在rk3588上部署并使用NPU/CPU方式运行Deepseek-R1-1.5b/7b模型(全流程实操)

开发环境:

主机环境:windows下vmware中的ubuntu22.04版本

注意:转换7B模型的时候需要用到32G的运行内存,本人实测,建议最少给虚拟机分配40G的运存才能稳定转换。不建议使用swap交换空间,会经常卡死。如果电脑内存不够建议加内存条

1.5b模型转换成rkllm格式后的大小为1.9G,7b模型转换后为7.7G左右,请保证ubuntu下磁盘空间剩余充足

目标机(orangepi5pro开发板)环境:

注意:如果想使用rk3588的npu运行和推理deepseek-r1-1.5b/7b模型,npu版本最低为0.9.8,本人亲测0.9.6版本不支持。进入到开发板的系统中,执行cat /proc/rknpu/version或者cat /sys/kernel/debug/rknpu/version可查看当前的版本。如果不知道如何更换npu版本,请参照香橙派5 RK3588S NPU驱动升级0.9.8_香橙派3588安装github系统linux-优快云博客

部署步骤(以下1-6步都在虚拟机的ubuntu里操作)

1,安装anaconda软件环境,详细可参考在Ubuntu中安装Anaconda和创建虚拟环境(保姆级教学,值得借鉴与信任)_ubuntu anaconda创建虚拟环境-优快云博客

2,anaconda安装完成后,执行conda create -n RKLLM-Toolkit python=3.8新建conda环境
,然后用conda env list命令可验证是否创建成功

conda环境创建成功后,执行conda activate RKLLM-Toolkit,激活并进入到RKLLM-Toolkit环境(退出已激活的conda环境到默认的base的命令为conda deactivate)

下图为正确安装anaconda和正确激活RKLLM-Toolkit环境的示例

3,获取rkllm转换工具

GitHub - airockchip/rknn-llm将此网站的仓库git clone下来,进入到rknn-llm-main/rkllm-toolkit目录下并执行pip install rkllm_toolkit-1.1.4-cp38-cp38-linux_x86_64.whl,耐心等待安装完成

4,下载DeepSeek-R1-Distill-Qwen-1.5B/DeepSeek-R1-Distill-Qwen-7B原始模型

方法一:直接通过浏览器打开并下载​​​​​​deepseek-ai/DeepSeek-R1-Distill-Qwen-7B at main (huggingface.co)

 方法二:在ubuntu终端通过命令下载

安装huggingface工具并指定源镜像地址:

pip3 install huggingface-cli -i https://mirrors.huaweicloud.com/repository/pypi/simple

export HF_ENDPOINT=https://hf-mirror.com

将deepseek-ai/DeepSeek-R1-xx模型资源下载到本地当前目录下:

huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local-dir . --local-dir-use-symlinks False

5,创建必要的文件,保证后面能正常执行转换

克隆的仓库里的rknn-llm-release-v1.1.4/rkllm-toolkit/examples目录下只有一个test.py文件,我们需要在这里新建data_quant.json和export_deepseek_7b_rkllm.py这两个文件,

data_quant.json文件内容示例如下:

[{"input":"Human: 你好!\nAssistant: ", "target": "你好!我是人工智能助手KK!"},{"input":"Human: 你可以干什么?\nAssistant: ", "target": "我可以唱跳rap"}]

export_deepseek_7b_rkllm.py文件内容示例如下:

rom 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)

6,使用rknn-toolkit工具将原始的huggingface格式的DeepSeek-R1-xx模型转化为瑞芯微支持的rkllm格式,这样才能使用瑞芯微的npu进行推理(注意:需要在conda activate RKLLM-Toolkit环境下运行,请先激活)

执行python export_deepseek_7b_rkllm.py命令,开始转换,整个过程大概要20-30分钟

转换过程如图所示:这是一个相当大的任务,cpu和磁盘以及内存的利用率很高

转换完成后会生成deepseek-7b-w8a8-rk3588.rkllm这个文件,将其传到开发板的系统里

7,部署开发板环境,以便使用rk3588的npu运行转换后的deepseek模型(下面步骤都在开发板的ubuntu系统中操作

git clone GitHub - airockchip/rknn-llm

sudo cp rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so  /usr/lib/librkllmrt.so

cd examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy

chmod a+x build-linux.sh

./build-linux.sh

执行完上面的脚本后,会在当前文件夹会出现install/demo_Linux_aarch64目录,将第六步生成的转换后的模型拷贝到这里

cd install/demo_Linux_aarch64

diff  lib/librkllmrt.so  /usr/lib/librkllmrt.so //验证一下刚生成的这个库文件是不是和rknn-llm-main/rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so的一样,要保证它们是1.1.4版本的才能满足这个模型的运行要求

8,在开发板上使用rk3588的npu推理和运行转换后的deepseek模型

cd rknn-llm-main/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy/install/demo_Linux_aarch64

执行命令taskset f0 ./llm_demo ./deepseek-7b-w8a8-rk3588.rkllm  5000 5000,即可成功运行deepseek-r1-7b模型,成功运行界面如下:

使用watch sudo cat /sys/kernel/debug/rknpu/load命令实时监控npu利用率,此时正在使用npu进行推理和运算,CPU未参与,内存占用大概9G

至此,大功告成!!!

以上1-8步实现了通过rk3588的NPU运行ds的方法,另外分享另一种可以在3588上运行deepseek的方法(只使用CPU推理运行)

直接在开发板系统中执行ollama run deepseek-r1:1.5b或者ollama run deepseek-r1:7b 命令,默默等待就行了。他会去下载ollama工具以及deepseek-r1模型,下载完之后会自动运行该模型。后期如果再次运行,再次执行这条命令就行,他不会重复去下载的​​​​​

我试过用这种方式,模型一运行,cpu负载一下飙到100%,CPU发烫严重,如果使用NPU的话,就不会有感觉。我认为使用ollama运行deepseek的方式只适合自己玩一下,不适合在生产中使用

### 如何在 RK3588 开发板上部署 Deepseek-R1 模型或应用程序 #### 准备工作 为了成功部署 Deepseek-R1 蒸馏模型RK3588 开发板,需先完成一系列准备工作。确保开发环境已配置好 Linux 系统,安装必要的依赖库和工具链。 #### 安装依赖项 首先,在终端执行命令来更新包列表安装基础软件包: ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config python3-pip -y pip3 install --upgrade pip setuptools wheel ``` #### 获取源码与预训练模型 克隆项目仓库以及下载所需的预训练模型文件至本地目录下: ```bash git clone https://github.com/your-repo/deepseek-r1.git cd deepseek-r1 wget http://example.com/path/to/pretrained_model.tar.gz tar zxvf pretrained_model.tar.gz ``` #### 编译优化后的推理引擎 针对 ARM 架构编译 TensorRT 或其他轻量化框架,以便更好地适配 RK3588 的硬件特性: ```bash mkdir build && cd build cmake .. make -j$(nproc) ``` #### 配置运行环境变量 编辑 `~/.bashrc` 文件加入路径指向新构建好的库位置: ```bash echo 'export LD_LIBRARY_PATH=/path/to/tensorrt/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc ``` #### 设置合理的训练参数 对于已经训练完毕的模型而言,重点在于调整推理阶段的相关超参设定。特别是当涉及到不同平台迁移时,适当调节 batch size 和线程数能够有效提升效率[^2]。 #### 测试验证 最后一步是对整个流程做全面测试,确认一切正常运作无误后再考虑上线使用。编写简单的 Python 脚本加载模型对样本数据集进行预测作: ```python import numpy as np from PIL import Image import tensorrt as trt import pycuda.driver as cuda import pycuda.autoinit def load_image_into_numpy_array(image_path, input_shape=(224, 224)): image = Image.open(image_path).resize(input_shape) (im_width, im_height) = image.size return np.array(image.getdata()).reshape( (im_height, im_width, 3)).astype(np.float32) # 加载TensorRT引擎 TRT_LOGGER = trt.Logger(trt.LogLevel.WARNING) with open("model.trt", "rb") as f, trt.Runtime(TRT_LOGGER) as runtime: engine = runtime.deserialize_cuda_engine(f.read()) context = engine.create_execution_context() input_data = load_image_into_numpy_array('test.jpg') output = np.empty([1], dtype=np.float32) d_input = cuda.mem_alloc(1 * input_data.nbytes) d_output = cuda.mem_alloc(1 * output.nbytes) bindings = [int(d_input), int(d_output)] stream = cuda.Stream() cuda.memcpy_htod_async(d_input, input_data.flatten(), stream) context.execute_v2(bindings=bindings, stream_handle=stream.handle) cuda.memcpy_dtoh_async(output, d_output, stream) stream.synchronize() print(f"Predicted class index: {np.argmax(output)}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值