CPU推断 - AWS 深度学习容器

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

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,因此您必须将您的 AWS 证书存储为 Kubernetes 密钥。在本示例中,使用 S3 存储和获取经过训练的模型。

    验证您的 AWS 凭证。他们必须具有 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,请参阅。自定义入口点