深度学习 AMI
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

推理

本部分将指导您如何使用 MXNet、PyTorch 和 TensorFlow 在 ECS 的 AWS Deep Learning Containers上运行推理。

有关 AWS Deep Learning Containers的完整列表,请参阅Deep Learning Containers映像

注意

MKL 用户:读取 AWS Deep Learning Containers MKL 建议以获得最佳训练或推理性能。

TensorFlow 推理

以下示例使用将 CPU 或 GPU 推理脚本添加到 AWS Deep Learning Containers的示例 Docker 映像。

基于 CPU 的推理

使用以下示例运行基于 CPU 的推理。

  1. 使用以下内容创建名为 ecs-dlc-cpu-inference-taskdef.json 的文件。

    { "requiresCompatibilities": [ "EC2" ], "containerDefinitions": [{ "command": [ "mkdir -p /test && cd /test && git clone -b r1.14 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.14.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" }
  2. 注册任务定义。记下输出中的修订号。

    aws ecs register-task-definition --cli-input-json file://ecs-dlc-cpu-inference-taskdef.json
  3. 创建 Amazon ECS 服务。当指定任务定义时,请将 revision_id 替换为上一步的输出中任务定义的修订号。

    aws ecs create-service --cluster ecs-ec2-training-inference \ --service-name cli-ec2-inference-cpu \ --task-definition Ec2TFInference:revision_id \ --desired-count 1 \ --launch-type EC2 \ --scheduling-strategy="REPLICA" \ --region us-east-1
  4. 通过完成以下步骤来验证服务并获取网络终端节点。

    1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

    2. 选择 ecs-ec2-training-inference 集群。

    3. Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu

    4. 一旦您的任务处于 RUNNING 状态,请选择任务 ID。

    5. Containers (容器) 下,展开容器详细信息。

    6. Name (名称)Network Bindings (网络绑定) 下,在 External Link (外部链接) 下,记下端口 8501 的 IP 地址。

    7. Log Configuration (日志配置) 下,选择 View logs in CloudWatch (查看 CloudWatch 中的日志 )。这会将您转到 CloudWatch 控制台以查看训练进度日志。

  5. 要运行推理,请使用以下命令,并且将外部 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 ] }

    重要

    If you are unable to connect to the external IP address, be sure that your corporate firewall is not blocking non-standards ports, like 8501. You can try switching to a guest network to verify.

基于 GPU 的推理

使用以下示例运行基于 GPU 的推理。

  1. 使用以下内容创建名为 ecs-dlc-gpu-inference-taskdef.json 的文件。

    { "requiresCompatibilities": [ "EC2" ], "containerDefinitions": [{ "command": [ "mkdir -p /test && cd /test && git clone -b r1.13 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" ], "entryPoint": [ "sh", "-c" ], "name": "tensorflow-inference-container", "image": "763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference:1.14.0-gpu-py36-cu100-ubuntu16.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" }
  2. 注册任务定义。记下输出中的修订号。

    aws ecs register-task-definition --cli-input-json file://ecs-dlc-gpu-inference-taskdef.json
  3. 创建 Amazon ECS 服务。当指定任务定义时,请将 revision_id 替换为上一步的输出中任务定义的修订号。

    aws ecs create-service --cluster ecs-ec2-training-inference \ --service-name cli-ec2-inference-gpu \ --task-definition Ec2TFInference:revision_id \ --desired-count 1 \ --launch-type EC2 \ --scheduling-strategy="REPLICA" \ --region us-east-1
  4. 通过完成以下步骤来验证服务并获取网络终端节点。

    1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

    2. 选择 ecs-ec2-training-inference 集群。

    3. Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu

    4. 一旦您的任务处于 RUNNING 状态,请选择任务 ID。

    5. Containers (容器) 下,展开容器详细信息。

    6. Name (名称)Network Bindings (网络绑定) 下,在 External Link (外部链接) 下,记下端口 8501 的 IP 地址。

    7. Log Configuration (日志配置) 下,选择 View logs in CloudWatch (查看 CloudWatch 中的日志 )。这会将您转到 CloudWatch 控制台以查看训练进度日志。

  5. 要运行推理,请使用以下命令,并且将外部 IP 地址替换为上一步中的外部链接 IP 地址。

    curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://<External ip>:8501/v1/models/saved_model_half_plus_two_gpu:predict

    下面是示例输出。

    { "predictions": [2.5, 3.0, 4.5 ] }

    重要

    If you are unable to connect to the external IP address, be sure that your corporate firewall is not blocking non-standards ports, like 8501. You can try switching to a guest network to verify.

MXNet 推理

您必须先注册任务定义才能在 ECS 集群上运行任务。任务定义是分组在一起的一系列容器。以下示例使用将 CPU 或 GPU 推理脚本添加到 AWS Deep Learning Containers的示例 Docker 映像。

基于 CPU 的推理

使用以下任务定义运行基于 CPU 的推理。

  1. 使用以下内容创建名为 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.4.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/mxnet-inference-cpu", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "squeezenet", "awslogs-create-group": "true" } } }], "volumes": [], "networkMode": "bridge", "placementConstraints": [], "family": "mxnet-inference" }
  2. 注册任务定义。记下输出中的修订号。

    aws ecs register-task-definition --cli-input-json file://ecs-dlc-cpu-inference-taskdef.json
  3. 创建 Amazon ECS 服务。当指定任务定义时,请将 revision_id 替换为上一步的输出中任务定义的修订号。

    aws ecs create-service --cluster ecs-ec2-training-inference \ --service-name cli-ec2-inference-cpu \ --task-definition Ec2TFInference:revision_id \ --desired-count 1 \ --launch-type EC2 \ --scheduling-strategy REPLICA \ --region us-east-1
  4. 验证服务并获取终端节点。

    1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

    2. 选择 ecs-ec2-training-inference 集群。

    3. Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu

    4. 一旦您的任务处于 RUNNING 状态,请选择任务 ID。

    5. Containers (容器) 下,展开容器详细信息。

    6. Name (名称)Network Bindings (网络绑定) 下,在 External Link (外部链接) 下,记下端口 8501 的 IP 地址。

    7. Log Configuration (日志配置) 下,选择 View logs in CloudWatch (查看 CloudWatch 中的日志 )。这会将您转到 CloudWatch 控制台以查看训练进度日志。

  5. 要运行推理,请使用以下命令。

    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" } ]

    重要

    If you are unable to connect to the external IP address, be sure that your corporate firewall is not blocking non-standards ports, like 8501. You can try switching to a guest network to verify.

基于 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.4.1-gpu-py36-cu100-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" }
  1. 使用以下命令注册任务定义。记下修订号的输出。

    aws ecs register-task-definition --cli-input-json file://<Task definition file>
  2. 要创建服务,请在以下命令中将 revision_id 替换为上一步中的输出。

    aws ecs create-service --cluster ecs-ec2-training-inference \ --service-name cli-ec2-inference-gpu \ --task-definition Ec2TFInference:<revision_id> \ --desired-count 1 \ --launch-type "EC2" \ --scheduling-strategy REPLICA \ --region us-east-1
  3. 验证服务并获取终端节点。

    1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

    2. 选择 ecs-ec2-training-inference 集群。

    3. Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu

    4. 一旦您的任务处于 RUNNING 状态,请选择任务 ID。

    5. Containers (容器) 下,展开容器详细信息。

    6. Name (名称)Network Bindings (网络绑定) 下,在 External Link (外部链接) 下,记下端口 8501 的 IP 地址。

    7. Log Configuration (日志配置) 下,选择 View logs in CloudWatch (查看 CloudWatch 中的日志 )。这会将您转到 CloudWatch 控制台以查看训练进度日志。

  4. 要运行推理,请使用以下命令。

    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"
      }
    ]

    重要

    If you are unable to connect to the external IP address, be sure that your corporate firewall is not blocking non-standards ports, like 8501. You can try switching to a guest network to verify.

PyTorch 推理

您必须先注册任务定义才能在 ECS 集群上运行任务。任务定义是分组在一起的一系列容器。以下示例使用将 CPU 或 GPU 推理脚本添加到 AWS Deep Learning Containers的示例 Docker 映像。

基于 CPU 的推理

使用以下任务定义运行基于 CPU 的推理。

  1. 使用以下内容创建名为 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.2.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/densenet-inference-cpu", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "densenet", "awslogs-create-group": "true" } } }], "volumes": [], "networkMode": "bridge", "placementConstraints": [], "family": "pytorch-inference" }
  2. 注册任务定义。记下输出中的修订号。

    aws ecs register-task-definition --cli-input-json file://ecs-dlc-cpu-inference-taskdef.json
  3. 创建 Amazon ECS 服务。当指定任务定义时,请将 revision_id 替换为上一步的输出中任务定义的修订号。

    aws ecs create-service --cluster ecs-ec2-training-inference \ --service-name cli-ec2-inference-cpu \ --task-definition Ec2PTInference:revision_id \ --desired-count 1 \ --launch-type EC2 \ --scheduling-strategy REPLICA \ --region us-east-1
  4. 通过完成以下步骤来验证服务并获取网络终端节点。

    1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

    2. 选择 ecs-ec2-training-inference 集群。

    3. Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu

    4. 一旦您的任务处于 RUNNING 状态,请选择任务 ID。

    5. Containers (容器) 下,展开容器详细信息。

    6. Name (名称)Network Bindings (网络绑定) 下,在 External Link (外部链接) 下,记下端口 8501 的 IP 地址。

    7. Log Configuration (日志配置) 下,选择 View logs in CloudWatch (查看 CloudWatch 中的日志 )。这会将您转到 CloudWatch 控制台以查看训练进度日志。

  5. 要运行推理,请使用以下命令。

    curl -O https://s3.amazonaws.com/model-server/inputs/flower.jpg curl -X POST http://<External ip>/predictions/densenet -T flower.jpg

    重要

    If you are unable to connect to the external IP address, be sure that your corporate firewall is not blocking non-standards ports, like 8501. You can try switching to a guest network to verify.

基于 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.2.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/densenet-inference-cpu", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "densenet", "awslogs-create-group": "true" } } }], "volumes": [], "networkMode": "bridge", "placementConstraints": [], "family": "pytorch-inference" }
  1. 使用以下命令注册任务定义。记下修订号的输出。

    aws ecs register-task-definition --cli-input-json file://<Task definition file>
  2. 要创建服务,请在以下命令中将 revision_id 替换为上一步中的输出。

    aws ecs create-service --cluster ecs-ec2-training-inference \ --service-name cli-ec2-inference-gpu \ --task-definition Ec2PTInference:<revision_id> \ --desired-count 1 \ --launch-type "EC2" \ --scheduling-strategy REPLICA \ --region us-east-1
  3. 通过完成以下步骤来验证服务并获取网络终端节点。

    1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

    2. 选择 ecs-ec2-training-inference 集群。

    3. Cluster (集群) 页面上,选择 Services (服务),然后选择 cli-ec2-inference-cpu

    4. 一旦您的任务处于 RUNNING 状态,请选择任务 ID。

    5. Containers (容器) 下,展开容器详细信息。

    6. Name (名称)Network Bindings (网络绑定) 下,在 External Link (外部链接) 下,记下端口 8501 的 IP 地址。

    7. Log Configuration (日志配置) 下,选择 View logs in CloudWatch (查看 CloudWatch 中的日志 )。这会将您转到 CloudWatch 控制台以查看训练进度日志。

  4. 要运行推理,请使用以下命令。

    curl -O https://s3.amazonaws.com/model-server/inputs/flower.jpg curl -X POST http://<External ip>/predictions/densenet -T flower.jpg

    重要

    If you are unable to connect to the external IP address, be sure that your corporate firewall is not blocking non-standards ports, like 8501. You can try switching to a guest network to verify.