深度学习 AMI
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

设置

本指南将帮助您使用 Amazon Elastic Container Service for Kubernetes (Amazon EKS) 和 AWS 深度学习容器来设置深度学习环境。使用 EKS,您可以借助 Kubernetes 容器扩展用于多节点训练和推理的生产就绪型环境。

如果您尚不熟悉 Kubernetes 或 EKS,也没关系。本指南及相关 EKS 文档将帮助您了解如何使用 Kubernetes 系列工具,以便可以借助 Kubernetes 和 EKS 扩展深度学习训练或推理系统。本指南假定您已熟悉您的深度学习框架的多节点实施或推理以及如何在容器外部设置推理服务器。

EKS 上的深度学习容器设置包含一个或多个容器(形成集成)。您可以有专用集群类型,如用于训练的集群和用于推理的集群。您还可能希望对于您的训练或实例集群具有不同的实例类型,具体取决于您计划部署的深度学习神经网络和模型的需求。

自定义映像

如果您要加载自己的代码或数据集并让其在您集群的每个节点均可用,则自定义映像将很有用。提供了使用自定义映像的示例,因此,您可以试用它们,而无需在开始时创建自己的自定义映像。

许可

要使用 GPU 硬件,您需要使用具有必需的 GPU 驱动程序的 AMI。我们建议结合使用经 EKS 优化 AMI 与 GPU 支持,您将使用在本指南的后续步骤使用它们。由于此 AMI 包含需要最终用户许可协 (EULA) 的第三方软件,因此您必须在 AWS Marketplace 中订阅经 EKS 优化的 AMI 并选择接受 EULA,然后才能在工作线程节点组中使用该 AMI。

重要

要订阅该 AMI,请访问 AWS Marketplace

安全配置

要使用 EKS,您必须具有有权访问多个安全权限的用户账户。使用 IAM 工具设置这些内容。

  1. 创建 IAM 用户或更新现有 IAM 用户。有关创建或编辑 IAM 用户的更多信息,请参阅 IAM 文档。

  2. 获取此用户的凭证。在“Users (用户)”下,选择您的用户,选择“Security Credentials (安全凭证)”,选择“Create access key pair (创建访问密钥对)”,然后下载该密钥对或复制相关信息以供稍后使用。

  3. 将策略添加到此 IAM 用户。这些将为 EKS、IAM 和 EC2 提供所需的访问权限。首先,通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/。

  4. 搜索 AmazonEKSAdminPolicy,单击复选框。

  5. 搜索 AmazonCloudFormationPolicy,单击复选框。

  6. 搜索 AmazonEC2FullAccess,单击复选框。

  7. 搜索 IAMFullAccess,单击复选框。

  8. 搜索 AmazonEC2ContainerRegistryReadOnly,单击复选框。

  9. 搜索 AmazonEKS_CNI_Policy,单击复选框。

  10. 搜索 AmazonS3FullAccess,单击复选框。

  11. 接受更改。

网关节点

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

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

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

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

    $ sudo pip install --upgrade awscli
  3. 通过运行以下命令安装 eksctl。有关 eksctl 的更多信息,请参阅:https://aws.amazon.com/blogs/opensource/eksctl-eks-cluster-one-command/

    $ 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
  4. 通过运行以下命令安装 kubectl。有关 kubeclt 的更多信息,请参阅:https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html

    $ curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.11.5/2018-12-06/bin/linux/amd64/kubectl $ chmod +x ./kubectl $ mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH
  5. 通过运行以下命令安装 aws-iam-authenticator。有关 aws-iam-authenticator 的更多信息,请参阅:https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html#eks-prereqs

    $ curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.11.5/2018-12-06/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 控制台中访问的 IAM 用户的 AWS 访问密钥和 AWS 秘密访问密钥并将这些密钥粘贴到 aws configure 中的提示符中。

  7. 安装 ksonnet:

    $ export KS_VER=0.13.1 $ export KS_PKG=ks_${KS_VER}_linux_amd64 $ wget -O /tmp/${KS_PKG}.tar.gz https://github.com/ksonnet/ksonnet/releases/download/v${KS_VER}/${KS_PKG}.tar.gz $ mkdir -p ${HOME}/bin $ tar -xvf /tmp/$KS_PKG.tar.gz -C ${HOME}/bin $ sudo mv ${HOME}/bin/$KS_PKG/ks /usr/local/bin

GPU 集群

  1. 检查以下使用 p3.8xlarge 实例类型创建集群的命令。您将需要修改它,然后再运行。

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

    • 节点是您希望集群中包含的实例的数量。在本示例中,我们将从三个节点开始。

    • 节点类型指的是实例类。如果您已知道最适合您的情况的实例类,则可以选择不同的实例类。

    • 超时和 *ssh-access *可以自行运行。

    • ssh-public-key 是您要用于登录工作线程节点的密钥的名称。使用已使用的安全密钥或创建新的安全密钥,但请务必使用已为您使用的区域分配的密钥交换出 ssh-public-key。注意:您只需提供在 EC2 控制台的“密钥对”部分中看到的密钥名称。

    • 区域是将在其中启动集群的 EC2 区域。如果您计划使用驻留在某特定区域(非 <us-east-1>)中的训练数据,建议您使用同一区域。ssh-public-key 必须具有在此区域中启动实例的权限。

      注意

      本指南的其余部分假定 <us-east-1> 作为此区域。

    • auto-kubeconfig 可以自行运行。

  2. 对该命令进行更改后,即可运行它,然后等待。这对于单节点集群可能需要几分钟时间,如果您选择创建大型集群,则甚至需要更长时间。

    $ eksctl create cluster <cluster-name> \ --version 1.11 \ --nodes 3 \ --node-type=<p3.8xlarge> \ --timeout=40m \ --ssh-access \ --ssh-public-key <key_pair_name> \ --region <us-east-1> \ --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.11/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 实例类型。

测试您的集群

  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 参数运行这一命令,它将报告您的当前主动控制集群上的状态。

    $ kubectl get pods
  • 如果您设置了多个集群,而这些集群尚未安装 NVIDIA 插件,则可以采用以下方式安装该插件:

    $ kubectl --kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-gpu-1 apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.10/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