02.模型量化

1.为啥要量化?

端侧AI一般跑在RK3588等芯片上,内存、FLASH都有限

原始模型一般较大,量化后体积会小很多,这样才有可能放到端侧AI芯片上运行

1)减小模型文件体积

原生 Qwen3‑4B BF16 .safetensors文件接近8GB

INT8(W8A8)量化后约 4GB

W8A8:Weight INT8,Activation INT8;权重、激活全部压缩,内存收益最大,但精度风险更高。

2)降低推理运行时内存占用

推理过程会产生大量中间激活值

未量化时激活为 BF16/FP16,占用大量内存。

在W8A8 量化模式下,激活值位宽同步压缩,推理内存减少一半

3)适配 NPU 硬件算力,提升推理速度

BF16 算子只能在CPU/GPU执行,速度很慢

RK NPU 硬件原生支持INT8/INT4 运算;量化后算子运行在NPU,速度快

2.量化初探

从官网下载的 (.safetensors)格式的大模型,比如Qwen3-VL-2B,这个模型只能在显卡上跑,不能在RK3588的NPU上跑。

此时就需要把.safetensors 格式的大模型量化转换为NPU可以运行的格式

转换代码例子

from rkllm.api import RKLLM
model_path = "/home/wssheng/rk3588/qwen3-2b/qwen3-2b"
save_path  = "/home/wssheng/rk3588/qwen3-2b/qwen3-2b-rk3588.rkllm"
llm = RKLLM()
#1. 加载
ret = llm.load_huggingface(model=model_path)
if ret != 0:
    print("load failed")
    exit(ret)
#2. 转换
ret = llm.build(
    do_quantization=True,
    optimization_level=1,
    quantized_dtype="w8a8",     
    target_platform="RK3588",
    num_npu_core=2
    )
if ret != 0:
    print("build failed")
    exit(ret)
#3. 导出
ret = llm.export_rkllm(save_path)
if ret == 0:
    print("✅ 导出成功:", save_path)
else:
    print("❌ 导出失败")
posted @ 2026-08-11 10:14  wssheng  阅读(1)  评论(0)    收藏  举报