模型加载流程

模型加载时, 做这些事情:

  1. 加载配置信息

    • 模型结构、层数、注意力头数、参数精度等元信息

  2. 加载模型权重

    • 下载或使用已经缓存的模型权重文件

    • 如果模型使用bin格式,需要PyTorch版本大于等于2.6

    • 若PyTorch版本低于2.6,则需要使用safetensors格式

  3. 初始化张量(tensor)结构

    • 根据第一步加载的配置信息构造张量,准备内存映射

  4. 将第二步下载的模型权重,以第一步设定的参数精度加载进第三步初始化的张量结构

  5. 分配计算设备,通常为 GPU(CUDA),支持 CPU 回退

参数精度

所谓『参数精度』,指的是模型的每个参数(权重)会使用多少bit存储

而常用的精度有四个级别:

精度

含义

内存占用

内存结构

fp32(float32)

全精度浮点数

4字节,32位

1 bit 符号,8 bit 指数,23 bit 尾数

fp16(float16)

半精度浮点数

2字节,16位

1 bit 符号,5 bit 指数,10 bit 尾数

int8

8位整数

1字节,8位

8 bit 整数

int4

4位整数

0.5字节,4位

4 bit 整数

内存占用

以4b模型为例,它在不同精度下加载,内存占用如下:

精度

内存占用

fp32(float32)

4 * 4 = 16b字节 = 160亿字节 = 16G

fp16(float16)

2 * 4 = 8b字节 = 80亿字节 = 8G

int8

1 * 4 = 4b字节 = 40亿字节 = 4G

int4

0.5 * 4 = 2b字节 = 20亿字节 = 2G

但是模型不是加载完就可以的,它还需要运算,运算也需要内存,通常是模型本身占用内存的60%,也就是说,以4b模型为例,fp16精度加载,它需要的内存是这样的:8 + 8 * 0.6 = 8 * 1.6 = 12.8G

选择策略

通常来说,模型的选择和优化有两个方向:小模型,高精度;大模型,低精度。

如何选择?

模型大小决定了模型能做什么,加载精度决定了模型能做到什么程度

因此,有如下选择建议:

任务类型

精度优先

模型优先

推荐精度

创造型生成(小说、文案)

int8

精确生成(代码、补全)

⚖️

fp16/int8

通用对话(ChatBot)

int8

分类(情绪、意图)

fp32/fp16

文本翻译

⚖️

fp16