Llama 2 系列中最大、最好的模型具有
700亿
个参数。一个fp16
参数占2
个字节。加载Llama 2 70B
需求140 GB
内存(700 亿 * 2 字节
)。
Llama 2 70B
明显小于 Falcon 180B
。
Llama 2 70B
能够完全合适单个消费级 GPU 吗?
这是个很有挑战性的问题。高端消费类 GPU(例如 NVIDIA RTX 3090
或 4090
)具有 24 GB
的显存VRAM
。假如将 Llama 2 70B
量化到 4-bit
精度,仍然需求 35 GB 显存
(700 亿 * 0.5
字节)。该模型能够装置到 2 个消费级 GPU 中。
经过 GPTQ 量化,能够进一步将精度下降到 3-bit
,而不会丢失太多模型的功能。 3-bit
参数在内存中的大小为 0.375
字节。 Llama 2 70B
量化为 3-bit
后仍需显存 26.25 GB
,还是不合适一款消费级 GPU。
继续下降精度,将精度下降到 2-bit
,需求现场 24 GB
,但依据之前关于 2-bit
量化的研究,模型的功能会显着下降。
为了防止模型功能丢失太多,能够将模型的重要层或部分量化为更高的精度,将不太重要的部分量化为更低的精度,将模型以混合精度办法进行量化。
ExLlamaV2(MIT 许可证)实现混合精度量化。
在本文中,将展示怎么运用 ExLlamaV2 以混合精度办法量化模型。具体地说,将了解怎么将 Llama 2 70B
量化到低于 3-bit
的均匀精度。
什么是 Llama 2
Meta AI 的 Llama 2 摆脱了前身 Llama 的暗影,在谈天机器人领域树立新基准方面迈出了重大一步。它的前身 Llama 经过依据提示生成文本和代码来激起波涛,就像它的谈天机器人同行相同。
Llama 2
扮演两个不同的角色 Llama 2
和 Llama 2-Chat
。Llama 2-Chat
特别合适进行双向对话。它们依据其杂乱程度进一步分为不同的版别,范围从 7b
个参数到高达 70b
个参数的模型。
混合精度 Llama 2 的量化
要以混合精度量化模型并运转它们,需求装置 ExLlamaV2 。
从源码装置:
git clone https://github.com/turboderp/exllamav2
cd exllamav2
pip install -r requirements.txt
方针是在消费级 GPU 上运转模型。
-
Llama 2 70B
:方针是24 GB
显存。NVIDIA RTX3090/4090
GPU 能够作业。假如运用Google Colab
,则无法在免费的Google Colab
上运转它。只要Google Colab PRO
的A100
有满足的显存。 -
Llama 2 13B
:方针是12 GB
显存。许多具有至少12 GB VRAM
的 GPU 都可用。RTX3060/3080/4060/4080
就是其间的类型。它能够在带有T4 GPU
的免费 Google Colab 上运转。
怎么运用 ExLlamaV2 以混合精度进行量化
ExLlamaV2 运用的量化算法与 GPTQ 相似。但 ExLlamaV2 没有挑选一种精度类型,而是在丈量量化差错时为每一层测验不同的精度类型。一切的测验和相关的过错率都会被保存。然后,给定用户供给的方针精度,ExLlamaV2 算法将经过为每层模块挑选抢先的量化精度来量化模型,均匀以最低的过错率到达方针精度。
在量化期间,ExLlamaV2 输出一切测验:
Llama 2 13B
第10层 up_proj
模块的量化测验:
-- Linear: model.layers.10.mlp.up_proj
-- 0.05:3b/0.95:2b 32g s4 2.18 bpw rfn_error: 0.21867
-- 0.25:3b/0.75:2b 32g s4 2.38 bpw rfn_error: 0.20617
-- 0.25:4b/0.75:2b 32g s4 2.63 bpw rfn_error: 0.20230
-- 0.1:4b/0.4:3b/0.5:2b 32g s4 2.73 bpw rfn_error: 0.18449
-- 0.1:4b/0.9:3b 32g s4 3.23 bpw rfn_error: 0.10229
-- 0.2:6b/0.8:3b 32g s4 3.73 bpw rfn_error: 0.09791
-- 1.0:3b 128g s4 3.03 bpw rfn_error: 0.11354
-- 1.0:3b 32g s4 3.13 bpw rfn_error: 0.10491
-- 0.05:4b/0.95:3b 32g s4 3.18 bpw rfn_error: 0.10363
-- 0.4:4b/0.6:3b 32g s4 3.53 bpw rfn_error: 0.09272
-- 0.6:4b/0.4:3b 64g s4 3.66 bpw rfn_error: 0.08835
-- 1.0:4b 128g s4 4.03 bpw rfn_error: 0.05756
-- 1.0:4b 32g s4 4.13 bpw rfn_error: 0.05007
-- 0.1:5b/0.9:4b 32g s4 4.23 bpw rfn_error: 0.04889
-- 0.1:6b/0.9:4b 32g s4 4.33 bpw rfn_error: 0.04861
-- 1.0:5b 128g s4 5.03 bpw rfn_error: 0.02879
-- 0.1:6b/0.9:5b 32g s4 5.23 bpw rfn_error: 0.02494
-- 0.05:8b/0.05:6b/0.9:5b 32g s4 5.33 bpw rfn_error: 0.02486
-- 0.4:6b/0.6:5b 32g s4 5.53 bpw rfn_error: 0.02297
-- 0.1:8b/0.3:6b/0.6:5b 32g s4 5.73 bpw rfn_error: 0.02280
-- 1.0:6b 128g s4 6.03 bpw rfn_error: 0.01503
-- 1.0:6b 32g s4 6.13 bpw rfn_error: 0.01471
-- 0.1:8b/0.9:6b 128g s4 6.23 bpw rfn_error: 0.01463
-- 1.0:8b 32g s4 8.13 bpw rfn_error: 0.00934
-- Time: 19.57 seconds
能够看到,正如预期的那样,跟着量化精度(bpw
,即每权重位数)的添加,过错率下降。
运用 ExLlamaV2 进行量化就像运转 convert.py
脚本相同简略,其间 convert.py
坐落ExLlamaV2 的根目录下:
python convert.py
-i ./Llama-2-13b-hf/
-o ./Llama-2-13b-hf/temp/
-c test.parquet
-cf ./Llama-2-13b-hf/3.0bpw/
-b 3.0
ExLlamaV2 不支持 Hugging Face 库,它期望模型和校准数据集存储在本地。
该脚本的主要参数如下:
- 输入模型
-i
:包含safetensors
格局模型的本地目录。 - 用于校准的数据集
-c
:需求一个用于校准量化的数据集。它有必要以parquet
格局存储在本地。 - 输出目录
-cf
:保存量化模型的本地目录。 - 量化的方针精度
-b
:模型将以混合精度进行量化,该混合精度将均匀为方针精度。在这里,挑选以3-bit
精度为方针。
这次量化花了 2小时5分钟
。运用具有 T4 GPU
和高 CPU RAM
的 Google Colab PRO。整个过程中没有耗费超过 5 GB
的 VRAM,但 CPU RAM 的峰值耗费到达了 20 GB
。
T4
相当慢。运用 Google Colab V100
或 RTX GPU
能够缩短量化时刻。 注意:不清楚量化期间 GPU 的运用量。 CPU 速度对量化时刻的影响或许比 GPU 更大。
要量化 Llama 2 70B
,能够执行相同的操作。
应该以什么精度为方针,以便量化的 Llama 2 70B
合适 24 GB VRAM
?
能够运用以下办法来确认给定硬件的模型的精度。
假设有 24 GB
的 VRAM。还应该一直预期推理睬产生一些内存开销。因此,方针是 22 GB
的量化模型大小。
首要,需求将 22 GB
转换为 bits
:
22 GB = 2.2e+10 bytes = 1.76e+11 bits (since 1 byte = 8 bits)
有 1.76e+11
bits (b) 可用。 Llama 2 70B
有 7e+10
个要量化的参数 p
。方针精度是 bpw
。
bpw = b/p
bpw = 176 000 000 000 / 70 000 000 000 = 2.51
因此能够接受每个参数 2.51 bits
的均匀精度。将其四舍五入为 2.5 bits
。 为了将 Llama 2 70B
量化到 2.5 bits
的均匀精度,运转:
python convert.py
-i ./Llama-2-70b-hf/
-o ./Llama-2-70b-hf/temp/
-c test.parquet
-cf ./Llama-2-70b-hf/2.5bpw/
-b 2.5
这种量化在具有 24 GB GPU 的消费类硬件上也是可行的。最多或许需求 15 小时
。假如想运用 Google Colab 进行此操作,请注意,有必要将原始模型存储在 Google Colab 硬盘之外,由于运用 A100 GPU
时原始模型太小。
运用 ExLlamaV2 在 GPU 上运转 Llama 2 70B
ExLlamaV2 供给运转混合精度量化模型所需的一切。
有一个 chat.py
脚本将模型作为谈天机器人运转以供交互运用。还能够运用 test_inference.py
简略地测验模型。这就是查看模型速度和内存耗费的办法。
为了测验以 2.5 bpw
量化的 Llama 2 70B
,运转:
python test_inference.py -m ./Llama-2-70b-2.5bpw/ -p "Once upon a time,"
-
-p
为测验提示符。
这应该需求几分钟(在 A100 GPU
上需求 8 分钟)。 ExLlamaV2 运用torch.compile。依据 PyTorch 文档:
torch.compile
经过将 PyTorch 代码 JIT 编译到优化的内核中,使 PyTorch 代码运转得更快,一起只需求最少的代码更改。
这个编译很耗时可是会被缓存。
假如运转 test_inference.py
,同样只需求 30 秒
。
该模型自身需求显存 22.15 GB
。在推理试验中,它正好占用了 24 GB
。它简直不合适消费级 GPU。
为什么它不只耗费 22.15 GB 显存?
显存中的模型实际上占用了 22.15 GB
,但推理自身也耗费了额外的显存。例如,有必要对提示进行编码并将其存储在显存中。此外,假如设置更高的最大序列长度或进行批量解码,推理将耗费更多显存。
运用 Google Colab 的 A100 进行这个试验。假如运用 24 GB
的 GPU,则在推理过程中或许会呈现 CUDA 内存不足过错,特别是假如还运用 GPU 运转操作系统图形用户界面(例如,Ubuntu 桌面耗费大约 1.5 GB
的显存) 。
为了给一些利润,方针是较低的 bpw
。 2.4
乃至 2.3
会留下几 GB
的 VRAM 可用于推理。
ExLlamaV2 模型的速度也非常快。观察到生成速度在 15
到 30
个令牌/秒
之间。为了给一个比较点,当运用 GPTQ(一个小 10 倍的模型)对量化为 4-bit
的 Llama 2 7B
进行基准测验时,运用 Hugging Face 转换器进行生成,能够到达大约 28
个令牌/秒的速度。
总结
混合精度的量化很直观,在影响较小的地方积极下降模型的精度。在单个消费级 GPU 上运转 Llama 2 70B
等大型模型是或许的。
请务必评价运用不同方针精度量化的模型。尽管较大的模型更简单量化而不会造成太大的功能丢失,但总有一个精度,在该精度下,量化的模型将变得比未量化但参数较少的模型更差,例如,Llama 2 70B
2-bit
或许比 4-bit
差很多,但仍然更大。