Appearance
硬件
一、为什么要了解深度学习硬件
了解硬件能帮我们设计更高效的算法,好的设计能让训练速度差出数量级 —— 比如有的设计 1 周就能训练完,有的要 3 个月,会错过截止日期。我们需要知道不同硬件的特点,才能让算法和硬件匹配,发挥最大性能。
二、计算机的基本组成
普通的深度学习用的计算机,核心部件有这些:
CPU(处理器):不只是跑操作系统,还能执行程序,一般有 8 个以上的核心。
内存(RAM):存权重、激活值、训练数据这些,用来快速存取计算结果。
以太网连接:速度从 1GB/s 到 100GB/s 不等,高端服务器会用更高级的连接方式。
PCIe 总线:用来连接 GPU 这些加速器,服务器最多能连 8 个加速卡,桌面一般 1-2 个。
持久存储设备:比如硬盘、固态硬盘,存训练数据和中间检查点,需要足够快的传输速度。
这些部件的连接方式很重要:PCIe 总线直接连 CPU,把 CPU 和网络、GPU、存储连起来;内存直接连 CPU,带宽能到 100GB/s。运行代码的时候,数据要传到处理器(CPU 或 GPU)计算,结果再存回内存或持久存储,所以不能让任何一个部件成为瓶颈 —— 比如如果加载图像太慢,处理器就没事干;如果数据传不到 GPU,GPU 就没法全速运行。
三、内存:数据存取的关键
1. CPU 内存
现在 CPU 内存一般是 DDR4,每个模块带宽 20-25Gb/s,总线是 64 位宽。CPU 一般有 2-4 个内存通道,所以内存带宽峰值在 40GB/s 到 100GB/s 之间。
内存存取有个很重要的特点:第一次读取的成本特别高!发送地址、准备传输要 100ns,之后每次传输只要 0.2ns,第一次读取的成本是后续的 500 倍!所以要尽量避免随机读取,用突发模式(一次读一大串数据)。
另外,内存有多个物理存储体,每个可以独立读取。如果随机读取均匀分布在内存里,有效随机读取次数能到 4 倍,但还是不如突发读取快。而且数据结构最好和 64 位边界对齐,编译器一般会自动做这个。
2. GPU 内存
GPU 的内存带宽要求更高,因为它的处理单元比 CPU 多得多。提升带宽的方法有两个:一是把内存总线做宽,比如 NVIDIA RTX 2080Ti 的总线是 352 位宽,能同时传更多数据;二是用高性能内存,比如消费级 GPU 用 GDDR6,高端服务器用 HBM2。GPU 内存比 CPU 内存贵,所以一般容量更小,不过速度更快。
四、持久存储:长期存数据的设备
持久存储的关键指标是带宽(传输速度)和延迟(存取时间),不同设备差别很大。
1. 硬盘驱动器(HDD)
用了半个多世纪的老设备,靠旋转的盘片和磁头读写数据。优点是便宜,高端硬盘能存 16TB;缺点是延迟高、容易坏。
硬盘转速一般 7200RPM,访问数据的时候要等盘片转到指定位置,最快也要 8 毫秒才能拿到数据,每秒只能做大概 100 次 IO 操作(IOPs),带宽只有 100-200MB/s。现在大数据集的训练已经很少用 HDD 了,主要用来归档。
2. 固态驱动器(SSD)
用闪存存数据,比 HDD 快很多:IOPs 能到 10 万 - 50 万,是 HDD 的 1000 倍;带宽 1-3GB/s,是 HDD 的 10 倍。但它也有缺点:
只能按块(256KB 或更大)写入,随机写入性能很差,因为要先读、擦除,再重新写入。
存储单元容易磨损,几千次写入就老化了,所以不适合做交换分区或大型日志文件。
高端的 NVMe SSD 用 PCIe 连接,PCIe4.0 上最高能到 8GB/s 带宽。
3. 云存储
可以动态配置性能,虚拟机的存储数量和速度都能按需调整。如果训练的时候延迟太高(比如有很多小文件),可以多配置点 IOPs。
五、CPU:计算机的核心
CPU 是计算机的核心,由处理器核心、总线、缓存、向量处理单元组成。
1. 微体系结构
每个处理器核心的结构很复杂,前端负责加载指令、预测执行路径,把汇编代码解码成微指令,再交给执行核心。执行核心能同时执行多个操作,比如 ARM Cortex A77 一个时钟周期能执行 8 个操作。
处理器还会在分支指令里同时执行多条路径,然后丢弃没选的路径,所以前端的分支预测单元很重要,要选最有可能的路径执行。
2. 矢量化(SIMD)
深度学习计算量大,CPU 靠向量处理单元来提速,比如 ARM 的 NEON、x86 的 AVX2,能执行单指令多数据操作 —— 比如一个时钟周期完成 8 个整数加法。这些寄存器最长能到 512 位,最多能处理 64 对数字,还能做乘加融合操作。
不过 CPU 的这个能力和 GPU 比就差远了,比如 NVIDIA RTX 2080Ti 有 4352 个 CUDA 核心,每个都能处理这样的操作。
3. 缓存:解决内存带宽不足的问题
CPU 的内存带宽跟不上计算需求,所以用缓存来解决。缓存分几级:
寄存器:不是缓存,但能以时钟速度访问,没有延迟,CPU 有几十个寄存器,编译器或程序员要好好利用。
一级缓存:很小,32-64KB,分数据和指令缓存,访问速度极快,如果数据不在这,就往下找。
二级缓存:每个核心 256-512KB,比一级缓存大,速度慢一点,要先检查一级缓存没找到才会访问它。
三级缓存:多个核心共享,一般 4-8MB,高端服务器能到 256MB。
缓存的预测很重要,比如向前遍历内存会更快,因为缓存算法会向前读取。另外,错误共享会导致性能严重下降:比如处理器 1 要的数据存在处理器 0 的缓存里,处理器 0 要把数据写回内存,处理器 1 再从内存读,这时候两个处理器都要等,多处理器运行的速度反而比单处理器慢。
六、GPU 和其他加速卡:深度学习的核心助力
没有 GPU 就没有现在的深度学习,GPU 和算法是互相促进发展的。
1. 训练和推断的硬件区别
推断:只需要前向传播,不用存中间数据,精度要求低,FP16 或 INT8 就够了,所以硬件会针对这个优化,比如 NVIDIA Turing T4 GPU。
训练:需要存中间结果算梯度,精度要求高,至少要 FP16(或混合精度),需要更快更大的内存(HBM2 或 GDDR6)和更强的处理能力,比如 NVIDIA V100 GPU。
2. GPU 的设计思路
GPU 的设计是在 CPU 的矢量化基础上升级:一是优化矩阵运算,比如张量核;二是增加更多核心。比如 NVIDIA Turing 的处理块有 16 个整数单元、16 个浮点单元,还有 2 个张量核,4 个这样的块组成一个流式多处理器,12 个流式多处理器组成一个图形处理集群。
3. 张量核
张量核是专门针对深度学习优化的电路,针对 4×4 和 16×16 的小型矩阵运算优化,不同精度的运算有不同的优化。不过 GPU 不擅长处理稀疏数据和中断,稀疏数据的访问模式不适合 GPU 的高带宽突发读取,现在有专门的库(比如 DGL)在研究解决这个问题。
七、网络和总线:设备之间的连接
当单个设备不够用的时候,就需要用网络和总线来传输数据、同步处理。
1. PCIe
专用总线,每个通道是点到点连接,PCIe4.0 的 16 通道插槽能到 32GB/s 带宽,延迟 5 微秒左右。处理器的 PCIe 通道数量有限:AMD EPYC 3 有 128 个,Intel Xeon 每个芯片 48 个,桌面级的 Ryzen9 是 20 个,Core i9 是 16 个。GPU 一般用 16 个通道,所以能全带宽连接的 GPU 数量受通道数量限制,还要和存储、以太网共享链路。
2. 以太网
连接计算机最常用的方式,比 PCIe 慢,但安装成本低、覆盖距离远。低级服务器带宽 1GBit/s,高端的能到 100GBit/s。以太网是连接两个设备,比如计算机和交换机。
3. 交换机
用来连接多个设备,让任意两个设备都能全带宽点对点连接,比如以太网交换机能连 40 台服务器。PCIe 也有交换机,比如 P2 实例能把很多 GPU 连到主机处理器。
4. NVLink
比 PCIe 带宽更高的互连方式,每条链路能到 300Gbit/s。服务器 GPU(Volta V100)有 6 条链路,消费级 GPU(RTX 2080Ti)只有 1 条,速度降到 100Gbit/s。用 NCCL 能实现 GPU 之间的高速数据传输。
八、各种操作的延迟:直观感受速度差异
不同操作的延迟差别极大,比如:
L1 缓存读取只要 1.5ns,
内存读取要 46-120ns,
SSD 随机读取要 120-500μs,
硬盘随机读取要 10ms,
跨数据中心的往返要 500μs,
跨洲的数据包往返要 150ms。
这些数字能帮我们判断算法的瓶颈在哪,比如如果算法里有很多硬盘随机读取,那速度肯定快不了。
九、小结
数据传输要 “量大次少”,不管是内存、SSD、网络还是 GPU,都要尽量一次传大量数据,减少传输次数。
矢量化是提升性能的关键,要了解硬件的特殊功能,比如 Intel CPU 的 INT8 优化、NVIDIA GPU 的 FP16 和张量核优化。
训练的时候要注意数据类型,太小的类型会导致数值溢出,推断的时候就没那么多限制。
内存对齐很重要,64 位 CPU 要按 64 位边界对齐,GPU 要和张量核对齐,不然性能会下降。
算法要和硬件匹配,比如把数据装进缓存里,能提升几个数量级的速度。
设计算法前先在纸上估算性能,关注数量级的差异,再用调试器找瓶颈。
训练和推断的硬件不一样,要根据需求选择。
(注:文档部分内容可能由 AI 生成)