本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon EK 设置
本节提供安装说明,以设置正在运行的深度学习环境AmazonAmazon Elastic Kubernetes Service (Amazon EKS) 上的Deep Learning Containers
自定义映像
如果您要加载自己的代码或数据集并让其在您集群的每个节点均可用,则自定义映像将很有用。提供了使用自定义镜像的示例。你可以试用它们来开始使用,而无需创建自己的版本。
许可
要使用 GPU 硬件,请使用具有必要 GPU 驱动程序的亚马逊机器映像。我们建议使用支持 GPU 的 Amazon EKS 优化的 AMI,本指南的后续步骤中将使用该功能。此 AMI 包含的软件不是Amazon,因此需要最终用户许可协议 (EULA)。您必须在中订阅经过 EKS 优化的 AMIAmazon Web Services Marketplace并接受 EULA,然后才能在工作节点组中使用 AMI。
重要
要订阅 AMI,请访问AmazonMarketplace
配置安全设置
要使用 Amazon EKS,您必须拥有一个可以访问多个安全权限的用户账户。这些设置为Amazon Identity and Access Management(IAM) 工具。
-
按照中的步骤创建 IAM 用户或更新现有 IAM 用户在您的中创建 IAM 用户Amazon帐户.
-
获取此用户的凭证。
-
通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
下面
Users
,请选择您的用户。 -
Select
Security Credentials
. -
Select
Create access key
. -
下载key pair 或复制信息以供日后使用。
-
-
向您的 IAM 用户添加以下策略。这些策略为Amazon EKS、IAmazon EKS、Amazon EKS、AElastic Compute Cloud (Amazon EC2) 提供了所需的访问权限。
-
Select
Permissions
. -
Select
Add permissions
. -
Select
Create policy
. -
来自的
Create policy
窗口,选择JSON
选项卡。 -
粘贴以下内容。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "eks:*", "Resource": "*" } ] }
-
给策略命名
EKSFullAccess
并创建策略。 -
导航回到
Grant permissions
时段。 -
Select
Attach existing policies directly
. -
搜索
EKSFullAccess
,然后选中该复选框。 -
搜索
AWSCloudFormationFullAccess
,然后选中该复选框。 -
搜索
AmazonEC2FullAccess
,然后选中该复选框。 -
搜索
IAMFullAccess
,然后选中该复选框。 -
搜索
AmazonEC2ContainerRegistryReadOnly
,然后选中该复选框。 -
搜索
AmazonEKS_CNI_Policy
,然后选中该复选框。 -
搜索
AmazonS3FullAccess
,然后选中该复选框。 -
接受更改。
-
网关节点
要设置 Amazon EKS 集群,请使用开源工具eksctl
. 我们建议您使用带有深度学习基础 AMI (Ubuntu) 的 Amazon EC2 实例来分配和控制您的集群。您可以在您的计算机或已经运行的 Amazon EC2 实例上本地运行这些工具。但是,为了简化本指南,我们假设您使用的是带有 Ubuntu 16.04 的深度学习基础 AMI (DLAMI)。我们将此称为您的网关节点。
在开始之前,请考虑您的训练数据的位置或您要运行集群以响应推理请求的位置。通常情况下,您的用于训练或推理的数据和集群应位于同一区域。此外,您在同一个区域中启动您的网关节点。你可以快点关注这个10 分钟教程
-
登录到您的网关节点。
-
安装或升级AmazonCLI。要访问所需的新 Kubernetes 功能,您必须具有最新版本。
$
sudo pip install --upgrade awscli -
安装
eksctl
通过在中运行与您的操作系统对应的命令Amazon EKS 用户指南的安装说明。有关更多信息eksctl
,另请参阅eksctl 文档. -
安装
kubectl
按中的步骤操作正在安装 kubectl指南。注意
您必须使用
kubectl
与您的 Amazon EKS 集群控制层面版本不同的一个次要版本内的版本。例如,一个 1.18kubectl
客户端可以使用 Kubernetes 1.17、1.18 和 1.19 集群。 -
通过运行以下命令安装
aws-iam-authenticator
。有关更多信息 aws-iam-authenticator,请参阅正在安装aws-iam-authenticator
.$
curl -o aws-iam-authenticator https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/aws-iam-authenticator$
chmod +x aws-iam-authenticator$
cp ./aws-iam-authenticator $HOME/bin/aws-iam-authenticator && export PATH=$HOME/bin:$PATH -
从“Security Configuration (安全配置)”部分中运行 IAM 用户的
aws configure
。您正在复制 IAM 用户的Amazon访问密钥,然后是Amazon您在 IAM 控制台中访问的私有访问密钥并将其粘贴到来自的提示中aws configure
.
GPU 集群
-
检查以下使用 p3.8xlarge 实例类型创建集群的命令。在运行它之前,必须进行以下修改。
-
name
是你用来管理集群的东西。您可以将cluster-name
更改为希望的任何名称,只要其中没有空格或特殊字符。 -
eks-version
是Amazon EKSkubernetes 版本。有关支持的亚马逊 EKS 版本,请参阅可用的 Amazon EKS Kubernetes 版本. -
nodes
是您要在集群中存储的实例的数量。在本示例中,我们将从三个节点开始。 -
node-type
指的是实例类. -
timeout
和*ssh-access *
可以独自一人。 -
ssh-public-key
是要用于登录工作节点的密钥的名称。要么使用你已经使用的安全密钥,要么创建一个新的安全密钥,但一定要换掉 ssh-public-key 使用为你使用的地区分配的密钥。注意:您只需要提供密钥名称,如 Amazon EC2 控制台的 “密钥对” 部分所示。 -
region
是启动集群的 Amazon EC2 区域。如果您计划使用位于特定区域(除外)的训练数据<us-east-1>
)我们建议您使用相同的区域。这些区域有: ssh-public-key 必须有权在该区域启动实例。注意
本指南的其余部分假定区域是
<us-east-1>
。
-
-
更改命令后,运行该命令并等待。单节点集群可能需要几分钟,如果您选择创建大型集群,则可能需要更长的时间。
$
eksctl create cluster<cluster-name>
\ --version<eks-version>
\ --nodes 3 \ --node-type=<p3.8xlarge>
\ --timeout=40m \ --ssh-access \ --ssh-public-key<key_pair_name>
\ --region<us-east-1>
\ --zones=us-east-1a,us-east-1b,us-east-1d \ --auto-kubeconfig您应该可以看到类似于如下输出的内容:
EKS cluster "training-1" in "us-east-1" region is ready
-
理想情况下,auto-kubeconfig 应已配置您的集群。但是,如果您遇到问题,则可以运行以下命令来设置您的 kubeconfig。如果您要从其他位置更改网关节点和管理集群,也可使用此命令。
$
aws eks --region<region>
update-kubeconfig --name<cluster-name>
您应该可以看到类似于如下输出的内容:
Added new context arn:aws:eks:us-east-1:999999999999:cluster/training-1 to /home/ubuntu/.kube/config
-
如果您计划使用 GPU 实例类型,请务必运行适用于 Kubernetes 的 NVIDIA 设备插件
在集群中使用以下命令: $
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.12/nvidia-device-plugin.yml$
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml -
验证 GPU 在您集群的每个节点上是否可用
$
kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
CPU 集群
请参阅上一节中有关使用方法的讨论eksctl命令启动 GPU 集群,然后修改node-type
使用 CPU 实例类型。
哈瓦那集群
请参阅前面关于使用方法的讨论eksctl命令启动 GPU 集群,然后修改node-type
使用带有 Habana Gaudi 加速器的实例,例如DL1 实例
测试您的集群
-
你可以运行一个kubectl命令在集群上检查其状态。试用该命令以确保其选择的是您要管理的当前集群。
$
kubectl get nodes -o wide -
简单了解 ~/.kube。此目录具有用于从您的网关节点配置的各个集群的 kubeconfig 文件。如果进一步浏览到该文件夹,您可以找到 ~/.kube/eksctl/clusters - 此文件夹包含用于使用 eksctl 创建的集群的 kubeconfig 文件。该文件包含一些理想情况下不必修改的细节,因为这些工具正在为您生成和更新配置,但是在进行故障排除时最好参考。
-
验证集群是否处于活动状态。
$
aws eks --region<region>
describe-cluster --name<cluster-name>
--query cluster.status您应看到以下输出:
"ACTIVE"
-
如果您在同一主机实例中具有多个集群设置,请验证 kubectl 上下文。有时候,确保找到的默认上下文会有所帮助kubectl设置正确。使用以下命令检查此内容:
$
kubectl config get-contexts -
如果未按预期设置该上下文,请使用以下命令修复此问题:
$
aws eks --region<region>
update-kubeconfig --name<cluster-name>
管理您的集群
当你想控制或查询集群时,你可以使用 kubeconfig 参数通过配置文件对其进行寻址。这在您有多个集群时很有用。例如,如果你有一个名为 “training-gpu-1” 的单独集群,你可以调用get pods通过将配置文件作为参数传递来对其执行命令,如下所示:
$
kubectl --kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-gpu-1 get pods
值得注意的是,你可以在没有 kubeconfig 参数的情况下运行同样的命令。在这种情况下,该命令将使用当前主动控制的集群 (current-context
)。
$
kubectl get pods
如果您设置了多个集群,而这些集群尚未安装 NVIDIA 插件,则可以采用以下方式安装该插件:
$
kubectl --kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-gpu-1
create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml
您还可以通过更新 kubeconfig、传递要管理的集群的名称来更改活动集群。以下命令更新 kubeconfig 且无需使用 kubeconfig 参数。
$
aws eks —regionus-east-1
update-kubeconfig —nametraining-gpu-1
如果您遵循本指南中的所有示例,则可能会经常在活动集群之间切换。这样你就可以协调训练或推理,或者使用在不同集群上运行的不同框架。
清除
使用完集群后,将其删除,以避免产生额外费用。
$
eksctl delete cluster --name=<cluster-name>
要仅删除 Pod,运行以下命令:
$
kubectl delete pods<name>
要重置访问集群的密钥,请运行以下命令:
$
kubectl delete secret ${SECRET} -n ${NAMESPACE} || true
删除nodegroup
连接到集群,运行以下命令:
$
eksctl delete nodegroup --name<cluster_name>
要附加一个nodegroup
到集群,运行以下命令:
$
eksctl create nodegroup --cluster<cluster-name>
\ --node-ami<ami_id>
\ --nodes<num_nodes>
\ --node-type=<instance_type>
\ --timeout=40m \ --ssh-access \ --ssh-public-key<key_pair_name>
\ --region<us-east-1>
\ --auto-kubeconfig
后续步骤
要了解如何在 Amazon EKS 上使用Deep Learning Containers 进行训练和推理,请访问培训要么Inference.