大模型AWQ量化Qwen模型和推理实战教程

随着深度学习技术的发展,大规模语言模型(LLMs)因其强大的自然语言理解和生成能力而受到广泛关注。然而,这些模型通常参数量巨大,导致在实际部署过程中面临计算资源消耗高、推理延迟长等问题。为了克服这些挑战,模型量化技术应运而生,它通过减少模型权重表示的精度来降低模型的存储和计算成本,同时尽量保持模型的性能不变。

为什么需要进行模型量化?

  1. 提高效率:量化可以显著减少模型的存储需求和计算量,从而加快推理速度,这对于资源受限的设备尤为重要。
  2. 降低成本:通过减少对高性能硬件的需求,量化有助于降低模型部署的成本。
  3. 扩展应用范围:使大型模型能够在边缘设备上运行,扩大了应用场景,包括移动设备、物联网设备等。

AWQ量化的重要性

AWQ(Activation-aware Weight Quantization)是一种专门针对大规模语言模型设计的低比特权重量化方法。它不仅考虑了权重本身的分布特性,还考虑了激活值的影响,这使得量化后的模型能够更好地保持原始模型的性能。与传统的FP16浮点数表示相比,采用AWQ技术的AutoAWQ工具包能够实现以下优势:

  • 加速推理:将模型的运行速度提升3倍,极大地提高了处理效率。
  • 减少内存占用:将模型的内存需求降至原来的三分之一,使得更大规模的模型可以在更广泛的硬件平台上运行。
  • 硬件友好:优化了量化过程中的硬件适应性,确保了模型在不同硬件上的高效执行。

1.vllm GPU 环境安装

  • vllm官方安装教程:https://docs.vllm.ai/en/latest/getting_started/installation.html
# 创建新的虚拟环境
conda create -n myenv python=3.11 -y
conda activate myenv# 安装 vllm 对应 CUDA 12.1.
pip install vllm

如果安装上面版本失败,可以手动下载whl文件进行安装,安装示例和注意事项如下:

  • 查看自己显卡的CUDA是什么版本,如支持11.8版本,那就下载跟cu118对应的whl文件
  • 查看自己当前python环境是什么版本,如果是python 3.11,则下载cp311对应的whl文件
  • linux环境下载linux的whl文件,window下载window对应文件

比如我的cuda是11.8版本,python环境是3.11,在linux环境下,因此安装命令如下:

pip install /home/xxx/cuda_whl/vllm-0.4.2+cu118-cp311-cp311-manylinux1_x86_64.whl
pip install /home/xxx/cuda_whl/xformers-0.0.26.post1+cu118-cp311-cp311-manylinux2014_x86_64.whl
pip install /home/xxx/cuda_whl/torch-2.3.0+cu118-cp311-cp311-linux_x86_64.whl

如果安装过程有失败,要根据失败信息去解决。

2.安装autoawq

pip install autoawq

3.下载预训练基础模型

  • 下载Qwen2.5-7B-Instruct作为量化模型:https://www.modelscope.cn/models/Qwen/Qwen2.5-7B-Instruct

安装modespace

pip install modelscope

模型下载

#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-7B-Instruct')

4.实现AWQ量化

  • autoawq: https://github.com/casper-hansen/AutoAWQ
  • qwen模型量化:https://qwen.readthedocs.io/zh-cn/latest/quantization/awq.html
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '7'# 前面下载到本地的模型路径
model_path = '/home/xxx/models/Qwen2.5-7B-Instruct'
# 量化后的保存路径,不存在会自动创建
quant_path = '/home/xxx/models/Qwen2.5-7B-Instruct-awq'  
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" }# 加载模型
model = AutoAWQForCausalLM.from_pretrained(model_path, device_map="auto", safetensors=True
)
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 校准数据微调,可以自定义这个数据集
dataset = [
[
{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are an expert in travel planning and programming."},
{"role": "user", "content": "Can you recommend a scenic spot for a weekend trip near Beijing?"},
{"role": "assistant", "content": "Certainly! The Great Wall at Mutianyu would be a perfect choice for a weekend getaway. It's less than two hours' drive from Beijing and offers stunning views and a less crowded experience compared to Badaling."}
],
[
{"role": "user", "content": "How about a good place for a family vacation in China?"},
{"role": "assistant", "content": "For a family vacation, I would suggest Shanghai Disneyland. It offers a magical experience with various attractions and parades suitable for all ages. Plus, it's a great way to combine fun with a visit to one of China's most vibrant cities."}
],
[
{"role": "user", "content": "Can you help me with a simple Python code to sort a list of numbers?"},
{"role": "assistant", "content": "Of course! Here's a simple example of how to sort a list of numbers in Python:\n\npython\nnumbers = [3, 1, 4, 1, 5, 9]\nnumbers.sort()\nprint(numbers)\n"}
],
[
{"role": "user", "content": "What are some must-see destinations in Europe for a first-time traveler?"},
{"role": "assistant", "content": "Europe has many must-see destinations, but for a first-time traveler, I would recommend visiting Paris for its iconic Eiffel Tower and Louvre Museum, Rome for its ancient ruins like the Colosseum, and Amsterdam for its charming canals and museums."}
],
[
{"role": "user", "content": "Can you provide a tip for optimizing JavaScript code performance?"},
{"role": "assistant", "content": "One tip for optimizing JavaScript performance is to minimize DOM manipulations. Accessing the DOM is slow, so try to batch updates or use Document Fragments when appending multiple elements to the DOM."}
]
]
data = []
for msg in dataset:text = tokenizer.apply_chat_template(msg, tokenize=False, add_generation_prompt=False)data.append(text.strip())
# 开始量化
model.quantize(tokenizer, quant_config=quant_config, 
calib_data=data,  # 自己准备的校准数据,也可以不准备,有默认从网上下载
max_calib_seq_len=256  # 校准数据太少时,设置小一点
)
# 保存量化后的模型和分词器
model.save_quantized(quant_path, safetensors=True, shard_size="4GB")
tokenizer.save_pretrained(quant_path)print(f'Model is quantized and saved at "{quant_path}"')

4.1.量化报错

  • ConnectionError: Couldn’t reach ‘mit-han-lab/pile-val-backup’ on the Hub (ConnectionError)
    运行到:model.quantize(tokenizer, quant_config=quant_config) 产生报错
    解决方案:连接外网失败,下载默认微调校准数据,用户校准量化缩放因子大小。可以自定义数据集进行校准

  • RuntimeError: torch.cat(): expected a non-empty list of Tensors

原因:数据太少,源码中的 n_split = cat_samples.shape[1] // max_seq_len整除为 0,因此造成错误

解决方案:model.quantize(tokenizer, quant_config=quant_config, calib_data=data,
max_calib_seq_len=256 # 调整 max_calib_seq_len 的最大长度,由512改成256
)

5.使用VLLM进行推理

加载量化后的模型进行推理。

from transformers import AutoTokenizer
from vllm import LLM, SamplingParams
import torch, os
os.environ['CUDA_VISIBLE_DEVICES'] = '7'
# os.environ['CUDA_VISIBLE_DEVICES'] = '6,7'  # 多张卡
model_path = "/home/xxx/models/Qwen2.5-7B-Instruct-awq"
prompt = "介绍一下大模型技术!"tokenizer = AutoTokenizer.from_pretrained(model_path, # trust_remote_code=True)
# Input the model name or path. Can be GPTQ or AWQ models.
llm = LLM(model=model_path,max_model_len=10000,  # 设置最大输入长度tensor_parallel_size=1,  # 多少张卡gpu_memory_utilization=0.95,trust_remote_code=True)
messages = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)# 输出
sampling_params = SamplingParams(temperature=0.7, top_p=0.8, repetition_penalty=1.05, max_tokens=512  # 设置最大输出长度)
outputs = llm.generate([text], sampling_params)
# print(outputs)# Print the outputs.
for output in outputs:prompt = output.promptgenerated_text = output.outputs[0].textprint(f"Generated text:\n {generated_text}")

6.使用transoformers进行推理

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch, os
os.environ['CUDA_VISIBLE_DEVICES'] = '7'
# os.environ['CUDA_VISIBLE_DEVICES'] = '6,7'  # 多张卡
model_name = "/home/xxx/models/Qwen2.5-7B-Instruct-awq"
prompt = "介绍一下大模型技术!"model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained(model_name)messages = [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": prompt},
]
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True,
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)generated_ids = model.generate(**model_inputs,max_new_tokens=512,
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Code::Blocks 24.10 全中文优化完整版

Code::Blocks(或者叫做 CodeBlocks)是一款开放源代码、跨平台的集成开发环境(IDE),通过配置不同的编程语言编译器,可以用于多种编程语言程序开发。 网上有很多文章介绍 Code::Blocks 的安装,通…

二叉树-哈夫曼树的构造和应用

重点:哈夫曼树的构造和应用(编码) 选取完最小权值的两个节点后新结点的权值是二者之和,新节点可以和选取剩余的结点结合,也可以在剩余的里面选出最小两个结合后形成的新结点与第一个新结点结合(前提他们是最小的两个结点) 哈夫曼编码 哈夫曼编码优化 130为最小的带权路径长度 …

d3坐标轴系数角度变换-位置不对等问题

svg.append(text).attr(x, 100) // 文本 x 坐标.attr(y,200 ) // 文本 y 坐标// .attr(text-anchor, middle) // 文本居中.attr(fill, black) // 文本颜色.attr(transform, rotate(-90, 25, 30)) // 旋转 -90 度.attr(font-size, 9).text(你的文本); 有些老哥…

rosbag数据导出成pcd文件

目录 步骤 1:安装必要的 ROS 包步骤 2:播放 .bag 文件中的点云数据(非必须)步骤 3:使用 pcl_ros 提取并保存点云数据步骤 4:验证输出 要将 .bag 文件中的点云数据导出为 .pcd 文件,通常需要以…

基于 Spring Boot 和 Vue 的门票销售创新系统

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅获取源码联系方式请查看文末🍅 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目…

推荐一款管道数据检索工具:Pipedata-Pro

Pipedata-Pro是一款专为设计石油、天然气、水和蒸汽管道及管道系统的工程师开发的应用程序。该应用程序提供了设计管道系统所需的工程数据,拥有一个全面的管道类型、配件和材料数据库。 软件特点: 1. 技术参数查询:Pipedata-Pro 提供关于管道…

使用 Umami 部署博客分析工具

Umami 简介 Umami 是一款开源且注重隐私的网站分析工具,可替代 Google Analytics。它提供网站流量和用户行为等见解,但不使用 Cookie 或收集个人数据,符合隐私法规。Umami 轻巧易用,可自行托管。 如果你有自己的博客,…

三菱QD77MS定位模块速度更改功能

速度更改功能” 是以任意时机将控制中的速度更改为新指定的速度的功能。更改后的速度直接设置到缓冲存储器中,并根据速度更改指令([cd.15速度更改请求)或者外部指令信号执行速度更改。 但是,机械原点复位的情况下,检测出近点狗 ON 并开始向蠕…

typescript 补充

文章目录 Pick<T, K> 从 T 中挑选部分属性构成新类型Partial<T>&#xff1a;将类型的所有属性变为可选Required<T>&#xff1a;将类型的属性变为必选。Omit<T, K>&#xff1a;从 T 中移除部分属性构成新类型。Readonly<T>&#xff1a;将类型的属…

运动【跑步 03】安踏冠军3的10KM和15KM*2体验(对比必迈PURE LIGHT)

这里写目录标题 1. 前言2. 两双鞋2.1 必迈 PURE LIGHT2.2 安踏 冠军 3 3. 主观对比4. 问题4.1 必迈 PURE LIGHT4.2 冠军 3 5. 总结 1. 前言 我是程序员&#xff0c;并不是专业的运动员&#xff0c;对跑步鞋的研究也不深&#xff0c;至今也就买过两双相对比较专业的跑鞋&#x…

【C++】踏上C++的学习之旅(六):深入“类和对象“世界,掌握编程的黄金法则(一)

文章目录 前言1. "面向过程"和"面向对象"的碰撞1.1 面向过程1.2 面向对象 2. "类"的引入3. "类"的定义3.1 &#x1f349;语法展示&#xff1a;3.2 "类"的两种定义方式3.3 "类"的命名规则 4. 类的访问限定符以及封…

Matlab绘制箭头(annotation 、quiver、​quiver3)

本文章开始讲述基于Matlab绘制箭头&#xff0c;主要包括一下函数&#xff1a; annotation &#xff1a;annotation(lineType,x,y) 创建一个在当前图窗中的两个点之间延伸的线条或箭头注释。将 lineType 指定为 ‘line’、‘arrow’、‘doublearrow’ 或 ‘textarrow’。将 x 和…

【ESP32+MicroPython】开发环境部署

本教程将指导你如何在Visual Studio Code&#xff08;VSCode&#xff09;中设置ESP32的MicroPython开发环境。我们将涵盖从安装Python到烧录MicroPython固件的整个过程&#xff0c;以及如何配置VSCode以便与ESP32进行交互。 准备工作 安装Python 确保你的计算机上安装了Pyth…

我来讲一下-Service Mesh.

前言&#xff1a; 1、中文直翻译&#xff1a;Service Mesh叫服务网格&#xff0c;有一些讲课老师说什么把服务当成一个一个格子&#xff0c;一笔带过&#xff0c;没有经过深刻思考的讲诉&#xff0c;我真的bs. 一、我来讲一下 1、这里拆解分析一下&#xff0c;Service中的"…

30.超市管理系统(基于springboot和Vue的Java项目)

目录 1.系统的受众说明 2.相关技术和开发环境 2.1 相关技术 2.1.1 Java语言 2.1.2 HTML、CSS、JavaScript 2.1.3 MySQL 2.1.4 Vue.js 2.1.5 SpringBoot 2.2 开发环境 3. 系统分析 3.1 可行性分析 3.1.1 经济可行性 3.1.2 技术可行性 3.1.3 运行可行性 3.2…

洛谷 P1434 [SHOI2002] 滑雪 完整题解

一、题目查看 P1434 [SHOI2002] 滑雪 - 洛谷 二、解题思路 本题需要使用记忆化搜索&#xff0c;把第x个点开始最多能走几步记录在dp[x]中&#xff0c;循环递归&#xff0c;记录&#xff0c;并找出最大的dp[i]。 三、题解 #include <bits/stdc.h> using namespace std;int…

分布式唯一ID生成(二): leaf

文章目录 本系列前言号段模式双buffer优化biz优化动态step源码走读 雪花算法怎么设置workerId解决时钟回拨源码走读 总结 本系列 漫谈分布式唯一ID分布式唯一ID生成&#xff08;二&#xff09;&#xff1a;leaf&#xff08;本文&#xff09;分布式唯一ID生成&#xff08;三&am…

Spring Boot 与 Vue 共筑电影评价卓越平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

Everything软件实现FTP功能

Windows的文件共享和ftp实在难用&#xff0c;这里介绍一种新的局域网内共享文件的方法 下载 Everything 选择想要共享的文件&#xff0c;选择包含到数据库&#xff0c;注意&#xff1a;要在对应的分卷设置&#xff0c;共享文件夹名称不要包含中文字符&#xff0c;因为Windows底…

CertiK创始人顾荣辉出席新加坡商业与慈善论坛,发表主旨演讲并主持专题讨论

2024年11月5日 —— 美国哥伦比亚大学教授、CertiK联合创始人、MAS国际技术顾问顾荣辉受邀参加2024年度新加坡商业与慈善论坛&#xff08;Business & Philanthropy Leadership Forum Singapore&#xff0c;简称B&P Forum&#xff09;&#xff0c;期间发表主旨演讲并主持…