tensorrt-llm与vllm的量化性能比较

准备部署lora微调好的语言大模型,有tensorrt-llm和vllm两种加速策略可选,而量化策略也有llm.int8,gptq,awq可用, 怎样的组合才能获得最佳精度与速度呢,这是个值得探讨的问题,本文以llama-factory训练的qwen-7b的lora模型为基准,探究这几个组合对性能的影响。
大模型的效果评估是件很难做的事,尤其是对文本生成类的lora模型,比较简单的办法是把生成文本与标签文本用chatgpt去评估打分。对于text2sql类的lora任务,容易处理些,分别使用生成的sql与标签sql去数据库查询,比较结果是否一致即可。
有时间再做专门的效果比较,本文仅比较量化相关的性能。

一 合并lora模型

使用llama-factory lora微调后的得到的是adapter层,需要与原模型merge后才能做后续各种量化
本文使用最新的llama-factory-0.7.1版本操作,使用yaml文件指定参数
理论上,想获得好的lora效果,要使用base模型,因为有更好的泛化性,不要用chat模型。

  • lyb_qwen_lora_sft_merge.yaml
# model
model_name_or_path: /mnt/e/PyCharm/PreTrainModel/qwen_7b
adapter_name_or_path: /mnt/e/PyCharm/insteresting/LLaMA-Factory-0.7.1/src/saves/qwen_7b_sft/checkpoint-200
template: qwen
finetuning_type: lora# export
export_dir: /mnt/e/PyCharm/PreTrainModel/qwen_7b_lora_merge
export_size: 2
export_device: cpu
# 为true,保存为safetensors格式
export_legacy_format: true
  • 关于模型合并,官方代码使用命令行操作,不太习惯,这里改成脚本操作,路径指向上面的yaml文件
# -*- coding: utf-8 -*-
# @Time    : 2024/5/25 22:21
# @Author  : yblir
# @File    : lyb_export_model.py
# explain  :
# =======================================================
import yaml
from llmtuner.train.tuner import export_modelif __name__ == "__main__":with open('../examples/yblir_configs/lyb_qwen_lora_sft_merge.yaml', 'r', encoding='utf-8') as f:param = yaml.safe_load(f)export_model(param)

二 模型量化

2.1 LLM.int量化
在推理时,直接在llma-factory中指定量化规格,里面使用的量化方法就是llm.int方法。
在这里插入图片描述

2.2 gptq量化
使用Qwen官方给的脚本(也是autogptq)run_gptq.py,参数指定如下:
https://github.com/QwenLM/Qwen

在这里插入图片描述

脚本是对autogpt代码的封装,量化时需要指定的参数有4个:

  • –model_name_or_path: 在(一)中合并后的模型
  • data_path: gptq量化需要指定的校准集
  • –out_path: 量化后模型输出位置
  • –bits: 量化规格,有int8,int4两种可选

下面重点讲下校准集的处理的
校准集尽量覆盖使用场景,官方的校准集是直接从sft数据中抽取的。
使用llama-factory lora微调时,数据集格式如下:

  [{"instruction": "<question>:表格中所有人的平均年龄是多少?\nCREATE TABLE 人员分布 (姓名 VARCHAR(255),\n年龄 FLOAT,\n城市 VARCHAR(255),\n性别 VARCHAR(255),\n职业 VARCHAR(255));\nINSERT INTO 人员 (姓名, 年龄, 城市, 性别, 职业) VALUES (Bob, 35, salt lake city, male, engineer);","input": "","output": "SELECT avg(年龄) FROM 人员"},{...}]

但Qwen量化时,需要的数据集格式如下:

[{"id": "identity_0","conversations": [{"from": "user","value": "你好"},{"from": "assistant","value": "我是一个语言模型,我叫通义千问。"}]}
]

因此,需要转换一下格式,转成Qwen lora微调时的数据格式:

# -*- coding: utf-8 -*-
# @Time    : 2024/5/26 10:47
# @Author  : yblir
# @File    : lyb_factory2qwen_format.py
# explain  : 
# =======================================================
import jsonqwen_format_list = []
with open('/mnt/e/PyCharm/insteresting/LLaMA-Factory-0.7.1/data/qwen-7b-sql-gptq.json', 'r', encoding='utf-8') as f:data = json.load(f)for i, item in enumerate(data):temp = {}temp['id'] = f'identity_{i}'temp['conversations'] = [{'from': 'user', 'value': item['instruction']},{'from': 'assistant', 'value': item['output']}]qwen_format_list.append(temp)with open('/mnt/e/PyCharm/insteresting/LLaMA-Factory-0.7.1/data/qwen-7b-sql-gptq2.json', 'w', encoding='utf-8') as f:json.dump(qwen_format_list, f, indent=4, ensure_ascii=False)

接下来,通过指定–bits可以获得int8或int4量化模型
在量化完成后,还必须拷贝被量化模型的*.py, *.cu, *.cpp(这两个文件如果有就复制) 文件和 generation_config.json 文件复制到量化模型的输出目录下。
在这里插入图片描述

2.3 autoawq量化
https://github.com/casper-hansen/AutoAWQ
awq的量化也需要数据集,只是对数据集的要求没有gptq那么敏感,这里只测速度,就用内置的默认数据集。

from awq import AutoAWQForCausalLM
from transformers import AutoTokenizermodel_path = '/mnt/e/PyCharm/PreTrainModel/qwen_7b_lora_merge'
quant_path = '/mnt/e/PyCharm/PreTrainModel/qwen_7b_awq_int4'
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" }# Load model
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)# Quantize
model.quantize(tokenizer, quant_config=quant_config)# Save quantized model
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)

2.4 tensorrt-llm编译
在新版tensorrt-llm中官方已经提供qwen系列加速代码,想起在0.5版本刚发布时没有qwen,只有llama,只能把llama的model.py拷贝一份,修改代码去适配qwen,现在能直接用,真是太幸福了~

官方另有提供weight only的量化方法:int8,int4, 但他们自己都表示weight only的方法掉点严重,因此这里我们只测试gptq-int4和awq-int4.

ps: 按官方说法,fp8似乎效果很好,可惜目前qwen还不支持, 坐等开源!

examples/qwen文件夹内:

2.4.1 gptq量化 在前面已gptq量化好的基础上,编译tensorrt引擎

  • 量化
python3 convert_checkpoint.py --model_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_gptq_int4 \--output_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_gptq_int4_trt \--dtype float16 \--use_weight_only \--weight_only_precision int4_gptq \--per_group
  • 编译tensorrt引擎,tensorrt_llm/commands/build.py
python tensorrt_llm/commands/build.py --checkpoint_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_gptq_int4_trt \--output_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_int4_GPTQ/1-gpu \--gemm_plugin float16

2.4.2 awq量化
tensorrt-llm不支持直接使用awq量化好的模型,但提供了定制版的awq量化方法,这个功能似乎不太完善,仅支持2个数据集,不能传lora微调的数据。
如果校准数据集下载不到,下载到本地修改加载路径, 这里使用的是pileval数据集:

在这里插入图片描述

python ../quantization/quantize.py --model_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_lora_merge \--dtype float16 \--qformat int4_awq \--awq_block_size 128 \--output_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_quantized_int4-awq_trt \--calib_size 32
python tensorrt_llm/commands/build.py --checkpoint_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_quantized_int4-awq_trt \--output_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_int4_AWQ/1-gpu \--gemm_plugin float16

2.4.3 耗时统计
tensorrt-llm耗时通过运行提供的run.py统计

# 统计gptq
python3 run.py --input_text "<question>:表格中所有人的平均年龄是多少?\nCREATE TABLE 人员分布 (姓名 VARCHAR(255),\n年龄 FLOAT,\n城市 VARCHAR(255),\n性别 VARCHAR(255),\n职业 VARCHAR(255));\nINSERT INTO 人员 (姓名, 年龄, 城市, 性别, 职业) VALUES (Bob, 35, salt lake city, male, engineer);" \--max_output_len=50 \--tokenizer_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_chat_lora_merge \--engine_dir=/home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_chat_int4_GPTQ/1-gpu \--run_profiling# 统计awq
python3 run.py --input_text "<question>:表格中所有人的平均年龄是多少?\nCREATE TABLE 人员分布 (姓名 VARCHAR(255),\n年龄 FLOAT,\n城市 VARCHAR(255),\n性别 VARCHAR(255),\n职业 VARCHAR(255));\nINSERT INTO 人员 (姓名, 年龄, 城市, 性别, 职业) VALUES (Bob, 35, salt lake city, male, engineer);" \--max_output_len=50 \--tokenizer_dir /home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_chat_lora_merge \--engine_dir=/home/TensorRT-LLM-0.9.0/checkpoints/qwen_7b_int4_AWQ/1-gpu \--run_profiling

三 模型推理耗时统计

综合以上量化方法,可以得到以下耗时统计:

在这里插入图片描述
通过比较可知:

  • vllm能获得比transformers多60%的提速,当然,显存占用也会更多。
  • tensorrt-llm提速最多,英伟达还是NB!int4量化后提速3~4倍,显存问题同上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代理记账公司的五大问题及其解决方案

代理记账公司是现代企业管理中不可或缺的一部分&#xff0c;它为企业的日常运营提供了专业、高效的服务&#xff0c;随着行业的发展和竞争的加剧&#xff0c;代理记账公司的面临的问题也日益突出&#xff0c;这些问题主要表现在以下几个方面&#xff1a; 业务流程不规范 许多代…

【前端】display:none和visibility:hidden两者的区别

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xff1a;洲与AI。 &#x1f913; 欢迎大家关注我的专栏&#xff0c;我将分享Web前后端开发、…

C语言 | Leetcode C语言题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; int minCut(char* s) {int n strlen(s);bool g[n][n];memset(g, 1, sizeof(g));for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i][j] (s[i] s[j]) && g[i 1][j - 1];}}int f[n];for (int i 0; i <…

YOLOv8改进 | Conv篇 | 利用YOLOv10提出的C2fUIB魔改YOLOv8(附代码 + 完整修改教程)

一、本文介绍 本文给大家带来的改进机制是利用YOLOv10提出的C2fUIB模块助力YOLOv8进行有效涨点&#xff0c;其中C2fUIB模块所用到的CIB模块是一种紧凑的倒置块结构&#xff0c;它采用廉价的深度卷积进行空间混合&#xff0c;并采用成本效益高的点卷积进行通道混合。本文针对该…

AI大数据统计《庆余年2》中的小人物有哪些?

《庆余年2》除了主角表演经常&#xff0c;每个配角小人物也很出彩。那到底有哪些小人物呢&#xff1f; 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要写一个Python脚本&#xff0c;具体步骤如下&#xff1a; 读取文档&#xff1a;"D:\qyn\…

数据结构与算法之Floyd弗洛伊德算法求最短路径

目录 前言 Floyd弗洛伊德算法 定义 步骤 一、初始化 二、添加中间点 三、迭代 四、得出结果 时间复杂度 代码实现 结束语 前言 今天是坚持写博客的第18天&#xff0c;希望可以继续坚持在写博客的路上走下去。我们今天来看看数据结构与算法当中的弗洛伊德算法。 Flo…

Leetcode3164. 优质数对的总数 II

Every day a Leetcode 题目来源&#xff1a;3164. 优质数对的总数 II 解法1&#xff1a;统计因子 遍历 nums1&#xff0c;统计所有元素的因子个数&#xff0c;记录到哈希表 cnt 中。 遍历 nums2&#xff0c;那么有 cnt[nums2[i]*k] 个数可以被 nums2[i]*k 整除&#xff0c;…

利用conda进行R的安装

1.miniconda3的安装 官网&#xff1a;Miniconda — Conda documentation 找到对应系统、Python版本下载 wget https://mirrors.ustc.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh #wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x…

信息系统项目管理师0141:产品范围和项目范围(9项目范围管理—9.1管理基础—9.1.1产品范围和项目范围)

点击查看专栏目录 文章目录 第9章 项目范围管理9.1 管理基础9.1.1 产品范围和项目范围 第9章 项目范围管理 项目范围管理包括确保项目做且只做所需的全部工作&#xff0c;以成功完成项目。项目范围管理主要在于定义和控制哪些工作应该包括在项目内&#xff0c;哪些不应该包含在…

Spring运维之boot项目开发关键之日志操作以及用文件记录日志

日志基础 日志 在企业级开发中还是比较重要的 我们来写一个日志 RestController RequestMapping("/books") public class Controller {//创建记录日志的对象private static final Logger log LoggerFactory.getLogger(Controller.class);GetMappingpublic String …

java自学阶段二:JavaWeb开发60(mybatis学习)

目录&#xff1a; 学习目标mybatis的基础用法&#xff08;新增、删除、修改、查询&#xff09; 一&#xff1a;学习目标&#xff1a; 1&#xff09;了解mybatis的基础概念&#xff1b; 2&#xff09;学会mybatis的基础用法&#xff1b; 二、mybatis的基础概念&#xff1a; M…

在Cisco Packet Tracer上配置NAT

目录 前言一、搭建网络拓扑1.1 配置PC机1.2 配置客户路由器1.3 配置ISP路由器 二、配置NAT2.1 在客户路由器中配置NAT2.2 测试是否配置成功 总结 前言 本篇文章是在了解NAT的原理基础上&#xff0c;通过使用Cisco Packet Tracer 网络模拟器实现模拟对NAT的配置&#xff0c;以加…

C++ | Leetcode C++题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; class Solution { public:int minCut(string s) {int n s.size();vector<vector<int>> g(n, vector<int>(n, true));for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i][j] (s[i] s[j]) &…

Jenkins+Rancher2.7部署构建

在Jenkins中使用rancher插件时需要去查找工作负载地址 在Rancher2.7没有查看Api按钮了需要自己去查找 1.进入https://192.168.x.xx:6443/v3/projects/ 2.输入在rancher中要查找的的项目名称并点击deployment连接进入下一个页面 3.找到自己的deployment随便点一个进去 4.浏览…

Nginx设置缓存后,访问网页404 问题原因及解决方案(随手记)

目录 问题描述Nginx文件 解决方案查看error_log日志问题原因修改文件并测试Nginx文件测试 总结 问题描述 在Nginx中设置缓存expires后&#xff0c;结果重启nginx&#xff0c;网站访问404了。 Nginx文件 server {listen 80;server_name bird.test.com;location / {root /app/…

Echarts 在指定部分做文字标记

文章目录 需求分析1. demo12. demo22. demo3 定位解决需求 实现在Echarts的折线图中,相同Y值的两点之间显示’abc’ 分析 1. demo1 使用 ECharts 的 markLine 功能来在相邻两个点之间添加标记。其中,我们通过设置标记的 yAxis 和 label 来控制标记的位置和显示内容。最后…

VL53L4CX TOF开发(2)----修改测距范围及测量频率

VL53L4CX TOF开发.2--修改测距范围及测量频率 概述视频教学样品申请完整代码下载测距范围测量频率硬件准备技术规格系统框图应用示意图生成STM32CUBEMX选择MCU串口配置IIC配置 XSHUTGPIO1X-CUBE-TOF1app_tof.c详细解释测量频率修改修改测距范围 概述 最近在弄ST和瑞萨RA的课程…

每日一题33:数据统计之广告效果

一、每日一题 返回结果示例如下&#xff1a; 示例 1&#xff1a; 输入&#xff1a; Ads 表: ------------------------- | ad_id | user_id | action | ------------------------- | 1 | 1 | Clicked | | 2 | 2 | Clicked | | 3 | 3 | Viewed…

系统架构设计师重难点知识脑图

大家都知道现在的软考自从变成机考后&#xff0c;越来越难了&#xff0c;教程上的内容不仅全还细&#xff0c;几乎任何内容都有可能考&#xff0c;出题老师主打一个出其不意&#xff0c;比如2024年5月考试&#xff0c;连UML时序图的片段都考&#xff0c;这 种如果看书的话一般都…

【乐吾乐3D可视化组态编辑器】数据接入

数据接入 本文为您介绍3D数据接入功能&#xff0c;数据接入功能分为三个步骤&#xff1a;数据订阅、数据集管理、数据绑定 编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 数据订阅 乐吾乐3D组态数据管理功能由次顶部工具栏中按钮数据管理打开。 在新弹窗中选择数据订阅…