PyTorch 团队亲自教你如何加速大模型推理。
文本生成
一直是一个特别受欢迎的领域,很多开源项目如 llama.cpp、vLLM 、 MLC-LLM 等,为了取得更好的效果,都在进行不停的优化。
机器学习
社区中最受欢迎框架之一的 PyTorch,自然也是抓住了这一新的机遇,不断优化。为此让大家更好的了解这些创新,PyTorch 团队专门设置了系列博客,重点介绍如何使用纯原生 PyTorch 加速生成式 AI 模型。
准确率
,只用了不到 1000 行的纯原生 PyTorch 代码!
所有
基准
测试都在 A100-80GB 上运行的,功率限制在 330W。
-
Torch.compile:PyTorch 模型编译器, PyTorch 2.0 加入了一个新的函数,叫做 torch.compile (),能够通过一行代码对已有的模型进行加速;
-
GPU
量化
:通过降低运算精度来加速模型;
-
Speculative Decoding:一种大模型推理加速方法,使用一个小的「draft」模型来预测大的「目标」模型的输出;
-
张量
并行:通过在多个设备上运行模型来加速模型推理。
6 步加快大模型推理
第一步:通过 Torch.compile 和静态 KV 缓存减少 CPU 开销,实现 107.0 TOK/S
逻辑
长度(logical length)」会增长。出现这种问题有两个原因:一是每次缓存增长时重新分配(和复制)kv 缓存的成本非常高;其次,这种动态分配使得减少开销变得更加困难。
注意力机制
中未使用的值。
文本生成
可视为一个两阶段过程:1. 用来处理整个提示的 prefill 阶段 2. 解码 token.
第二步:通过 int8
权重
量化
缓解内存带宽瓶颈,实现 157.4 tok /s
权重
从 GPU 全局内存加载到寄存器的代价。换句话说,每次前向传播都需要「接触(touch)」GPU 上的每个
参数
。那么,理论上我们能够以多快的速度「接触」模型中的每个
参数
?
参数
模型,每个
参数
都存储在 fp16 中(每个
参数
2 字节),可以实现 107 tokens/s。A100-80GB 理论上有 2 TB/s 的内存带宽。
参数
的数量,也无法改变 GPU 的内存带宽。但他们发现可以更改每个
参数
存储的字节数!
量化
。
量化
权重
,计算本身仍然在 bf16 中完成。此外,有了 torch.compile,可以轻松生成 int8
量化
的高效代码。
权重
量化
时,性能有显着提升。
量化
应用于 Llama-7B 模型,性能提高了约 50%,达到 157.4 tokens/s。
第三步:使用 Speculative Decoding
量化
等技术之后,该团队仍然面临着另一个问题,即为了生成 100 个 token,必须加载
权重
100 次。
权重
被
量化
,一遍又一遍地加载
权重
也避免不了,这种问题该如何解决呢?事实证明,利用 speculative decoding 能够打破这种严格的串行依赖性并获得加速。
第四步:使用 int4
量化
和 GPTQ 方法进一步减小
权重
,实现 202.1 tok/s
权重
为 4-bits 时,模型的
准确率
开始下降。
量化
策略。将这些操作组合在一起,得到如下:
第五步:将所有内容组合在一起,得到 244.7 tok/s
第六步:
张量
并行性
张量
并行的低级工具,只需 150 行代码,并且不需要任何模型更改。
张量
并行性组合,将这些组合在一起,能以 55 tokens/s 的速度为 Llama-70B 模型提供 int8
量化
。
张量
并行性以达到约 80 tok/s,这些都接近或超过 SOTA 性能。
原文链接:https://pytorch.org/blog/accelerating-generative-ai-2/
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...