0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

LLaMa量化部署

jf_pmFSk4VX 来源:GiantPandaCV 2023-08-28 16:44 次阅读


本文导论部署 LLaMa 系列模型常用的几种方案,并作速度测试。包括 Huggingface 自带的 LLM.int8(),AutoGPTQ, GPTQ-for-LLaMa, exllama, llama.cpp。

总结来看,对 7B 级别的 LLaMa 系列模型,经过 GPTQ 量化后,在 4090 上可以达到 140+ tokens/s 的推理速度。在 3070 上可以达到 40 tokens/s 的推理速度。

LM.int8()

来自论文:LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

LM.int8() 时 Hugingface 集成的量化策略。能够通过在.from_pretrain()时候传递load_in_8bit来实现,针对几乎所有的 HF Transformers 模型都有效。大致方法是,在矩阵点积计算过程中, 将其中的 outliers 参数找出来(以行或列为单位),然后用类似 absolute maximum (absmax) quantization 的方法,根据行/列对 Regular 参数做量化处理,outlier 参数仍然做 fp16 计算,最后相加。

98b17b6c-4557-11ee-a2ef-92fbcf53809c.png

根据huggingface 的博客, LLM.INT8() 能够再模型性能不影响很多的前提下,让我们能用更少的资源进行 LLM 推理。但 LLM.int8() 普遍的推理速度会比 fp16 慢。博客中指出,对于越小的模型, int8() 会导致更慢的速度。

结合论文中的实验结果,模型越大,int8() 加速越明显,个人猜测是由于非 outlier 数量变多了,更多的参数进行了 int8 计算,抵消了额外的量化转化时间开销?

98cb079e-4557-11ee-a2ef-92fbcf53809c.png

GPTQ

GPTQ: ACCURATE POST-TRAINING QUANTIZATION FOR GENERATIVE PRE-TRAINED TRANSFORMERS

使用 GPTQ 量化的模型具有很大的速度优势,与 LLM.int8() 不同,GPTQ 要求对模型进行 post-training quantization,来得到量化权重。GPTQ 主要参考了 Optimal Brain Quanization (OBQ),对OBQ 方法进行了提速改进。有网友在文章中对 GPTQ, OBQ, OBS 等量化策略进行了整理,这里就不多赘述了。

以下对几个 GPTQ 仓库进行介绍。以下所有测试均在 4090 上进行,模型推理速度采用oobabooga/text-generation-webui提供的 UI。

GPTQ-for-LLaMa

专门针对 LLaMa 提供 GPTQ 量化方案的仓库,如果考虑 GPU 部署 LLaMa 模型的话,GPTQ-for-LLaMa 是十分指的参考的一个工具。像http://huggingface.co上的Thebloke很大部分模型都是采用 GPTQ-for-LLaMa 进行量化的。

Post Training Quantization:GPTQ-for-LLaMa 默认采用C4数据集进行量化训练(只采用了 C4 中英文数据的一部分进行量化,而非全部 9TB+的数据):

CUDA_VISIBLE_DEVICES=0 python llama.py /models/vicuna-7b c4 
    --wbits 4 
--true-sequential
--groupsize128
--save_safetensorsvicuna7b-gptq-4bit-128g.safetensors

由于 GPTQ 是 Layer-Wise Quantization,因此进行量化时对内存和显存要求会少一点。在 4090 测试,最高峰显存占用 7000MiB,整个 GPTQ 量化过程需要 10 分钟。量化后进行 PPL 测试,7b 在没有 arc_order 量化下,c4 的 ppl 大概会在 5-6 左右:

CUDA_VISIBLE_DEVICES=0 python llama.py /models/vicuna-7b c4 
    --wbits 4     
    --groupsize 128     
    --load vicuna7b-gptq-4bit-128g.safetensors     
    --benchmark 2048 --check

对量化模型在 MMLU 任务上测试,量化后 MMLU 为,于 fp16(46.1)稍微有点差距。

Huggingface 上的TheBloke发布的大部分 LLaMa GPTQ 模型,都是通过以上方式(C4 数据集 + wbit 4 + group 128 + no arc_order + true-sequential)量化的。若由于 GPTQ-for-LLaMa 及 transformers 仓库不断更新,Huggingface.co 上发布的模型可能存在无法加载或精度误差等问题,可以考虑重新量化,并通过优化量化数据集、添加 arc_order 等操作来提高量化精度。

GPTQ-for-LLaMa 的一些坑:

  • 经过测试,问题存在于llama.py中的quant.make_quant_attn(model)。使用quant_attn能够极大提升模型推理速度。参考这个历史 ISSUE,估计是position_id的推理 cache 在 Attention layer 中的配置存在了问题。left-padding issue

  • 模型加载问题:使用 gptq-for-llama 时,因 transformer 版本不同,可能出现模型加载不上问题。如加载TheBloke/Wizard-Vicuna-30B-Uncensored-GPTQ时,用最新版的 GPTQ-for-LLaMa 就会出现权重于模型 registry 名称不匹配的情况。

  • left-padding 问题:目前 GPTQ-for-LLaMa 的所有分支(triton, old-cuda 或 fastest-inference-int4)都存在该问题。如果模型对存在 left-padding 的输入进行预测时候,输出结果是混乱的。这导致了 GPTQ-for-LLaMa 目前无法支持正确的 batch inference。

  • GPTQ-for-LLaMa 版本变动大,如果其他仓库有使用 GPTQ-for-LLaMa 依赖的话,需要认真检查以下版本。如obbaboogafork 了一个单独的GPTQ-for-LLaMa为oobabooga/text-generation-webui做支持。最新版的 GPTQ-for-LLaMa 在 text-generation-webui 中使用会有 BUG。

AutoGPTQ

AutoGPTQ 使用起来相对容易,它提供了对大多数 Huggingface LLM 模型的量化方案,如 LLaMa 架构系列模型,bloom,moss,falcon,gpt_bigcode 等。(没在支持表中看到 ChatGLM 系列模型)。具体可以参考 官方的快速上手和进阶使用来进行量化模型训练和部署。

AutoGPTQ 可以直接加载 GPTQ-for-LLaMa 的量化模型:

from auto_gptq import AutoGPTQForCausalLMmodel = AutoGPTQForCausalLM.from_quantized(
  model_dir,   # 存放模型的文件路径,里面包含 config.json, tokenizer.json 等模型配置文件
  model_basename="vicuna7b-gptq-4bit-128g.safetensors",
  use_safetensors=True,
  device="cuda:0",
  use_triton=True,  # Batch inference 时候开启 triton 更快
  max_memory = {0: "20GIB", "cpu": "20GIB"}  # )

AutoGPTQ 提供了更多的量化加载选项,如是否采用fused_attention,配置CPU offload等。用 AutoGPTQ 加载权重会省去很多不必要的麻烦,如 AutoGPTQ 并没有 GPTQ-for-LLaMa 类似的 left-padding bug,对 Huggingface 其他 LLM 模型的兼容性更好。因此如果做 GPTQ-INT4 batch inference 的话,AutoGPTQ 会是首选。

但对于 LLaMa 系列模型,AutoGPTQ 的速度会明显慢于 GPTQ-for-LLaMa。在 4090 上测试,GPTQ-for-LLaMa 的推理速度会块差不多 30%。

exllama

exllama为了让 LLaMa 的 GPTQ 系列模型在 4090/3090 Ti 显卡上跑更快,推理平均能达到 140+ tokens/s。当然为了实现那么高的性能加速,exllama 中的模型移除了 HF transformers 模型的大部分依赖,这也导致如果在项目中使用 exllama 模型需要额外的适配工作。text-generation-webui 中对 exllama 进行了 HF 适配,使得我们能够像使用 HF 模型一样使用 exllama,代价是牺牲了一些性能,参考exllama_hf。

gptq

GPTQ 的官方仓库。以上大部分仓库都是基于官方仓库开发的,感谢 GPTQ 的开源,让单卡 24G 显存也能跑上 33B 的大模型。

GGML

GGML是一个机械学习架构,使用 C 编写,支持 Integer quantization(4-bit, 5-bit, 8-bit) 以及 16-bit float。同时也对部分硬件架构进行了加速优化。本章中讨论到的 LLaMa 量化加速方案来源于LLaMa.cpp。LLaMa.cpp 有很多周边产品,如llama-cpp-python等,在下文中,我们以 GGML 称呼这类模型量化方案。

llama.cpp 在一个月前支持了全面 GPU 加速(在推理的时候,可以把整个模型放在 GPU 上推理)。参考后文的测试,LLaMa.cpp 比 AutoGPTQ 有更快的推理速度,但是还是比 exllama 慢很多。

GGML 有不同的量化策略(具体量化类型参考),以下使用 Q4_0 对 LLaMa-2-13B-chat-hf 进行量化和测试。

此处采用docker with cuda部署,为方便自定义,先注释掉.devops/full-cuda.Dockerfile中的EntryPoint。而后构建镜像:

docker build -t local/llama.cpp:full-cuda -f .devops/full-cuda.Dockerfile .

构建成功后开启容器(models 映射到模型文件路径):

docker run -it --name ggml --gpus all -p 8080:8080 -v /home/kevin/models:/models local/llama.cpp:full-cuda bash

参考官方文档,进行权重转换即量化:

# 转换 ggml 权重python3 convert.py /models/Llama-2-13b-chat-hf/# 量化./quantize /models/Llama-2-13b-chat-hf/ggml-model-f16.bin /models/Llama-2-13b-chat-GGML_q4_0/ggml-model-q4_0.bin q4_0

完成后开启server 测试

./server -m /models/Llama-2-13b-chat-GGML_q4_0/ggml-model-q4_0.bin --host 0.0.0.0 --ctx-size 2048 --n-gpu-layers 128

发送请求测试:

curl --request POST   --url http://localhost:8080/completion   --header "Content-Type: application/json"   --data '{"prompt": "Once a upon time,","n_predict": 200}'

使用 llama.cpp server 时,具体参数解释参考官方文档。主要参数有:

  • --ctx-size: 上下文长度。

  • --n-gpu-layers:在 GPU 上放多少模型 layer,我们选择将整个模型放在 GPU 上。

  • --batch-size:处理 prompt 时候的 batch size。

使用 llama.cpp 部署的请求,速度与 llama-cpp-python 差不多。对于上述例子中,发送Once a upon time,并返回 200 个字符,两者完成时间都在 2400 ms 左右(约 80 tokens/秒)。

推理部署

记得在bert 时代,部署 Pytorch 模型时可能会考虑一些方面,比如动态图转静态图,将模型导出到 onnx,torch jit 等,混合精度推理,量化,剪枝,蒸馏等。对于这些推理加速方案,我们可能需要自己手动应用到训练好的模型上。但在 LLaMa 时代,感受到最大的变化就是,一些开源的框架似乎为你做好了一切,只需要把你训练好的模型权重放上去就能实现比 HF 模型快 n 倍的推理速度。

以下对比这些推理加速方案:HF 官方 float16(基线), vllm,llm.int8(),GPTQ-for-LLaMa,AUTOGPTQ,exllama, llama.cpp。

Model_name tool tokens/s
vicuna 7b float16 43.27
vicuna 7b load-in-8bit (HF) 19.21
vicuna 7b load-in-4bit (HF) 28.25
vicuna7b-gptq-4bit-128g AUTOGPTQ 79.8
vicuna7b-gptq-4bit-128g GPTQ-for-LLaMa 80.0
vicuna7b-gptq-4bit-128g exllama 143.0
Llama-2-7B-Chat-GGML (q4_0) llama.cpp 111.25
Llama-2-13B-Chat-GGML (q4_0) llama.cpp 72.69
Wizard-Vicuna-13B-GPTQ exllama 90
Wizard-Vicuna-30B-uncensored-GPTQ exllama 43.1
Wizard-Vicuna-30B-uncensored-GGML (q4_0) llama.cpp 34.03
Wizard-Vicuna-30B-uncensored-GPTQ AUTOGPTQ 31

以上所有测试均在 4090 + Inter i9-13900K上进行,模型推理速度采用oobabooga/text-generation-webui提供的 UI(text-generation-webui 的推理速度会比实际 API 部署慢一点)。这边只做速度测试,关于精度测试,可以查看GPT-for-LLaMa result和exllama results。

一些备注

  1. 模型推理的速度受 GPU 即 CPU 的影响最大。有网友指出link,同样对于 4090,在 CPU 不同的情况下,7B LLaMa fp16 快的时候有 50 tokens/s,慢的时候能达到 23 tokens/s。

  2. 对于 stable diffusion,torch cuda118 能比 torch cuda 117 速度快上1倍。但对于 LLaMa 来说,cuda 117 和 118 差别不大。

  3. 量化 batch inference 首选 AUTOGPTQ (TRITON),尽管 AutoGPTQ 速度慢点,但目前版本的 GPTQ-for-LLaMa 存在 left-padding 问题,无法使用 batch inference;batch size = 1 时,首选 exllama 或者 GPTQ-for-LLaMa。

  4. vllm 部署 fp16 的模型速度也不错(80+ tokens/s),同时也做了内存优化;如果设备资源够的话,可以考虑下 vllm,毕竟采用 GPTQ 还是有一点精度偏差的。

  5. TheBloke 早期发布的一些模型可能无法加载到 exllama 当中,可以使用最新版本的 GPTQ-for-LLaMa 训练一个新模型。

  6. 当显卡容量无法加载整个模型时(比如在单卡 4090 上加载 llama-2-70B-chat),llama.cpp 比 GPTQ 速度更快(参考)。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211094
  • 模型
    +关注

    关注

    1

    文章

    3158

    浏览量

    48701
  • LLM
    LLM
    +关注

    关注

    0

    文章

    272

    浏览量

    304

原文标题:LLaMa 量化部署

文章出处:【微信号:GiantPandaCV,微信公众号:GiantPandaCV】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    解读大模型FP量化的解决方案

    LLaMA, BERT 以及 ViTs 模型上,4-bit 量化皆取得了远超 SOTA 的结果。特别是,这篇文章展示了 4-bit 量化LLaMA-13B 模型,在零样本推理任
    发表于 11-24 11:15 884次阅读
    解读大模型FP<b class='flag-5'>量化</b>的解决方案

    [技术] 【飞凌嵌入式OK3576-C开发板体验】llama2.c部署

    MCU 上部署。以下是 llama2.c 在 OK3576 开发板上的部署步骤。 工程克隆 首先我们将源码克隆下来:https://github.com/karpathy/llama
    发表于 09-18 23:58

    用TensorFlow将神经网络量化为8位

    使用CoreML量化工具优化模型以进行部署。查看34T苹果开发者34Twebsite了解更多更新。 请注意,目前无法在iOS上通过CoreML部署8位量化TensorFlow模型。但是
    发表于 08-10 06:01

    实战MNN之量化部署

    今天MNN更新了新的工具包---CNN网络量化工具(quantization),作者也第一时间进行了测试。提升的效果还是很可观的,量化前的CNN网络大小...
    发表于 02-07 11:45 0次下载
    实战MNN之<b class='flag-5'>量化</b><b class='flag-5'>部署</b>

    基于LLAMA的魔改部署

    训练),并且和Vision结合的大模型也逐渐多了起来。所以怎么部署大模型是一个 超级重要的工程问题 ,很多公司也在紧锣密鼓的搞着。 目前效果最好讨论最多的开源实现就是LLAMA,所以我这里讨论的也是基于 LLAMA的魔改
    的头像 发表于 05-23 15:08 5403次阅读
    基于<b class='flag-5'>LLAMA</b>的魔改<b class='flag-5'>部署</b>

    Yolo系列模型的部署、精度对齐与int8量化加速

    在基于PytorchQuantization导出的含有QDQ节点的onnx时,我们发现尽管量化版本的torch模型精度很高,但是在TensorRT部署时精度却很低,TRT部署收精度损失很严重,通过
    的头像 发表于 11-23 16:40 1183次阅读

    LLaMA 2是什么?LLaMA 2背后的研究工作

    Meta 发布的 LLaMA 2,是新的 sota 开源大型语言模型 (LLM)。LLaMA 2 代表着 LLaMA 的下一代版本,并且具有商业许可证。
    的头像 发表于 02-21 16:00 967次阅读

    Llama 3 王者归来,Airbox 率先支持部署

    前天,智算领域迎来一则令人振奋的消息:Meta正式发布了备受期待的开源大模型——Llama3。Llama3的卓越性能Meta表示,Llama3在多个关键基准测试中展现出卓越性能,超越了业内先进的同类
    的头像 发表于 04-22 08:33 585次阅读
    <b class='flag-5'>Llama</b> 3 王者归来,Airbox 率先支持<b class='flag-5'>部署</b>

    Optimum Intel三步完成Llama3在算力魔方的本地量化部署

    Llama3 是Meta最新发布的开源大语言模型(LLM), 当前已开源8B和70B参数量的预训练模型权重,并支持指令微调。
    的头像 发表于 05-10 10:34 970次阅读
    Optimum Intel三步完成<b class='flag-5'>Llama</b>3在算力魔方的本地<b class='flag-5'>量化</b>和<b class='flag-5'>部署</b>

    【AIBOX上手指南】快速部署Llama3

    Firefly开源团队推出了Llama3部署包,提供简易且完善的部署教程,过程无需联网,简单快捷完成本地化部署。点击观看Llama3快速
    的头像 发表于 06-06 08:02 587次阅读
    【AIBOX上手指南】快速<b class='flag-5'>部署</b><b class='flag-5'>Llama</b>3

    如何将Llama3.1模型部署在英特尔酷睿Ultra处理器

    本文从搭建环境开始,一步一步帮助读者实现只用五行代码便可将Llama3.1模型部署在英特尔 酷睿 Ultra 处理器上。
    的头像 发表于 07-26 09:51 1932次阅读
    如何将<b class='flag-5'>Llama</b>3.1模型<b class='flag-5'>部署</b>在英特尔酷睿Ultra处理器

    源2.0-M32大模型发布量化版 运行显存仅需23GB 性能可媲美LLaMA3

    北京2024年8月23日 /美通社/ -- 近日,浪潮信息发布源2.0-M32大模型4bit和8bit量化版,性能比肩700亿参数的LLaMA3开源大模型。4bit量化版推理运行显存仅需
    的头像 发表于 08-25 22:06 252次阅读
    源2.0-M32大模型发布<b class='flag-5'>量化</b>版 运行显存仅需23GB 性能可媲美<b class='flag-5'>LLaMA</b>3

    使用OpenVINO 2024.4在算力魔方上部署Llama-3.2-1B-Instruct模型

    前面我们分享了《三步完成Llama3在算力魔方的本地量化部署》。2024年9月25日,Meta又发布了Llama3.2:一个多语言大型语言模型(LLMs)的集合。
    的头像 发表于 10-12 09:39 453次阅读
    使用OpenVINO 2024.4在算力魔方上<b class='flag-5'>部署</b><b class='flag-5'>Llama</b>-3.2-1B-Instruct模型

    Meta发布Llama 3.2量化版模型

    近日,Meta在开源Llama 3.2的1B与3B模型后,再次为人工智能领域带来了新进展。10月24日,Meta正式推出了这两个模型的量化版本,旨在进一步优化模型性能,拓宽其应用场景。
    的头像 发表于 10-29 11:05 300次阅读

    使用NVIDIA TensorRT提升Llama 3.2性能

    Llama 3.2 模型集扩展了 Meta Llama 开源模型集的模型阵容,包含视觉语言模型(VLM)、小语言模型(SLM)和支持视觉的更新版 Llama Guard 模型。与 NVIDIA 加速
    的头像 发表于 11-20 09:59 110次阅读