AmazonDeep Learning Containers 英特尔数学核心库 (MKL) 建议 - Amazon 深度学习容器
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

AmazonDeep Learning Containers 英特尔数学核心库 (MKL) 建议

针对 CPU 容器的 MKL 建议

CPU 实例上深度学习框架的训练和推理工作负载的性能情形不一,具体取决于各种配置设置。例如,在AmazonEC2 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

在极少数情况下,英特尔 MKL 可能会产生不良影响。若要禁用 MKL TensorFlow 请设置以下环境变量:

export TF_DISABLE_MKL=1 export TF_DISABLE_POOL_ALLOCATOR=1

设置环境变量的 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" }

在极少数情况下,英特尔 MKL 可能会产生不良影响。若要禁用 MKL TensorFlow 请设置以下环境变量:

{ "name": "TF_DISABLE_MKL", "value": 1 }, { "name": "TF_DISABLE_POOL_ALLOCATOR", "value": 1 }

设置环境变量的 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

在极少数情况下,英特尔 MKL 可能会产生不良影响。若要禁用 MKL TensorFlow 请设置以下环境变量:

- name: TF_DISABLE_MKL           value: 1 - name: TF_DISABLE_POOL_ALLOCATOR           value: 1