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

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

CPU推断

本节将指导您使用 PyTorch和 TensorFlow在EKSCPU集群的 Deep Learning Containers 上运行推理。

有关深度学习容器的完整列表,请参阅可用的深度学习容器映像

PyTorch CPU推断

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

  1. 创建命名空间。你可能需要更改 kubeconfig 以指向正确的集群。确认您已设置了 “training-cpu-1” 或将其更改为集群的配置。CPU有关设置集群的更多信息,请参阅亚马逊EKS设置

    $ 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: - multi-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理

TensorFlow CPU推断

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

  1. 创建命名空间。你可能需要更改 kubeconfig 以指向正确的集群。确认您已设置了 “training-cpu-1” 或将其更改为集群的配置。CPU有关设置集群的更多信息,请参阅亚马逊EKS设置

    $ NAMESPACE=tf-inference; kubectl —kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-cpu-1 create namespace ${NAMESPACE}
  2. 可以用不同的方式检索用于推理的模型,例如使用共享卷和 Amazon S3。由于 Kubernetes 服务需要访问亚马逊 S3 和亚马逊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. 克隆 tensorf low 服务存储库。

    $ 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 一起使用。要将其与 TensorFlow 2 一起使用,请将 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 ] }

后续步骤

要了解如何在亚马逊上将自定义入口点与 Deep Learning Containers 配合使用EKS,请参阅。自定义入口点