本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在适用于亚马逊的 Deep Learning Containers 上运行推理 ECS
本节介绍如何使用 Apache(孵化)、、和 2 在适用于亚马逊弹性容器服务(亚马逊ECS)的 Dee AWS p Learning Conta MXNet iners 上运行推理。 PyTorch TensorFlow TensorFlow 你也可以使用 Elastic Inference 通过 Dee AWS p Learning Containers 运行推理。有关 Elastic Inference 的教程和更多信息,请参阅亚马逊上将AWS 深度学习容器与 Elastic Inference 结合使用。ECS
有关 Deep Learning Containers 的完整列表,请参阅深度学习容器图片。
注意
MKL用户:阅读AWS Deep Learning Containers 英特尔数学内核库 (MKL) 建议以获得最佳的训练或推理性能。
重要
如果您的账户已经创建了 Amazon ECS 服务相关角色,则除非您在此处指定角色,否则该角色将默认用于您的服务。如果您的任务定义使用 awsvpc 网络模式,则需要服务相关角色。如果服务配置为使用服务发现、外部部署控制器、多个目标组或 Elastic Inference 加速器,则也需要该角色,在这种情况下,您不应在此处指定角色。有关更多信息,请参阅《亚马逊ECS开发者指南》ECS中的使用亚马逊服务相关角色。
TensorFlow推断
以下示例使用一个示例 Docker 镜像,该镜像通过主机的命令行向 Deep Learn GPU ing Containers 添加CPU或推理脚本。
CPU基于推理
使用以下示例进行CPU基于运行的推理。
-
使用以下内容创建名为
ecs-dlc-cpu-inference-taskdef.json
的文件。你可以将其与 TensorFlow 或 TensorFlow 2 一起使用。要将其与 TensorFlow 2 一起使用,请将 Docker 镜像更改为 TensorFlow 2 镜像,然后克隆 r2.0 服务存储库分支而不是 r1.15。{ "requiresCompatibilities": [ "EC2" ], "containerDefinitions": [{ "command": [ "mkdir -p /test && cd /test && git clone -b r1.15 https://github.com/tensorflow/serving.git && tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=saved_model_half_plus_two --model_base_path=/test/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu" ], "entryPoint": [ "sh", "-c" ], "name": "
tensorflow-inference-container
", "image": "763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference:1.15.0-cpu-py36-ubuntu18.04
", "memory":8111
, "cpu":256
, "essential": true, "portMappings": [{ "hostPort": 8500, "protocol": "tcp", "containerPort": 8500 }, { "hostPort": 8501, "protocol": "tcp", "containerPort": 8501 }, { "containerPort": 80, "protocol": "tcp" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/tensorflow-inference-gpu", "awslogs-region": "us-east-1
", "awslogs-stream-prefix": "half-plus-two
", "awslogs-create-group": "true" } } }], "volumes": [], "networkMode": "bridge", "placementConstraints": [], "family": "tensorflow-inference
" } -
注册任务定义。记下输出中的修订版号,并在下一步中使用它。
aws ecs register-task-definition --cli-input-json file://
ecs-dlc-cpu-inference-taskdef.json
-
创建亚马逊ECS服务。指定任务定义时,请
revision_id
用上一步输出中任务定义的修订版号替换。aws ecs create-service --cluster
ecs-ec2-training-inference
\ --service-namecli-ec2-inference-cpu
\ --task-definitionEc2TFInference:revision_id
\ --desired-count1
\ --launch-typeEC2
\ --scheduling-strategy="REPLICA
" \ --regionus-east-1
-
通过完成以下步骤来验证服务并获取网络终端节点。
-
在 https://console.aws.amazon.com/ecs/v2
中打开控制台。 -
选择
ecs-ec2-training-inference
集群。 -
在 Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu。
-
任务处于
RUNNING
状态后,选择任务标识符。 -
在 “日志” 下,选择 “查看登录信息” CloudWatch。这会将您带到 CloudWatch 控制台查看训练进度日志。
-
在 Containers (容器) 下,展开容器详细信息。
-
在 “名称” 和 “网络绑定” 下,在 “外部链接” 下记下端口 8501 的 IP 地址,并在下一步中使用它。
-
-
要运行推理,请使用以下命令。将外部 IP 地址替换为上一步中的外部链接 IP 地址。
curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://
<External ip>
:8501/v1/models/saved_model_half_plus_two:predict下面是示例输出。
{ "predictions": [2.5, 3.0, 4.5 ] }
重要
如果您无法连接到外部 IP 地址,请确保您的公司防火墙没有阻止非标准端口,例如 8501。您可以尝试切换至来宾网络来验证。
GPU基于推理
使用以下示例进行GPU基于运行的推理。
-
使用以下内容创建名为
ecs-dlc-gpu-inference-taskdef.json
的文件。你可以将其与 TensorFlow 或 TensorFlow 2 一起使用。要将其与 TensorFlow 2 一起使用,请将 Docker 镜像更改为 TensorFlow 2 镜像,然后克隆 r2.0 服务存储库分支而不是 r1.15。{ "requiresCompatibilities": [ "EC2" ], "containerDefinitions": [{ "command": [ "mkdir -p /test && cd /test && git clone -b r1.15 https://github.com/tensorflow/serving.git && tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=saved_model_half_plus_two --model_base_path=/test/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu" ], "entryPoint": [ "sh", "-c" ], "name": "
tensorflow-inference-container
", "image": "763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference:1.15.0-gpu-py36-cu100-ubuntu18.04
", "memory":8111
, "cpu":256
, "resourceRequirements": [{ "type": "GPU", "value": "1" }], "essential": true, "portMappings": [{ "hostPort": 8500, "protocol": "tcp", "containerPort": 8500 }, { "hostPort": 8501, "protocol": "tcp", "containerPort": 8501 }, { "containerPort": 80, "protocol": "tcp" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/TFInference", "awslogs-region": "us-east-1
", "awslogs-stream-prefix": "ecs
", "awslogs-create-group": "true" } } }], "volumes": [], "networkMode": "bridge", "placementConstraints": [], "family": "TensorFlowInference
" } -
注册任务定义。记下输出中的修订版号,并在下一步中使用它。
aws ecs register-task-definition --cli-input-json file://
ecs-dlc-gpu-inference-taskdef.json
-
创建亚马逊ECS服务。指定任务定义时,请
revision_id
用上一步输出中任务定义的修订版号替换。aws ecs create-service --cluster
ecs-ec2-training-inference
\ --service-namecli-ec2-inference-gpu
\ --task-definitionEc2TFInference:revision_id
\ --desired-count1
\ --launch-typeEC2
\ --scheduling-strategy="REPLICA
" \ --regionus-east-1
-
通过完成以下步骤来验证服务并获取网络终端节点。
-
在 https://console.aws.amazon.com/ecs/v2
中打开控制台。 -
选择
ecs-ec2-training-inference
集群。 -
在 Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu。
-
任务处于
RUNNING
状态后,选择任务标识符。 -
在 “日志” 下,选择 “查看登录信息” CloudWatch。这会将您带到 CloudWatch 控制台查看训练进度日志。
-
在 Containers (容器) 下,展开容器详细信息。
-
在 “名称” 和 “网络绑定” 下,在 “外部链接” 下记下端口 8501 的 IP 地址,并在下一步中使用它。
-
-
要运行推理,请使用以下命令。将外部 IP 地址替换为上一步中的外部链接 IP 地址。
curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://
<External ip>
:8501/v1/models/saved_model_half_plus_two:predict下面是示例输出。
{ "predictions": [2.5, 3.0, 4.5 ] }
重要
如果您无法连接到外部 IP 地址,请确保您的公司防火墙没有阻止非标准端口,例如 8501。您可以尝试切换至来宾网络来验证。
ApacheMXNet(孵化中)推断
必须先注册任务定义,然后才能在 Amazon ECS 集群上运行任务。任务定义是分组在一起的一系列容器。以下示例使用一个示例 Docker 镜像,该镜像通过主机的命令行向 Deep Learn GPU ing Containers 添加CPU或推理脚本。
CPU基于推理
使用以下任务定义进行CPU基于运行的推理。
-
使用以下内容创建名为
ecs-dlc-cpu-inference-taskdef.json
的文件。{ "requiresCompatibilities": [ "EC2" ], "containerDefinitions": [{ "command": [ "mxnet-model-server --start --mms-config /home/model-server/config.properties --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model" ], "name": "
mxnet-inference-container
", "image": "763104351884.dkr.ecr.us-east-1.amazonaws.com/mxnet-inference:1.6.0-cpu-py36-ubuntu16.04
", "memory":8111
, "cpu":256
, "essential": true, "portMappings": [{ "hostPort": 8081, "protocol": "tcp", "containerPort": 8081 }, { "hostPort": 80, "protocol": "tcp", "containerPort": 8080 } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/mxnet-inference-cpu", "awslogs-region": "us-east-1
", "awslogs-stream-prefix": "squeezenet
", "awslogs-create-group": "true" } } }], "volumes": [], "networkMode": "bridge", "placementConstraints": [], "family": "mxnet-inference
" } -
注册任务定义。记下输出中的修订版号,并在下一步中使用它。
aws ecs register-task-definition --cli-input-json file://
ecs-dlc-cpu-inference-taskdef.json
-
创建亚马逊ECS服务。指定任务定义时,请
revision_id
用上一步输出中任务定义的修订版号替换。aws ecs create-service --cluster
ecs-ec2-training-inference
\ --service-namecli-ec2-inference-cpu
\ --task-definitionEc2TFInference:revision_id
\ --desired-count1
\ --launch-typeEC2
\ --scheduling-strategyREPLICA
\ --regionus-east-1
-
验证服务并获取终端节点。
-
在 https://console.aws.amazon.com/ecs/v2
中打开控制台。 -
选择
ecs-ec2-training-inference
集群。 -
在 Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu。
-
任务处于
RUNNING
状态后,选择任务标识符。 -
在 “日志” 下,选择 “查看登录信息” CloudWatch。这会将您带到 CloudWatch 控制台查看训练进度日志。
-
在 Containers (容器) 下,展开容器详细信息。
-
在 “名称” 和 “网络绑定” 下,在 “外部链接” 下记下端口 8081 的 IP 地址,并在下一步中使用该地址。
-
-
要运行推理,请使用以下命令。将该
external IP
地址替换为上一步中的外部链接 IP 地址。curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg curl -X POST http://
<External ip>
/predictions/squeezenet -T kitten.jpg下面是示例输出。
[ { "probability": 0.8582226634025574, "class": "n02124075 Egyptian cat" }, { "probability": 0.09160050004720688, "class": "n02123045 tabby, tabby cat" }, { "probability": 0.037487514317035675, "class": "n02123159 tiger cat" }, { "probability": 0.0061649843119084835, "class": "n02128385 leopard, Panthera pardus" }, { "probability": 0.003171598305925727, "class": "n02127052 lynx, catamount" } ]
重要
如果您无法连接到外部 IP 地址,请确保您的企业防火墙不会阻止非标准端口,如 8081。您可以尝试切换至来宾网络来验证。
GPU基于推理
使用以下任务定义进行GPU基于运行的推理。
{ "requiresCompatibilities": [ "EC2" ], "containerDefinitions": [{ "command": [ "mxnet-model-server --start --mms-config /home/model-server/config.properties --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model" ], "name": "
mxnet-inference-container
", "image": "763104351884.dkr.ecr.us-east-1.amazonaws.com/mxnet-inference:1.6.0-gpu-py36-cu101-ubuntu16.04
", "memory":8111
, "cpu":256
, "resourceRequirements": [{ "type": "GPU", "value": "1" }], "essential": true, "portMappings": [{ "hostPort": 8081, "protocol": "tcp", "containerPort": 8081 }, { "hostPort": 80, "protocol": "tcp", "containerPort": 8080 } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/mxnet-inference-gpu", "awslogs-region": "us-east-1
", "awslogs-stream-prefix": "squeezenet
", "awslogs-create-group": "true" } } }], "volumes": [], "networkMode": "bridge", "placementConstraints": [], "family": "mxnet-inference
" }
-
使用以下命令注册任务定义。记下修订号的输出,并在下一步中使用它。
aws ecs register-task-definition --cli-input-json file://
<Task definition file>
-
要创建服务,请在以下命令中将
revision_id
替换为上一步中的输出。aws ecs create-service --cluster
ecs-ec2-training-inference
\ --service-namecli-ec2-inference-gpu
\ --task-definitionEc2TFInference:<revision_id>
\ --desired-count1
\ --launch-type "EC2
" \ --scheduling-strategyREPLICA
\ --regionus-east-1
-
验证服务并获取终端节点。
-
在 https://console.aws.amazon.com/ecs/v2
中打开控制台。 -
选择
ecs-ec2-training-inference
集群。 -
在 Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu。
-
任务处于
RUNNING
状态后,选择任务标识符。 -
在 “日志” 下,选择 “查看登录信息” CloudWatch。这会将您带到 CloudWatch 控制台查看训练进度日志。
-
在 Containers (容器) 下,展开容器详细信息。
-
在 “名称” 和 “网络绑定” 下,在 “外部链接” 下记下端口 8081 的 IP 地址,并在下一步中使用该地址。
-
-
要运行推理,请使用以下命令。将该
external IP
地址替换为上一步中的外部链接 IP 地址。curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg curl -X POST http://
<External ip>
/predictions/squeezenet -T kitten.jpg下面是示例输出。
[ { "probability": 0.8582226634025574, "class": "n02124075 Egyptian cat" }, { "probability": 0.09160050004720688, "class": "n02123045 tabby, tabby cat" }, { "probability": 0.037487514317035675, "class": "n02123159 tiger cat" }, { "probability": 0.0061649843119084835, "class": "n02128385 leopard, Panthera pardus" }, { "probability": 0.003171598305925727, "class": "n02127052 lynx, catamount" } ]
重要
如果您无法连接到外部 IP 地址,请确保您的企业防火墙不会阻止非标准端口,如 8081。您可以尝试切换至来宾网络来验证。
PyTorch 推断
必须先注册任务定义,然后才能在 Amazon ECS 集群上运行任务。任务定义是分组在一起的一系列容器。以下示例使用一个示例 Docker 镜像,该镜像向 Deep Learning C CPU on GPU tainers 添加了或推理脚本。
CPU基于推理
使用以下任务定义进行CPU基于运行的推理。
-
使用以下内容创建名为
ecs-dlc-cpu-inference-taskdef.json
的文件。{ "requiresCompatibilities": [ "EC2" ], "containerDefinitions": [{ "command": [ "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" ], "name":
"pytorch-inference-container"
, "image":"763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-inference:1.3.1-cpu-py36-ubuntu16.04"
, "memory":8111
, "cpu":256
, "essential": true, "portMappings": [{ "hostPort": 8081, "protocol": "tcp", "containerPort": 8081 }, { "hostPort": 80, "protocol": "tcp", "containerPort": 8080 } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/densenet-inference-cpu", "awslogs-region":"us-east-1"
, "awslogs-stream-prefix":"densenet"
, "awslogs-create-group": "true" } } }], "volumes": [], "networkMode": "bridge", "placementConstraints": [], "family":"pytorch-inference"
} -
注册任务定义。记下输出中的修订版号,并在下一步中使用它。
aws ecs register-task-definition --cli-input-json file://
ecs-dlc-cpu-inference-taskdef.json
-
创建亚马逊ECS服务。指定任务定义时,请
revision_id
用上一步输出中任务定义的修订版号替换。aws ecs create-service --cluster
ecs-ec2-training-inference
\ --service-namecli-ec2-inference-cpu
\ --task-definitionEc2PTInference:revision_id
\ --desired-count1
\ --launch-typeEC2
\ --scheduling-strategyREPLICA
\ --regionus-east-1
-
通过完成以下步骤来验证服务并获取网络终端节点。
-
在 https://console.aws.amazon.com/ecs/v2
中打开控制台。 -
选择
ecs-ec2-training-inference
集群。 -
在 Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu。
-
任务处于
RUNNING
状态后,选择任务标识符。 -
在 “日志” 下,选择 “查看登录信息” CloudWatch。这会将您带到 CloudWatch 控制台查看训练进度日志。
-
在 Containers (容器) 下,展开容器详细信息。
-
在 “名称” 和 “网络绑定” 下,在 “外部链接” 下记下端口 8081 的 IP 地址,并在下一步中使用该地址。
-
-
要运行推理,请使用以下命令。将该
external IP
地址替换为上一步中的外部链接 IP 地址。curl -O https://s3.amazonaws.com/model-server/inputs/flower.jpg curl -X POST http://
<External ip>
/predictions/densenet -T flower.jpg重要
如果您无法连接到外部 IP 地址,请确保您的企业防火墙不会阻止非标准端口,如 8081。您可以尝试切换至来宾网络来验证。
GPU基于推理
使用以下任务定义进行GPU基于运行的推理。
{ "requiresCompatibilities": [ "EC2" ], "containerDefinitions": [{ "command": [ "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" ], "name":
"pytorch-inference-container"
, "image":"763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-inference:1.3.1-gpu-py36-cu101-ubuntu16.04"
, "memory":8111
, "cpu":256
, "essential": true, "portMappings": [{ "hostPort": 8081, "protocol": "tcp", "containerPort": 8081 }, { "hostPort": 80, "protocol": "tcp", "containerPort": 8080 } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/densenet-inference-cpu", "awslogs-region":"us-east-1"
, "awslogs-stream-prefix":"densenet"
, "awslogs-create-group": "true" } } }], "volumes": [], "networkMode": "bridge", "placementConstraints": [], "family":"pytorch-inference"
}
-
使用以下命令注册任务定义。记下修订号的输出,并在下一步中使用它。
aws ecs register-task-definition --cli-input-json file://
<Task definition file>
-
要创建服务,请在以下命令中将
revision_id
替换为上一步中的输出。aws ecs create-service --cluster
ecs-ec2-training-inference
\ --service-namecli-ec2-inference-gpu
\ --task-definitionEc2PTInference:<revision_id>
\ --desired-count1
\ --launch-type "EC2
" \ --scheduling-strategyREPLICA
\ --regionus-east-1
-
通过完成以下步骤来验证服务并获取网络终端节点。
-
在 https://console.aws.amazon.com/ecs/v2
中打开控制台。 -
选择
ecs-ec2-training-inference
集群。 -
在 Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu。
-
任务处于
RUNNING
状态后,选择任务标识符。 -
在 “日志” 下,选择 “查看登录信息” CloudWatch。这会将您带到 CloudWatch 控制台查看训练进度日志。
-
在 Containers (容器) 下,展开容器详细信息。
-
在 “名称” 和 “网络绑定” 下,在 “外部链接” 下记下端口 8081 的 IP 地址,并在下一步中使用该地址。
-
-
要运行推理,请使用以下命令。将该
external IP
地址替换为上一步中的外部链接 IP 地址。curl -O https://s3.amazonaws.com/model-server/inputs/flower.jpg curl -X POST http://
<External ip>
/predictions/densenet -T flower.jpg重要
如果您无法连接到外部 IP 地址,请确保您的企业防火墙不会阻止非标准端口,如 8081。您可以尝试切换至来宾网络来验证。
后续步骤
要了解如何在亚马逊的 Deep Learning Containers 中使用自定义入口点ECS,请参阅。Amazon 的自定义入口点 ECS