浅谈NVIDIA H100白皮书
【GiantPandaCV导语】忙完手头工作,就赶紧来过了一遍 H100 白皮书。下面我就以框架开发和炼丹师的角度谈谈 H100 的一些新特性,如有说错的地方还望指正。
硬件层级
相较于A100的108个SM,H100 提升到了132个SM,每个SM里一共有 128个FP32 CUDA Core,并配备了第四代 TensorCore。每个 GPU 一共有16896个 FP32 CUDA Core,528个Tensor Core。
![5c1c1c79dd06ac872803aa4939a86a5c.webp](https://filescdn.proginn.com/3dc9f6f3d7f3bd9178d026bbed2a2d48/5c1c1c79dd06ac872803aa4939a86a5c.webp)
我还留意了下其他文章所提及的,这次 FP32 CUDA Core是独立的,而在安培架构,是有复用 INT32 部分。相较A100,这次是在没复用的情况下把 FP32 CUDA Core数量翻倍。
第四代TensorCore
![6d113d25b6a514ccc6f340e0715febaf.webp](https://filescdn.proginn.com/f845c937285e96dd871e1ef9e22b36f7/6d113d25b6a514ccc6f340e0715febaf.webp)
TensorCore对矩阵乘法有着高度优化,这一次发布了第四代,在FP16矩阵乘法下有3倍的提升
FP8 数据格式
NV也发布了一款全新的数据格式 Float8,具体而言分两种模式,E5M2是 5个指数位,2个尾数位,1个符号位;另一个 E4M3 是 4个指数位置,3个尾数位,一个符号位。需要比较大的范围,则用 E5M2,对精度有一定要求可以使用 E4M3
![0baa8bb85bdb7ee555d1a6110ea4f049.webp](https://filescdn.proginn.com/3b7c2b5819850a093e31435c8c9ceffe/0baa8bb85bdb7ee555d1a6110ea4f049.webp)
并且支持多种精度类型的累加:
![2fefbb93febea03bc8db854d9b581d56.webp](https://filescdn.proginn.com/f914e42a44295de461c56c69d25d0289/2fefbb93febea03bc8db854d9b581d56.webp)
前面 TensorCore 在 FP16 已经有3倍提升了,对应的在 FP8 情况则有6倍提升
Transformer Engine
一开始我以为只是名字恰好取的是Transformer,但看他意思是专为Transformer模型而生的一个组件
随着 GPT-3 等模型发展,Transformer类的模型越来越大,训练时间也越来越长,以Megatron Turing NLG为例,需要 2048张 A100 训8周。而自动混合精度训练逐渐成熟,能够以更小,更快的数据格式(FP16)训练,同时也能保证模型准确率,Transformer Engine也应运而生了。
我理解 NV 这里是通过硬件+软件的方式来实现了自动混合精度训练,我们常说的自动混合精度训练都是fp16为主,而Transformer Engine支持了 FP8 数据格式。Transformer Engine会对 TensorCore 的计算结果进行统计分析,并决定是否要转换精度,并会搭配scale来进行缩放。
看上去Transformer Engine专门为Transformer模型而生,很好奇后续应该通过什么专用工具库来调用Transformer Engine。
![b1492b224e3e8a35fb09fe70d0121658.webp](https://filescdn.proginn.com/59847f157744973000f840599912f9e0/b1492b224e3e8a35fb09fe70d0121658.webp)
至此:
- SM相较上一代提升了22%
- 第四代TensorCore性能有着两倍提升
- FP8数据类型引入+Transformer Engine又有两倍提升
- 时钟频率提升带来了30%提升 这一代相比A100有着6倍的提升
![0e56c49df5b49a96ce8060201d2f2791.webp](https://filescdn.proginn.com/73c5e0900ee1939e5357cd17de7d2c67/0e56c49df5b49a96ce8060201d2f2791.webp)
新的线程层次 Thread Block Cluster
在之前CUDA编程里,我们将多个线程块组织成一个Grid,多个线程组织成一个线程块。一个线程块被单个SM调度,并且块内的线程可以同步,并利用SM上的shared memory来交换数据。线程块这个概念作为CUDA编程模型里唯一一个局部单元,已经无法最大限度拉满执行效率。
这一次在 Block 和 Grid 中间,插入了一个新的线程层次 Thread Block Cluster。一个 Cluster 是由一组线程块构成,并能被并发地被一组 SM 调度。
在一个 Cluster 内,所有线程可以访问其他SM上的Shared Memory进行数据读取交换:
而在A100只能借助Global Memory实现不同SM上的Shared Memory访问
这种新的数据交换方式能够提升7倍的速度
碍于鄙人的能力,这个我暂时只能想到做reduce_sum的时候,各线程块的部分和结果可以直接通过 Cluster 内的Distributed Shared Memory相加,而无需重新启动一个核函数或用AtomicAdd实现最后的求和。
Tensor Memory Accelerator
TensorCore计算能力上来了,那IO也得对应升级一下。TMA则是针对数据从Global Memory传输到Shared Memory而生。
![f13088b26f95e7ecc65b9e39f1b19c88.webp](https://filescdn.proginn.com/9caabe1c0e1d5eec1d556446493b4b4a/f13088b26f95e7ecc65b9e39f1b19c88.webp)
TMA编程模型是单线程的,即一个线程束内,会随机选一个线程用来异步操作,其他线程则等待数据完成传输。
这一硬件也解放了线程,以往地址计算和数据搬运是需要线程执行,而这一次都由TMA包了:
![e786a29e3df10644a6888dbabc8a7e17.webp](https://filescdn.proginn.com/5707a61561241714b4c4b764ca567e63/e786a29e3df10644a6888dbabc8a7e17.webp)
还有一些特性没完全看完,看得出NV已经是All in AI,并且押宝在Transformer类模型上了,期待后续的实际测试。