当前位置: 首页 > news >正文

LoRA 部署:微调后的模型怎么上线

本文基于昇腾CANN和昇腾NPU,围绕 cann-recipes-infer 仓库的相关技术展开。

LoRA 训练完出来两个东西——基础模型权重不动,外加一个小 rank 矩阵。部署时你不能直接丢原始权重,LoRA 矩阵要合并进去或者通过算子注入。CANN 上 LoRA 部署有两种路子:权重合并(Merge)和动态注入(Runtime LoRA)。

LoRA 的本质

# LoRA 训练的产出——两个小矩阵classLoraLayer(torch.nn.Module):""" 原始层: y = Wx LoRA: y = Wx + BAx B: [out_dim, rank], A: [rank, in_dim], rank << dim """def__init__(self,base_weight,rank=8,alpha=16):super().__init__()self.W=base_weight# 冻结,不更新self.A=torch.nn.Linear(base_weight.shape[1],rank,bias=False)self.B=torch.nn.Linear(rank,base_weight.shape[0],bias=False)self.scale=alpha/rank# 初始化:A 用高斯,B 用 0torch.nn.init.normal_(self.A.weight,std=0.02)torch.nn.init.zeros_(self.B.weight)defforward(self,x):# LoRA 分支:x → A → B → scale,加到主路lora_out=self.B(self.A(x))*self.scalereturnself.W(x)+lora_out# 训练完得到 A、B 矩阵# rank=8, dim=4096 → A: [8, 4096], B: [4096, 8] → 共 65K 参数# 原始层 W 有 4096×4096 ≈ 16.8M 参数# LoRA 只改 0.4% 的参数

部署时两难:跑推理时每个 Forward 都要算Wx + BAx,多了两次小 MatMul。合并的话,丢掉了切换任务的能力。

方案一:权重合并

# Merge——把 BA 加进 W,推理不感知 LoRAdefmerge_lora_to_weight(base_weight,lora_A,lora_B,alpha,rank):""" 把 LoRA 矩阵合并到原始权重 W_merged = W + (B @ A) * (alpha / rank) 合并后模型结构和原始模型完全一样。 推理代码不需要知道 LoRA 的存在。 """# B @ A: [out_dim, rank] @ [rank, in_dim] = [out_dim, in_dim]delta=torch.mm(lora_B.weight.data,lora_A.weight.data)delta=delta*(alpha/rank)merged_weight=base_weight.clone()merged_weight+=deltareturnmerged_weight# 使用方法merged_w=merge_lora_to_weight(model.layers[0].self_attn.q_proj.weight,lora_modules["q_proj"].A.weight,lora_modules["q_proj"].B.weight,alpha=16,rank=8)# 推理时直接换权重——代码没变# model.layers[0].self_attn.q_proj.weight = merged_w

合并后推理路径跟原始模型一模一样——零额外开销。代价是每换一个任务要重新 Merge 一遍,生成一个新的 OM 模型文件。

方案二:CANN 动态注入

// AscendCL 上做 Runtime LoRA——不合并,用额外的 MatMulclassRuntimeLoRAExecutor{// 加载基础模型uint32_tmodel_id;aclmdlDesc*model_desc;// LoRA 参数——存在 Device 上std::vector<LoraAdapter>adapters;structLoraAdapter{void*a_matrix_dev;// [rank, dim] 存 Devicevoid*b_matrix_dev;// [dim, rank] 存 Device};voidExecuteWithLoRA(void*input,void*output,constchar*task_name){// 先跑基础模型aclmdlExecute(model_id,input,output);// 根据 task_name 选 LoRA 适配器LoraAdapter&lora=adapters[task_name];// 在某个 Attention 层的输出上追加 LoRA 分支// 需要知道目标层的输出 Tensor 地址void*layer_out=GetLayerOutput(model_id,"self_attn.q_proj");// LoRA 分支:x → A → B → scale → addvoid*hidden_buf=aclrtMalloc(hidden_dim*sizeof(float));void*rank_buf=aclrtMalloc(rank*sizeof(float));// x @ A^T: [1, dim] @ [dim, rank] = [1, rank]aclblasGemmEx(rank_buf,layer_out,lora.a_matrix_dev,1,rank,dim,ACL_TRANS_N,ACL_TRANS_N,ALPHA,0.0f,ACL_FLOAT);// rank_out @ B^T: [1, rank] @ [rank, dim] = [1, dim]aclblasGemmEx(hidden_buf,rank_buf,lora.b_matrix_dev,1,dim,rank,ACL_TRANS_N,ACL_TRANS_N,alpha/rank,1.0f,ACL_FLOAT);// beta=1 做累加// 结果已经在 hidden_buf 里累加到原始输出了}};

动态注入的好处是切换任务不用换模型,换个 adapter 指针就行。CANN 上利用aclblasGemmEx的小矩阵 API 做 LoRA 分支,rank=8 的矩阵乘法在 NPU 上的开销约 0.02ms——可以忽略。

部署选型建议

场景选 Merge选 Runtime LoRA
单任务部署✅ 性能最好❌ 有额外开销
多租户不同 LoRA❌ 要存多份✅ 切换快
小 Batch 在线服务
大 Batch 离线推理❌ 显存碎片多

CANN 上跑 LoRA 部署时注意一点:AscendCL 的aclmdlExecute是模型级执行,不能模块粒度打断。想做到 Layer 级 LoRA 注入,得在 GE 图层面插入算子节点,或者用 ATC 编译时把 LoRA 矩阵编进 OM。

参考仓库

LoRA 部署示例

AscendCL 推理接口

TorchAir 微调支持

http://www.jsqmd.com/news/872974/

相关文章:

  • 3种实战方法搞定Docker镜像加速:从零到精通完全指南
  • CANN ATC模型编译器深度解析:ONNX到OM的编译全流程与黑盒参数详解
  • 从开题到定稿零返工:okbiye 毕业论文 AI 写作,把格式和内容难题都解决了
  • 通过Taotoken Token Plan套餐降低长期项目成本的观察
  • 【行业首发】Midjourney v6.2水动力学渲染白皮书:基于流体物理模型的prompt工程重构(附NASA水波频谱对照表)
  • 暂时停止所有开发工作------全部转到销售+推广
  • 回收福禄克Fluke 5730A多功能校准器
  • 5款必备Illustrator脚本:让你的设计效率提升300%
  • 股票低开必读:5条黄金口诀,教你反手掌握主动权
  • QLoRA:4-bit 量化微调的完整链路
  • vLLM 在 CANN 上的推理优化
  • 防城港6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • AI Agent不是替代工程师,而是重建协作范式:建筑全生命周期8类角色能力升级路线图(限时公开)
  • 别只看页面:盲盒源码小程序V6MAX系统与盲盒app源码程序解析 - 壹软科技
  • 使用OpenClaw连接Taotoken配置Agent工作流的具体步骤
  • RimSort终极指南:3步解决环世界MOD加载顺序混乱的完整方案
  • Lindy流程自动化效果衰减真相:3年追踪数据显示,未做持续治理的企业6个月后效率回落至基线112%
  • DeepSeek-R1 在 CANN 上的推理部署
  • 钦州6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 最新论文降重工具横向测评|新手零踩雷选择指南
  • 如何轻松实现Windows任务栏图标居中?TaskbarX完整使用指南
  • 3步快速搭建微信小程序商城:巴爷商城开源项目实战指南
  • 在nodejs后端服务中集成taotoken调用大模型详解
  • Lindy流程冷启动死亡陷阱(97%新手踩中的第3个环节):实时检测+自动回滚机制详解
  • Taotoken在多模型A/B测试场景下的统一接入与效果对比实践
  • 将Taotoken作为统一网关整合到企业现有微服务架构中的设计考量
  • AI答案优化效果可以靠哪些第三方数据验证?
  • 玉林6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 观测 TaoToken 在多模型间自动路由的稳定性与响应速度
  • AI Agent在仓储分拣中的真实效能验证(2023-2024全国12家仓配中心压测报告首次公开)