Inferentia 支持 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Inferentia 支持

本主题介绍如何创建包含运行 Amazon EKS Inf1Amazon EC2 实例的节点的 集群并(可选)部署示例应用程序。Amazon EC2Inf1 实例由 AWS Inferentia 芯片提供支持,这些芯片由 AWS 自定义构建,可在云中提供高性能和最低成本的推理。机器学习模型使用 AWS Neuron(一个专用的软件开发工具包 (SDK)(由编译器、运行时和分析工具组成)部署到容器中,用于优化 Inferentia 芯片的机器学习推理性能。AWSNeuron 支持常用的机器学习框架,如 TensorFlow、PyTorch 和 MXNet。

Considerations

  • Neuron 设备逻辑 ID 必须是连续的。如果在 inf1.6xlargeinf1.24xlarge 实例类型(具有多个 Neuron 设备)上调度请求多个 Neuron 设备的 pod,则当 Kubernetes 调度程序选择不连续的设备 ID 时,该 pod 将无法启动。有关更多信息,请参阅 GitHub 上的设备逻辑 ID 必须是连续的

  • Amazon EC2托管节点组当前不支持 Inf1 实例。

Prerequisites

  • 在计算机上安装 eksctl 如果未安装,请参阅eksctl 命令行实用程序了解安装说明。

  • 在计算机上安装 kubectl 有关更多信息,请参阅 安装kubectl.

  • (可选)在计算机上安装 python3 如果未安装,请参阅 Python 下载了解安装说明。

创建集群

创建具有 Inf1 Amazon EC2 实例节点的集群

  1. 创建具有 Inf1 Amazon EC2 实例节点的集群。您可以将 <inf1.2xlarge> 替换为任意 Inf1 实例类型eksctl 检测到您正在启动具有 Inf1 实例类型的节点组,并使用 EKS 优化的加速 AMI 启动节点。

    注意

    您不能将服务账户的 IAM 角色与 TensorFlow Serving 一起使用。

    eksctl create cluster \ --name <inferentia> \ --version <1.16> \ --region <region-code> \ --nodegroup-name <ng-inf1> \ --node-type <inf1.2xlarge> \ --nodes <2> \ --nodes-min <1> \ --nodes-max <4>
    注意

    请记住下一个输出行的值。在后面的(可选)步骤中将使用该值。

    [ℹ] adding identity "arn:aws:iam::<111122223333>:role/eksctl-<inferentia>-<nodegroup-ng-in>-NodeInstanceRole-<FI7HIYS3BS09>" to auth ConfigMap

    在启动具有 Inf1 实例的节点组时,eksctl 将自动安装 AWS Neuron Kubernetes 设备插件。此插件将 Neuron 设备作为系统资源传播到 Kubernetes 调度程序,以供容器请求。除了默认 Amazon EKS 节点 IAM 策略之外,还添加了 Amazon S3 只读访问策略,以便后一个步骤中涵盖的示例应用程序可以从 Amazon S3 加载训练后的模型。

  2. 确保所有 pod 已正常启动。

    kubectl get pods -n kube-system

    输出

    NAME READY STATUS RESTARTS AGE aws-node-kx2m8 1/1 Running 0 5m aws-node-q57pf 1/1 Running 0 5m coredns-86d5cbb4bd-56dz2 1/1 Running 0 5m coredns-86d5cbb4bd-d6n4z 1/1 Running 0 5m kube-proxy-75zx6 1/1 Running 0 5m kube-proxy-plkfq 1/1 Running 0 5m neuron-device-plugin-daemonset-6djhp 1/1 Running 0 5m neuron-device-plugin-daemonset-hwjsj 1/1 Running 0 5m

(可选)创建 Neuron TensorFlow Serving 应用程序映像

注意

Neuron 很快将能预安装在 AWS Deep Learning Containers. 中。有关更新,请检查 AWS Neuron.

  1. 创建 Amazon ECR 存储库以存储应用程序映像。

    aws ecr create-repository --repository-name tensorflow-model-server-neuron

    请记下输出中返回的 repositoryUri,以便在下一个步骤中使用。

  2. 使用以下内容创建名为 Dockerfile.tf-serving 的 Dockerfile。Dockerfile 包含用于构建 Neuron optimized TensorFlow Serving 应用程序映像的命令。Neuron TensorFlow Serving 使用与普通 TensorFlow Serving 相同的 API。唯一的区别是,必须为 Inferentia 编译保存的模型,并且入口点是其他二进制文件。

    FROM amazonlinux:2 RUN yum install -y awscli RUN echo $'[neuron] \n\ name=Neuron YUM Repository \n\ baseurl=https://yum.repos.neuron.amazonaws.com \n\ enabled=1' > /etc/yum.repos.d/neuron.repo RUN rpm --import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB RUN yum install -y tensorflow-model-server-neuron
  3. 将您的 Docker 客户端登录到 ECR 存储库中。

    aws ecr get-login-password \ --region <region-code> \ | docker login \ --username AWS \ --password-stdin <111122223333>.dkr.ecr.<region-code>.amazonaws.com
  4. 构建 Docker 映像并将它上传到上一步中创建的 Amazon ECR 存储库。

    docker build . -f Dockerfile.tf-serving -t tensorflow-model-server-neuron docker tag tensorflow-model-server-neuron:latest <111122223333>.dkr.ecr.<region-code>.amazonaws.com/tensorflow-model-server-neuron:1.15.0 docker push <111122223333>.dkr.ecr.<region-code>.amazonaws.com/tensorflow-model-server-neuron:1.15.0
    注意

    如果您收到来自 Docker 的权限相关问题,则可能需要配置 Docker 以供非根用户使用。有关更多信息,请参阅 Docker 文档中的以非根用户身份管理 Docker

(可选)部署 TensorFlow Serving 应用程序映像

经过训练的模型必须先编译为 Inferentia 目标,才能部署在 Inferentia 实例上。要继续,您需要在 中保存的 Neuron optimized TensorFlowAmazon S3 模型。如果您还没有保存的模型,则可以按照 AWS Neuron 文档中的教程创建与 Neuron 兼容的 BERT-Large 模型并将其上传到 S3。BERT 是一种常用的机器学习技术,用于理解自然语言任务。有关编译 Neuron 模型的更多信息,请参阅《 开发人员指南》中的带 DLAMI 的 AWS Inferentia 芯片AWS Deep Learning AMI。

示例部署清单管理两个容器:Neuron 运行时容器映像和 TensorFlow Serving 应用程序。有关 Neuron 容器映像的更多信息,请参阅 GitHub 上的教程:Neuron 容器工具。Neuron 运行时作为附加容器映像运行,并用于与节点上的 Inferentia 芯片进行交互。这两个容器通过置于共享装载卷中的 Unix 域套接字进行通信。在启动时,应用程序映像将从 Amazon S3 中提取您的模型,使用保存的模型启动 Neuron TensorFlow Serving,然后等待预测请求。

可使用 Neuron 运行时容器规范中的 aws.amazon.com/neuron 资源来调整 Inferentia 设备的数量。运行时期望每个 Inferentia 设备有 128 个 2-MB 页面,因此,必须将 hugepages-2Mi 设置为 256 x the number of Inferentia devices. 要访问 Inferentia 设备,Neuron 运行时需要 SYS_ADMINIPC_LOCK 功能,但在打开 gRPC 套接字之前,该运行时会在初始化时删除这些功能。

  1. AmazonS3ReadOnlyAccess IAM 策略添加到在创建集群的步骤 1 中创建的节点实例角色。必须执行此操作,示例应用程序才能从 加载经过训练的模型。Amazon S3.

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \ --role-name eksctl-<inferentia>-<nodegroup-ng-in>-NodeInstanceRole-<FI7HIYS3BS09>
  2. 使用以下内容创建名为 bert_deployment.yaml 的文件。使用您的账户 ID、区域代码和已保存的模型名称和位置更新 <111122223333>、<region-code>bert/saved_model>。当客户端向 TensorFlow 服务器发出请求时,模型名称用于标识目的。此示例使用模型名称匹配将在稍后的步骤中用于发送预测请求的示例 BERT 客户端脚本。您还可以将 <1.0.7865.0> 替换为更高版本。有关最新版本,请参阅 GitHub 上的 Neuron 运行时发布说明或输入以下命令。

    aws ecr list-images --repository-name neuron-rtd --registry-id 790709498068 --region us-west-2
    kind: Deployment apiVersion: apps/v1 metadata: name: <eks-neuron-test> labels: app: <eks-neuron-test> role: master spec: replicas: <2> selector: matchLabels: app: <eks-neuron-test> role: master template: metadata: labels: app: <eks-neuron-test> role: master spec: volumes: - name: sock emptyDir: {} containers: - name: <eks-neuron-test> image: <111122223333>.dkr.ecr.<region-code>.amazonaws.com/tensorflow-model-server-neuron:1.15.0 command: - /usr/local/bin/tensorflow_model_server_neuron args: - --port=9000 - --rest_api_port=8500 - --model_name=bert_mrpc_hc_gelus_b4_l24_0926_02 - --model_base_path=s3://<bert/saved_model> ports: - containerPort: 8500 - containerPort: 9000 imagePullPolicy: IfNotPresent env: - name: AWS_REGION value: "<region-code>" - name: S3_USE_HTTPS value: "1" - name: S3_VERIFY_SSL value: "0" - name: AWS_LOG_LEVEL value: "3" - name: NEURON_RTD_ADDRESS value: unix:/sock/neuron.sock resources: limits: cpu: 4 memory: 4Gi requests: cpu: "1" memory: 1Gi volumeMounts: - name: sock mountPath: /sock - name: neuron-rtd image: 790709498068.dkr.ecr.<region-code>.amazonaws.com/neuron-rtd:<1.0.7865.0> securityContext: capabilities: add: - SYS_ADMIN - IPC_LOCK volumeMounts: - name: sock mountPath: /sock resources: limits: hugepages-2Mi: 256Mi aws.amazon.com/neuron: 1 requests: memory: 1024Mi
  3. 部署模型。

    kubectl apply -f bert_deployment.yaml
  4. 使用以下内容创建名为 bert_service.yaml 的文件。这将打开 HTTP 和 gRPC 端口以接受预测请求。

    kind: Service apiVersion: v1 metadata: name: <eks-neuron-test> labels: app: <eks-neuron-test> spec: type: ClusterIP ports: - name: http-tf-serving port: 8500 targetPort: 8500 - name: grpc-tf-serving port: 9000 targetPort: 9000 selector: app: <eks-neuron-test> role: master
  5. 为 TensorFlow 模型 Serving 应用程序创建 Kubernetes 服务。

    kubectl apply -f bert_service.yaml

(可选)根据 TensorFlow Serving 服务进行预测

  1. 要在本地进行测试,请将 gRPC 端口转发到 eks-neuron-test 服务。

    kubectl port-forward svc/eks-neuron-test 9000:9000 &
  2. 从 Neuron GitHub 存储库下载示例 BERT 客户端。

    curl https://raw.githubusercontent.com/aws/aws-neuron-sdk/master/src/examples/tensorflow/k8s_bert_demo/bert_client.py > bert_client.py
  3. 运行脚本以将预测数据提交给服务。

    python3 bert_client.py

    输出

    ... Inference successful: 0 Inference successful: 1 Inference successful: 2 Inference successful: 3 Inference successful: 4 Inference successful: 5 Inference successful: 6 Inference successful: 7 Inference successful: 8 Inference successful: 9 ... Inference successful: 91 Inference successful: 92 Inference successful: 93 Inference successful: 94 Inference successful: 95 Inference successful: 96 Inference successful: 97 Inference successful: 98 Inference successful: 99 Ran 100 inferences successfully. Latency