亚马逊EKS设置 - AWS 深度学习 Containers

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

亚马逊EKS设置

本节提供安装说明,用于在亚马逊 Elastic Kubernetes Service(亚马逊)上设置运行 AWS 深度学习容器的深度学习环境。EKS

自定义镜像

如果您要加载自己的代码或数据集并让其在您集群的每个节点均可用,则自定义映像将很有用。提供了使用自定义图像的示例。你可以先试一试,而不用自己创建。

许可

要使用GPU硬件,请使用具有必要GPU驱动程序的 Amazon 系统映像。我们建议使用经过亚马逊EKS优AMI化的GPU支持版,本指南的后续步骤中将使用该支持。这AMI包括非最终用户许可协议的软件 AWS,因此需要最终用户许可协议(EULA)。您必须订阅AMI中的EKS优化版 AWS Marketplace 并接受,EULA然后才能在工作节点组AMI中使用。

重要

要订阅,请访问 AWS Marketplace。AMI

配置安全设置

要使用 Amazon,EKS您必须拥有一个可以访问多项安全权限的用户账户。这些是用 AWS Identity and Access Management (IAM) 工具设置的。

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

  2. 获取此用户的凭证。

    1. 打开IAM控制台,网址为https://console.aws.amazon.com/iam/

    2. 在下方Users,选择您的用户。

    3. 选择 Security Credentials

    4. 选择 Create access key

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

  3. 向您的IAM用户添加以下策略。这些政策为亚马逊和亚马逊EKS弹性计算云 (AmazonEC2) 提供了所需的访问权限。IAM

    1. 选择 Permissions

    2. 选择 Add permissions

    3. 选择 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. 选择 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. 安装或升级 AWS CLI。要访问所需的新 Kubernetes 功能,您必须具有最新版本。

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

  4. kubectl按照安装 kubectl 指南中的步骤进行安装

    注意

    您使用的kubectl版本必须与您的 Amazon EKS 集群控制平面版本相差不到一个次要版本。例如,1.18 kubectl 客户端可与 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. 从 “安全配置” 部分aws configure为IAM用户运行。您正在复制IAM用户的 AWS 访问密钥,然后是您在IAM控制台中访问的私有访问 AWS 密钥,然后将其粘贴到来自aws configure的提示中。

GPU集群

  1. 检查以下使用 p3.8xlarge 实例类型创建集群的命令。在运行它之前,必须进行以下修改。

    • name是您用来管理集群的工具。您可以将 cluster-name 更改为希望的任何名称,只要其中没有空格或特殊字符。

    • eks-version是亚马逊 EKS kubernetes 版本。有关支持的亚马逊EKS版本,请参阅可用的亚马逊 EKS Kubernetes 版本。

    • nodes是您想要在集群中安装的实例数量。在本示例中,我们将从三个节点开始。

    • node-type指的是一个实例类

    • timeout而且*ssh-access *可以不管。

    • ssh-public-key是您要用来登录工作节点的密钥的名称。要么使用你已经使用的安全密钥,要么创建一个新的安全密钥,但一定要 ssh-public-key 用为你使用的区域分配的密钥替换。注意:您只需要提供在 Ama EC2 zon 控制台的 “密钥对” 部分中显示的密钥名称。

    • 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. 验证集群中每个节点上都有GPUs可用的

    $ 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

后续步骤

要了解有关使用亚马逊上的 Deep Learning Containers 进行训练和推理的信息EKS,请访问亚马逊EKS培训亚马逊EKS推断