vllm 大模型量化微调推理使用: lora、gptq、awq

本文介绍了大模型的量化微调和推理使用,涉及LORA模型的微调、AWQ及GPTQ量化模型的运行方式。在微调LORA模型时,可通过OPENAI接口指定–lora-modules qwen-lora来使用,并调整temperature参数以优化回答质量。实测发现,AWQ和GPTQ量化模型在4090 GPU上的运行速度分别为30 tokens/s左右,而未量化的模型可达到90 tokens/s。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大模型微调、强化训练可以参考:

LLaMA-Factory
https://blog.youkuaiyun.com/weixin_42357472/article/details/139408979

1)微调lora模型推理

docker run  --gpus all  -v /ai/Qwen1.5-7B-Chat:/qwen
<think>我们正在讨论LoRA微调后的模型在vLLM部署时出现权重形状不匹配的问题。根据用户提供的引用和问题,我们可以总结如下: - 用户使用LoRA微调了一个3B模型,微调前模型为5G(FP16),微调后导出的模型只有2G。这是因为LoRA只更新了低秩矩阵,存储的是这些较小的矩阵,因此模型体积变小了[^1]。 - 用户尝试使用vLLM部署微调后的模型(可能是合并后的模型)时,遇到了权重形状不匹配的AssertionError。 问题:**LoRA微调后的量化模型权重合并时出现形状不匹配错误,是否不能使用vLLM部署?** ### 回答 不是不能使用vLLM部署,但需要确保正确合并LoRA权重并保存为完整的模型格式。vLLM要求加载的模型必须具有与原始模型相同的结构(即每一层的权重形状必须一致)。出现形状不匹配错误通常是因为合并后的模型权重与vLLM期望的形状不一致。以下是可能的原因和解决方案: #### 1. **LoRA权重合并不正确** - **问题**:在合并LoRA权重时,如果操作不正确(例如,没有正确地将LoRA权重加到基础模型的权重上),会导致最终模型的权重形状与基础模型不同。 - **解决方案**:使用正确的方法合并LoRA权重。推荐使用`peft`库的`merge_and_unload()`方法: ```python from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B") peft_model = PeftModel.from_pretrained(base_model, "/path/to/lora/checkpoint") merged_model = peft_model.merge_and_unload() # 合并权重 merged_model.save_pretrained("/path/to/merged_model") ``` 这样保存的模型将是一个完整的Transformer模型,其权重形状与基础模型一致。 #### 2. **量化导致的权重形状变化** - **问题**:如果对合并后的模型进行了量化(如将FP16量化为INT4),则权重的形状(如维度)可能不会改变,但数据类型和存储方式会改变。然而,vLLM在加载模型时,要求权重的数据类型和形状与模型配置匹配。 - **解决方案**: - 如果使用vLLM部署量化模型,确保使用vLLM支持的量化方式(如AWQGPTQ)。例如,使用`--quantization awq`参数。 - 注意:如果合并后的模型已经进行了自定义量化(非vLLM支持的格式),则vLLM可能无法直接加载。建议先保存为FP16模型,然后让vLLM在加载时进行量化(如果支持)。 #### 3. **vLLM模型加载参数设置** - 在vLLM加载合并后的模型时,确保指定正确的参数: - `--model`: 指向合并后的模型目录。 - `--dtype`: 指定与模型权重一致的数据类型(如`--dtype bfloat16`或`--dtype float16`)。如果模型是量化后的,则需使用对应的量化参数。 - 示例命令: ```bash vllm serve --model /path/to/merged_model --dtype float16 ``` #### 4. **vLLM版本兼容性** - 确保使用vLLM版本支持您的模型(如Qwen3-0.6B)。如果不支持,可能需要升级vLLM使用其他部署方式(如Hugging Face TGI)。 - 升级vLLM:`pip install -U vllm` #### 5. **验证模型权重** - 在合并和保存模型后,使用以下代码验证模型权重是否加载正确(不通过vLLM): ```python from transformers import AutoModel model = AutoModel.from_pretrained("/path/to/merged_model") # 如果没有报错,说明模型权重正确 ``` ### 结论 LoRA微调后的模型可以通过正确合并权重并保存为完整模型格式来使用vLLM部署。关键步骤是: 1. 使用`merge_and_unload()`正确合并LoRA权重。 2. 保存合并后的模型为标准的Transformer格式(包含`config.json`和`pytorch_model.bin`或`safetensors`)。 3. 使用vLLM加载时,确保参数(如`--dtype`)与模型匹配。 如果仍然遇到形状不匹配错误,请检查: - 合并后的模型权重形状是否与原始基础模型一致(例如,每一层的维度是否相同)。 - vLLM的日志中报错的具体层,对比该层在基础模型和合并模型中的权重形状。 引用说明: - 引用[1]解释了LoRA微调后模型体积变小的原因(只存储低秩矩阵)[^1]。 - 引用[2]提到LoRA微调的高效性,但未直接解决部署问题[^2]。 §§相关问题§§ 1. 如何验证LoRA合并后模型的权重是否正确? 2. vLLM支持哪些量化方式的模型部署? 3. 除了vLLM,还有哪些高性能推理引擎可以部署LoRA微调后的模型?</think>### LoRA微调量化模型权重合并问题解析 根据您的引用和问题描述,LoRA微调后模型体积变小(5G→2G)是正常现象,但部署到vLLM时出现权重形状不匹配错误。这**不是**vLLM无法部署量化模型的限制,而是权重合并过程中的技术问题。以下是具体分析和解决方案: #### 问题根源:权重合并不兼容 1. **LoRA微调机制**: - LoRA通过低秩分解矩阵$A \in \mathbb{R}^{r \times k}$和$B \in \mathbb{R}^{d \times r}$(其中$r \ll d$)更新权重$W \rightarrow W + BA$[^1] - 微调后保存的只有小矩阵$A,B$(约占总参数0.1%),导致模型体积大幅减小 ```mermaid graph LR A[原始权重W] --> B[LoRA分解] B --> C[低秩矩阵A] B --> D[低秩矩阵B] C & D --> E[微调后模型] ``` 2. **vLLM加载失败原因**: - 直接使用LoRA检查点(含$A,B$矩阵)时,vLLM期望加载完整权重$W$而非分解矩阵 - 合并操作未正确重建原始权重形状: - 预期形状:$W \in \mathbb{R}^{d \times k}$ - 实际提供:$A \in \mathbb{R}^{r \times k}$ 或 $B \in \mathbb{R}^{d \times r}$ → 触发`AssertionError: param_data.shape == loaded_weight.shape` #### 解决方案:正确合并权重 1. **标准合并流程**(必须执行): ```python from peft import PeftModel from transformers import AutoModelForCausalLM # 加载基础模型 base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B") # 加载LoRA适配器并合并 model = PeftModel.from_pretrained(base_model, "./lora_checkpoint") merged_model = model.merge_and_unload() # 关键步骤:重建完整权重 # 保存完整模型 merged_model.save_pretrained("./merged_model", safe_serialization=True) ``` 2. **vLLM部署命令修正**: ```bash vllm serve ./merged_model \ --dtype bfloat16 \ --quantization none # 确保未启用额外量化 ``` 3. **特殊场景处理**: - **若需部署量化模型**:先合并LoRA再独立量化 ```python # 合并后使用AWQ量化 from awq import AutoAWQForCausalLM quantizer = AutoAWQForCausalLM.from_pretrained("./merged_model") quantizer.quantize(save_dir="./quant_model", bits=4) ``` 部署时指定量化参数: ```bash vllm serve ./quant_model --quantization awq ``` #### 关键验证步骤 1. **检查权重形状一致性**: ```python import torch original = torch.load("Qwen/Qwen3-0.6B/pytorch_model.bin") merged = torch.load("./merged_model/pytorch_model.bin") for k in original.keys(): assert original[k].shape == merged[k].shape # 必须全部通过 ``` 2. **vLLM兼容性确认**: - Qwen3-0.6B已在vLLM v0.4+原生支持 - 确认vLLM版本:`pip show vllm | grep Version` > 引用说明:LoRA的轻量化特性使微调后模型体积显著减小[^1],但正确合并权重是部署前提。若跳过`merge_and_unload()`直接部署,必然导致形状不匹配[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loong_XL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值