本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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
. 默认ServiceType
是ClusterIP
. 部署负责确保一定数量的 Pod 始终启动并运行。
-
创建命名空间。您可能需要更改 kubeconfig 以指向正确的集群。验证您已设置 “training-cpu-1” 或将其更改为您的 CPU 集群的配置。有关如何设置群集的更多信息,请参阅。Amazon EK 设置.
$
NAMESPACE=mx-inference; kubectl —kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-cpu-1 create namespace ${NAMESPACE} -
(使用公共模型时的可选步骤。) 在可装载的网络位置(如 Amazon S3)处设置您的模型。有关如何将训练后的模型上传到 S3,请参阅。TensorFlow CPU 推理. 将密钥应用于您的命名空间。有关密钥的更多信息,请参阅Kubernetes 密钥文档
. $
kubectl -n ${NAMESPACE} apply -f secret.yaml -
使用以下内容创建名为
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 -
将配置应用于之前定义的命名空间中的新 pod。
$
kubectl -n ${NAMESPACE} apply -f mx_inference.yaml您的输出应类似于以下内容:
service/
squeezenet-service
created deployment.apps/squeezenet-service
created -
检查 pod 的状态。
$
kubectl get pods -n ${NAMESPACE}重复状态检查,直到您看到以下 “RUNNING” 状态:
NAME READY STATUS RESTARTS AGE
squeezenet-service
-xvw1 1/1 Running 0 3m -
要进一步描述 pod,请运行以下命令:
$
kubectl describe pod
<pod_name>
-n ${NAMESPACE} -
由于此处的 serviceType 为 ClusterIP,您可以使用以下命令将端口从您的容器转发至您的主机:
$
kubectl port-forward -n ${NAMESPACE} `kubectl get pods -n ${NAMESPACE} --selector=app=squeezenet-service
-o jsonpath='{.items[0].metadata.name}'` 8080:8080 & -
下载小猫的图像。
$
curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg -
使用小猫的图像对模型运行推理过程:
$
curl -X POST http://127.0.0.1:8080/predictions/squeezenet -T kitten.jpg
TensorFlow CPU 推理
在本教程中,创建一个 Kubernetes 服务和部署,用于使用 TensorFlow 来运行 CPU 推理。Kubernetes 服务公开了一个进程及其端口。创建 Kubernetes 服务时,可以指定要使用的服务类型ServiceTypes
. 默认ServiceType
是ClusterIP
. 部署负责确保一定数量的 Pod 始终启动并运行。
-
创建命名空间。您可能需要更改 kubeconfig 以指向正确的集群。验证您已设置 “training-cpu-1” 或将其更改为您的 CPU 集群的配置。有关如何设置群集的更多信息,请参阅。Amazon EK 设置.
$
NAMESPACE=tf-inference; kubectl —kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-cpu-1 create namespace ${NAMESPACE} -
用于推理的模型可通过不同的方式进行检索,例如,使用共享卷和 Amazon S3。由于 Kubernetes 服务需要访问 Amazon S3 和 Amazon ECR,因此您必须存储Amazon凭据作为 Kubernetes 秘密。在本示例中,请使用 S3 来存储和获取训练后的模型。
验证您的Amazon凭证。他们必须具有 S3 写入访问权限。
$
cat ~/.aws/credentials -
该输出值将类似于以下内容:
$
[default] aws_access_key_id =YOURACCESSKEYID
aws_secret_access_key =YOURSECRETACCESSKEY
-
使用 base64 对这些凭证进行编码。
首先编码访问密钥。
$
echo -n '
YOURACCESSKEYID
' | base64接下来编码秘密访问密钥。
$
echo -n '
YOURSECRETACCESSKEY
' | base64您的输出应类似于以下内容:
$ echo -n '
YOURACCESSKEYID
' | base64 RkFLRUFXU0FDQ0VTU0tFWUlE $ echo -n 'YOURSECRETACCESSKEY
' | base64 RkFLRUFXU1NFQ1JFVEFDQ0VTU0tFWQ== -
创建一个名为的文件
secret.yaml
并将以下内容置于您的主目录中。该文件用于存储密钥。apiVersion: v1 kind: Secret metadata: name: aws-s3-secret type: Opaque data: AWS_ACCESS_KEY_ID:
YOURACCESSKEYID
AWS_SECRET_ACCESS_KEY:YOURSECRETACCESSKEY
-
将密钥应用于您的命名空间。
$
kubectl -n ${NAMESPACE} apply -f secret.yaml -
克隆tensorflow 服务
存储库。 $
git clone https://github.com/tensorflow/serving/$
cd serving/tensorflow_serving/servables/tensorflow/testdata/ -
同步预训练后的
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 -
使用以下内容创建名为
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 -
将配置应用于之前定义的命名空间中的新 pod。
$
kubectl -n ${NAMESPACE} apply -f tf_inference.yaml您的输出应类似于以下内容:
service/
half-plus-two
created deployment.apps/half-plus-two
created -
检查 pod 的状态。
$
kubectl get pods -n ${NAMESPACE}重复状态检查,直到您看到以下 “RUNNING” 状态:
NAME READY STATUS RESTARTS AGE
half-plus-two
-vmwp9 1/1 Running 0 3m -
要进一步描述 pod,您可以运行:
$
kubectl describe pod
<pod_name>
-n ${NAMESPACE} -
由于 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 & -
将以下 json 字符串置于名为的文件中
half_plus_two_input.json
{"instances": [1.0, 2.0, 5.0]}
-
在模型上运行推理模型。
$
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
. 默认ServiceType
是ClusterIP
. 部署负责确保一定数量的 Pod 始终启动并运行。
-
创建命名空间。您可能需要更改 kubeconfig 以指向正确的集群。验证您已设置 “training-cpu-1” 或将其更改为您的 CPU 集群的配置。有关如何设置群集的更多信息,请参阅。Amazon EK 设置.
$
NAMESPACE=pt-inference; kubectl create namespace ${NAMESPACE} -
(使用公共模型时的可选步骤。) 在可装载的网络位置(如 Amazon S3)处设置您的模型。有关如何将训练后的模型上传到 S3,请参阅。TensorFlow CPU 推理. 将密钥应用于您的命名空间。有关密钥的更多信息,请参阅Kubernetes 密钥文档
. $
kubectl -n ${NAMESPACE} apply -f secret.yaml -
使用以下内容创建名为
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 -
将配置应用于之前定义的命名空间中的新 pod。
$
kubectl -n ${NAMESPACE} apply -f pt_inference.yaml您的输出应类似于以下内容:
service/
densenet-service
created deployment.apps/densenet-service
created -
检查 pod 的状态并等待 pod 处于 “RUNNING (正在运行)” 状态:
$
kubectl get pods -n ${NAMESPACE} -w您的输出应类似于以下内容:
NAME READY STATUS RESTARTS AGE densenet-service-xvw1 1/1 Running 0 3m
-
要进一步描述 pod,请运行以下命令:
$
kubectl describe pod
<pod_name>
-n ${NAMESPACE} -
由于此处的 serviceType 为 ClusterIP,您可以将端口从您的容器转发至您的主机。
$
kubectl port-forward -n ${NAMESPACE} `kubectl get pods -n ${NAMESPACE} --selector=app=densenet-service
-o jsonpath='{.items[0].metadata.name}'` 8080:8080 & -
在启动您的服务器后,现在您可以使用以下命令从不同的窗口来运行推理:
$
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 结合使用,请参阅自定义入口点.