运用 ExLlamaV2 在消费级 GPU 上运转 Llama 2 70B

Llama 2 系列中最大、最好的模型具有 700亿 个参数。一个 fp16 参数占 2 个字节。加载 Llama 2 70B 需求 140 GB 内存(700 亿 * 2 字节)。

Llama 2 70B 明显小于 Falcon 180B

Llama 2 70B 能够完全合适单个消费级 GPU 吗?

这是个很有挑战性的问题。高端消费类 GPU(例如 NVIDIA RTX 30904090)具有 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 2Llama 2-ChatLlama 2-Chat 特别合适进行双向对话。它们依据其杂乱程度进一步分为不同的版别,范围从 7b 个参数到高达 70b 个参数的模型。

运用 ExLlamaV2 在消费级 GPU 上运转 Llama 2 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 PROA100 有满足的显存。
  • 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 V100RTX 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 70B7e+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 的显存) 。

为了给一些利润,方针是较低的 bpw2.4 乃至 2.3 会留下几 GB 的 VRAM 可用于推理。

ExLlamaV2 模型的速度也非常快。观察到生成速度在 1530令牌/秒之间。为了给一个比较点,当运用 GPTQ(一个小 10 倍的模型)对量化为 4-bitLlama 2 7B 进行基准测验时,运用 Hugging Face 转换器进行生成,能够到达大约 28 个令牌/秒的速度。

总结

混合精度的量化很直观,在影响较小的地方积极下降模型的精度。在单个消费级 GPU 上运转 Llama 2 70B 等大型模型是或许的。

请务必评价运用不同方针精度量化的模型。尽管较大的模型更简单量化而不会造成太大的功能丢失,但总有一个精度,在该精度下,量化的模型将变得比未量化但参数较少的模型更差,例如,Llama 2 70B 2-bit 或许比 4-bit 差很多,但仍然更大。

翻译:towardsdatascience.com/run-llama-2…