在发布的 RKLLM 工具链压缩文件中,包含了 RKLLM-Toolkit 的 whl 安装包、RKLLM Runtime 库的相关文件以及参考示例代码,github链接如下:https://github.com/airockchip/rknn-llm
环境准备
RKLLM-Toolkit
由于提供的rkllm_toolkit包为python3.8版本的,因此需要确保本地的python环境为3.8,否则需要新建python3.8的虚拟环境。
首先进入到rkllm-toolkit``/packages
目录下,使用 pip 工具直接安装所提供的工具链 whl 包
pip install rkllm_toolkit-1.0.1-cp38-cp38-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后,我们可以使用如下命令测试是否安装成功
python
from rkllm.api import RKLLM
RKLLM Runtime
在rkllm-runtime的rumtime目录下,分别包含Linux和Android下RKLLM Runtime 的全部文件:
- lib/librkllmrt.so: 适用于 RK3576/RK3588 板端进行模型推理的 RKLLM Runtime 库;
- include/rkllm_api.h: 与 librkllmrt.so 相对应的头文件,包含相关结构体及函数定义的说明;
在通过 RKLLM 工具链构建OK3576板端的部署推理代码时,为保证编译的正确性,需要包含对以上头文件及函数库的链接。当代码在开发板上运行的过程中,同样需要确保库文件也成功推送至板端,并正确设置环境变量
export LD_LIBRARY_PATH=/path/to/your/lib
RKNPU driver
在板端使用 RKLLM Runtime 进行模型推理前,首先需要确认板端的 NPU 内核是否为 v0.9.6 版本,具体的查询命令如下:
板端执行以下命令,查询 NPU 内核版本
cat /sys/kernel/debug/rknpu/version
确认命令输出是否为:
RKNPU driver: v0.9.6
若所查询的 NPU 内核版本低于 v0.9.6,则需要更新npu驱动并且重新编译进内核。
模型转换
在rkllm-toolkit``/``examples``/huggingface
目录下提供了huggingface模型转换的示例。整体流程如下图:
导入库
首先导入rkllm库
from rkllm.api import RKLLM
读取模型
读取我们的huggingface格式的模型,需要把其中的modelpath修改为自己的模型文件夹
modelpath = '/tmp/code/models/qwen2_0_5B'
llm = RKLLM()
# Load model
ret = llm.load_huggingface(model = modelpath)
if ret != 0:
print('Load model failed!')
exit(ret)
模型量化构建
# Build model
ret = llm.build(do_quantization=True, optimization_level=1, quantized_dtype='w8a8', target_platform='rk3576')
if ret != 0:
print('Build model failed!')
exit(ret)
各参数说明如下:
- do_quantization: 该参数控制是否对模型进行量化操作,建议设置为 True;
- optimization_level: 该参数用于设置是否进行量化精度优化,0 表示不做任何优化,1 表示进行精度优化;
- quantized_dtype: 该参数用于设置量化的具体类 型, 目前支持的量化类型包括“w4a16”和“w8a8”,“w4a16”表示对权重进行 4bit 量化而对激活值不进行量化;“w8a8”表示对权重和激活值均进行 8bit 量化;目前 rk3576 平台支持“w4a16”和“w8a8”两种量化类型,rk3588 仅支持“w8a8”量化类型;
- target_platform: 模型运行的硬件平台, 可选择的设置包括“rk3576”或“rk3588”;
导出模型
在通过 rkllm.build()函数构建了 RKLLM 模型后,可以通过rkllm.export_rkllm()函数将RKNN 模型保存为一个.rkllm 文件,以便后续模型的部署。
# Export rknn model
ret = llm.export_rkllm("/tmp/code/models/qwen.rkllm")
if ret != 0:
print('Export model failed!')
exit(ret)