2020 年 5 月 14日,NVIDIA 创始人兼首席执行官黄仁勋在 NVIDIA GTC 2020 主题演讲中介绍了基于最新 Ampere 架构的 NVIDIA A100 GPU。NVIDIA A100 Tensor Core GPU 基于最新的 Ampere 架构,相比上一代 NVIDIA Tesla V100 GPU 增加了了许多新特性,在 HPC,AI 和数据分析领域都有更好的表现。
北京时间 9 月 1 日,滴滴云发布基于 NVIDIA Tesla A100 GPU 的云服务器产品,据悉滴滴云是该型GPU云服务器产品的国内首发云厂商。
滴滴云基于 A100 GPU 的产品包括裸金属服务器(BMS)、透传性 GPU 云服务器和 vGPU 云服务器产品,可用于深度学习训练/推理、视频处理、科学计算、图形图像处理等场景。目前基于 A100 GPU 的裸金属服务器产品开放测试,欢迎企业用户垂询。
A100 搭载了革命性的多实例 GPU(Multi-instance GPU 或 MIG)虚拟化与 GPU 切割能力,对云服务供应商(CSPs)更加友好。当配置为 MIG 运行状态时,A100 可以通过分出最多 7 个核心来帮助供应商提高 GPU 服务器的利用率,无需额外投入。A100 稳定的故障分离也能够让供应商安全的分割GPU。
A100 带有性能强劲的第三代 Tensor Core,支持更为丰富的 DL 和 HPC 数据类型,同时具有比 V100 更高的计算吞吐。 A100 新的稀疏(Sparsity)特性能够进一步让计算吞吐翻倍。新的 TensorFloat-32 (TF32) 核心运算单元让 A100 在 DL 框架和 HPC 中轻松加速以 FP32 作为输入/输出数据的运算,比 V100 FP32 FMA 操作快10倍,稀疏优化(sparse)下可以达到 20 倍。在 FP16/FP32 的混合精度下也能达到 V100 的 2.5 倍,稀疏优化后达 5 倍。新的 Bfloat16(BF16)/FP32 混合精度 Tensor Core 运算单元和 FP16/FP32 混合精度以相同的频率运行。Tensor Core 对 INT8,INT4 和 INT1 的加速为 DL 推理提供了全面支持,A100 sparse INT8 比 V100 INT8 快 20 倍。在 HPC 中,A100 Tensor 核心的 IEEE 兼容 FP64 处理让它的表现是 V100的 2.5 倍。
下图为 A100 GPU 支持的各种浮点数据类型位宽表示。
A100 硬件参数与前代 GPU 对比
板卡名 | Tesla V100 SXM2 | RTX 2080 Ti | Quadro RTX 6000 | Tesla A100 SXM4 |
---|---|---|---|---|
GPU 型号 | GV100 | TU102 | TU102 | GA100 |
GPU 工艺 | TSMC 12nm | TSMC 12nm | TSMC 12nm | TSMC 7nm |
CUDA 架构 | Volta(SM_70) | Turing (SM_75) | Turing (SM_75) | Ampere(SM_80) |
SM 数目 | 80 | 68 | 72 | 108 |
SP 数目 | 5120 | 4352 (=68 * 64) | 4608 (=72 * 64) | 6912 (=108 * 64) |
GPU 时钟频率 | 1.53 GHz | 1.545 GHz* | 1.77 GHz | 1.41 GHz |
ROPs | 128 | 88 | 96 | 160 |
TMUs | 320 | 272 | 288 | 432 |
Tensor Cores | 640 | 544 | 576 | 432 |
RT Cores | N/A | 68 | 72 | N/A |
显存容量 | 32 GB HBM2 | 11 GB GDDR6 | 24 GB GDDR6 | 40 GB HBM2E |
显存位宽 | 4096 bits | 352 bits | 384 bits | 5120 bits |
显存频率 | 0.876 GHz(x2) | 1.75 GHz(x8) | 1.75 GHz(x8) | 1.215 GHz(x2) |
显存带宽 | 897 GB/s | 616 GB/s** | 672 GB/s | 1555 GB/s |
功耗 | 250 W | 250 W | 260 W | 400 W |
A100 与前代 GPU CUDA Core/Tensor Core 计算能力对比(单位:每时钟周期每 SM 乘累加次数):
根据上述表格中的数字可以计算出 A100 峰值计算能力:
计算类型 | 峰值吞吐(TFLOPS/TOPS) |
---|---|
FP64, CUDA Core | 9.746(= 108 x 32 x 1410MHz x 2) |
FP64, Tensor Core | 19.49(= 108 x 64 x 1410MHz x 2) |
FP32, CUDA Core | 19.49(= 108 x 64 x 1410MHz x 2) |
TF32, Tensor Core | 155.9(= 108 x 512 x 1410MHz x 2) |
TF32, Tensor Core, Sparse | 311.87(= 108 x 1024 x 1410MHz x 2) |
FP16, CUDA Core | 77.96(= 108 x 256 x 1410MHz x 2) |
FP16, Tensor Core | 311.87(= 108 x 1024 x 1410MHz x 2) |
FP16, Tensor Core, Sparse | 623.74(= 108 x 2048 x 1410MHz x 2) |
INT8, CUDA Core | 77.96(= 108 x 256 x 1410MHz x 2) |
INT8, Tensor Core | 623.74(= 108 x 2048 x 1410MHz x 2) |
INT8, Tensor Core, Sparse | 1247.5(= 108 x 4096 x 1410MHz x 2) |
INT4, Tensor Core | 1247.5(= 108 x 4096 x 1410MHz x 2) |
INT4, Tensor Core, Sparse | 2495(= 108 x 8192 x 1410MHz x 2) |
INT1, Tensor Core | 4990(= 108 x 16384 x 1410MHz x 2) |
2、软件环境
为了发挥出 A100 的计算能力,用户需要升级软件环境。下表为推荐版本:
软件名 | 推荐版本 | 说明 |
---|---|---|
GPU 驱动 | 450.xx | 滴滴云内网链接:https://zyk.s3-internal.didiyunapi.com/public_software/NVIDIA/DRV/NVIDIA-Linux-x86_64-450.57.run |
CUDA Toolkit | 11.0+ | 滴滴云内网链接:https://zyk.s3-internal.didiyunapi.com/public_software/NVIDIA/CUDA/cuda_11.0.1_450.36.06_linux.run |
cuDNN | 8.0+ | 滴滴云内网链接:https://zyk.s3-internal.didiyunapi.com/public_software/NVIDIA/CUDNN/cudnn-11.0-linux-x64-v8.0.0.180.tgz |
Tensor RT | 7.1+ | 滴滴云内网链接:https://zyk.s3-internal.didiyunapi.com/public_software/NVIDIA/TENSORRT/TensorRT-7.1.3.4.Ubuntu-18.04.x86_64-gnu.cuda-11.0.cudnn8.0.tar.gz |
NGC | 20.06+ | 滴滴云内网链接: docker pull hub.didiyun.com/ngc/tensorflow:20.06-tf1-py3 docker pull hub.didiyun.com/ngc/tensorflow:20.06-tf2-py3 docker pull hub.didiyun.com/ngc/mxnet:20.06-py3 docker pull hub.didiyun.com/ngc/pytorch:20.06-py3 |
下面为 NVIDIA GPU 驱动、CUDA Toolkit、cuDNN的安装方法。
2.1 手动安装 GPU 驱动
apt install -y gcc g++ build-essential linux-headers-$(uname -r) wget https://zyk.s3-internal.didiyunapi.com/public_software/NVIDIA/DRV/NVIDIA-Linux-x86_64-450.57.run chmod 755 NVIDIA-Linux-x86_64-450.57.run ./NVIDIA-Linux-x86_64-450.57.run nvidia-persistenced
2.2 手动安装 CUDA Toolkit
wget https://zyk.s3-internal.didiyunapi.com/public_software/NVIDIA/CUDA/cuda_11.0.1_450.36.06_linux.run chmod 755 cuda_11.0.1_450.36.06_linux.run ./cuda_11.0.1_450.36.06_linux.run
注意上一步已经安装了 GPU 驱动,这一步安装时可跳过驱动安装。
2.3 手动安装 cuDNN
wget https://zyk.s3-internal.didiyunapi.com/public_software/NVIDIA/CUDNN/cudnn-11.0-linux-x64-v8.0.0.180.tgz tar zxvf cudnn-11.0-linux-x64-v8.0.0.180.tgz -C /usr/local/
2.4 手动安装 TensorRT
wget https://zyk.s3-internal.didiyunapi.com/public_software/NVIDIA/TENSORRT/TensorRT-7.1.3.4.Ubuntu-18.04.x86_64-gnu.cuda-11.0.cudnn8.0.tar.gz tar zxvf TensorRT-7.1.3.4.Ubuntu-18.04.x86_64-gnu.cuda-11.0.cudnn8.0.tar.gz
说明:如果用户选择 NGC 镜像,则无需手动安装 CUDA Toolkit、cuDNN、TensorRT,这些已包含于 NGC 镜像中。
2.5 NGC 环境初始化
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" apt update apt install -y docker-ce docker-ce-cli containerd.io docker version curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list apt update apt install -y nvidia-docker2 systemctl daemon-reload systemctl restart docker nvidia-docker docker login --username=public --password=ddy_public hub.didiyun.com docker pull hub.didiyun.com/ngc/pytorch:20.06-py3 docker pull hub.didiyun.com/ngc/mxnet:20.06-py3 docker pull hub.didiyun.com/ngc/tensorflow:20.06-tf1-py3 docker pull hub.didiyun.com/ngc/tensorflow:20.06-tf2-py3 docker images
3、硬件基础测试
PCIe 带宽测试:
cd /usr/local/cuda/samples/1_Utilities/bandwidthTest/ make ./bandwidthTest
多卡 P2P 通信带宽/延迟测试:
cd /usr/local/cuda/samples/1_Utilities/p2pBandwidthLatencyTest/ make ./p2pBandwidthLatencyTest
4、矩阵乘(GEMM)性能评测
这里使用 NVIDIA 开源的 CUTLASS 作为评测工具。运行步骤如下:
git clone https://github.com/NVIDIA/cutlass mkdir build cd build/ export CUDACXX=/usr/local/cuda/bin/nvcc cmake .. -DCUTLASS_NVCC_ARCHS=80 make cutlass_profiler -j12 ./tools/profiler/cutlass_profiler --op_class=simt --m=8192 --n=8192 --k=8192 ./tools/profiler/cutlass_profiler --op_class=tensorop --m=8192 --n=8192 --k=8192
运行结束后,会打印结果,由于内容较多,下图只挑选了我们关心的几项:
5、AI 训练性能评测
A100 强大算力非常适合 AI 训练场景。为了定量评估 A100 的训练性能,我们基于 NGC 镜像内置的 ResNet 101 图像分类代码进行测试。
nvidia-docker run -ti --shm-size=64G --ulimit memlock=-1 --ulimit stack=67108864 -v /data:/data hub.didiyun.com/ngc/mxnet:20.06-py3 cd /opt/mxnet/example/image-classification/ python train_imagenet.py --benchmark 1 --gpus 0 --network resnet --num-layers 101 --batch-size 256
运行结果如下:
INFO:root:Epoch[0] Batch [240-260] Speed: 430.06 samples/sec lr:0.001039 accuracy=1.000000
INFO:root:Epoch[0] Batch [260-280] Speed: 429.93 samples/sec lr:0.001119 accuracy=1.000000
INFO:root:Epoch[0] Batch [280-300] Speed: 430.00 samples/sec lr:0.001199 accuracy=1.000000
INFO:root:Epoch[0] Batch [300-320] Speed: 429.96 samples/sec lr:0.001279 accuracy=1.000000
INFO:root:Epoch[0] Batch [320-340] Speed: 430.20 samples/sec lr:0.001359 accuracy=1.000000
INFO:root:Epoch[0] Batch [340-360] Speed: 430.21 samples/sec lr:0.001439 accuracy=1.000000
INFO:root:Epoch[0] Batch [360-380] Speed: 431.00 samples/sec lr:0.001518 accuracy=1.000000
INFO:root:Epoch[0] Batch [380-400] Speed: 429.90 samples/sec lr:0.001598 accuracy=1.000000
上述测试只用了一张卡,我们尝试 8 卡训练:
python train_imagenet.py --benchmark 1 --gpus 0,1,2,3,4,5,6,7 --network resnet --num-layers 101 --batch-size 2048
运行结果如下:
INFO:root:Epoch[0] Batch [440-460] Speed: 3385.54 samples/sec lr:0.014696 accuracy=0.253589
INFO:root:Epoch[0] Batch [460-480] Speed: 3383.47 samples/sec lr:0.015335 accuracy=0.421460
INFO:root:Epoch[0] Batch [480-500] Speed: 3386.62 samples/sec lr:0.015974 accuracy=0.559961
INFO:root:Epoch[0] Batch [500-520] Speed: 3386.76 samples/sec lr:0.016613 accuracy=0.655444
INFO:root:Epoch[0] Batch [520-540] Speed: 3384.64 samples/sec lr:0.017252 accuracy=0.731396
INFO:root:Epoch[0] Batch [540-560] Speed: 3383.85 samples/sec lr:0.017891 accuracy=0.806445
INFO:root:Epoch[0] Batch [560-580] Speed: 3384.85 samples/sec lr:0.018530 accuracy=0.872095
INFO:root:Epoch[0] Batch [580-600] Speed: 3385.41 samples/sec lr:0.019169 accuracy=0.927905
8 卡训练速度相比单卡加速比约 7.87 倍,接近线性加速。
在另一个终端运行 nvidia-smi 可以显示 GPU 利用情况:
可见每卡显存占用约 36 GB,计算资源占用都在 99% 左右,硬件效率得到充分发挥。
和 RTX 2080Ti 对比结果
A100 | 2080Ti | A100/2080Ti 加速比 | |
---|---|---|---|
1 卡 | 430.2 | 170.71 | 2.52X |
8 卡 | 3384 | 1102.64 | 3.07X |
多卡线性加速比 | 7.87X | 6.46X | —— |
说明:A100 多卡情况下 NVLink 表现更为优异,接近线性加速;2080Ti 则依赖 PCIe 进行通信,不支持 P2P,多卡扩展性较差。
6、AI 推理性能评测
先根据 2.4 节手动安装 Tensor RT,之后进入例程所在目录,编译:
cd /work/TensorRT-7.1.3.4/samples/ make cd .. export LD_LIBRARY_PATH=$(pwd)/lib:$LD_LIBRARY_PATH ./bin/trtexec --deploy={resnet18.prototxt, resnet50.prototxt, vgg16.prototxt} --output=prob --warmUp=10 --batch={1,2,4,8,16,32,64,128,256,512} --workspace=1024 {--useCudaGraph} {--noTF32} {--fp16} {--int8}
利用该工具,对 ResNet-18、ResNet-50 和 VGG-16 三个模型,在不同精度(FP32、TF32、FP16、INT8)、不同 Batch Size 情况下评测其吞吐和延迟情况,结果见下表:
Throughput(fps)
ResNet-18 | ||||||
---|---|---|---|---|---|---|
Batch\Precision | FP32 | TF32 | FP32(cudagraph) | TF32(cudagraph) | FP16 | INT8 |
1 | 785.72 | 1363.86 | 835.39 | 1455.06 | 3110.10 | 4102.16 |
2 | 1252.80 | 2475.30 | 1438.27 | 2607.65 | 5919.07 | 7454.90 |
4 | 2361.48 | 3781.43 | 2581.81 | 4584.22 | 10415.77 | 13374.71 |
8 | 3253.70 | 5572.31 | 3423.51 | 6435.21 | 16516.13 | 21881.78 |
16 | 4027.04 | 9422.85 | 4285.52 | 9674.98 | 23011.25 | 32141.23 |
32 | 5153.42 | 12207.50 | 5417.77 | 12391.00 | 26282.72 | 45495.32 |
64 | 5587.32 | 13205.08 | 5873.01 | 13778.67 | 28827.66 | 49484.66 |
128 | 5985.45 | 14647.27 | 6129.59 | 14948.49 | 30606.41 | 59775.10 |
256 | 5182.31 | 12188.56 | 5474.89 | 12225.52 | 31561.76 | 67693.71 |
512 | 5308.93 | 12366.76 | 5335.44 | 12484.70 | 30923.29 | 74240.77 |
ResNet-50 | ||||||
Batch\Precision | FP32 | TF32 | FP32(cudagraph) | TF32(cudagraph) | FP16 | INT8 |
1 | 421.0951844 | 556.1271307 | 479.8855953 | 594.3783694 | 1569.949903 | 2017.735899 |
2 | 697.7855775 | 1020.970739 | 735.9163999 | 1089.912317 | 2976.744186 | 3570.274608 |
4 | 1133.565147 | 1736.880042 | 1234.571712 | 1852.186274 | 5215.341448 | 6220.201348 |
8 | 1273.224409 | 2444.464815 | 1299.051368 | 2550.597477 | 8198.149268 | 10170.08191 |
16 | 1883.438688 | 3613.549002 | 1946.824911 | 3696.473333 | 10556.73586 | 14766.95893 |
32 | 2253.060995 | 5148.253616 | 2374.450908 | 5532.101749 | 12028.26643 | 18701.20155 |
64 | 2500 | 5977.453791 | 2563.897124 | 6147.344155 | 13069.94668 | 21656.30097 |
128 | 2625.280218 | 6502.280878 | 2672.311926 | 6626.733693 | 13963.32663 | 24196.41439 |
256 | 2264.344534 | 5641.052761 | 2621.946099 | 5767.272531 | 13943.88675 | 26446.63616 |
512 | 2483.411587 | 5873.715125 | 2781.716732 | 5940.219579 | 15028.94246 | 27950.19188 |
VGG16 | ||||||
Batch\Precision | FP32 | TF32 | FP32(cudagraph) | TF32(cudagraph) | FP16 | INT8 |
1 | 367.8201507 | 541.6325889 | 376.7599399 | 558.0357143 | 1860.125968 | 1455.061869 |
2 | 468.263445 | 769.2514798 | 479.411666 | 791.7029531 | 2897.769587 | 2295.159852 |
4 | 566.3700775 | 1062.92517 | 573.6897285 | 1081.463978 | 4115.548129 | 3898.407501 |
8 | 630.497147 | 1330.012735 | 636.2992834 | 1347.67938 | 4938.667918 | 5694.314938 |
16 | 671.7552124 | 1423.044426 | 674.7126146 | 1432.177447 | 5554.841913 | 7352.839805 |
32 | 803.5698591 | 1521.201749 | 811.4145745 | 1536.083563 | 5875.16019 | 9204.501001 |
64 | 843.8418008 | 1557.321602 | 936.4131572 | 1570.90295 | 6193.568366 | 9776.201365 |
128 | 898.8069742 | 1596.42401 | 933.8089923 | 1601.886221 | 6264.100343 | 10503.16736 |
256 | 791.2615057 | 1530.834963 | 940.0636012 | 1677.808363 | 6341.326873 | 11221.37672 |
512 | 857.772305 | 1499.193305 | 883.6956428 | 1570.214985 | 6389.369686 | 11372.64745 |
7、MIG 测试
A100 的强大算力对于 AI 推理而言有些过剩,此时可以通过 MIG 技术将 1 张卡切为多份,同时运行多个不同推理任务来提高硬件利用率。
下表为物理卡与不同规格 MIG 实例的硬件参数与计算/IO 性能对比。
MIG 规格 | 物理卡 A100-SXM4-40GB | MIG 7g.39gb | MIG 4g.20gb | MIG 2g.10gb | MIG 1g.5gb |
---|---|---|---|---|---|
显存容量 | 40 GB | 40 GB | 20 GB | 10 GB | 5 GB |
SM 数量 | 108 | 98 | 56 | 28 | 14 |
显存带宽 | 1228.38 GB/s | 1119.5 GB/s | 619.7 GB/s | 322.5 GB/s | 164.2 GB/s |
FP32 峰值计算性能 | 19106.8 GFLOPS | 17307.5 GFLOPS | 9938.76 GFLOPS | 4973.4 GFLOPS | 2487.69 GFLOPS |
经测试发现当前 MIG 有如下限制:
1) 目前无法监控每个 MIG instance 的 GPU Util、Mem Util 等指标;
2) 无论规格大小,都不支持 NVLink;
3) GPU 时钟为全局设置,不能只针对某一个 instance 单独设置;
4) 仅支持 Docker,K8S 集成还未支持;
5) 不支持在一个进程中同时使用多个 instance;
在不同规格 MIG 实例上测试 AI 推理性能,结果如下:
注意:小规格 MIG 实例由于资源较少,运行时可能发生 OOM,需要适当调小模型 Batch Size。
如需测试 MIG 功能,请联系滴滴云工程师协助配置环境。
8、总结
A100 提供了全新的使用体验,性能提升显著,资源粒度更小,部署灵活性更高。
当前仍处于早期试水阶段,NV 一些库和上层 AI 框架还在不断调整中,社区版框架普遍还未很好支持,用起来需要花些时间和精力。