当前位置: 首页 > news >正文

RK3588开发板本地部署DeepSeek-R1

前言

最近deepseek闹的比较火,看网上已经有博主将deepseek部署到了RK3588上,自己手头刚好有RK3588的板子,于是就参考网上的教程部署了一套本地的deepseek,体验一下国人的AI。下面记录了详细的部署过程,有感兴趣的小伙伴可以试试看。

一、模型文件转换

以下操作在ubuntu主机上进行,这里选择的是ubuntu22.04.
1.下载模型文件
以DeepSeek-R1-Distill-Qwen-1.5B为例,可以从"huggingface.co"拉取模型文件,但是由于网络的原因要么下载的慢要么就是无法访问,这里通过hf-mirror或modelscope获得更快的下载速度。

$ git lfs install  #如果检查未安装可以执行'apt-get install git-lfs'进行安装
$ git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B.git

2.RKNN-LLM工具包

$ git clone https://github.com/airockchip/rknn-llm.git
$ cd rknn-llm/rkllm-toolkit
$ pip3 install rkllm_toolkit-1.1.4-cp310-cp310-linux_x86_64.whl

注意:安装过程会通过网络现在软件包,如果出现超时可以重新执行命令。
3.执行模型转换
进入"rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/export"目录,编辑export_rkllm.py文件,修改变量modelpath的值为模型文件的路径。
在这里插入图片描述
保存后执行下面命令进行模型转换。

python3 export_rkllm.py

在这里插入图片描述
注意:这里不建议在虚拟机上执行,很可能会由于性能的问题导致转换过程失败。
转换完成后.rkllm格式的模型文件默认放在export_rkllm.py所在目录。
如果不想转换模型可以下载官方模型(密码:rkllm)。

二、模型验证

说明:以下操作在RK3588开发板上,操作系统为ubuntu20.04.
1.编译RKNN-LLM
复制rknn-llm到开发板上,进入"rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy"目录,编辑build-linux.sh修改里面的编译工具链,保存后运行build-linux.sh进行编译。
这个过程也可以在ubuntu主机上进行,注意修改主机上的交叉编译工具链地址即可。
编译完成后在"rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy/install/demo_Linux_aarch64"中会多出一个llm_demo程序和对应的库。
在这里插入图片描述
2.测试验证
复制已经转换好的模型文件到开发板上。执行下面命令。

$ export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
$ ./llm_demo /home/ubuntu/deepseek/_W8A8_RK3588.rkllm 2048 4096

在这里插入图片描述
通过下面命令可以查看npu的使用情况。

cat /sys/kernel/debug/rknpu/load

除了使用llm_demo外也可以通过提供的pyhon脚本实现客户端和服务端的访问。
服务端:
进入rknn-llm/examples/rkllm_server_demo/rkllm_server目录,执行下面命令:

ulimit -n 102400
python3 flask_server.py --rkllm_model_path /home/ubuntu/deepseek/module/DeepSeek-R1-Distill-Qwen-1.5B_FP16_RK3588.rkllm --target_platform rk3588

提示未安装flask时,可利用下面命令安装

pip3 install flask

启动成功的log
客户端:
新打开一个终端,进入rknn-llm/examples/rkllm_server_demo/目录,执行以下命令:

python3 chat_api_flask.py

运行后如果不能正常对话,可以尝试修改chat_api_flask.py中的server_url字段,将上面log中的IP地址替换原有的IP。
启动后
网上有帖子说npu的使用率可以达到80%,cpu仅消耗10%~20%,而我实际测试的结果npu只用了50%多,CPU用了200%左右。用python的方式要好一点npu 60%多,cpu降低到70%左右。不清楚什么情况,有兴趣的朋友可在评论区讨论。

三、NPU驱动

执行ll_demo时若提示npu版本低,可参见下面方法升级npu驱动。新的npu驱动位于"rknn-llm/rknpu-driver"中。复制其中的压缩包到内核源码的顶层目录下执行下面命令进行解压。

tar -xjvf rknpu_driver_0.9.8_20241009.tar.bz2

注意:一定要解压到内核源码的顶层目录下,因为压缩包解压后是以drivers目录为起点的。
注意:一定要解压到内核源码的顶层目录下,因为压缩包解压后是以drivers目录为起点的。
编译错误1:
在这里插入图片描述

阅读源码可以看到这个是和rk3576相关的,所以这里直接注释掉。
编译错误2:
在这里插入图片描述

内核版本问题,5.10的内核中没有这两个函数,将驱动中这两个函数进行替换,修改如下:

diff --git a/drivers/rknpu/rknpu_gem.c b/drivers/rknpu/rknpu_gem.c
index a5c5354ed85c..d6886fe31f64 100644
--- a/drivers/rknpu/rknpu_gem.c
+++ b/drivers/rknpu/rknpu_gem.c
@@ -995,7 +995,7 @@ static int rknpu_gem_mmap_pages(struct rknpu_gem_object *rknpu_obj,
        struct drm_device *drm = rknpu_obj->base.dev;
        int ret = -EINVAL;

-       vm_flags_set(vma, VM_MIXEDMAP);
+       vma->vm_flags |= VM_MIXEDMAP;

        ret = __vm_map_pages(vma, rknpu_obj->pages, rknpu_obj->num_pages,
                             vma->vm_pgoff);
@@ -1088,7 +1088,7 @@ static int rknpu_gem_mmap_cache(struct rknpu_gem_object *rknpu_obj,
                return -EINVAL;
        }

-       vm_flags_set(vma, VM_MIXEDMAP);
+       vma->vm_flags |= VM_MIXEDMAP;

        vm_size = vma->vm_end - vma->vm_start;

@@ -1144,8 +1144,8 @@ static int rknpu_gem_mmap_buffer(struct rknpu_gem_object *rknpu_obj,
         * vm_pgoff (used as a fake buffer offset by DRM) to 0 as we want to map
         * the whole buffer.
         */
-       vm_flags_set(vma, VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP | VM_IO);
-       vm_flags_clear(vma, VM_PFNMAP);
+       vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP | VM_IO;
+       vma->vm_flags &= ~VM_PFNMAP;
        vma->vm_pgoff = 0;

        vm_size = vma->vm_end - vma->vm_start;

相关文章:

  • uac bypass 相关资料
  • 计算机视觉(opencv-python)入门之常见图像预处理操作(待补充)
  • 【2025-02-26】基础算法:二分查找(二)
  • PS吸管工具
  • 给字符串加密解密
  • Go中slice和map引用传递误区
  • 内存泄漏问题分享
  • nginx 配置https
  • 怎样免费部署LLM通过python进行调用
  • [含文档+PPT+源码等]精品基于Python实现的居家健身系统的设计与实现
  • Linux | GRUB / bootloader 详解
  • 【Java项目】基于Spring Boot的论坛管理系统
  • 如何在 Unity3D 中将网页内容渲染为纹理
  • 缓存击穿、缓存穿透、缓存雪崩
  • 回归预测 | Matlab基于SSA-BiLSTM-Attention的数据多变量回归预测(多输入单输出)
  • 文献汇总|AI生成图像检测相关数据集汇总
  • 聚焦低空经济,峰飞航空飞行汽车开启未来出行新篇章
  • 学习笔记06——JVM调优
  • 【论文解读】Kimi开源《Muon is Scalable for LLM Training》
  • 蓝桥杯练习代码
  • 李在明正式登记参选下届韩国总统
  • 花2万多在海底捞办婚礼,连锁餐企要抢酒楼的婚宴生意?
  • 上海消防全面推行“检查码”,会同相关部门推行“综合查一次”
  • 海南省三亚市委原常委、秘书长黄兴武被“双开”
  • 秦洪看盘|受阻回落,蓄积新做多能量
  • 央行:增加科技创新和技术改造再贷款额度3000亿元