本帖最后由 jf_85110202 于 2025-2-14 16:41 编辑
ATK-DLRK3588开发板 deepseek-r1-1.5b/7b部署指南
最近 deepseek爆火,当DeepSeek这样的国产大模型部署在RK3588上时,由于RK3588的强大性能支持,同样的模型规模可以得到更强大的推理能力、实时性能以及边缘计算能力。在本篇文章中,我们将一口气教大家从下载模型、转换模型到最终部署deepseek-r1-1.5b和deepseek-r1-7b的模型到正点原子的ATK-DLRK3588上面测试。
1、安装anaconda软件环境
第 1小节至第4小节讲解从安装conda环境到转换模型,如果需要想要直接在ATK-DLRK3588开发板体验模型的话请直接移步第5小节- deepseek部署章节 。
安装 anaconda环境请参考正点原子ATK-DLRK3588资料盘的开发板光盘A盘-基础资料\10、用户手册\01、测试文档目录下《03【正点原子】ATK-DLRK3588_AI例程测试手册V1.1》的1.3章节,如下图。
2、安装rkllm转换环境
2.1、新建conda环境
在 ubuntu终端里面打开终端,执行以下命令新建conda环境
conda create -n RKLLM-Toolkit python=3.8 复制代码
2.2、安装rkllm_toolkit工具
首先解压 rkllm压缩包,这里在家目录下新建了一个software目录下,并在software目录下面新建了个rkllm目录,将rknn-llm-release-v1.1.4压缩包解压到当前文件夹下,然后在打开终端,执行以下命令进入RKLLM-Toolkit的conda环境。
ubuntu终端下运行
conda acti vate RKLLM-Toolkit cd rkllm-toolkit/packages pip3 install rkllm_toolkit-1.1.4-cp38-cp38-linux_x86_64.whl 复制代码
3、下载deepseek模型
3.1、安装huggingface-cli工具
ubuntu终端中conda环境下运行
pip3 install huggingface-cli -i https://mirrors.huaweicloud.com/repository/pypi/simple 复制代码
3.2、下载deepseek模型
可以配置加速节点,下载 deepseek的huggingface格式模型(有时候也会失效,建议直接官网直接点击下载键来下载模型会更快),网盘中也有提供下载好的原始huggingface格式模型。
在 ~/software/rkllm/rknn-llm-release-v1.1.4/rkllm-toolkit/examples/下新建一个huggingface文件夹:
mkdir ~/software/rkllm/rknn-llm-release-v1.1.4/rkllm-toolkit/examples/huggingface -p 复制代码
然后执行如下命令:
export HF_ENDPOINT=https://hf-mirror.com cd ~/software/rkllm/rknn-llm-release-v1.1.4/rkllm-toolkit/examples/huggingface/ 复制代码
再新建一个文件夹 deepseek-r1-1.5b,进入该文件夹下:
mkdir deepseek-r1-1.5b && cd deepseek-r1-1.5b 复制代码
再执行命令并下载 DeepSeek-R1-Distill-Qwen-1.5B模型到对应文件夹中:
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local-dir . --local-dir-use-symlinks False 复制代码
我们已经提供了下载好的 deepseek-r1 1.5b/7b原始huggingface模型在网盘,想要自己转换的可以自行下载转换模型。
4、deepseek转换rkllm模型
4.1、转换deepseek_1.5b版本的脚本
进入到前面解压的 rkllm-toolkit工具里的 rkllm-toolkit/examples 目录,将 开发板光盘 C盘 - 大模型资料 \1 、程序源码 \3 、导出 rkllm 脚本 里面的三个文件均放在 rkllm-toolkit/examples目录下,并在在当前目录打开终端并进入 conda 环境。
from rkllm.api import RKLLM import os #os.environ['CUDA_VISIBLE_DEVICES']='0' modelpath = './huggingface/deepseek-r1-1.5b' llm = RKLLM() # Load model # Use 'export CUDA_VISIBLE_DEVICES=0' to specify GPU device # options ['cpu', 'cuda'] ret = llm.load_huggingface(model=modelpath, model_lora = None, device='cpu') if ret != 0: print('Load model failed!') exit(ret) # Build model dataset = "./data_quant.json" qparams = None ret = llm.build(do_quantization=True, optimization_level=1, quantized_dtype='w8a8', quantized_algorithm='normal', target_platform='rk3588', num_npu_core=3, extra_qparams=qparams,dataset=dataset) if ret != 0: print('Build model failed!') exit(ret) # Export rkllm model ret = llm.export_rkllm(f"./deepseek-1.5b-w8a8-rk3588.rkllm") if ret != 0: print('Export model failed!') exit(ret) 复制代码
1、在命令行中执行以下命令,进入 conda 环境
conda activate RKLLM-Toolkit 复制代码
2、转换 deepseek-r1-1.5b 模型时,执行以下 python 脚本进行转换模型。
python3 export_deepseek_1.5b_rkllm.py 复制代码
当出现 INFO: Model has been saved to ./deepseek-1.5b-w8a8-rk3588.rkllm!,即转换模型成功。
4.2、转换deepseek_7b版本的脚本
from rkllm.api import RKLLM import os #os.environ['CUDA_VISIBLE_DEVICES']='0' modelpath = './huggingface/deepseek-r1-7b' llm = RKLLM() # Load model # Use 'export CUDA_VISIBLE_DEVICES=0' to specify GPU device # options ['cpu', 'cuda'] ret = llm.load_huggingface(model=modelpath, model_lora = None, device='cpu') if ret != 0: print('Load model failed!') exit(ret) # Build model dataset = "./data_quant.json" qparams = None ret = llm.build(do_quantization=True, optimization_level=1, quantized_dtype='w8a8', quantized_algorithm='normal', target_platform='rk3588', num_npu_core=3, extra_qparams=qparams,dataset=dataset) if ret != 0: print('Build model failed!') exit(ret) # Export rkllm model ret = llm.export_rkllm(f"./deepseek-7b-w8a8-rk3588.rkllm") if ret != 0: print('Export model failed!') exit(ret) 复制代码
1、转换 deepseek-r1-7b 模型时,执行以下 python 脚本进行转换模型。 python3 export_deepseek_7b_rkllm.py
将模型拷贝到部署模型目录下,编译部署程序。
注意!!!转换 deepseek-r1-7b及以上规模(包含 7b , 8b , 14b 甚至 32b 等) rkllm 模型对 PC 设备要求比较高,如果想要自己另外转换更大规模的 rkllm 模型,请确保虚拟机的运行内存充足,如果内存不足,可以通过使用存储来配置交换内存来作为临时内存使用。
一般我们的电脑的运行内存转换 huggingface模型为 rkllm 模型时都不够用,在转换时很容易出现无法转换直接杀死进程的情况,转换前可以创建交换分区,使用硬盘的空间作为运存,在 ubuntu 下创建 10g 的交换分区(可根据实际内存创建更大的 swap 分区),执行以下命令进行创建。
sudo dd if=/dev/zero of=/tmp/swapfile bs=1M count=10240 使用chmod权限 sudo chmod 0600 /tmp/swapfile 创建swap分区文件系统 sudo mkswap /tmp/swapfile 开启swap分区 sudo swapon /tmp/swapfile 查看分区情况 swapon -s 复制代码
5、编译deepseek部署程序
5.1、安装编译器
将 r8的编译器拷贝到 ubuntu 中,编译器在资料盘 开发板光盘 A盘 - 基础资料 \05 、开发工具 \03 、交叉编译工具 目录下的 atk-dlrk3588-toolchain-aarch64-buildroot-linux-gnu-x86_64_5_10_r8_20250120-v1.1.run。
在当前目录打开终端,执行以下命令安装。
chmod a+x atk-dlrk3588-toolchain-aarch64-buildroot-linux-gnu-x86_64_5_10_r8_20250120-v1.1.run ./atk-dlrk3588-toolchain-aarch64-buildroot-linux-gnu-x86_64_5_10_r8_20250120-v1.1.run 复制代码
当提示 “Enter target directory for toolchain (default: /opt/atk-dlrk3588-toolchain):” 时, 表示是否选择默认安装在 /opt/atk-dlrk3588-toolchain 目录下,建议直接选择默认安装路径( 注意!!!!这里会把原先安装的编译器给覆盖,所以原先的编译器还有用处请修改路径, 或者下次需要用到再重新安装原先的编译器 ),直接按下回车键即可。当提示 “You are ab out to install the toolchain to "/opt/atk-dlrk3588-toolchain". Proceed[Y/n]?” 时,直接按下 “Y” 回车即可。输入 ubuntu 密码回车后,当弹出提示 “$. source /opt/atk-dlrk3588-toolchain/environment-setup” 时,表示已经安装完成。
5.2、编译部署程序
将提供的 deepseek例程压缩包解压,位置在 开发板光盘 C盘 - 大模型资料 \1 、程序源码 \2 、板端部署程序 里的 atk_deepseek_demo.zip,解压后 将资料盘中的 rkllm文件或者转换好的文件拷贝到 rkllm_model 目录中 ,打开终端,执行以下命令执行编译部署程序的脚本。
等待编译完成后,需要拷贝 rkllm和 libgomp 库到开发板的 usr/lib 目录下,可通过 adb 或者 scp 工具传输到 rk3588 开发板上。
#传输一些库到开发板中 adb push lib/libgomp/libgomp.so /usr/lib/libgomp.so.1 adb push lib/librkllm_api/librkllmrt /usr/lib #将编译好的可执行文件和模型传输到开发板中 adb push install/atk_deepseek_rkllm_demo/ / 复制代码
6、运行测试
6.1、烧录R8版本镜像
正点原子 ATK-DLRK3588开发板准备,请参考资料盘 开发板光盘 A盘 - 基础资料 \10 、用户手册 \03 、辅助文档 \31 【正点原子】 ATK-DLRK3588 出厂镜像烧录指导 V1.1.pdf 烧录 r8系统镜像。
6.2、运行测试
运行测试时建议连接网线,开发板使用 ssh登录,否则会不断打印 npu 切换 iommu 信息
此处请注意, 4+32g版本 rk3588 目前仅支持 deepseek-R1-1.5b 版本运行, 7b 版本在 8+64g 的 rk3588 需要创建 swap 分区才能运行,创建方法如下。
执行以下命令会比较慢 dd if=/dev/zero of=/userdata/swapfile bs=1M count=10240 使用chmod权限 chmod 0600 /userdata/swapfile 创建swap分区文件系统 mkswap /userdata/swapfile 开启swap分区 swapon /userdata/swapfile 查看分区情况 free -mh 复制代码
所有内存版本 rk3588均使用以下命令进行部署测试。
打开RK3588板端shell(建议ssh登录),执行以下命令进行测试。 cd /atk_deepseek_rkllm_demo 运行deepseek-R1-1.5b程序 ./atk_deepseek_demo rkllm_model/deepseek-1.5b-w8a8-rk3588.rkllm 5000 5000 运行deepseek-R1-7b程序 ./atk_deepseek_demo rkllm_model/deepseek-7b-w8a8-rk3588.rkllm 5000 5000 复制代码
等待加载完毕后,可以在里面进行提问,或者输入预设序号进行提问, deepseek-r1-1.5b和 deepseek-r1-7b 测试结果分别如下。
root@ATK-DLRK3588:/atk_deepseek_rkllm_demo# ./atk_deepseek_demo rkllm_model/deepseek-1.5b-w8a8-rk3588.rkllm 5000 5000 rkllm init start W rkllm: Warning: Your rknpu driver version is too low, please upgrade to 0.9.7. I rkllm: rkllm-runtime version: 1.1.4, rknpu driver version: 0.9.6, platform: RK3588 rkllm init success **********************可输入以下问题对应序号获取回答/或自定义输入******************** [0] 现有一笼子,里面有鸡和兔子若干只,数一数,共有头14个,腿38条,求鸡和兔子各有多少只? [1] 有28位小朋友排成一行,从左边开始数第10位是学豆,从右边开始数他是第几位? ************************************************************************* user: 请问你能做些什么 robot: 您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。有关模型和产品的详细内容请参考官方文档。 user: 能写一首关于春天的诗吗 robot: 嗯,用户想要一首关于春天的诗。首先,我得考虑春天的特点,比如花开、绿草、鸟鸣这些元素。然后,可能需要一些意象来表达春天的美好和变化。 也许可以从自然景象入手,比如柳树在春风中摇曳,这样的画面很生动。接着,可以加入一些动态的元素,比如蝴蝶在花间翩翩起舞,这样能增加诗的活力。 再想想季节的变化,春天来了,万物复苏,所以可以用“春”字来表达整体的主题。同时,要让诗句流畅自然,避免生硬的连接。 可能还需要一些比喻或者拟人化的手法,让文字更有画面感。比如把花朵比作小精灵,或者把蝴蝶比作舞者,这样能让读者更容易想象出春天的美好场景。 最后,确保整首诗有节奏感和韵律,这样读起来更顺口,也更有感染力。可能需要调整句子的长度和用词,让每一句都能传达出春天的不同方面。 总的来说,这首诗应该包含自然景象、动态元素以及季节的变化,通过生动的意象和比喻来展现春天的美好和生机。 ## 《春日》 柳絮飘飘 在春风中摇曳 蝴蝶翩翩 在花间起舞 花开得正盛 绿草如茵 小精灵们 正朝向春天奔走 我看见 春天的影子 正在阳光下 慢慢升起 root@ATK-DLRK3588:/atk_deepseek_rkllm_demo# ./atk_deepseek_demo rkllm_model/deepseek-7b-w8a8-rk3588.rkllm 5000 5000 rkllm init start W rkllm: Warning: Your rknpu driver version is too low, please upgrade to 0.9.7. I rkllm: rkllm-runtime version: 1.1.4, rknpu driver version: 0.9.6, platform: RK3588 rkllm init success **********************可输入以下问题对应序号获取回答/或自定义输入******************** [0] 现有一笼子,里面有鸡和兔子若干只,数一数,共有头14个,腿38条,求鸡和兔子各有多少只? [1] 有28位小朋友排成一行,从左边开始数第10位是学豆,从右边开始数他是第几位? ************************************************************************* user: 0 现有一笼子,里面有鸡和兔子若干只,数一数,共有头14个,腿38条,求鸡和兔子各有多少只? robot: 设鸡的数量为x,兔子的数量为y。 根据题意,头的总数是14,可以得到方程: x + y = 14 腿的总数是38,鸡有2条腿,兔子有4条腿,因此可以得到第二个方程: 2x + 4y = 38 将第一个方程解为x = 14 - y,并代入第二个方程中: 2(14 - y) + 4y = 38 28 - 2y + 4y = 38 2y = 10 y = 5 然后,将y的值代入x = 14 - y中: x = 14 - 5 = 9 因此,鸡有9只,兔子有5只。 设鸡的数量为 \( x \),兔子的数量为 \( y \)。 根据题意,可以列出以下两个方程: \[ \begin{cases} x + y = 14 \\ 2x + 4y = 38 \end{cases} \] **步骤如下:** 1. **解第一个方程求 \( x \):** \[ x = 14 - y \] 2. **将 \( x = 14 - y \) 代入第二个方程:** \[ 2(14 - y) + 4y = 38 \\ 28 - 2y + 4y = 38 \\ 2y = 10 \\ y = 5 \] 3. **将 \( y = 5 \) 代入 \( x = 14 - y \):** \[ x = 14 - 5 = 9 \] **最终答案:** 鸡有 \(\boxed{9}\) 只,兔子有 \(\boxed{5}\) 只。 复制代码
至此部署测试完毕
测试硬件为 ATK-DLRK3588开发板 16+128 版本
0