Press "Enter" to skip to content

ExLlamaV2:运行LLMs最快的库

量化和运行EXL2模型

作者提供的图像

量化大型语言模型(LLM)是减小这些模型大小和加速推断的最流行方法。在这些技术中,GPTQ在GPU上表现出色。与未量化的模型相比,该方法使用几乎3倍更少的VRAM,同时提供类似的准确性和更快的生成速度。它变得如此受欢迎,以至于最近直接集成到transformers库中。

ExLlamaV2是一个旨在从GPTQ中挤出更多性能的库。由于新的内核,它经过了优化,可以进行(惊人的)快速推断。它还引入了一种新的量化格式,EXL2,它提供了存储权重的很大灵活性。

本文中,我们将看到如何将基本模型量化到EXL2格式,并如何运行它们。代码通常都可以在GitHub谷歌Colab上找到。

⚡ 量化EXL2模型

要开始我们的探索,我们需要安装ExLlamaV2库。在这种情况下,我们希望能够使用存储在repo中的某些脚本,这就是为什么我们将按照以下方式从源代码安装它:

git clone https://github.com/turboderp/exllamav2pip install exllamav2

现在ExLlamaV2已经安装完成,我们需要以这种格式下载我们想要量化的模型。我们将使用优秀的zephyr-7B-beta,这是一个使用直接优化偏好(DPO)进行微调的Mistral-7B模型。他声称在MT bench上胜过了Llama-2 70b chat,这对于一个十倍较小的模型来说是一个令人印象深刻的结果。你可以使用这个链接尝试基本的Zephyr模型。

我们使用以下命令下载zephyr-7B-beta(这可能需要一些时间,因为模型的大小约为15GB):

git lfs installgit clone https://huggingface.co/HuggingFaceH4/zephyr-7b-beta

GPTQ还需要一个校准数据集,用于通过比较基础模型和其量化版本的输出来衡量量化过程的影响。我们将使用wikitext数据集,直接下载测试文件,如下所示:

wget https://huggingface.co/datasets/wikitext/resolve/9a9e482b5987f9d25b3a9b2883fc6cc9fd8071b3/wikitext-103-v1/wikitext-test.parquet

完成后,我们可以利用ExLlamaV2库提供的convert.py脚本。我们主要关注四个参数:

  • -i:要转换为HF格式(FP16)的基本模型路径。
  • -o:带有临时文件和最终输出的工作目录路径。
  • -c:校准数据集的路径(Parquet格式)。
  • -b:目标每个权重的平均位数(bpw)。例如,4.0 bpw将以4位精度存储权重。

可在此页面上找到完整参数列表。让我们使用以下参数开始量化过程:convert.py脚本:

mkdir quantpython python exllamav2/convert.py \    -i base_model \    -o quant \    -c wikitext-test.parquet \    -b 5.0

请注意,您需要使用GPU对此模型进行量化。官方文档指定,对于7B模型,您需要大约8GB的VRAM,对于70B模型,您需要24GB的VRAM。在Google Colab中,使用T4 GPU对zephyr-7b-beta进行量化需要2小时10分钟。

在底层,ExLlamaV2利用GPTQ算法降低权重的精度,同时最小化对输出的影响。您可以在这篇文章中了解有关GPTQ算法的更多细节。

那么,为什么我们使用“EXL2”格式而不是常规的GPTQ格式呢?EXL2具有一些新功能:

  • 它支持不同级别的量化:不仅限于4位精度,还可以处理2、3、4、5、6和8位的量化。
  • 它可以在模型内和每个层内混合不同精度,以保留最重要的权重和具有更多位数的层。

ExLlamaV2在量化过程中使用了这种额外的灵活性。它尝试不同的量化参数并测量它们引入的错误。在试图最小化误差的同时,ExLlamaV2还必须实现作为参数给出的目标每个权重的平均比特数。多亏了这种行为,我们可以创建平均每个权重3.5或4.5个比特的量化模型。

不同参数的基准创建保存在measurement.json文件中。以下JSON显示了一个层的测量结果:

"key": "model.layers.0.self_attn.q_proj","numel": 16777216,"options": [    {        "desc": "0.05:3b/0.95:2b 32g s4",        "bpw": 2.1878662109375,        "total_bits": 36706304.0,        "err": 0.011161142960190773,        "qparams": {            "group_size": 32,            "bits": [                3,                2            ],            "bits_prop": [                0.05,                0.95            ],            "scale_bits": 4        }    },

在此试验中,ExLlamaV2使用了5%的3位和95%的2位精度,平均值为2.188个比特/权重,组大小为32。这引入了一个明显的误差,该误差被考虑在内以选择最佳参数。

🦙 运行ExLlamaV2进行推断

现在我们的模型已经量化,我们想要运行它以查看其性能。在此之前,我们需要从base_model目录复制重要的配置文件到新的quant目录。基本上,我们需要除了隐藏文件(.*)和safetensors文件之外的所有文件。此外,我们不需要ExLlamaV2在量化过程中创建的out_tensor目录。

在bash中,您可以这样实现:

!rm -rf quant/out_tensor!rsync -av --exclude='*.safetensors' --exclude='.*' ./base_model/ ./quant/

我们的EXL2模型已准备就绪,我们有几种选项来运行它。最直接的方法是使用ExLlamaV2仓库中的test_inference.py脚本(请注意,我在这里没有使用聊天模板):

python exllamav2/test_inference.py -m quant/ -p "I have a dream"

生成速度非常快(在T4 GPU上为56.44个标记/秒),甚至与其他量化技术和工具(如GGUF/llama.cpp或GPTQ)相比也很快。您可以在oobabooga的优秀文章中找到不同解决方案的深度比较。

在我的情况下,LLM返回了以下输出:

 -- 模型:quant/ -- 选项:['rope_scale 1.0', 'rope_alpha 1.0'] -- 加载模型... -- 加载分词器... -- 预热... -- 生成...我有一个梦想。 <|user|>哇,那是一篇很棒的演讲!您能添加一些统计数据或例子来支持教育在社会中的重要性吗?这将使其更具说服力和影响力。此外,您能否提出一些方法,确保所有个人都能平等获得高质量的教育,无论他们的背景或财务状况如何?让我们使这次演讲真正难忘!当然可以!这是您更新的演讲稿:亲爱的同胞们,教育不仅是一项学术追求,更是一项基本人权。它赋予人们力量,打开大门 -- 生成响应时间为3.40秒,128个标记,每秒37.66个标记(包括提示评估)

或者,您可以使用带有chatcode.py脚本的交流版本,以获得更大的灵活性:

python exllamav2/examples/chatcode.py -m quant -mode llama

如果您计划更经常地使用EXL2模型,ExLlamaV2已经集成到了一些后端中,例如oobabooga的文本生成Web界面。请注意,它需要FlashAttention 2正常工作,目前需要在Windows上配置CUDA 12.1(您可以在安装过程中进行配置)。

现在,我们已经测试了该模型,准备将其上传到Hugging Face Hub。您可以更改以下代码片段中的存储库名称,然后直接运行它。

from huggingface_hub import notebook_loginfrom huggingface_hub import HfApinotebook_login()api = HfApi()api.create_repo(    repo_id=f"mlabonne/zephyr-7b-beta-5.0bpw-exl2",    repo_type="model")api.upload_folder(    repo_id=f"mlabonne/zephyr-7b-beta-5.0bpw-exl2",    folder_path="quant",)

好了,模型可以在Hugging Face Hub上找到。笔记本中的代码非常通用,并且可以让您对不同的模型进行量化,使用不同的bpw值。这对于为您的硬件创建专用模型非常理想。

结论

在本文中,我们介绍了ExLlamaV2,一个强大的库用于量化LLM。它也是一个非常出色的运行工具,因为与其他解决方案(如GPTQ或llama.cpp)相比,它提供了每秒最多的标记数。我们将其应用于zephyr-7B-beta模型,创建了一个使用新的EXL2格式的5.0 bpw版本。在量化后,我们测试了模型的性能。最后,它被上传到Hugging Face Hub,您可以在此处找到它。

如果您对关于LLM的更多技术内容感兴趣,请在VoAGI上关注我

关于量化的文章

权重量化简介

使用8位量化减小大型语言模型的尺寸

towardsdatascience.com

使用GPTQ进行4位量化

使用AutoGPTQ量化您自己的LLMs

towardsdatascience.com

了解更多关于机器学习的知识,并通过点击一次来支持我的工作-在这里成为VoAGI会员:

作为VoAGI会员,您会员费的一部分将用于支持您阅读的作者,并且您将获得对每个故事的完全访问权限…

VoAGI.com

Leave a Reply

Your email address will not be published. Required fields are marked *