本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
GPU推断
本节介绍如何在EKSGPU集群的 Deep Learning Containers 上运行推理 PyTorch,以及。 TensorFlow
有关深度学习容器的完整列表,请参阅可用的深度学习容器映像
PyTorch GPU推断
在此方法中,创建一个 Kubernetes 服务和部署。Kubernetes 服务公开了一个进程及其端口。在创建 Kubernetes 服务时,您可以指定要使用的服务类型。ServiceTypes
默认 ServiceType
为 ClusterIP
。部署负责确保一定数量的 pod 始终处于启动和运行状态。
-
要进行 GPU-base 推断,请安装适用于 Kubernet NVIDIA es 的设备插件。
$
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.12/nvidia-device-plugin.yml -
验证运行 nvidia-device-plugin-daemonset是否正常。
$
kubectl get daemonset -n kube-system该输出值将类似于以下内容。
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE aws-node 3 3 3 3 3 <none> 6d kube-proxy 3 3 3 3 3 <none> 6d nvidia-device-plugin-daemonset 3 3 3 3 3 <none> 57s
-
创建命名空间。
$
NAMESPACE=pt-inference; kubectl create namespace ${NAMESPACE} -
(使用公共模型时的可选步骤。) 在可装载的网络位置(如 S3)处设置您的模型。请参阅使用推理一节中提及的将经过训练的模型上传到 S3 的步骤。 TensorFlow将密钥应用于您的命名空间。有关密钥的更多信息,请参阅 Kubernetes
密钥文档。 $
kubectl -n ${NAMESPACE} apply -f secret.yaml -
创建
pt_inference.yaml
文件。使用下一个代码块的内容作为其内容。--- 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-gpu-py36-cu101-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 resources: limits: cpu: 4 memory: 4Gi nvidia.com/gpu: 1 requests: cpu: "1" memory: 1Gi -
将配置应用于之前定义的命名空间中的新 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}您的输出应类似于以下内容:
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理。
TensorFlow GPU推断
在此方法中,创建一个 Kubernetes 服务和部署。Kubernetes 服务公开了一个进程及其端口。在创建 Kubernetes 服务时,您可以指定要使用的服务类型。ServiceTypes
默认 ServiceType
为 ClusterIP
。部署负责确保一定数量的 pod 始终处于启动和运行状态。
-
要进行 GPU-base 推断,请安装适用于 Kubernet NVIDIA es 的设备插件:
$
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.12/nvidia-device-plugin.yml -
验证运行 nvidia-device-plugin-daemonset是否正常。
$
kubectl get daemonset -n kube-system该输出值将类似于以下内容:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE aws-node 3 3 3 3 3 <none> 6d kube-proxy 3 3 3 3 3 <none> 6d nvidia-device-plugin-daemonset 3 3 3 3 3 <none> 57s
-
创建命名空间。您可能需要更改 kubeconfig 以指向正确的集群。确认您已设置了 “training-gpu-1” 或将其更改为集群的配置。GPU有关设置集群的更多信息,请参阅亚马逊EKS设置。
$
NAMESPACE=tf-inference; kubectl —kubeconfig=/home/ubuntu/.kube/eksctl/clusters/training-gpu-1 create namespace ${NAMESPACE} -
用于推理的模型可通过不同的方式进行检索,例如,使用共享卷、S3 等。由于该服务需要访问 S3 和ECR,因此您必须将 Amazon 凭证存储为 Kubernetes 密钥。在本示例中,您将使用 S3 来存储和提取训练后的模型。
检查您的 Amazon 凭证。这些凭证必须具有 S3 写入访问权限。
$
cat ~/.aws/credentials -
输出将类似于以下内容:
$
[default] aws_access_key_id = FAKEAWSACCESSKEYID aws_secret_access_key = FAKEAWSSECRETACCESSKEY -
使用 base64 对这些凭证进行编码。首先编码访问密钥。
$
echo -n '
FAKEAWSACCESSKEYID
' | base64接下来编码秘密访问密钥。
$
echo -n '
FAKEAWSSECRETACCESSKEYID
' | base64您的输出应类似于以下内容:
$ echo -n 'FAKEAWSACCESSKEYID' | base64 RkFLRUFXU0FDQ0VTU0tFWUlE $ echo -n 'FAKEAWSSECRETACCESSKEY' | base64 RkFLRUFXU1NFQ1JFVEFDQ0VTU0tFWQ==
-
创建 yaml 文件来存储密钥。在您的主目录中将该密钥另存为 secret.yaml。
apiVersion: v1 kind: Secret metadata: name: aws-s3-secret type: Opaque data: AWS_ACCESS_KEY_ID:
RkFLRUFXU0FDQ0VTU0tFWUlE
AWS_SECRET_ACCESS_KEY:RkFLRUFXU1NFQ1JFVEFDQ0VTU0tFWQ==
-
将密钥应用于您的命名空间:
$
kubectl -n ${NAMESPACE} apply -f secret.yaml -
在本示例中,您将克隆 tensorflow-serving
存储库并将预训练模型同步到 S3 存储桶。以下示例命名存储桶 tensorflow-serving-models
。它还将已保存的模型同步到名saved_model_half_plus_two_gpu
的 S3 存储桶。$
git clone https://github.com/tensorflow/serving/$
cd serving/tensorflow_serving/servables/tensorflow/testdata/ -
同步CPU模型。
$
aws s3 sync saved_model_half_plus_two_gpu s3://
<your_s3_bucket>
/saved_model_half_plus_two_gpu -
创建
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-gpu-py36-cu100-ubuntu18.04
command: - /usr/bin/tensorflow_model_server args: - --port=9000 - --rest_api_port=8500 - --model_name=saved_model_half_plus_two_gpu - --model_base_path=s3://tensorflow-trained-models
/saved_model_half_plus_two_gpu 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 resources: limits: cpu:4
memory:4Gi
nvidia.com/gpu: 1 requests: cpu: "1" memory: 1Gi -
将配置应用于之前定义的命名空间中的新 pod:
$
kubectl -n ${NAMESPACE} apply -f tf_inference.yaml您的输出应类似于以下内容:
service/
half-plus-two
created deployment.apps/half-plus-two
created -
检查 Pod 的状态并等待 pod 处于 “RUNNING” 状态:
$
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 ] }
后续步骤
要了解如何在亚马逊上将自定义入口点与 Deep Learning Containers 配合使用EKS,请参阅。自定义入口点