使用 NPU 跑推理大模型可以更有效地规划资源分配,实现更高效的应用。

1 部署前准备

在 RK3588 上使用 NPU 部署大语言模型需要提前准备文件如下,分别是瑞芯微 NPU 对应的文件以及 DeepSeek 推理模型的文件。

1
2
3
4
## Rockchip 官方资源
https://github.com/airockchip/rknn-llm/tree/main/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo
## DeepSeek 资源
https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B/tree/main

目前,在部署大模型前,首先检查 NPU 驱动是否为 0.9.8 版本,这里推荐将驱动更新为最新版本。

1
2
sudo cat /sys/kernel/debug/rknpu/version
RKNPU driver: v0.9.8

2 驱动更新注意事项

根据官网手册重新编译内核实现 NPU 驱动的更新,需要注意两点。

编译错误一:因为 RK3588 和 RK3576 NPU 是一致的,所以采用同一个驱动文件,但是 RK3588 驱动没有定义这个结构体,只需要到对应位置,将该行代码注释即可。
1
2
3
237 |  .set_soc_info = rockchip_opp_set_low_length,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
| rockchip_pvtpll_add_length
编译错误二:内核版本 5.10 时未定义该函数,按照官方手册定义下即可。
1
2
3
4
5
6
  998 |  vm_flags_set(vma, VM_MIXEDMAP);
| ^~~~~~~~~~~~
make[3]: *** [scripts/Makefile.build:273: drivers/rknpu/rknpu_devfreq.o] Error 1
make[3]: *** Waiting for unfinished jobs....
1148 | vm_flags_clear(vma, VM_PFNMAP);
| ^~~~~~~~~~~~~~

如果是 RK3588 也可以直接找已经修改好的驱动文件复制进内核驱动文件夹中,进行编译即可。

3 编译 Kernel && 部署

3.1 编译内核

将上述驱动文件覆盖至驱动文件夹,按照手册编译内核,将生成的 boot.img 烧录至板卡。

更新内核后,再次查看 npu 驱动版本,如果驱动版本已经升级即可进行下一步。

1
2
sudo cat /sys/kernel/debug/rknpu/version
RKNPU driver: v0.9.8
3.2 部署之虚拟机操作

将官方仓库文件拉取到本地,进行 rkllm-toolkit 安装,建议使用 conda 新建一个 python3.8 或者 3.10 的环境。

rkllm-toolkit.whl 文件在拉取仓库的 rknn-llm-main/rkllm-toolkit 的文件夹下,目前支持 python3.8 或者 pyython3.10。

1
2
3
4
5
6
git clone https://github.com/airockchip/rknn-llm.git

conda create -n rkllm python=3.10
conda activate rkllm

pip3 install rkllm_toolkit-1.1.4-cp310-cp310-linux_x86_64.whl

安装好之后可以在 python 环境下测试是否安装成功。

1
from rkllm.api import RKLLM

拉取模型仓库数据,也可以直接下载下来。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 安装git-lfs
sudo apt-get install git-lfs
git lfs install

# 获取DeepSeek-R1-Distill-Qwen-1.5B
git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
# 从镜像网址获取(可选)
git clone https://hf-mirror.com/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

# 获取DeepSeek-R1-Distill-Qwen-7B
git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
# 从镜像网址获取(可选)
git clone https://hf-mirror.com/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B

然后创建 data_quant.json 用于量化的 rkllm 模型。

1
python generate_data_quant.py  -m ../deepseek-aiDeepSeek-R1-Distill-Qwen-1.5B/

导出 rkllm 模型,需要在脚本里修改硬件平台,模型数据的位置等信息。

1
python export_rkllm.py
1
2
3
4
5
6
7
8
modelpath = './deepseek-aiDeepSeek-R1-Distill-Qwen-1.5B'
dataset = "./data_quant.json"
qparams = None # Use extra_qparams
target_platform = "RK3588"
optimization_level = 1
quantized_dtype = "W8A8"
quantized_algorithm = "normal"
num_npu_core = 3

将生成的 rkllm 文件传输到板卡上,虚拟机端操作即可完成。其中导出 rkllm 模型这一过程需要消耗大量的内存资源,需要开发者合理选择操作的机器。

3.2 部署之板卡操作

首先,安装一些编译需要用到的工具。

1
2
sudo apt update
sudo apt install gcc g++ cmake

板卡上同样需要拉取官方仓库文件,也可以将虚拟机上 clone 的文件传输至板卡上。

1
git clone https://github.com/airockchip/rknn-llm.git

进入对用案例的 deploy 文件夹,修改编译器,执行编译即可。

1
2
3
4
5
cd rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy

##GCC_COMPILER_PATH=aarch64-linux-gnu

./build-linux.sh

执行后,会在 build 文件夹下生成 llm_demo 文件,需要给该文件加上执行权限。

1
chmod 777 llm_demo

将需要用到的库文件拷贝到 /usr/lib 文件下。

1
cp rknn-llm-main/rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so /usr/lib

最后执行以下指令即可运行 deepseek。

1
2
3
ulimt -Sn 50000
export LD_LIBRARY_PATH.
./ llm_demo deepseek_r1_rk3588.rkllm 10000 1000

4 运行体验

1
2
3
4
./llm_demo RK3588.rkllm 10000 1000
rkllm init start
I rkllm: rkllm-runtime version: 1.1.4, rknpu driver version: 0.9.8, platform: RK3588
rkllm init success

问问他会不会汉语,

1
2
3
4
5
6
user: 你会汉语吗
robot: <think>

</think>

是的,我懂汉语。有什么问题可以问我吗?

再考考他专业知识,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
user: 你知道 Xilinx FPGA 吗
robot: <think>

</think>

是的,Xilinx FPGA(Field-Programmed Readable Array)是一种用于实现可编程逻辑器件的芯片,主要用于在数字电路设计和系统开发中提供快速、灵活的解决方案。Xilinx以其在该领域的创新和成熟产品而闻名。

### Xilinx FPGA的主要特点:
1. **可编程逻辑器件**:支持多种逻辑功能,如加法器、乘法器、存储器等。
2. **嵌入式解决方案**:适用于嵌入式系统设计,提供高可用性和低功耗。
3. **时序设计工具**:支持VHDL、Verilog等语言,用于描述和验证设计。
4. **快速开发和调试**:通过Xilinx的开发 boards(如XLP10等)简化了开发流程。

### Xilinx的主要产品:
- **XLP10**:嵌入式开发板,支持多种逻辑功能和时序工具。
- **XLP700系列**:高带宽、低延迟的高速开发设备。
- **XLP200系列**:适合小型系统设计的低功耗设备。

### Xilinx在行业中的应用:
- **嵌入式系统**:如Android、iOS系统,用于实现复杂的逻辑和时序功能。
- **物联网(IoT)**:用于数据处理和控制模块的设计。
- **自动驾驶**:用于传感器数据处理和决策算法的开发。

Xilinx通过其产品和技术,帮助开发者快速实现复杂数字系统设计,并在各种应用中发挥重要作用。

上面的问题直接通过知识库就可以查询,再问下需要一定思考的更深层次的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
user: 如何使用 RK3588 部署大模型
robot: <think>

</think>

我无法直接访问或部署特定的模型,如RK3588。不过,如果你想了解如何使用大型语言模型(如GPT-4等),可以参考以下步骤:

1. **选择合适的模型**:如GPT-4、Claude等。

2. **安装必要的工具和库**:
- `llama-cpp` 或 `llama-python` 用于编译模型。
- `sentence-transformers` 和 `transformers` 库用于处理上下文和预训练数据。

3. **配置模型参数**:根据你的需求调整模型的大小、隐藏层等参数。

4. **训练或推理**:
- 使用训练集进行学习,或者使用测试集进行推理。
- 调整超参数以优化模型性能。

5. **部署和使用**:将模型部署到服务器上,并通过API或本地环境进行推理或生成文本。

如果你有具体问题或需要进一步帮助,请提供更多细节。

没有深度思考过程,回答很一般,再来个简单的数学问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
user: Please tell me what is 7 add 9?
robot: <think>
I need to calculate the sum of 7 and 9.

First, I'll identify the numbers involved: 7 and 9.

Next, I'll perform the addition by combining these two quantities.

Finally, I'll determine that the result of adding 7 and 9 is 16.
</think>

**Solution:**

To find the sum of 7 and 9, follow these simple steps:

1. **Identify the numbers to add:**
\[
7 + 9
\]

2. **Perform the addition:**
\[
7 + 9 = 16
\]

**Final Answer:**
\[
\boxed{16}
\]

不得不说,比起 CPU 部署运行速度提高不少,不过 NPU 部署过程还是会存在一些困难。

  • 编译内核,可能会因为内核版本、平台不同,对驱动进行一定的修改;

  • 导出 rkllm 模型时对虚拟机内存有一定的要求,等。