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

AWS Deep Learning Containers MKL 建议

针对 CPU 容器的 MKL 建议

CPU 实例上深度学习框架的训练和推理工作负载的性能情形不一,具体取决于各种配置设置。例如,在 AWS EC2 c5.18xlarge 实例上,物理内核数为 36,而逻辑内核数为 72。MKL 的训练和推理的配置设置受这些因素影响。通过更新 MKL 的配置来匹配实例功能,则有可能实现性能改进。

请考虑以下使用 Intel-MKL 优化的 TensorFlow 二进制的示例:

  • 据对一个 ResNet50v2 模型(该模型使用 TensorFlow 来训练,训练好后使用TensorFlow Serving 来推理)的观察,当 MKL 设置调整到匹配实例的内核数量时,推理性能提高 2 倍。以下设置用于 c5.18xlarge 实例。

export TENSORFLOW_INTER_OP_PARALLELISM=2 # For an EC2 c5.18xlarge instance, number of logical cores = 72 export TENSORFLOW_INTRA_OP_PARALLELISM=72 # For an EC2 c5.18xlarge instance, number of physical cores = 36 export OMP_NUM_THREADS=36 export KMP_AFFINITY='granularity=fine,verbose,compact,1,0' # For an EC2 c5.18xlarge instance, number of physical cores / 4 = 36 /4 = 9 export TENSORFLOW_SESSION_PARALLELISM=9 export KMP_BLOCKTIME=1 export KMP_SETTINGS=0
  • 据对一个 ResNet50_v1.5 模型(该模型使用 TensorFlow 在 ImageNet 数据集上训练,并且使用 NHWC 图像形状)的观察,训练吞吐量性能加快了 9 倍左右。比较对象为未进行 MKL 优化的二级制,用“样本数/秒”指标来进行度量。使用以下环境变量:

export TENSORFLOW_INTER_OP_PARALLELISM=0 # For an EC2 c5.18xlarge instance, number of logical cores = 72 export TENSORFLOW_INTRA_OP_PARALLELISM=72 # For an EC2 c5.18xlarge instance, number of physical cores = 36 export OMP_NUM_THREADS=36 export KMP_AFFINITY='granularity=fine,verbose,compact,1,0' # For an EC2 c5.18xlarge instance, number of physical cores / 4 = 36 /4 = 9 export KMP_BLOCKTIME=1 export KMP_SETTINGS=0

以下链接将帮助您了解如何调整 Intel MKL 和您的深度学习框架设置,以优化深度学习工作负载:

设置环境变量的 EC2 指南 

请参阅 docker run 文档,了解在创建容器时如何设置环境变量:https://docs.docker.com/engine/reference/run/#env-environment-variables

下面是为 docker run 设置称为 OMP_NUM_THREADS 的环境变量的一个示例。

ubuntu@ip-172-31-95-248:~$ docker run -e OMP_NUM_THREADS=36 -it --entrypoint "" 999999999999.dkr.ecr.us-east-1.amazonaws.com/beta-tensorflow-inference:1.13-py2-cpu-build bash root@d437faf9b684:/# echo $OMP_NUM_THREADS 36

设置环境变量的 ECS 指南 

要在 ECS 中为容器指定运行时环境变量,必须编辑 ECS 任务定义。在任务定义的 containerDefinitions 部分,以“名称-值”密钥对的形式添加环境变量。下面为设置 OMP_NUM_THREADSKMP_BLOCKTIME 变量的示例。

{     "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_cpu --model_base_path=/test/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu"         ],         "entryPoint": [             "sh",             "-c"         ],         "name": "EC2TFInference",         "image": "999999999999.dkr.ecr.us-east-1.amazonaws.com/tf-inference:1.12-cpu-py3-ubuntu16.04",         "memory": 8111,         "cpu": 256,         "essential": true,         "environment": [{               "name": "OMP_NUM_THREADS",               "value": "36"             },             {               "name": "KMP_BLOCKTIME",               "value": 1             }         ],         "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-west-2",                 "awslogs-stream-prefix": "ecs",                 "awslogs-create-group": "true"             }         }     }],     "volumes": [],     "networkMode": "bridge",     "placementConstraints": [],     "family": "Ec2TFInference" }

设置环境变量的 EKS 指南

要为容器指定运行时环境变量,编辑 EKS 作业(.yaml、.json)的原始清单。以下清单的代码段显示名为 squeezenet-service 的容器的定义。除了其他属性如 args 和端口外,环境变量以“名称-值”密钥对的形式列出。

      containers:       - name: squeezenet-service         image: 999999999999.dkr.ecr.us-east-1.amazonaws.com/beta-mxnet-inference:1.4.0-py3-gpu-build         command:         - mxnet-model-server         args:         - --start         - --mms-config /home/model-server/config.properties         - --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model         ports:         - name: mms           containerPort: 8080         - name: mms-management           containerPort: 8081         imagePullPolicy: IfNotPresent         env:         - name: AWS_REGION``           value: us-east-1         - name: OMP_NUM_THREADS           value: 36         - name: TENSORFLOW_INTER_OP_PARALLELISM           value: 0         - name: KMP_AFFINITY           value: 'granularity=fine,verbose,compact,1,0'         - name: KMP_BLOCKTIME           value: 1