深度学习GPU性能优化综合指南
本文探讨了优化深度学习模型训练和推理过程中GPU性能的方法。通过研究本文,我们提出了一些缩短训练时间和提高效率的技术。.

深度学习GPU性能优化综合指南

本文将探讨深度学习的GPU性能优化。我们将通过实用的技术方法,教您如何利用合适的硬件和优化的设置,实现最短的训练时间和最高的效率。.
0 股票
0
0
0
0

 

为什么GPU性能优化对深度学习至关重要?

对于从事大型模型训练和推理的人员来说,深度学习的 GPU 性能优化是一个根本性的挑战。. 目标 本指南提供实用和技术指导,以提高本地和云环境中的 GPU 性能:从驱动程序调优和操作系统配置到 I/O 优化、框架、性能分析和分布式训练。.

本文旨在帮助网站管理员、DevOps 工程师、深度学习研究人员和 MLOps 团队选择合适的硬件组合(例如,具有访问权限的 GPU 云图形服务器)。 85+ 个地点通过软件优化,实现最短的培训时间和最高的生产力。.

 

关键要素和愿景

为了优化性能,我们需要考虑四个主要方面。这些方面中的任何一个,无论是单独存在还是相互组合,都可能造成瓶颈,从而降低生产力。.

  • GPU计算: 使用 张量核心混合精度 以及内核优化。.
  • GPU内存及其管理: 防止内存溢出,请使用 激活检查点 并降低内存消耗。.
  • 输入/输出和数据处理(数据管道): 使用 NVMe、预取、DALI 或 tf.data 来消除 I/O 瓶颈。.
  • 分布式学习中的网络(网络): 节点间的延迟和带宽、RDMA/InfiniBand 的使用情况以及 NCCL 设置。.

 

识别瓶颈

准确诊断瓶颈是第一步。 GPU 利用率 如果数值偏低,而你期望数值更高,通常问题出在 CPU 或 I/O 上。.

基本的诊断工具包括 nvidia-smi 以及 NVIDIA 分析工具,例如 nsysNsight 这些工具提供有关 SM 使用情况、内存和功耗的信息。.

 

有用的 nvidia-smi 命令和拓扑检查

nvidia-smi --query-gpu=utilization.gpu,utilization.memory,memory.total,memory.used --format=csv
nvidia-smi topo -m

 

推荐的分析工具

使用以下工具进行更深入的分析:

  • NVIDIA Nsight Systems (nsys)Nsight 计算 用于核心和内存时序分析。.
  • PyTorch 分析器TensorBoard 分析器 在框架内进行分析。.
  • 系统工具,例如 穿孔顶部iostat 检查CPU和磁盘。.

实现示例 nsys:

nsys profile --trace=cuda,cudnn,osrt -o my_profile python train.py

 

系统设置和驱动程序(Linux)

安装与 CUDA/cuDNN 版本匹配的干净环境。要点:

  • 务必检查 NVIDIA 驱动程序版本、CUDA 工具包和 cuDNN 之间的兼容性。.
  • 对于专用服务器,激活 持久模式 调整GPU时钟频率可以防止频率波动:
sudo nvidia-smi -pm 1
sudo nvidia-smi -ac <memClock,graphicsClock>

设置支持 GPU 的 Docker 是基本步骤示例:

sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
docker run --gpus '"device=0,1"' --rm -it your-image:tag bash

安装驱动程序和 nvidia-docker 的示例(Ubuntu 通用示例):

sudo apt update && sudo apt install -y build-essential dkms
# add NVIDIA repository and install driver and cuda-toolkit per NVIDIA guide
sudo apt install -y nvidia-docker2
sudo systemctl restart docker

 

框架级优化(PyTorch 和 TensorFlow)

框架具有利用硬件的功能;它们的正确配置对吞吐量和内存消耗有直接影响。.

 

PyTorch — 快速实用的搭建

  • 为具有固定输入的模型启用 cuDNN 自动调谐器:
torch.backends.cudnn.benchmark = True
  • 使用混合精度 torch.cuda.amp 使用张量核心:
scaler = torch.cuda.amp.GradScaler()
with torch.cuda.amp.autocast(): outputs = model(inputs)
  • 数据加载器:增加 工作者数量 只要 CPU 或 I/O 不是瓶颈,就可以使用。 pin_memory=Truepersistent_workers=True:
DataLoader(dataset, batch_size=..., num_workers=8, pin_memory=True, persistent_workers=True, prefetch_factor=2)
  • 样本 梯度累积 为了模拟更大批量生产而不出现内存溢出:
loss = model(...) / accumulation_steps
scaler.scale(loss).backward()
if (step+1) % accumulation_steps == 0:
    scaler.step(optimizer)
    scaler.update()
    optimizer.zero_grad()

 

TensorFlow — 实际应用

  • 启用混合精度:
from tensorflow.keras import mixed_precision
mixed_precision.set_global_policy('mixed_float16')
  • tf.data:使用预取,映射 num_parallel_calls=tf.data.AUTOTUNE 以及用于小型集合的缓存:
dataset = dataset.map(..., num_parallel_calls=tf.data.AUTOTUNE).prefetch(tf.data.AUTOTUNE)
  • GPU内存增长设置:
gpus = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(gpus[0], True)

 

数据和I/O管理

I/O 很快就会成为瓶颈,尤其是在处理大型数据集和多节点负载时。.

  • NVMe 对于大型数据集,建议使用本地模式,以享受快速 I/O 的优势。.
  • 在多节点环境中,使用分布式文件系统(Lustre、Ceph)或与 S3 兼容的对象存储。.
  • 对于静态数据(如矢量图或现成模型),使用 CDN 和全球覆盖范围(85 个以上位置)可以降低下载延迟。.
  • 图像和视频处理:NVIDIA DALI 可以将预处理从 CPU 转移到 GPU,从而减轻 CPU 的压力。.

 

网络环境和分布式学习

对于多节点训练,请使用 NCCL 作为 GPU 间通信的后端。采用 RDMA/InfiniBand 的网络性能优于基于以太网的 TCP。.

有用的环境设置:

export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=eth0
export NCCL_IB_DISABLE=0

网络建议:对于大型模型的分布式训练,请使用 25/40/100GbE 或 InfiniBand。.

在 Docker 容器内运行 PyTorch DDP 的示例:

docker run --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 your-image
python -m torch.distributed.run --nproc_per_node=4 --nnodes=2 --node_rank=0 --rdzv_endpoint=master:29500 train.py

 

提高GPU内存效率

以下解决方案有助于降低内存消耗并提高可扩展性:

  • 混合精度(FP16) 以及张量核心,以降低功耗并提高吞吐量。.
  • 激活检查点 不要保存所有激活信息,并在回滚时重新创建它们。.
  • 诸如技术 ZeRO(DeepSpeed)FSDP (PyTorch 全分片数据并行)用于在 GPU 之间进行内存分片。.
  • 降低模型部分(例如嵌入)的精度,并将敏感部分保留在 FP32 中。.

 

技术提示和有用的环境变量

以下是一些常用的环境变量和系统设置:

  • GPU分配控制 CUDA_VISIBLE_DEVICES=0,1.
  • 要从以下位置进行调试 CUDA_LAUNCH_BLOCKING=1 使用(问题,它会导致运行缓慢)。.
  • 调整 CPU 线程数以防止过度分配:
export OMP_NUM_THREADS=4
export MKL_NUM_THREADS=4

适用于高以太网云环境中的 NCCL:

export NCCL_SOCKET_IFNAME=ens5
export NCCL_IB_DISABLE=1

 

安全和运营管理

可靠的运营管理对于生产环境至关重要:

  • 使用公钥保护 SSH 访问安全,取消密码登录,并关闭不必要的端口。.
  • 在云服务器上升级之前,安排驱动程序更新并创建快照。.
  • 为了隔离,请在容器(nvidia-docker)中运行模型;在 Kubernetes 中使用 NVIDIA 设备插件或 GPU Operator。.
  • 使用受保护的服务器 反DDoS 并监控具有入站流量的生产环境。.

 

根据需求推荐的配置

根据任务类型进行硬件配置:

  • 开发和测试(本地/小规模实验): 1 个 NVIDIA T4 或 RTX 3080 显卡,32-64GB 内存,1TB NVMe 固态硬盘,8 个 CPU 核心。.
  • 中等教育(研究): 2-4 个 A100/RTX 6000 处理器,256GB 内存,2-4TB NVMe 固态硬盘,32-64 个 CPU 核心,25-100GbE 以太网接口。.
  • 推理/低延迟: 高速 GPU 和内存(例如 A10/A30)、用于模型的 NVMe、自动扩展集群、用于模型和数据的 CDN。.
  • 渲染/高计算量: GPU 具备高 FP32 规格、大量显存,如果需要共享内存,则需要 NVLink。.

 

实际场景和示例命令

以下是一些在检查和运行模型时常用的命令和示例:

  • 查看GPU状态:
watch -n1 nvidia-smi
  • 运行一个可访问所有 GPU 且内存受限的 PyTorch 容器:
docker run --gpus all --memory=128g --cpus=32 -it my-pytorch:latest bash

以下是 AMP 和 DataLoader 的 PyTorch 代码片段示例:

model.train()
scaler = torch.cuda.amp.GradScaler()
for data, target in dataloader:
    data, target = data.cuda(non_blocking=True), target.cuda(non_blocking=True)
    optimizer.zero_grad()
    with torch.cuda.amp.autocast():
        output = model(data)
        loss = loss_fn(output, target)
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

 

结论和最终建议

提高深度学习的 GPU 性能需要多层次的优化:合适的硬件(GPU、NVMe、高速网络)、合适的驱动程序和容器化技术、数据管道优化以及使用诸如以下功能: 混合精度激活检查点 以及分布式学习。.

定期进行性能分析,并在每次优化后测量变化,是找出真正瓶颈的最佳方法。.

 

常见问题解答

您可能也喜欢