网易首页 > 网易号 > 正文 申请入驻

使用 NVIDIA TensorRT-LLM 支持 int4 量化和推理优化实践

0
分享至

使其可部署在 24GB 显存的单张 NVIDIA A10 Tensor Core GPU

概述

CodeFuse(https://github.com/codefuse-ai)是由蚂蚁集团开发的代码语言大模型,旨在支持整个软件开发生命周期,涵盖设计、需求、编码、测试、部署、运维等关键阶段。

为了在下游任务上获得更好的精度,CodeFuse 提出了多任务微调框架(MFTCoder),能够解决数据不平衡和不同收敛速度的问题。

通过对比多个预训练基座模型的精度表现,我们发现利用 MFTCoder [1,2] 微调后的模型显著优于原始基座模型。其中,尤为值得关注的是采用了 MFTCoder 框架,并利用多任务数据集进行微调的 CodeFuse-CodeLlama-34B [3] 模型,在 HumanEval 评估数据集中取得了当时的最好结果。具体来说,基于 CodeLlama-34b-Python 模型进行微调的 CodeFuse-CodeLlama-34B 在 HumanEval-python 上实现了 74.4% 的 pass@1(贪婪解码)。以下是完整的代码能力评估结果 :

在代码补全、text2code、代码翻译、单测生成以及代码生成任务上,CodeFuse-CodeLlama-34B 全面超过 GPT-3.5;CodeFuse-CodeLlama-34B 能够在单测生成和代码补全(HumanEval )任务上超过 GPT-4。同时,上述微调模型、MFTCoder 训练框架和高质量代码数据集已经开源(github: https://github.com/codefuse-ai)。

然而,CodeFuse-CodeLlama-34B 的部署遇到了如下两个挑战:

1)数据类型为 fp16 的 34B 模型,显存占用为 68 GB,至少需要 3 张 A10 才能加载模型,部署成本很高;

2)在模型推理的生成阶段,通常伴随着长条形的矩阵运算,此时计算量较小,不足以掩盖 GPU 的访存延迟,即 memory bound 问题,此时程序的性能受限于 GPU 带宽。

为了解决上述问题,我们利用 GPTQ 量化技术,在降低了部署成本的同时,也缓解了 GPU 的带宽压力 ,从而显著提升了推理速度。最终,CodeFuse-CodeLlama-34B 的 int4 量化模型可以部署在单张 A10 显卡上,推理速度可以达到 20 tokens/s (batch_size=1)。同时,相较于 fp16 数据精度的模型,通过算法上的优化,int4 量化引入的精度下降可以控制在 1% 以内。下面,我们从模型量化和测试两个方面展示我们是如何实现 CodeFuse-CodeLlama-34B 模型的 int4 量化部署的。另外,TensorRT-LLM 也支持了 CodeFuse 中基于 MFTCoder 训练的开源模型部署。

CodeFuse-CodeLlama-34B int4 量化

这里我们使用 GPTQ [4] 技术对模型进行 int4 量化。GPTQ 是对逐层量化范式经典框架 OBQ(Optimal Brain Quantization)[5] 的高效实现,能够利用单张 A100-80G 在 4 小时内完成 OPT-175B 模型的量化,并且可以获得较好的准确率。

另外,我们这里采用了静态量化方式,即通过矫正数据离线地进行量化,得到诸如缩放因子和零点的量化参数,在推理时不再进行量化参数的更新。与之对应的是动态量化,会在模型推理的同时根据输入进行量化参数的调整。最后,我们这里进行的是 int4-weight-only 量化,即只对权重进行量化而不对层输入进行量化,即 W4A16 量化。

GPTQ 算法

为了量化权重

,OBQ 框架对层重建损失函数

进行二阶泰勒级数展开,同时假设在未量化的权重值处一阶梯度为零,从而得到如下优化问题:

其中,

是所有未量化权重对应的 Hessian 矩阵。那么,量化误差以及权重更新值分别为

上面的两个公式意味着所有未量化权重需要

通过

更新以补偿量化带来的量化误差。同时,层重建损失函数可以按照输出通道(output channel, OC)分解为独立的子问题,例如:

其中 Hessian 矩阵为

。为了充分利用 GPU 的能力,GPTQ 做了如下三个改进:

  1. 所有输出通道共享相同的量化顺序,从而使得行间共享同一份 Hessian 矩阵,大大减少了算法计算量。
  2. 使用一次 Cholesky 分解代替了在 GPTQ 每次迭代中对整个 Hessian 矩阵的逆矩阵的高斯消元迭代更新方式。既大大减少了计算量,又得以利用成熟 GPU 矩阵库中的 Cholesky 算法,且避免了迭代更新方式在矩阵运算中所带来的数值不稳定问题。
  3. 通过将整个计算过程由对单个输入通道进行更新,等效转变为划分 batch 并逐 batch 更新的方式,避免了每次量化对整个 Hessian 与权重矩阵的 GPU 读写操作,大大降低了 GPU 访存数量。

上述的改进使得 GPTQ 可以有效提升 GPU 利用率,从而能够对大模型进行高效量化。

int4-weight-only 量化

这里我们利用开源工具 AutoGPTQ(https://github.com/PanQiWei/AutoGPTQ)进行量化,工具超参数如下;

利用 AutoGPTQ 进行模型加载和推理的例子如下:

import osimport torchimport timefrom modelscope import AutoTokenizer, snapshot_downloadfrom auto_gptq import AutoGPTQForCausalLMos.environ["TOKENIZERS_PARALLELISM"] = "false"def load_model_tokenizer(model_path): """ Load model and tokenizer based on the given model name or local path of downloaded model. """ tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True, use_fast=False, lagecy=False) tokenizer.padding_side = "left" tokenizer.pad_token_id = tokenizer.convert_tokens_to_ids("") tokenizer.eos_token_id = tokenizer.convert_tokens_to_ids("") model = AutoGPTQForCausalLM.from_quantized(model_path, inject_fused_attention=False, inject_fused_mlp=False, use_cuda_fp16=True, disable_exllama=False, device_map='auto' # Support multi-gpus ) return model, tokenizerdef inference(model, tokenizer, prompt): """ Uset the given model and tokenizer to generate an answer for the speicifed prompt. """ st = time.time() inputs = prompt if prompt.endswith('\') else f'{prompt}\' input_ids = tokenizer.encode(inputs, return_tensors="pt", padding=True, add_special_tokens=False).to("cuda") with torch.no_grad(): generated_ids = model.generate( input_ids=input_ids, top_p=0.95, temperature=0.1, do_sample=True, max_new_tokens=512, eos_token_id=tokenizer.eos_token_id, pad_token_id=tokenizer.pad_token_id ) print(f'generated tokens num is {len(generated_ids[0][input_ids.size(1):])}') outputs = tokenizer.batch_decode(generated_ids, skip_special_tokens=True) print(f'generate text is {outputs[0][len(inputs): ]}') latency = time.time() - st print('latency is {} seconds'.format(latency)) if __name__ == "__main__": model_dir = snapshot_download('codefuse-ai/CodeFuse-CodeLlama-34B-4bits', revision='v1.0.0') prompt = 'Please write a QuickSort program in Python' model, tokenizer = load_model_tokenizer(model_dir) inference(model, tokenizer, prompt)

在做静态量化时,GPTQ 使用矫正数据集作为输入计算 Hessian 矩阵,从而更新未量化权重进而补偿量化带来的误差。如果推理阶段的输入和矫正数据集有偏差(bias),那么量化时用矫正数据得到的 Hessian 矩阵就无法完全反映推理输入,这会导致 GPTQ 的误差补偿失效(失效的程度和偏差成正比),出现量化模型在推理输入上量化误差变大的情况,进而导致量化模型的精度下降。

为了解决上述问题,对于微调模型,我们使用了一种数据分布对齐技术减少模型量化带来的损失。通过抽取训练数据(CodeFuse 开源的高质量代码数据集 evol)中的 Question 作为引导方式,利用原始模型生成 Answer,将 Question 和 Answer 拼接起来作为矫正数据;最终在 HumanEval Benchmarks 的 Python pass@1 取得了 73.8% 的准确率,相较于 bf16 模型仅有 0.6% 的精度损失。同时,在 CMNLI 和 C-Eval 两个数据集的精度损失也比较少。

构建 TensorRT 引擎

在通过 AutoGPTQ 可以得到 safetensors 格式的 int4 量化模型 [6] 后,我们的目标是构建单卡 TensorRT 引擎,同时保证 activation 是 fp16 的数据精度。通过 examples/llama/build.py 进行 TensorRT 引擎构建时,需要关注如下参数:

  • dtype:设置为 fp16
  • use_gpt_attention_plugin:设置为 fp16,构建引擎时利用 gpt a ttention plugin 并且数据精度为 fp16
  • use_gemm_plugin:设置为 fp16,构建引擎时利用 gemm_plugin 并且数据精度为 fp16
  • use_weight_only:触发 weight only 量化
  • weight_only_precision:设置为 int4 _gptq,表示构建 W4A16 的 GPTQ 量化模型引擎
  • per_group:gptq 为group-wise 量化,所以需要触发 per-group
  • max_batch_size: TensorRT 引擎最大允许 batch size
  • max_input_len:TensorRT 引擎最大允许输入长度
  • max_output_len:TensorRT 引擎最大允许输出长度

综上,我们在单卡 A10/A100 上构建 TensorRT 引擎的命令如下:

python build.py --model_dir "${model_dir}" \\ --quant_safetensors_path "${quant_safetensors_path}" \\ --dtype float16 \\ --use_gpt_attention_plugin float16 \\ --use_gemm_plugin float16 \\ --use_weight_only \\ --weight_only_precision int4_gptq \\ --max_batch_size 1 \\ --max_input_len 2048 \\ --max_output_len 1024 \\ --per_group \\ --output_dir "${engin_dir}" 2>&1 | tee dev_build.log

测试

性能

下面,我们主要测试了 batch size 为 1 时,不同的输入输出长度和量化精度情况下,TensorRT-LLM 在 A10/A100 上的推理速度表现。可以看到,在 A100 上,TensorRT-LLM 的 int4 相对 fp16,最高能够带来 2.4 倍的加速,相对 int8 最高也能带来 1.7 倍的加速。

注意:以上性能测试均基于 TensorRT-LLM 的 0.6.1 版本

显存占用和结果测试

我们测量了模型加载后占用的显存占用情况,以及输入 2048/1024 tokens 并输出 1024/2048 tokens 时的显存使用情况;同时我们也测试了量化前后的精度情况,如下表所示:

可见,4bit 量化后,显存占用大幅缩小,在一张 A10(24GB 显存)上就能部署 34B 的大模型,具备非常好的实用性。

模型演示

我们通过终端命令行 [7] 以及网页聊天机器人 [8] 两种不同的方式,展示我们最终的推理效果,具体细节可以访问开源的链接。

Cli Demo

Webui Demo

总结

在这篇文章中,我们介绍了如何使用 TensorRT-LLM 来加速 CodeFuse 的推理性能。具体而言,我们按照顺序展示了如何使用 GPTQ Int4 量化方法、增强 GPTQ 量化算法精度的自动对齐技术、TensorRT-LLM int4 量化模型的使用方法以及相应的评估过程。通过 TensorRT-LLM 的支持,CodeFuse 实现了较低的推理延迟和优化的部署成本。欢迎大家关注 CodeFuse 获取最新发布的更高准确率的微调大模型。

参考资料:

[1] Liu, B., Chen, C., Liao, C., Gong, Z., Wang, H., Lei, Z., Liang, M., Chen, D., Shen, M., Zhou, H., Yu, H., & Li, J. (2023). MFTCoder: Boosting Code LLMs with Multitask Fine-Tuning. ArXiv, abs/2311.02303.

[2] Zhang, Z., Chen, C., Liu, B., Liao, C., Gong, Z., Yu, H., Li, J., & Wang, R. (2023). Unifying the Perspectives of NLP and Software Engineering: A Survey on Language Models for Code.

[3] https://huggingface.co/codefuse-ai/CodeFuse-CodeLlama-34B

[4] Frantar, E., Ashkboos, S., Hoefler, T., & Alistarh, D. (2022). GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers. ArXiv, abs/2210.17323.

[5] Frantar, E., Singh, S. P., Alistarh, D. (2022). Optimal Brain Compression: A Framework for Accurate Post-Training Quantization and Pruning. Advances in Neural Information Processing Systems, 35, 4475-4488.

[6] https://huggingface.co/codefuse-ai/CodeFuse-CodeLlama-34B-4bits

[7] Codefuse-ai: https://github.com/codefuse-ai

[8] Codefuse-chatbot: https://github.com/codefuse-ai/codefuse-chatbot

关于作者:

王智

蚂蚁集团技术专家,博士毕业于北京邮电大学。主要研究方向为强化学习和贝叶斯优化。目前主要关注 LLM 推理加速技术。

胡文

清华大学计算机专业,拥有工学博士学位。目前在蚂蚁集团担任算法专家,带领团队在算法层、软件层、服务层三个维度优化大模型推理部署性能。

邵将

NVIDIA DevTech 团队,动力工程及工程热物理专业博士学位,毕业于北京航空航天大学。主要负责 AI、HPC 等领域的 GPU 并行计算程序性能优化。

刘川

NVIDIA 解决方案架构经理,整体负责中国区云计算行业 GPU 解决方案。于南京大学获计算机科学与技术专业硕士学位。带领团队主要从事大语言模型、生成式 AI 以及搜索推荐等重点 AI 任务的 GPU 适配、优化和加速方案的设计、部署和落地,帮助多家头部互联网公司在诸多业务中大幅降本增效。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
破案了!上海能赢广厦33分,点解?刘炜道出了4个原因

破案了!上海能赢广厦33分,点解?刘炜道出了4个原因

体育哲人
2026-05-31 22:11:21
给钱我都不坐!多名特斯拉前员工坦言:马斯克吹的FSD根本不安全

给钱我都不坐!多名特斯拉前员工坦言:马斯克吹的FSD根本不安全

快科技
2026-05-31 14:09:06
5亿美元重压下雷霆被迫拆队,亚历山大超越杜兰特难度增大

5亿美元重压下雷霆被迫拆队,亚历山大超越杜兰特难度增大

郭蛹包工头
2026-05-31 14:14:57
上海一同学聚会吃了43万6,请客的人先行离开,剩下的人当场翻脸

上海一同学聚会吃了43万6,请客的人先行离开,剩下的人当场翻脸

萧竹轻语
2025-06-11 17:21:59
54岁李亚鹏再登热搜!近期一组照片引热议,网友感慨“老得太快”

54岁李亚鹏再登热搜!近期一组照片引热议,网友感慨“老得太快”

火山詩话
2026-05-29 10:56:03
六辆装甲车白守!无人机钻门缝炸穿指挥室,旅长当场脑浆迸裂

六辆装甲车白守!无人机钻门缝炸穿指挥室,旅长当场脑浆迸裂

深度报
2026-05-30 00:32:15
释永信在监狱能申请吃素不能

释永信在监狱能申请吃素不能

熊太行
2026-05-30 14:45:23
虎父无犬子!曼联名宿19岁爱子压哨入选世界杯名单

虎父无犬子!曼联名宿19岁爱子压哨入选世界杯名单

仰卧撑FTUer
2026-05-31 18:57:03
汽车变客厅?中国监管拟禁止零重力座椅

汽车变客厅?中国监管拟禁止零重力座椅

甜份超标的我
2026-05-30 02:11:08
最新!总台人事变动

最新!总台人事变动

广电头条
2026-05-31 20:13:34
399元起,徕芬手持折叠小风扇AirFold开售

399元起,徕芬手持折叠小风扇AirFold开售

IT之家
2026-05-31 19:37:15
G3上海110-77大胜广厦 球员评价:5人优秀,2人及格,2人低迷

G3上海110-77大胜广厦 球员评价:5人优秀,2人及格,2人低迷

篮球资讯达人
2026-05-31 21:23:12
斯坦丘+毕津浩最想赢!李国旭换人没效果,大连队打分:5人刚及格

斯坦丘+毕津浩最想赢!李国旭换人没效果,大连队打分:5人刚及格

刀锋体育
2026-05-31 21:44:41
武契奇没想到,访华结束,45岁妻子竟因拒绝一件事,实现圈粉无数

武契奇没想到,访华结束,45岁妻子竟因拒绝一件事,实现圈粉无数

井普独白
2026-05-30 12:38:46
55岁汪峰给所有男人提了个醒:可以老、可以胖,但穿衣打扮要注意

55岁汪峰给所有男人提了个醒:可以老、可以胖,但穿衣打扮要注意

寻墨阁
2026-05-31 12:49:15
榛树导弹误击己方阵地,普京遭遇3.6亿损失闹剧

榛树导弹误击己方阵地,普京遭遇3.6亿损失闹剧

老头的传奇色彩
2026-05-30 08:45:10
175年来首次!华裔学者出任美国顶尖大学校长

175年来首次!华裔学者出任美国顶尖大学校长

化学人生
2026-05-30 20:10:20
退休后,千万不要着急去提取住房公积金!一定要等公积金“封存”

退休后,千万不要着急去提取住房公积金!一定要等公积金“封存”

石辰搞笑日常
2026-05-31 10:55:04
金融危机要来?专家预测,2026到2027上半年,世界将爆发金融风暴

金融危机要来?专家预测,2026到2027上半年,世界将爆发金融风暴

真猫爷的渔场
2026-05-31 17:09:15
降央卓玛:我这辈子最正确的决定,就是嫁给了自己倒追的藏族丈夫

降央卓玛:我这辈子最正确的决定,就是嫁给了自己倒追的藏族丈夫

飘飘然的娱乐汇
2026-05-29 19:50:05
2026-05-31 23:16:49
NVIDIA英伟达中国 incentive-icons
NVIDIA英伟达中国
英伟达(中国)官方账号
3533文章数 1453关注度
往期回顾 全部

科技要闻

戴尔诺基亚又回来了!AI重估老牌科技公司

头条要闻

女子在家洗澡浑身赤裸 一醉汉闯入拖她进房间欲"猥亵"

头条要闻

女子在家洗澡浑身赤裸 一醉汉闯入拖她进房间欲"猥亵"

体育要闻

阿森纳用最悲壮的方式,成就了巴黎王朝

娱乐要闻

朱军退休,正义虽迟但到,女方受惩

财经要闻

医学首席转岗搞科技,A股科技股遭遇巨震

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

艺术
亲子
时尚
公开课
军事航空

艺术要闻

16位欧美画家笔下的儿童肖像

亲子要闻

青少年哪个品牌DHA好?藻油组合易吸收,纯净配方无负担,学习状态更稳定

梓渝:慢下来,也很好

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

解放军代表质问日防卫大臣:日本何时道歉

无障碍浏览 进入关怀版