Beijing: ☀️ 🌡️+33°C 🌬️↓4km/h

写在前面

深度学习中,我们在训练一个大模型或完成较大的任务之前,都需要对硬件环境进行评测,特别是 GPU 的性能进行测试,尽管官方已经给出了不同显卡在对应任务上的表现,但是不同的计算机配置(除 GPU 之外的硬件)也会影响其训练性能,因此我们需要进行实测,其主要有两个目的:

  • 🤸 评估整个任务完成所需要的时间以及成本估计
  • 💯 在可选择方案中,选择最具性价比的方案
  • 🆎 计算资源有限的情况下,尽可能消耗极致性能

由于就不同的配置环境,本篇的目的主要有:

  • 如何评测一个任务在实际硬件中的性能
  • 如何理解实际性能和理论性能的差别
  • 理解计算的瓶颈,通过调节参数提高训练的性能

网络结构逐层分析

A100 A6000 V100 3090 Ti
Theory TF32(FP32) / FP16 156 / 312 75 / 150 16 / 125 80 / 160
Memory (GB) / Bandwidth (GB/s) 80 / 2039 48 / 768 32 / 900 24 / 1008
Approximate Price $ 16,000 4,000 3,500 1,500
Matrix Multiplication FP32 / FP16 116 / 230 60 / 95 14 / 95 42 / 81
Vector Multiplication 0.202 0.082 0.098 0.107
Bert Layer Forward / Forward+Backward 110 / 136 60 / 70 53 / 64 56 / 62
GPT-2 Layer Forward / Forward+Backward 45 / 53 35 / 38 32 / 36 37 / 39
T5 Encoder Forward / Forward+Backward 44 / 56 34 / 41 31 / 38 36 / 41
T5 Decoder Forward / Forward+Backward 38 / 47 28 / 34 26 / 32 30 / 36

训练

总结

关于 batch size 选择

  • 🧴 提升 batch size 途径
    • 使用较大显存的 GPU
    • 使用较低精度 16 位浮点数类型
    • 合并运算降低中间变量存储的开销
    • 梯度累加
    • 梯度 check points
  • 🥉 存在问题
    • 较大的 bs 会导致收敛变慢,需要更多次的迭代
    • Fine-tuning 时需要选择较小的 bs,因为一般而言,测试数据集的多样性并非很丰富,Pre-tranining 过程中可以选择较大的 bs
    • 当 GPU 增加到成百上千的时候,能分配的 bs 相对较小

关于多卡训练

  • 尽可能使用数据并行
    • 🅰 满足条件
      • 模型能够放到单卡的内存
      • bs 满足训练需求
    • 💢 优点
      • 通讯模式相对简单
      • 通讯和运行有一定的并行度
      • 性能表现相对较好
  • 不能使用数据并行的情况下,使用 zero 划分模型中间状态,或张量并行
  • 做张量并行最好选择较大的带宽,NV-Link 是相对较好的选择

北京超算 GPU 资源测试

以下是对北京超算 GPU 性能测试过程的相关说明:

  1. 本次测试的目的:① 对比采用’fp16’,‘batch size’,‘num_GPUs’以及不同 GPU 资源配置对模型预训练时间及推理时间的影响;② 估算训练模型所耗费的时间成本和经济成本;③ 根据已有的算力资源配置,选择合适的训练参数,保证 GPU 资源得到充分利用。
  2. 本次采用的算力资源皆来自于北京超算,测试脚本中,采用模型为 transform 类的 BERT 系,共有参数 184551780,预训练任务为 MLM,主要使用 Huggingface 的 Transformers 的 Trainer 类进行训练,wandb 记录运行相关日志;
  3. 这里记录时间仅为模型预训练和推理的时间,不包括 tokenizer 的训练以及文件的 IO 相关;
  4. 原始语料共有数据:训练集(1994187)、验证集:(104838),本次使用 datasets 的 select 方法对数据进行随机采样,最终模型所使用的数据为:训练集(2048)、验证集:(1024),同时为每次训练语料的一致性,使用 transfomers 下的 set_seed 方法设置随机种子;
  5. 本次模型训练过程中,在每个 epoch 结束后在验证集上进行一次推理测试,即每轮参数在验证集上的推理 2 次epoch 总数为 2,梯度累积步数(gradient_accumulation_steps)为 4;
  6. V100_4gpu_8表示采用 4 块 V100 GPU,每个 GPU 上的 train 和 eval 的 batch size 都为 8,total_train_bs 表示 🧉num_GPUs*gradient_accumulation_steps*train_bs_per_device
  7. V100 配置
    • CPU:Gold 61 系列(72vCPU) v5@2.5GHz
    • 内存:320GB
    • GPU:8 * NVIDIA®Tesla ® V100 SXM2
    • 显存:8 * 32GB(897 GB/s)
    • NVLink: 双向通信 300 GB/s
    • 操作系统:CentOS7.8
    • 单卡按需(元/卡/时)💰5.3
  8. A100 配置
    • CPU:Intel 6248R(48C)@3.0GHz
    • 内存:384GB
    • GPU:8 * NVIDIA®Tesla®A100 PCIe
    • 显存:8 * 40GB(1555 GB/s)
    • 节点互联:100G RoCE(RDMA 协议)
    • 操作系统:CentOS
    • 单卡按需(元/卡/时)💰9.3
    • 节点包月(元/节点/月) 👍50,112

测试结果如图所示:

Name fp16 train_bs total_train_bs train/global_step train/train_steps_per_second eval/steps_per_second train/train_samples_per_second eval/samples_per_second train/train_runtime eval/runtime
V100_4gpu_8 FALSE 32 128 32 0.157 1.648 20.108 52.727 203.6953 19.4207
V100_4gpu_4 FALSE 16 64 64 0.218 2.01 13.981 32.159 292.9683 31.8422
V100_2gpu_8 FALSE 16 64 64 0.282 3.826 18.06 61.211 226.7969 16.7291
V100_2gpu_4 FALSE 8 32 128 0.448 5.503 14.338 44.021 285.6699 23.2614
V100_1gpu_8 FALSE 8 32 128 0.357 5.223 11.43 41.781 358.3632 24.5089
V100_1gpu_4 FALSE 4 16 256 0.679 9.943 10.858 39.773 377.22 25.746
V100_4gpu_8 TRUE 32 128 32 0.156 1.646 19.941 52.673 205.4075 19.4407
V100_2gpu_8 TRUE 16 64 64 0.282 3.806 18.057 60.897 226.8387 16.8152
V100_1gpu_8 TRUE 8 32 128 0.732 11.312 23.419 90.499 174.9004 11.315
A100_4gpu_8 FALSE 32 128 32 0.128 1.109 16.351 35.484 250.501 28.858
A100_4gpu_4 FALSE 16 64 64 0.212 1.888 13.563 30.207 301.997 33.8995
A100_2gpu_8 FALSE 16 64 64 0.244 2.629 15.63 42.067 262.06 24.342
A100_2gpu_4 FALSE 8 32 128 0.41 4.352 13.13 34.817 311.952 29.4107
A100_1gpu_8 FALSE 8 32 128 0.447 6.789 14.316 54.313 286.1143 18.8538
A100_1gpu_4 FALSE 4 16 256 0.848 12.599 13.567 50.395 301.9006 20.3194
A100_1gpu_16 FALSE 16 64 64 0.23 3.43 14.752 54.881 277.6584 18.6587
A100_4gpu_8 TRUE 32 128 32 0.125 1.119 16.003 35.814 255.9549 28.5925
A100_2gpu_8 TRUE 16 64 64 0.244 2.636 15.588 42.173 262.7728 24.2807
A100_1gpu_8 TRUE 8 32 128 1.111 18.314 35.552 146.516 115.2122 6.989

参考文献

[1] 环境安装,BERT、GPT、T5 性能测试,和横向对比【100 亿模型计划】_哔哩哔哩_bilibili

[2] 单卡、多卡 BERT、GPT2 训练性能【100 亿模型计划】_哔哩哔哩_bilibili

[3] GitHub - mli/transformers-benchmarks: real Transformer TeraFLOPS on various GPUs

[4] GPU Benchmarks for Deep Learning | Lambda