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

Amazon EKS 设置

本指南说明如何使用 Amazon Elastic Kubernetes Service (Amazon EKS) 和 AWS Deep Learning Containers 设置深度学习环境。使用 Amazon EKS,您可以借助 Kubernetes 容器扩展用于多节点训练和推理的生产就绪型环境。

如果您尚不熟悉 Kubernetes 或 Amazon EKS,也没关系。本指南和相关 Amazon EKS 文档介绍如何使用 Kubernetes 工具系列。本指南假定您已熟悉深度学习框架的多节点实施以及如何在容器外部设置推理服务器。

Amazon EKS 上的深度学习容器设置包含一个或多个容器(构成一个集群)。您可以有专用集群类型,如用于训练的集群和用于推理的集群。您可能还需要根据深度学习神经网络和模型的需求,为您的集群提供不同的实例类型。

自定义映像

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

许可

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

重要

要订阅该 AMI,请访问 AWS Marketplace

配置安全设置

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

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

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

  3. 向此 IAM 用户添加策略。它们提供 Amazon EKS、IAM 和 Amazon Elastic Compute Cloud (Amazon EC2) 所需的访问权限。

  4. 搜索 AmazonEKSAdminPolicy,然后选中该复选框。

  5. 搜索 AmazonCloudFormationPolicy,然后选中该复选框。

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

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

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

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

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

  11. 接受更改。

网关节点

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

注意

您的 eksctl 版本必须为 1.12 或更高版本。

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

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

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

    $ sudo pip install --upgrade awscli
  3. 通过运行以下命令安装 eksctl。有关 eksctl 的更多信息,请参阅 AWS 开源博客上的 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
  4. 通过运行以下命令安装 kubectl。有关 kubectl 的详细信息,请参阅安装 kubectl

    $ 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 的更多信息,请参阅 Amazon EKS 入门

    $ 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 实例类型创建集群的命令。您将需要修改它,然后再运行。

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

    • 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>

    • 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.12/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.12/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 进行训练和推论,请参阅Amazon EKS 教程