本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
亚马逊 EKS 安装
本指南介绍了如何使用 Amazon Elastic Kubernetes 服务 (Amazon EKS) 设置深度学习环境AmazonDeep Learning Containers。利用 Amazon EKS,您可以借助 Kubernetes 容器扩展用于多节点训练和推理的生产就绪型环境。
如果您尚不熟悉 Kubernetes 或 Amazon EKS,也没关系。本指南和相关的 Amazon EKS 文档展示了如何使用 Kubernetes 工具系列。本指南假定您已熟悉您的深度学习框架的多节点实施以及如何在容器外部设置推理服务器。
Amazon EKS 上的深度学习容器设置包含一个或多个容器(形成集成)。您可以有专用集群类型,如用于训练的集群和用于推理的集群。您还可能希望对于您的集群具有不同的实例类型,具体取决于您的深度学习神经网络和模型的需求。
自定义映像
如果您要加载自己的代码或数据集并让其在您集群的每个节点均可用,则自定义映像将很有用。提供了使用自定义图像的示例。你可以在不创建自己的情况下尝试开始使用它们。
Licensing
要使用 GPU 硬件,请使用具有必需的 GPU 驱动程序的 Amazon 系统映像。我们建议结合使用 Amazon EKS 优化 AMI 与 GPU 支持,将使用在本指南的后续步骤使用它们。此 AMI 包括非Amazon需要最终用户许可协议 (EULA) 的软件。您必须在中订阅 EKS 优化的 AMIAmazon Web Services Marketplace并在工作人员节点组中使用 AMI 之前接受 EULA。
要订阅 AMI,请访问AmazonMarketplace
配置安全设置
要使用 Amazon EKS,您必须具有有权访问多个安全权限的用户账户。这些都是用Amazon Identity and Access Management(IAM) 工具。
-
按中的步骤操作,创建 IAM 用户或更新现有 IAM 用户在您的Amazon帐户.
-
获取此用户的凭证。
-
访问:https://console.aws.amazon.com/iam/
,打开 IAM 控制台。 -
UNDER
Users,选择用户。 -
Select
Security Credentials. -
Select
Create access key. -
下载 key pair 或复制信息以供以后使用。
-
-
向 IAM 用户添加以下策略。这些策略提供 Amazon EKS、IAM 和 Amazon Elastic 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. 我们建议您结合使用 Amazon EC2 实例与深度学习基础 AMI (Ubuntu) 来分配和控制您的集群。您可以在计算机或已运行的 Amazon EC2 实例上本地运行这些工具。但是,为了简化本指南,我们假定您使用的是带 Ubuntu 16.04 的深度学习基础 AMI (DLAMI)。我们将此称为您的网关节点。
在开始之前,请考虑您的训练数据的位置或您要运行集群以响应推理请求的位置。通常情况下,您的用于训练或推理的数据和集群应位于同一区域。此外,您可以在此同一区域中启动您的网关节点。你可以快速关注10 分钟教程
-
登录到您的网关节点。
-
安装或升级AmazonCLI。要访问所需的新 Kubernetes 功能,您必须具有最新版本。
$sudo pip install --upgrade awscli -
通过运行以下命令安装 eksctl。有关 eksctl 的更多信息,请参阅eksctl 文档
. $curl --silent \ --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" \ | tar xz -C /tmp$sudo mv /tmp/eksctl /usr/local/bin -
安装
kubectl按照安装 kubectl指南。注意 您必须使用
kubectl与 Amazon EKS 集群控制层面版本不同的一个次要版本内的版本。例如,1.18kubectl客户端使用 Kubernetes 1.17、1.18 和 1.19 集群。 -
通过运行以下命令安装
aws-iam-authenticator。有关 aws-iam-AM 身份验证器的更多信息,请参阅安装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是亚马逊 EKS kubernetes 版本。有关受支持的 Amazon EKS 版本,请参阅可用的亚马逊 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 参数通过配置文件对其进行寻址。这在您有多个集群时很有用。例如,如果您有一个称为 “raining-gpu-1” 的单独的集群,则可以调用get pods命令通过将配置文件作为参数传递,如下所示:
$kubectl --kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-gpu-1 get pods
值得一提的是,可以不带 kubeconfig 参数运行这一命令,它将报告您的当前主动控制集群上的状态。
$kubectl get pods
如果您设置了多个集群,而这些集群尚未安装 NVIDIA 插件,则可以采用以下方式安装该插件:
$kubectl --kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-gpu-1create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml
您还可以通过更新 kubeconfig、传递要管理的集群的名称来更改活动集群。以下命令更新 kubeconfig 且无需使用 kubeconfig 参数。
$aws eks —regionus-east-1update-kubeconfig —nametraining-gpu-1
如果您遵循本指南中的所有示例,您将经常在活动集群之间切换。因此,您可以协调训练或推理或者使用在不同集群上运行的不同框架。
Cleanup
当您使用完集群后,将其删除以避免产生额外成本。
$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 的训练和推理,请参阅Amazon EKS 教程.