Amazon EK 设置 - Amazon深度学习容器
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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) 工具。

  1. 按照中的步骤创建 IAM 用户或更新现有 IAM 用户在您的中创建 IAM 用户Amazon帐户.

  2. 获取此用户的凭证。

    1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

    2. 下面Users,请选择您的用户。

    3. Select Security Credentials.

    4. Select Create access key.

    5. 下载key pair 或复制信息以供日后使用。

  3. 向您的 IAM 用户添加以下策略。这些策略为Amazon EKS、IAmazon EKS、Amazon EKS、AElastic Compute Cloud (Amazon EC2) 提供了所需的访问权限。

    1. Select Permissions.

    2. Select Add permissions.

    3. Select Create policy.

    4. 来自的Create policy窗口,选择JSON选项卡。

    5. 粘贴以下内容。

      { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "eks:*", "Resource": "*" } ] }
    6. 给策略命名EKSFullAccess并创建策略。

    7. 导航回到Grant permissions时段。

    8. Select Attach existing policies directly.

    9. 搜索EKSFullAccess,然后选中该复选框。

    10. 搜索AWSCloudFormationFullAccess,然后选中该复选框。

    11. 搜索AmazonEC2FullAccess,然后选中该复选框。

    12. 搜索IAMFullAccess,然后选中该复选框。

    13. 搜索AmazonEC2ContainerRegistryReadOnly,然后选中该复选框。

    14. 搜索AmazonEKS_CNI_Policy,然后选中该复选框。

    15. 搜索AmazonS3FullAccess,然后选中该复选框。

    16. 接受更改。

网关节点

要设置 Amazon EKS 集群,请使用开源工具eksctl. 我们建议您使用带有深度学习基础 AMI (Ubuntu) 的 Amazon EC2 实例来分配和控制您的集群。您可以在您的计算机或已经运行的 Amazon EC2 实例上本地运行这些工具。但是,为了简化本指南,我们假设您使用的是带有 Ubuntu 16.04 的深度学习基础 AMI (DLAMI)。我们将此称为您的网关节点。

在开始之前,请考虑您的训练数据的位置或您要运行集群以响应推理请求的位置。通常情况下,您的用于训练或推理的数据和集群应位于同一区域。此外,您在同一个区域中启动您的网关节点。你可以快点关注这个10 分钟教程它指导您启动一个 DLAMI 以用作您的网关节点。

  1. 登录到您的网关节点。

  2. 安装或升级AmazonCLI。要访问所需的新 Kubernetes 功能,您必须具有最新版本。

    $ sudo pip install --upgrade awscli
  3. 安装eksctl通过在中运行与您的操作系统对应的命令Amazon EKS 用户指南的安装说明。有关更多信息eksctl,另请参阅eksctl 文档.

  4. 安装kubectl按中的步骤操作正在安装 kubectl指南。

    注意

    您必须使用kubectl与您的 Amazon EKS 集群控制层面版本不同的一个次要版本内的版本。例如,一个 1.18kubectl客户端可以使用 Kubernetes 1.17、1.18 和 1.19 集群。

  5. 通过运行以下命令安装 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
  6. 从“Security Configuration (安全配置)”部分中运行 IAM 用户的 aws configure。您正在复制 IAM 用户的Amazon访问密钥,然后是Amazon您在 IAM 控制台中访问的私有访问密钥并将其粘贴到来自的提示中aws configure.

GPU 集群

  1. 检查以下使用 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>

  2. 更改命令后,运行该命令并等待。单节点集群可能需要几分钟,如果您选择创建大型集群,则可能需要更长的时间。

    $ 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
  3. 理想情况下,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
  4. 如果您计划使用 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
  5. 验证 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 实例类型。

测试您的集群

  1. 你可以运行一个kubectl命令在集群上检查其状态。试用该命令以确保其选择的是您要管理的当前集群。

    $ kubectl get nodes -o wide
  2. 简单了解 ~/.kube。此目录具有用于从您的网关节点配置的各个集群的 kubeconfig 文件。如果进一步浏览到该文件夹,您可以找到 ~/.kube/eksctl/clusters - 此文件夹包含用于使用 eksctl 创建的集群的 kubeconfig 文件。该文件包含一些理想情况下不必修改的细节,因为这些工具正在为您生成和更新配置,但是在进行故障排除时最好参考。

  3. 验证集群是否处于活动状态。

    $ aws eks --region <region> describe-cluster --name <cluster-name> --query cluster.status

    您应看到以下输出:

    "ACTIVE"
  4. 如果您在同一主机实例中具有多个集群设置,请验证 kubectl 上下文。有时候,确保找到的默认上下文会有所帮助kubectl设置正确。使用以下命令检查此内容:

    $ kubectl config get-contexts
  5. 如果未按预期设置该上下文,请使用以下命令修复此问题:

    $ 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 —region us-east-1 update-kubeconfig —name training-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.