张帆,云计算解决方案工程师

中国 Azure 两个新数据中心(分别位于两个新区域:中国东部 2 和中国北部 2)现已正式商用,在新数据中心中新增加了 NCsv3 系列虚拟机,该系列虚拟机是 GPU 产品系列的新成员,装配了 NVIDIA Tesla V100 GPU。客户可将这些最新的 GPU 用于加速大数据分析与科学计算、VDI 等其他高性能用途。该系列虚拟机提供 InfiniBand 网络的配置,以加快横向扩展功能并提升单个实例性能。具体的实例配置如下图:

此价格参考页面截取于 2018 年 10 月 31 日,不保证将来不会发生价格更新


下面将针对该系列 VM 进行部分深度学习应用场景下性能测试,并与 CPU 计算进行对比。

一、Openpose人体关键点检测性能测试

1. 测试环境

GPU 机型:中国北部 2,标准 NC6s_v3 (6 vcpu,112 GB 内存,1 X NVIDIA Tesla V100 16G PCI-E)

CPU 机型:中国北部 1,标准 DS4 v2 (8 vcpu,28 GB 内存)

OS: Ubuntu 18.04

Caffe:1.0.0

OpenCV:3.2.0

Boost:1.65

GPU 机型的驱动版本:NVIDIA Driver 390.48,CUDA 9.0,cuDNN v7.0.5


CPU 机型安装了 Intel® Math Kernel Library (Intel® MKL) ,版本为 2018.3.222


2. 测试内容

该测试使用了 Openpose v1.3 自带的 Demo,对长度为 6 秒的 avi 格式 sample 视频进行关键点识别,对比 GPU 与 CPU 完成识别的耗时。

运行时命令和参数如下(分别为:仅身体,身体 + 脸,身体 + 手,身体 + 脸 + 手,四项测试):

# 仅身体

./build/examples/openpose/openpose.bin --video examples/media/video.avi --display 0 --render_pose 0 --write_video results/non.avi

# 身体+脸

./build/examples/openpose/openpose.bin --video examples/media/video.avi --face --display 0 --write_video results/face.avi

# 身体+手

./build/examples/openpose/openpose.bin --video examples/media/video.avi --hand --display 0 --write_video results/hand.avi

# 身体+脸+手

./build/examples/openpose/openpose.bin --video examples/media/video.avi --face --hand --display 0 --write_video results/face_hand.avi

测试计时采用程序自带的时间统计,基于 GPU 的机型测试结果输出如下:


基于 CPU 的机型测试结果输出如下(由于耗时较长,部分结果输出到文件中查看):





测试完成输出的人体关键点识别结果样例截图:


3. 性能统计

在 OpenPose 部分性能测试结果统计如下表(耗时单位为秒):


由于 Openpose 测试时只能利用 CPU 的 1 个核心,没有充分发挥 CPU 的性能,因此还标注了理想情况下(CPU6 核全利用)的性能提升倍数。可以看出 GPU 对性能的提升为数数十倍甚至上百倍,十分可观。

二、ResNet 训练性能测试

在该项测试中使用了中国北部 2,Azure 标准 NC6s_v3 (6 vcpu,112 GB 内存,1 X NVIDIA Tesla V100 16G PCI-E)虚拟机,通过启用和禁用 GPU 加速来对比有无 GPU 的训练速度性能。软件环境具体如下:

OS: Ubuntu 18.04

NVIDIA Driver 390.48,CUDA 9.0,cuDNN v7.0.5

Python: Anaconda3-5.2.0-Linux-x86_64 (Python 3.6.5)

Pytorch 0.4.0

测试使用了 3D-ResNets-PyTorch(链接:https://github.com/kenshohara/3D-ResNets-PyTorch),使用的模型为 ResNet-34(CPU 和 GPU 版本),数据集为 UCF101(链接:http://crcv.ucf.edu/data/UCF101.php),进行行为识别的模型训练,可以识别视频中如跳水、骑马、理发、打字等行为。

1. 通过 GPU 训练

训练时使用的命令为:

ocp@gputest:~/3D-ResNets-PyTorch$ python main.py --root_path ~/3D-ResNets-PyTorch --video_path ucf101/jpg --annotation_path ucf101/anno/ucf101_01.json --result_path results --dataset ucf101 --n_classes 400 --n_finetune_classes 101 --pretrain_path models/resnet-34-kinetics.pth --ft_begin_index 4 --model resnet --model_depth 34 --resnet_shortcut A --batch_size 64 --n_threads 4 --checkpoint 5

训练时部分输出如下:


2. 通过 CPU 训练

训练时使用的命令为(禁用了 CUDA,使用 CPU 的预训练模型):

ocp@gputest:~/3D-ResNets-PyTorch$ python main.py --root_path ~/3D-ResNets-PyTorch --video_path ucf101/jpg --annotation_path ucf101/anno/ucf101_01.json --result_path restmp --dataset ucf101 --n_classes 400 --n_finetune_classes 101 --pretrain_path models/resnet-34-kinetics-cpu.pth --ft_begin_index 4 --model resnet --model_depth 34 --resnet_shortcut A --batch_size 64 --n_threads 4 --checkpoint 5 --no_cuda

训练时部分输出如下:


3. 性能统计

在 ResNet 训练部分性能测试结果统计如下表,统计了 Epoch 1 的总耗时,Batch 平均耗时,Validation 耗时:


可以从结果中看出,在第一个 Epoch 中,GPU 对训练速度的提升约为 50 倍,对验证速度的提升约为 15 倍,效果显著。

三、总结

从以上测试结果可以看出,GPU 计算耗时相对 CPU 缩短数十倍,使用 GPU 可将数小时的计算耗时缩短到分钟级别。因此合理利用 Azure 新数据提供的 GPU 资源可以显著提升数据分析和处理的效率,缩短耗时,节约成本。

最后感谢 Microsoft MTC 的 Guojun Zhang, Qi Gu, Zhixin Meng 的帮助和支持。