共计 6912 个字符,预计需要花费 18 分钟才能阅读完成。
1. 概念与架构速览
1.1 为什么 GPU 擅长加速?
- 大规模并行:数千到上万的流处理器(NVIDIA SM 中的 CUDA Core、AMD CU 中的 SIMDs)。
- 吞吐优先:牺牲单线程延迟,换取批量吞吐;适合矩阵、向量化、规则访问。
- 高带宽显存:GDDR6/HBM3 带宽远高于普通 DDR 内存。
1.2 基本术语
- SM/CU:Streaming Multiprocessor(NVIDIA)/Compute Unit(AMD)。
- Warp/Wavefront:32/64 线程为一组锁步执行。
- 显存层级:全局显存(Global)/ 共享内存(Shared/LDS)/ 寄存器 / 常量缓存 / 纹理缓存。
- 张量核心:专用矩阵乘单元(如 NVIDIA Tensor Cores,支持 FP16/BF16/INT8/FP8)。
1.3 适配任务
- 强适配:深度学习训练 / 推理、图像视频处理、稠密线性代数、粒子仿真、光线追踪。
- 中等:图算法(需重排 / 压缩)、不规则数据访问的数值计算。
- 弱适配:强依赖串行逻辑 / 分支的任务。
2. 选择你的硬件与平台
2.1 GPU 品类与对比要点
- NVIDIA:生态完善(CUDA/TensorRT/NCCL)、训练 / 推理主流;注意显存、NVLink、MIG 支持。
- AMD:ROCm 成熟度持续提升,性价比高;关注目标框架是否提供原生 ROCm 轮子。
- Apple:Apple Silicon GPU + Metal/MPS,移动端 / 本地推理友好。
- Intel:oneAPI (DPC++/Level Zero)、Arc/Max 系列,推理 / 媒体能力强。
关键指标:显存容量与带宽、FP16/BF16/FP8/INT8 吞吐、PCIe/NVLink 拓扑、功耗与散热、价格 / 可获得性。
2.2 主机与拓扑
- PCIe 通道:x16 优先;多卡建议 PCIe Gen4/Gen5。
- NVLink/Infinity Fabric:大模型训练 / 张量并行更高带宽。
- NUMA 亲和性:多 CPU 插槽主机请绑定 CPU 与 GPU 拓扑,避免跨 NUMA 访问。
2.3 存储与网络
- 高速本地盘:NVMe SSD;训练数据与缓存读写关键。
- 网络:100G/200G 以太 /IB;分布式训练与参数同步瓶颈。
3. 驱动与工具链安装
以下命令仅作参考,具体以官方文档与当前驱动版本为准。
3.1 NVIDIA(Linux/Windows)
- 安装驱动(Linux)
# Ubuntu 推荐使用官方 run 包或发行版仓库(保持与 CUDA 工具链兼容)sudo ubuntu-drivers autoinstall
nvidia-smi # 验证
- 安装 CUDA Toolkit
# 选择与显卡驱动匹配的 CUDA 版本
# 安装后验证:nvcc --version
- Nsight/Profiler 工具:Nsight Systems、Nsight Compute、CUDA-GDB。
3.2 AMD ROCm(Linux)
# 选择受支持的内核与发行版;参考 ROCm 兼容列表
# 安装后验证
rocminfo
rocminfo | grep Name
3.3 Apple (macOS, Apple Silicon)
- Xcode Command Line Tools、Metal 开发者工具;深度学习可用 PyTorch MPS / Core ML。
3.4 Intel(Linux/Windows)
- oneAPI Base Toolkit + HPC/AI Toolkit;驱动包含 Level Zero、OpenCL。
- 验证:
sycl-ls、clinfo。
3.5 容器化(强烈建议)
# NVIDIA
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
# 运行 CUDA 容器
docker run --gpus all --rm nvidia/cuda:12.5.0-runtime-ubuntu22.04 nvidia-smi
# AMD ROCm(示例)docker run --device=/dev/kfd --device=/dev/dri --group-add video \
--rm rocm/dev-ubuntu-22.04 rocminfo
4. 编程模型与常用 API
4.1 CUDA(NVIDIA)
最常用的通用计算 API。
- 线程层级:Grid → Block → Thread;Warp=32。
- 内存:Global / Shared / Constant / Texture。
- 并发:Streams、Events、异步拷贝、图(CUDA Graph)。
示例:向量加法
// nvcc vec_add.cu -o vec_add
__global__ void vecAdd(const float* a, const float* b, float* c, int n){
int i = blockIdx.x * blockDim.x + threadIdx.x;
if(i < n) c[i] = a[i] + b[i];
}
int main(){
// 省略: 分配 / 拷贝 / 核函数配置
// dim3 block(256); dim3 grid((n+255)/256);
// vecAdd<<<grid, block>>>(d_a, d_b, d_c, n);
}
4.2 ROCm/HIP(AMD)
- HIP 代码可在 NVIDIA/AMD 间移植(hipify)。
- 与 RCCL(NCCL 类似)搭配做分布式通信。
4.3 OpenCL(跨厂商)
- 统一的异构计算标准,生态较广但语法相对繁琐。
4.4 Vulkan Compute / DirectX 12 Compute
- 图形 / 计算融合场景、实时渲染与后处理、跨平台应用。
4.5 Metal / MPS(Apple)
- iOS/macOS 原生;PyTorch MPS 后端支持。
4.6 oneAPI (DPC++/SYCL)
- 面向多硬件(CPU/GPU/FPGA);与 Level Zero/OpenCL 交互。
4.7 WebGPU / DirectML(桌面 / 浏览器 /Windows)
- 端侧 / 浏览器推理、Windows 上的非 CUDA GPU 加速。
5. 深度学习框架与推理引擎
5.1 PyTorch(CUDA/ROCm/MPS)
import torch
print(torch.cuda.is_available()) # NVIDIA
print(torch.backends.mps.is_available()) # Apple
x = torch.randn(1024, 1024).cuda() # or .to('mps') / .to('amd')
- AMP 自动混合精度:
torch.cuda.amp.autocast(),配合 GradScaler。 - 图捕获 / 编译:
torch.compile()、CUDA Graph、TorchScript(部分场景)。 - 多卡:
DistributedDataParallel (DDP)+ NCCL/RCCL;ZeRO/DeepSpeed 降低显存占用。
5.2 TensorFlow / JAX
- XLA 编译加速;TPU/GPU 混合生态。
- TensorFlow on ROCm、on MPS(功能子集)。
5.3 推理引擎
- TensorRT(NVIDIA):子图融合、算子调度、INT8/FP8 量化、动态形状。
- ONNX Runtime:CUDA / TensorRT / ROCm / DirectML / OpenVINO 多后端。
- OpenVINO(Intel):CPU/iGPU/VPU 高效推理。
- Core ML(Apple):端侧部署。
5.4 服务化
- Triton Inference Server:支持 PyTorch/TensorFlow/ONNX/TensorRT、多模型并发、批处理调度。
- vLLM/TGI:大语言模型高吞吐推理(PagedAttention、KV Cache 优化)。
6. GPU 内存与并行模型
6.1 线程组织
- Block 大小:128/256/512 常见;对齐 Warp(32)以减少浪费。
- 占用率(Occupancy):线程数、寄存器、共享内存共同决定。
6.2 内存层级与访问模式
- 合并访问(Coalescing):相邻线程访问相邻地址。
- 共享内存:避免重复全局访问;注意 Bank 冲突。
- 对齐与向量化:
float4/int4等可提升带宽利用率。
6.3 数据转移
- Pinned Memory:提高 H2D/D2H 传输带宽。
- 异步拷贝 / 流水化:
cudaMemcpyAsync+streams与计算重叠。
6.4 混合精度与量化
- AMP:FP16/BF16 自动混合精度。
- 后训练量化 /PTQ 与 量化感知训练 /QAT:INT8/FP8 支持,配合 TensorRT/ORT。
7. 核心优化技巧(含代码与 Checklist)
7.1 通用 Checklist
- 明确瓶颈:计算 vs. 内存 vs. 通信。
- 使用 Profiling 工具定位热点核函数、低效内存访问。
- 批大小(Batch Size)与流水深度(Pipeline Depth)尽可能大但不 OOM。
- 合理设置线程 / 块 / 网格;避免分支发散。
- 尽量用库(cuBLAS/cuDNN/CUTLASS/Thrust/hipBLAS/MKL/oneDNN)。
- 使用混合精度 / 量化与算子融合。
- 启用内核融合(Fuse)与图编译(XLA/
torch.compile)。 - 数据预处理上 GPU,减少主机↔设备搬运。
- Pin 内存与异步拷贝,重叠 I/O 与计算。
- 多卡通信算法选择(Ring/Tree)、拓扑与亲和性优化。
7.2 CUDA 样例:共享内存优化的矩阵乘
// 伪代码框架:块分块 + Shared Memory Tile 缓存 + 边界检查
// 关键点:tile 尺寸(如 32x32),确保合并访问,避免 bank 冲突
7.3 PyTorch:AMP 与 GradScaler
scaler = torch.cuda.amp.GradScaler()
for data, target in loader:
optimizer.zero_grad(set_to_none=True)
with torch.cuda.amp.autocast():
loss = model(data.cuda()).loss
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
7.4 TensorRT:动态形状与 INT8 校准
- 构建 engine 时设置 优化 profile,提供 min/opt/max 形状。
- INT8 需提供代表性数据进行校准,或使用 QAT 导出量化权重。
7.5 分布式训练关键点
- 梯度压缩 、 混合并行 (数据 / 张量 / 流水线)、 重计算检查点、ZeRO 分片。
- NCCL/RCCL 参数:
NCCL_P2P_LEVEL,NCCL_IB_HCA,NCCL_SOCKET_IFNAME,排障时可用NCCL_DEBUG=INFO。
8. 性能分析与调试
8.1 工具
- NVIDIA:Nsight Systems(系统时序)、Nsight Compute(内核级分析)、CUDA Profiler、
cuda-memcheck。 - AMD:rocprof、rocm-smi(监控)、CodeXL 继承工具链。
- Intel:VTune Profiler、Advisor、oneAPI 工具链。
- 通用:Perfetto/Chrome Tracing、RenderDoc(图形)。
8.2 方法论
- 先系统级:是否 I/O/CPU 绑定?GPU 利用率曲线如何?
- 再内核级:SM 占用率、内存带宽利用率、分支发散、访存模式。
- 最后业务级:Batch/ 序列长度 / 算子组合 / 图编译。
9. 多 GPU 与分布式
9.1 通信原语
- NCCL(NVIDIA)/RCCL(AMD):AllReduce/AllGather/ReduceScatter/Broadcast。
- Gloo/MPI:CPU 回退或特定网络环境。
9.2 并行策略
- 数据并行:最简单;需调大 Batch 与梯度累积。
- 张量并行:大模型矩阵分块。
- 流水并行:按层 / 模块分段;与张量并行组合为 3D 并行。
- 专家混合(MoE):路由开销与负载均衡。
9.3 工具与框架
- DeepSpeed / Megatron-LM / ColossalAI / FSDP:显存高效训练。
- Ray / SLURM / Kubernetes:集群调度。
10. 推理部署与工程化
10.1 容器与驱动隔离
- 基础镜像选择:
nvidia/cuda:<ver>-runtime、rocm/dev-ubuntu-22.04等。 - NVIDIA MIG:将 A100/H100 等按切片虚拟成多个独立 GPU;提高隔离与利用率。
10.2 Triton Inference Server(示例)
- 模型仓库:
models/<name>/<version>/model.[plan|onnx|pt] - 并发与批处理:
config.pbtxt设置 instance groups、dynamic batching。 - 监控:Prometheus 指标、Perf Analyzer 压测。
10.3 KV Cache 与长序列推理
- PagedAttention、连续批处理 (continuous batching)、 静态 / 动态张量并发。
10.4 数据管道
- DALI/VisionOS/FFmpeg 硬编解码、零拷贝(DMABuf)、Pinned 内存、GPUDirect Storage(GDS)。
11. 常见场景最佳实践
11.1 计算机视觉
- NHWC/NCHW 布局选择、算子融合(Conv+BN+ReLU)、混合精度与 TensorRT。
- 数据增强上 GPU:DALI/Albumentations(CUDA)。
11.2 NLP/LLM
- 选择合适精度(FP8/BF16/INT8)与 KV Cache 策略。
- vLLM/TGI + TensorRT-LLM;分布式与分词器并行。
11.3 多模态 / 视频
- 硬编解码(NVDEC/NVENC,AMF,Quick Sync),时序模型按 Clip 批处理。
- 时域重排、光流 / 稀疏采样、内存复用。
11.4 数据库 / 大数据
- RAPIDS(cuDF/cuML/cuGraph)、Polars GPU、Spark+RAPIDS Accelerator;列式压缩与算子下推。
12. 故障排查与稳定性
12.1 快速诊断清单
nvidia-smi/rocm-smi/sycl-ls正常?驱动与工具链版本匹配?- 是否 OOM:显存碎片 / 峰值 / 缓存(
torch.cuda.empty_cache()仅释放缓存)。 - 温度功耗限制(Thermal/Power Throttling)?机箱风道 / 电源冗余?
- PCIe 错误 / 掉卡 / 拓扑异常(
dmesg/journalctl/ 事件查看器)? - 容器内外 CUDA/ROCm 版本不一致?
12.2 常见报错速查
CUDA_ERROR_OUT_OF_MEMORY:减小 batch、启用梯度检查点、FSDP/ZeRO、量化。illegal memory access:越界访问;使用cuda-memcheck/asan。- NCCL hangs:网络 / 防火墙、IB/PCIe 亲和性、环境变量配置。
13. 安全、能耗与成本优化
- 能效优先:选择 FP8/INT8、合理限功率(
nvidia-smi -pl)、按负载调节时钟。 - 成本优化:按需弹性(K8s/Spot)、MIG 切片复用、模型蒸馏 / 剪枝减少算力需求。
- 安全隔离:MIG/SR-IOV、容器权限最小化、驱动与固件及时更新。
14. FAQ 与术语表
FAQ
- Q:单卡显存不够怎么办?
A:梯度检查点、ZeRO/FSDP、张量并行、启用 CPU/NVMe Offload、量化(INT8/FP8)。 - Q:为何 GPU 利用率不高?
A:I/O 或 CPU 预处理瓶颈、批量过小、内存访问不合并;用 Nsight 定位并增大批量、移到 GPU。 - Q:Windows 也能玩训练吗?
A:可以,但生产部署通常推荐 Linux;Windows 可配 WSL2 + CUDA。
术语表(节选)
- AMP:自动混合精度;DDP:分布式数据并行;FSDP:完全分片数据并行;
- MIG:Multi-Instance GPU;GDS:GPUDirect Storage;PTQ/QAT:后训练 / 感知量化;
- XLA:加速线性代数编译器;NVDEC/NVENC:NVIDIA 硬件编解码。
附:速用配方(Cheat Sheet)
检查环境
nvidia-smi && nvcc --version # NVIDIA
rocminfo && rocm-smi # AMD
sycl-ls && clinfo # Intel/ 通用
PyTorch GPU 首测
import torch
assert torch.cuda.is_available()
x = torch.randn(8192, 8192, device='cuda')
y = x @ x.T
print(y.norm())
Docker 运行推理服务(Triton)
docker run --gpus all -p8000:8000 -p8001:8001 -p8002:8002 \
-v $PWD/models:/models --rm nvcr.io/nvidia/tritonserver:23.12-py3 \
tritonserver --model-repository=/models
NCCL 简易测试
# 两张卡:export NCCL_DEBUG=INFO
python -m torch.distributed.run --nproc_per_node=2 your_train.py
正文完

