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,一经查实,立即删除!

相关文章

【手撕面试题】Vue(高频知识点四)

每天10道题&#xff0c;100天后&#xff0c;搞定所有前端面试的高频知识点&#xff0c;加油&#xff01;&#xff01;&#xff01;在看文章的同时&#xff0c;希望不要直接看答案&#xff0c;先思考一下自己会不会&#xff0c;如果会&#xff0c;自己的答案是什么&#xff1f;想…

【plt保存图片的坑】python中为什么使用plt.savefig()保存图片为空白

检查一下&#xff0c;你是不是把plt.savefig()指令放在plt.show()之后了&#xff1f; plt.show()会创建一个新的空白图形窗口,用于显示当前的图形。 因此,在plt.show()之后调用plt.savefig(),实际上是在保存这个新创建的空白图形窗口,而不是之前绘制的图形。 所以把plt.savef…

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

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

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

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

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类型兼容性规则)

14.2.1 泛型类型兼容性规则 ​ 在传统的Pascal和Object Pascal中&#xff0c;核心类型兼容性规则基于类型名称的等价性。换句话说&#xff0c;只有当两个变量的类型名称相同时&#xff0c;它们才是类型兼容的&#xff0c;而不管它们所引用的实际数据结构。这是静态数组类型不兼…

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;…

管理能力学习笔记十二:高效组织会议

会议常见的问题 没有决策缺乏准备组织混乱主持人独角戏 学习目标 有效管理&#xff1a;可将会议时间减少25%高效的会议可以有效的节省成本&#xff0c;提高绩效 高效组织会议的四大原则 原则一&#xff1a;制定会议规则 与下属一起制定会议规则&#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…

python-web应用程序-Django数据库-操作表中的数据

python-web应用程序-Django数据库-操作表中的数据 一、新增数据 类.objects.create(字段名 字段值&#xff0c;字段名 字段值&#xff0c;...)导入models包 models.User.objects.create(nameyulin,sex0,info三好学生)即可对数据进行操作 二、删除数据 类.objects.filter(…

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

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

自定义注解实现Excel 导出

概述 一个用自定义注解实现导出字段定义的工具实现。 1. 注解定义,定义导出Excel的字段 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface PoiExportField {// Label of the columnString label();// Order of the column,default 0,means t…

【Flutter 面试题】 为什么我的容器无论设置宽高多少都是占整个的宽高?怎么解决?

【Flutter 面试题】 为什么我的容器无论设置宽高多少都是占整个的宽高?怎么解决? 文章目录 写在前面口述回答补充说明写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2023博客之星TOP153。 👏🏻 正在学 Flu…

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…

神经网络 设计层数和神经元数量的考虑

在设计神经网络时&#xff0c;选择每层的神经元数量&#xff08;也即输出特征的数量&#xff09;是一个需要经验、实验和特定任务需求的过程。以下是选择第二层为24个神经元的一些可能原因和设计考虑&#xff1a; 设计层数和神经元数量的考虑 特征提取和压缩&#xff1a; 第一…

在Cisco Packet Tracer上配置NAT

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