ATK-DLRK3588开发板deepseek-r1-1.5b/7b部署指南

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 activate 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目录中,打开终端,执行以下命令执行编译部署程序的脚本。

./build-linux.sh

等待编译完成后,需要拷贝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: <think>


</think>


您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。有关模型和产品的详细内容请参考官方文档。


user: 能写一首关于春天的诗吗
robot: <think>
嗯,用户想要一首关于春天的诗。首先,我得考虑春天的特点,比如花开、绿草、鸟鸣这些元素。然后,可能需要一些意象来表达春天的美好和变化。


也许可以从自然景象入手,比如柳树在春风中摇曳,这样的画面很生动。接着,可以加入一些动态的元素,比如蝴蝶在花间翩翩起舞,这样能增加诗的活力。


再想想季节的变化,春天来了,万物复苏,所以可以用“春”字来表达整体的主题。同时,要让诗句流畅自然,避免生硬的连接。


可能还需要一些比喻或者拟人化的手法,让文字更有画面感。比如把花朵比作小精灵,或者把蝴蝶比作舞者,这样能让读者更容易想象出春天的美好场景。


最后,确保整首诗有节奏感和韵律,这样读起来更顺口,也更有感染力。可能需要调整句子的长度和用词,让每一句都能传达出春天的不同方面。


总的来说,这首诗应该包含自然景象、动态元素以及季节的变化,通过生动的意象和比喻来展现春天的美好和生机。
</think>


## 《春日》


柳絮飘飘
在春风中摇曳
蝴蝶翩翩
在花间起舞


花开得正盛
绿草如茵
小精灵们
正朝向春天奔走


我看见
春天的影子
正在阳光下
慢慢升起

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: <think>
设鸡的数量为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只。
</think>


设鸡的数量为 \( 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版本

#嵌入式##开发##linux##AI##deepseek#
正点原子产品简讯 文章被收录于专栏

正点原子开源资料文章

全部评论

相关推荐

嵌入式开发工程师职位名称:嵌入式开发工程师&nbsp;&nbsp;所属部门:硬件研发部&nbsp;&nbsp;工作地点:沈阳&nbsp;&nbsp;薪资范围:15-20K/月(13薪+绩效奖金)&nbsp;&nbsp;岗位职责:&nbsp;&nbsp;1.&nbsp;固件开发:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;基于Linux/FreeRTOS开发边缘计算单元(Jetson&nbsp;Nano/RK3588)的底层驱动,支持多传感器(摄像头、红外测温、麦克风阵列)数据采集。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;优化硬件资源占用(内存&amp;lt;500MB,CPU利用率&amp;lt;70%)。&nbsp;&nbsp;2.&nbsp;低功耗优化:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;实现动态电压频率调整(DVFS),待机功耗&amp;lt;5W。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;设计离线缓存机制(存储30天数据),支持断网环境下的本地决策。&nbsp;&nbsp;3.&nbsp;通信协议开发:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;开发设备与云端的数据传输协议(MQTT/CoAP),确保数据同步延迟&amp;lt;1秒。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;适配工业通信协议(如Modbus&nbsp;RTU/TCP),支持PLC设备联动控制。&nbsp;&nbsp;4.&nbsp;故障排查:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;分析硬件异常日志(如SPI通信超时、DMA溢出),提出改进方案。&nbsp;&nbsp;任职要求:&nbsp;&nbsp;1.&nbsp;教育背景:本科及以上学历,计算机、电子工程、通信工程等相关专业。&nbsp;&nbsp;2.&nbsp;经验要求:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;3年以上嵌入式开发经验,熟悉ARM/Linux开发环境。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;有边缘计算设备(如智能摄像头、工业网关)开发经验。&nbsp;&nbsp;3.&nbsp;技术能力:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;精通C/C++,熟悉Python脚本开发。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;掌握Linux内核裁剪、设备树(Device&nbsp;Tree)配置、驱动开发。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;熟悉RTOS系统(FreeRTOS、Zephyr)实时任务调度机制。&nbsp;&nbsp;4.&nbsp;加分项:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;有FPGA开发经验(如Xilinx&nbsp;Zynq系列)。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;熟悉硬件安全机制(Secure&nbsp;Boot、TrustZone)。&nbsp;
点赞 评论 收藏
分享
1,之前面过我们吗(我给忘了我秋招面过,说没有,他说有面试记录)2,为啥不考研3,主语言c++,岗位方向有限定吗4,实习浙江广州都有,为啥实习不准备转正5,假如你发现我们公司没有自己的产品,或者你的岗位不是自研岗位,你会怎么办6,你的语言c++,python,代码量怎么样7,现在回学校了吗8,实习中的ota功能详解9,你实习中音视频解码降低cpu占用怎么实现10,为什么第一家公司只待了两个月11,线程池具体讲一下12,采集数据,处理数据和显示数据速率不匹配如何处理的13,为什么要用线程池(调度?我不清楚问啥)线程池原理的一个重点:调度,锁14,c/c++新特性,auto用做什么15,智能指针16,结构体和类的区别17,结构体内存对齐?(我给忘了)18,tcp/udp,http,ip在那一层tcp/udp区别tcp为什么可靠19,了解一下大学期间成绩怎么样20,大学里的自己的规划21,在学技术的时候学习途径学习方法22,学习有做笔记吗23,大学敲代码,自己有做过什么实现吗24,mit操作系统内核,讲一下25,最简单的操作系统需要包含哪些功能26,大学期间印象比较深的经历27,你觉得你在你们宿舍你是最优秀的吗28,你自己自我评价,优缺点2个29,大三7月份就跑出去为啥(实习的还是晚了应该早点)30,目前几个offer31,假如去一家公司发现他的方向和你的规划不匹配,或者工作没有挑战力,或者觉得技术栈太拉,没有自己的产品,遇到这种情况怎么办32,前两家实习有加班吗,对加班和出差有要求吗反问base地,项目关于什么
鼠生的意义就是每天喝到可口可乐:2面群面+hr面,3个人一起面试,我答的一坨,大部分都是排序算法,网络的5层概念和具体协议实现(我记的是7层模型),死锁,野指针啥的,他是一个人回答一点,我回答的都是他俩的最后导致我不知道说啥了,当然也是我只知道最常用的,没看的很深入 后面就面试官都跳过我不问了,直接问他们俩了,最后hr问我们薪资的时候我就说多益hr刚面完,这边给14,我个人期望是嵌入式方向,也知道嵌入式这边薪资给不高,就只要了10,然后第二天就打电话过了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务