从 LLaMA-Factory 微调到高通 NPU 部署: Qwen-0.6B 全链路移植指南

前言

在大模型端侧化部署的趋势下,如何将微调后的 LLM 跑在手机 NPU 上是很多开发者的痛点。本文将手把手教你如何将使用 LLaMA-Factory 微调后的 Qwen-0.6B 模型,一步步移植到高通(Qualcomm)骁龙平台的 NPU 上,实现低功耗、高速度的本地化推理。

一、 导出微调模型

首先,在 LLaMA-Factory 界面中选择好微调后的检查点(Checkpoint),填写导出路径,点击 “开始导出”

[图片]

导出成功后,你会在目录下看到如下文件:

  • model.safetensors(模型权重)
  • config.json(模型配置)
  • tokenizer.json 等(分词器相关)

要将微调后的 Qwen-0.6B 模型移植到高通 NPU,第一步就是格式转换。safetensors 是目前 Hugging Face 推崇的安全权重格式,而 ONNX 则是进入高通工具链(QNN/SNPE)的通用门票。
以下是详细的操作步骤

二、 格式转换:从 Safetensors 到 ONNX

1. 转换为 PyTorch 权重

由于部分旧版转换工具不支持 safetensors,建议先将其转回标准的 pytorch_model.bin

import torch from safetensors.torch import load_file # 1. 路径设置 safetensors_path ="./qwen0_6b/model.safetensors" pytorch_bin_path ="./qwen0_6b/pytorch_model.bin"# 2. 加载并保存 weights = load_file(safetensors_path) torch.save(weights, pytorch_bin_path)[cite_start]print(f"转换成功:{pytorch_bin_path}")[cite:42,43,44,46,51,54]

注意:转换后,请确保你的 config.json 中的 architectures 字段正确(对于 Qwen0.6B 通常是 Qwen2ForCausalLM)。

2. 使用 Optimum 导出 ONNX

导出 LLM 涉及复杂的 KV Cache 处理,强烈建议使用 Hugging Face 的 Optimum 库 。

安装工具:

[cite_start]pip install optimum[exporters] onnx onnxruntime [cite: 62]

执行导出:
针对 NPU 部署,必须开启 with past 模式以保证推理速度 。

optimum-cli export onnx \ --model ./qwen0_6b \ --task text-generation-with-past \ --trust-remote-code \[cite_start]./qwen_onnx_out/ [cite: 67, 69, 71, 73, 75]

输出结果:你会得到 decoder_model.onnxdecoder_with_past_model.onnx

注意:--task text-generation-with-past:这非常关键!这会生成两个模型,一个处理初始 Prompt,另一个利用 KV Cache 负责后续 Token 生成 。

三、 高通 NPU 关键优化(必看!)

高通 Hexagon NPU 对算子有特定要求,进入工具链前需完成以下优化:

  1. Opset 版本: 建议使用 Opset 17 或更高版本 。如果 optimum 默认导出较低,可以指定:
--opset 17
  1. 静态形状(Static Shapes): NPU 在静态形状下性能最强。建议将输入固定,如 batch_size=1, sequence_length=512
  2. 模型简化: 使用 onnxsim 消除冗余算子,降低报错率 。
pip install onnxsim onnxsim ./qwen_onnx_out/decoder_model.onnx ./qwen_onnx_out/decoder_model_sim.onnx 

四、验证 ONNX 模型

在交给高通工具链之前,先确保 ONNX 模型是正确的:

import onnx import onnxruntime as ort model = onnx.load("./qwen_onnx_out/decoder_model.onnx") onnx.checker.check_model(model) print("ONNX 模型校验通过!")

五、 高通工具链(QNN)模型编译

1. 环境准备

确保你的 Linux 开发机已安装:

  • Qualcomm AI Engine Direct SDK (QNN)
  • Android NDK (建议 r25c 或 r26)
  • 设置环境变量
exportQNN_SDK_ROOT=/path/to/qnn_sdk exportANDROID_NDK_ROOT=/path/to/android_ndk source$QNN_SDK_ROOT/bin/envsetup.sh 

一旦你拿到了 decoder_model.onnx,你接下来的操作流程是:

  • 准备量化数据:从你的微调数据集中抽取 100 条样本,用于高通工具的 Post-Training Quantization (PTQ)。
  • 使用 QNN Converter
qnn-onnx-converter -i decoder_model.onnx -o qwen_qnn.cpp --input_list_file calibration_data.txt 

要把微调后的 Qwen-0.6B 最终跑在手机 NPU 上,你需要经历交叉编译的过程。高通 QNN SDK 提供了专门的工具,将转换后的中间代码(.cpp / .bin)编译成手机端可执行的二进制文件。
在高通架构中,通常涉及两种文件:

  • .so (Model Library):模型的结构描述库。
  • .bin (Context Binary):针对特定 NPU 硬件优化并序列化后的图模型(这是性能最高的形态)。

2. 生成模型动态库 (.so)

使用 qnn-onnx-converter 将 ONNX 转为 C++ 代码,再通过 qnn-model-lib-generator 编译 。

qnn-model-lib-generator \ -c qwen_model.cpp \ -b qwen_model.bin \ -o ./model_libs \ -t aarch64-android # 指定目标平台为 Android ARM64
  • 输出结果:在 ./model_libs/aarch64-android/ 目录下,你会得到一个 libqwen_model.so
  • 用途:这个文件包含了模型的拓扑结构,可以被高通的推理引擎加载。

3. 生成上下文二进制文件 (.bin) —— 性能核心

为了实现“秒开”和极致加速,必须生成针对 HTP(Hexagon Tensor Processor)优化的 Context Binary 。

qnn-context-binary-generator \ --model ./model_libs/aarch64-android/libqwen_model.so \ --backend libQnnHtp.so \ --output_dir ./context_out \ --binary_file qwen_htp_context 
  • --backend libQnnHtp.so:这步至关重要,它指定使用 HTP (Hexagon Tensor Processor) 后端,即真正的 NPU 加速。
  • 输出结果qwen_htp_context.bin
注意:此步骤通常建议在连接了真机的情况下运行(通过 adb),或者使用高通提供的模拟器,因为生成 context 需要针对具体的芯片架构(如 v73, v75)。

六、 手机端集成与验证

在 Android 项目中,通过 C++/JNI 调用 QNN API 加载 qwen_htp_context.bin 即可执行推理 。

现在你手里有了:

  1. 模型资产:qwen_htp_context.bin。
  2. 推理引擎库:从 QNN SDK 中提取的 libQnnHtp.so, libQnnSystem.so 等。

快速验证:
在写 App 前,先用 qnn-net-run 工具在手机 shell 中测试 :

[cite_start]./qnn-net-run --container qwen_htp_context.bin --backend libQnnHtp.so --input_list input_data.txt [cite: 198, 199, 200]

若能正常输出 Tensor 结果,说明模型已成功跑在 NPU 上!

推理代码核心逻辑(C++/JNI):
在 Android 的 C++ 层,你需要调用 QNN API 来加载这个 .bin 文件:

// 1. 初始化 QNN 实例 Qnn_BackendHandle_t backendHandle; QnnBackend_initialize(..., &backendHandle); // 2. 加载之前生成的 Context Binary Qnn_ContextHandle_t contextHandle; // 通过读取 qwen_htp_context.bin 的 buffer 传入 QnnContext_createFromBinary(backendHandle, deviceHandle, ..., binaryBuffer, binarySize, &contextHandle, ...); // 3. 准备 Tensor 数据并执行推理 QnnGraph_execute(graphHandle, inputTensors, numInputs, outputTensors, numOutputs, ...); 

🛠 避坑总结

  • 版本一致性: 编译 .so 的 NDK 版本必须与 Android 项目一致 。
  • 内存溢出: 若 Context Length 设得太大,NPU 内存会溢出,建议从 512 或 1024 测起 。
  • 算子支持: 若生成 Binary 报错,需回到 ONNX 阶段进行算子融合或替换 。

希望这篇指南能帮你顺利把大模型装进兜里!如果有问题,欢迎在评论区交流。

如果你觉得有用,欢迎点赞、收藏、关注!

Read more

【本地Docker部署开源低代码开发神器Appsmith与远程访问在线使用】

【本地Docker部署开源低代码开发神器Appsmith与远程访问在线使用】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂 非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨ 博客目录 * 前言

专访越擎科技,为什么选择iRobotCAM机器人离线编程软件作为机器人激光加工首选方案

专访越擎科技,为什么选择iRobotCAM机器人离线编程软件作为机器人激光加工首选方案

摘要:激光具备高精度的特性,而激光设备如何实现高精度的应用,不仅涉及设备的硬件精度,也涉及到软件的适配精度。本文通过对话越擎科技CEO,从行业洞察角度,越擎科技研发的iRobotCAM机器人离线编程软件背后的技术架构优势,如何确保实现激光高精度加工适配。 由于激光工艺的高精度的特性,各类激光加工设备应运而生,不断的满足各类的应用场景的需求。而对于设备的精度控制,除了激光器等相关硬件的调试外,软件也是其关键的一环。以机器人激光加工为例,iRobotCAM提供了全面的激光加工工艺模块,可以适配各类不同的机器人,通过其高精度的技术架构的优势,满足各类高精尖或复杂的产品加工需求。 而更具体的讲,作为跨平台架构的iRobotCAM,从全国产的角度来看,选择iRobotCAM作为机器人激光工艺应用软件有哪些明显的优势。 技术层面 * 高精度轨迹算法:基于国产中望3D平台开发的iRobotCAM版本,能够利用中望3D的各类2轴到5轴的轨迹算法,使机器人在激光加工过程中拥有类似CAM软件的精确轨迹算法,可将激光束准确地聚焦在加工部位,实现高精度的激光切割、焊接、雕刻等工艺,确保加工质量和一致性

【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化

【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化

文章目录 * 《VR 360°全景视频开发》专栏 * Part 3|Unity VR眼镜端播放器开发与优化 * 第一节|基于Unity的360°全景视频播放实现方案 * 第二节|VR眼镜端的开发适配与交互设计 * 第三节|Unity VR手势交互开发与深度优化 * 第四节|高分辨率VR全景视频播放性能优化 * 一、挑战分析与目标设定 * 1.1 主要瓶颈 * 1.2 目标设定 * 二、硬解与软解方案选型 * 2.1 平台解码能力检测 * 2.2 推荐策略 * 三、视野裁剪与分块播放 * 3.1 原理说明 * 3.2 实现流程图 * 3.3 伪代码 * 四、动态降级与多码率自适应 * 4.1

宇树科技Go2机器人强化学习(RL)开发实操指南

宇树科技Go2机器人强化学习(RL)开发实操指南

在Go2机器人的RL开发中,环境配置、模型训练、效果验证与策略部署的实操步骤是核心环节。本文基于宇树科技官方文档及开源资源,以Isaac Gym和Isaac Lab两大主流仿真平台为核心,提供从环境搭建到实物部署的全流程操作步骤,覆盖关键命令与参数配置,帮助开发者快速落地RL开发。 一、基础准备:硬件与系统要求 在开始操作前,需确保硬件与系统满足RL开发的基础需求,避免后续因配置不足导致训练中断或性能瓶颈。 类别具体要求说明显卡NVIDIA RTX系列(显存≥8GB)需支持CUDA加速,Isaac Gym/Isaac Lab均依赖GPU进行仿真与训练操作系统Ubuntu 18.04/20.04/22.04推荐20.04版本,兼容性最佳,避免使用Windows系统(部分依赖不支持)显卡驱动525版本及以上需与CUDA版本匹配(如CUDA 11.3对应驱动≥465.19.01,CUDA 11.8对应驱动≥520.61.05)软件依赖Conda(