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("❌ 导出失败")
浙公网安备 33010602011771号