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

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

CPU 推理

本部分指导您使用 Apache MXNet(孵化)、PyTorch、TensorFlow 和 TensorFlow 2 在 EKS CPU 集群的 Deep Learning Containers 上运行推理。

有关 Deep Learning Containers 的完整列表,请参阅。可用的 Deep Learning Containers 映像.

注意

如果您是在使用 MKL,请参阅。AmazonDeep Learning Containers 英特尔数学核心库 (MKL) 建议以获得最佳训练或推理性能。

Apache MxNet(孵化)CPU 推理

在本教程中,创建一个 Kubernetes 服务和部署,用于使用 MXNet 来运行 CPU 推理。Kubernetes 服务公开了一个进程及其端口。创建 Kubernetes 服务时,可以指定要使用的服务类型ServiceTypes. 默认ServiceTypeClusterIP. 部署负责确保一定数量的 Pod 始终启动并运行。

  1. 创建命名空间。您可能需要更改 kubeconfig 以指向正确的集群。验证您已设置 “training-cpu-1” 或将其更改为您的 CPU 集群的配置。有关如何设置群集的更多信息,请参阅。Amazon EK 设置.

    $ NAMESPACE=mx-inference; kubectl —kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-cpu-1 create namespace ${NAMESPACE}
  2. (使用公共模型时的可选步骤。) 在可装载的网络位置(如 Amazon S3)处设置您的模型。有关如何将训练后的模型上传到 S3,请参阅。TensorFlow CPU 推理. 将密钥应用于您的命名空间。有关密钥的更多信息,请参阅Kubernetes 密钥文档.

    $ kubectl -n ${NAMESPACE} apply -f secret.yaml
  3. 使用以下内容创建名为 mx_inference.yaml 的文件。此示例文件指定了模型、使用的 MxNet 推理图像以及模型的位置。此示例使用公共模型,因此您无需修改它。

    --- kind: Service apiVersion: v1 metadata: name: squeezenet-service labels: app: squeezenet-service spec: ports: - port: 8080 targetPort: mms selector: app: squeezenet-service --- kind: Deployment apiVersion: apps/v1 metadata: name: squeezenet-service labels: app: squeezenet-service spec: replicas: 1 selector: matchLabels: app: squeezenet-service template: metadata: labels: app: squeezenet-service spec: containers: - name: squeezenet-service image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/mxnet-inference:1.6.0-cpu-py36-ubuntu16.04 args: - mxnet-model-server - --start - --mms-config /home/model-server/config.properties - --models squeezenet=https://s3.amazonaws.com/model-server/model_archive_1.0/squeezenet_v1.1.mar ports: - name: mms containerPort: 8080 - name: mms-management containerPort: 8081 imagePullPolicy: IfNotPresent
  4. 将配置应用于之前定义的命名空间中的新 pod。

    $ kubectl -n ${NAMESPACE} apply -f mx_inference.yaml

    您的输出应类似于以下内容:

    service/squeezenet-service created deployment.apps/squeezenet-service created
  5. 检查 pod 的状态。

    $ kubectl get pods -n ${NAMESPACE}

    重复状态检查,直到您看到以下 “RUNNING” 状态:

    NAME READY STATUS RESTARTS AGE squeezenet-service-xvw1 1/1 Running 0 3m
  6. 要进一步描述 pod,请运行以下命令:

    $ kubectl describe pod <pod_name> -n ${NAMESPACE}
  7. 由于此处的 serviceType 为 ClusterIP,您可以使用以下命令将端口从您的容器转发至您的主机:

    $ kubectl port-forward -n ${NAMESPACE} `kubectl get pods -n ${NAMESPACE} --selector=app=squeezenet-service -o jsonpath='{.items[0].metadata.name}'` 8080:8080 &
  8. 下载小猫的图像。

    $ curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
  9. 使用小猫的图像对模型运行推理过程:

    $ curl -X POST http://127.0.0.1:8080/predictions/squeezenet -T kitten.jpg

TensorFlow CPU 推理

在本教程中,创建一个 Kubernetes 服务和部署,用于使用 TensorFlow 来运行 CPU 推理。Kubernetes 服务公开了一个进程及其端口。创建 Kubernetes 服务时,可以指定要使用的服务类型ServiceTypes. 默认ServiceTypeClusterIP. 部署负责确保一定数量的 Pod 始终启动并运行。

  1. 创建命名空间。您可能需要更改 kubeconfig 以指向正确的集群。验证您已设置 “training-cpu-1” 或将其更改为您的 CPU 集群的配置。有关如何设置群集的更多信息,请参阅。Amazon EK 设置.

    $ NAMESPACE=tf-inference; kubectl —kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-cpu-1 create namespace ${NAMESPACE}
  2. 用于推理的模型可通过不同的方式进行检索,例如,使用共享卷和 Amazon S3。由于 Kubernetes 服务需要访问 Amazon S3 和 Amazon ECR,因此您必须存储Amazon凭据作为 Kubernetes 秘密。在本示例中,请使用 S3 来存储和获取训练后的模型。

    验证您的Amazon凭证。他们必须具有 S3 写入访问权限。

    $ cat ~/.aws/credentials
  3. 该输出值将类似于以下内容:

    $ [default] aws_access_key_id = YOURACCESSKEYID aws_secret_access_key = YOURSECRETACCESSKEY
  4. 使用 base64 对这些凭证进行编码。

    首先编码访问密钥。

    $ echo -n 'YOURACCESSKEYID' | base64

    接下来编码秘密访问密钥。

    $ echo -n 'YOURSECRETACCESSKEY' | base64

    您的输出应类似于以下内容:

    $ echo -n 'YOURACCESSKEYID' | base64 RkFLRUFXU0FDQ0VTU0tFWUlE $ echo -n 'YOURSECRETACCESSKEY' | base64 RkFLRUFXU1NFQ1JFVEFDQ0VTU0tFWQ==
  5. 创建一个名为的文件secret.yaml并将以下内容置于您的主目录中。该文件用于存储密钥。

    apiVersion: v1 kind: Secret metadata: name: aws-s3-secret type: Opaque data: AWS_ACCESS_KEY_ID: YOURACCESSKEYID AWS_SECRET_ACCESS_KEY: YOURSECRETACCESSKEY
  6. 将密钥应用于您的命名空间。

    $ kubectl -n ${NAMESPACE} apply -f secret.yaml
  7. 克隆tensorflow 服务存储库。

    $ git clone https://github.com/tensorflow/serving/ $ cd serving/tensorflow_serving/servables/tensorflow/testdata/
  8. 同步预训练后的saved_model_half_plus_two_cpu将模型到您的 S3 存储桶。

    $ aws s3 sync saved_model_half_plus_two_cpu s3://<your_s3_bucket>/saved_model_half_plus_two
  9. 使用以下内容创建名为 tf_inference.yaml 的文件。更新--model_base_path以使用您的 S3 存储桶。您可以将它与 TensorFlow 或 TensorFlow 2 一起使用。要将其与 TensorFlow2 一起使用,请将 Docker 映像更改为 TensorFlow 2 映像。

    --- kind: Service apiVersion: v1 metadata: name: half-plus-two labels: app: half-plus-two spec: ports: - name: http-tf-serving port: 8500 targetPort: 8500 - name: grpc-tf-serving port: 9000 targetPort: 9000 selector: app: half-plus-two role: master type: ClusterIP --- kind: Deployment apiVersion: apps/v1 metadata: name: half-plus-two labels: app: half-plus-two role: master spec: replicas: 1 selector: matchLabels: app: half-plus-two role: master template: metadata: labels: app: half-plus-two role: master spec: containers: - name: half-plus-two image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference:1.15.0-cpu-py36-ubuntu18.04 command: - /usr/bin/tensorflow_model_server args: - --port=9000 - --rest_api_port=8500 - --model_name=saved_model_half_plus_two - --model_base_path=s3://tensorflow-trained-models/saved_model_half_plus_two ports: - containerPort: 8500 - containerPort: 9000 imagePullPolicy: IfNotPresent env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: key: AWS_ACCESS_KEY_ID name: aws-s3-secret - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: key: AWS_SECRET_ACCESS_KEY name: aws-s3-secret - name: AWS_REGION value: us-east-1 - name: S3_USE_HTTPS value: "true" - name: S3_VERIFY_SSL value: "true" - name: S3_ENDPOINT value: s3.us-east-1.amazonaws.com
  10. 将配置应用于之前定义的命名空间中的新 pod。

    $ kubectl -n ${NAMESPACE} apply -f tf_inference.yaml

    您的输出应类似于以下内容:

    service/half-plus-two created deployment.apps/half-plus-two created
  11. 检查 pod 的状态。

    $ kubectl get pods -n ${NAMESPACE}

    重复状态检查,直到您看到以下 “RUNNING” 状态:

    NAME READY STATUS RESTARTS AGE half-plus-two-vmwp9 1/1 Running 0 3m
  12. 要进一步描述 pod,您可以运行:

    $ kubectl describe pod <pod_name> -n ${NAMESPACE}
  13. 由于 serviceType 为 ClusterIP,您可以将端口从您的容器转发至您的主机。

    $ kubectl port-forward -n ${NAMESPACE} `kubectl get pods -n ${NAMESPACE} --selector=app=half-plus-two -o jsonpath='{.items[0].metadata.name}'` 8500:8500 &
  14. 将以下 json 字符串置于名为的文件中half_plus_two_input.json

    {"instances": [1.0, 2.0, 5.0]}
  15. 在模型上运行推理模型。

    $ curl -d @half_plus_two_input.json -X POST http://localhost:8500/v1/models/saved_model_half_plus_two_cpu:predict

    您的输出应与以下内容类似:

    { "predictions": [2.5, 3.0, 4.5 ] }

PyTorch CPU 推理

在此方法中,创建一个 Kubernetes 服务和部署,用于使用 PyTorch 运行 CPU 推理。Kubernetes 服务公开了一个进程及其端口。创建 Kubernetes 服务时,可以指定要使用的服务类型ServiceTypes. 默认ServiceTypeClusterIP. 部署负责确保一定数量的 Pod 始终启动并运行。

  1. 创建命名空间。您可能需要更改 kubeconfig 以指向正确的集群。验证您已设置 “training-cpu-1” 或将其更改为您的 CPU 集群的配置。有关如何设置群集的更多信息,请参阅。Amazon EK 设置.

    $ NAMESPACE=pt-inference; kubectl create namespace ${NAMESPACE}
  2. (使用公共模型时的可选步骤。) 在可装载的网络位置(如 Amazon S3)处设置您的模型。有关如何将训练后的模型上传到 S3,请参阅。TensorFlow CPU 推理. 将密钥应用于您的命名空间。有关密钥的更多信息,请参阅Kubernetes 密钥文档.

    $ kubectl -n ${NAMESPACE} apply -f secret.yaml
  3. 使用以下内容创建名为 pt_inference.yaml 的文件。此示例文件指定了模型、所使用的 PyTorch 推理图像以及模型的位置。此示例使用公共模型,因此您无需修改它。

    --- kind: Service apiVersion: v1 metadata: name: densenet-service labels: app: densenet-service spec: ports: - port: 8080 targetPort: mms selector: app: densenet-service --- kind: Deployment apiVersion: apps/v1 metadata: name: densenet-service labels: app: densenet-service spec: replicas: 1 selector: matchLabels: app: densenet-service template: metadata: labels: app: densenet-service spec: containers: - name: densenet-service image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-inference:1.3.1-cpu-py36-ubuntu16.04 args: - mxnet-model-server - --start - --mms-config /home/model-server/config.properties - --models densenet=https://dlc-samples.s3.amazonaws.com/pytorch/multi-model-server/densenet/densenet.mar ports: - name: mms containerPort: 8080 - name: mms-management containerPort: 8081 imagePullPolicy: IfNotPresent
  4. 将配置应用于之前定义的命名空间中的新 pod。

    $ kubectl -n ${NAMESPACE} apply -f pt_inference.yaml

    您的输出应类似于以下内容:

    service/densenet-service created deployment.apps/densenet-service created
  5. 检查 pod 的状态并等待 pod 处于 “RUNNING (正在运行)” 状态:

    $ kubectl get pods -n ${NAMESPACE} -w

    您的输出应类似于以下内容:

    NAME READY STATUS RESTARTS AGE densenet-service-xvw1 1/1 Running 0 3m
  6. 要进一步描述 pod,请运行以下命令:

    $ kubectl describe pod <pod_name> -n ${NAMESPACE}
  7. 由于此处的 serviceType 为 ClusterIP,您可以将端口从您的容器转发至您的主机。

    $ kubectl port-forward -n ${NAMESPACE} `kubectl get pods -n ${NAMESPACE} --selector=app=densenet-service -o jsonpath='{.items[0].metadata.name}'` 8080:8080 &
  8. 在启动您的服务器后,现在您可以使用以下命令从不同的窗口来运行推理:

    $ curl -O https://s3.amazonaws.com/model-server/inputs/flower.jpg curl -X POST http://127.0.0.1:8080/predictions/densenet -T flower.jpg

使用完集群后,请参阅 EKS 清除以获取有关清除集群的信息。

后续步骤

要了解如何在 Amazon EKS 上将自定义入口点与 Deep Learning Containers 结合使用,请参阅自定义入口点.