大模型开发技巧

低显存GPU环境调试大模型

方案:将 config.json 文件中 num_hidden_layers 的值修改为较小的值(比如 1)

原理:隐藏层中 block 的输入输出维度是一致的,因此去除重复的 block 并不会影响模型的处理逻辑;但需要注意该方法会影响模型的性能,因此只适合模型调试阶段使用。

低显存 GPU 环境推理大模型

分层推理法:将模型根据层来进行拆分存储,推理时分批次将要处理的层导入显存

代码示例:

from accelerate import init_empty_weights
from accelerate import load_checkpoint_and_dispatch

# 1.使用 init_empty_weights 初始化模型(不会占用内存)
with init_empty_weights():
    model = ModelClass(...)

# 2.导入模型参数,并将模型分派出去
model = load_checkpoint_and_dispatch(
    model, checkpoint=weights_location, device_map="auto", no_split_module_classes=['Block']
) # 在 device_map="auto" 模式下,标准的transformers会自动采用分层推理

# 开始分层推理
input = torch.randn(2,3)
input = input.to("cuda")
output = model(input)

模型分派的优先级:

  • 程序会自动根据 GPU 显存,内存的大小,对模型进行拆分和配置
  • 优先使用 GPU 来存储参数,当 GPU 显存不足后,使用 CPU 的内存来存储
  • 如果 CPU 的内存也不足,则会将剩余的参数存储在硬盘上

分层推理速度低于 GPU 推理,但明显优于 CPU 推理;单张GPU显存不足时,选择顺序为:【float16 + 多张GPU】 > 【Int8 + 单GPU】 > 【Int4 + 单GPU】 > 【多层推理】

参考:

小显存GPU如何调试大模型?
大模型推理技巧:分层推理法

往年同期文章