瑞芯微RK3588板子上实地部署Deepseek-R1模型

最近各大组织、机构、企业端都开始陆续宣布内部完成深度融合Deepseek-R1模型了,本身对于大模型来说一般都是会首选部署在算力服务器端的,这样能够快速进行推理响应,我们内部是基于自建的搭载4090显卡的服务器完成的私有化部署,当然了也是比较耗费资源的,正好最近在做板子端的开发就想着拿最小的模型来在板端跑跑看看咋样,官方好像也给出来了对应的教程,因为RK3588内置的有NPU的硬件算力,为了能够使用到NPU的加速计算能力,需要使用官方发布的rknn-llm组件来进行模型的转化计算才可以。

模型转化为rkllm格式之后就可以充分使用到NPU的硬件加速计算能力,转化代码实现如下:

from rkllm.api import RKLLM
import os
os.environ['CUDA_VISIBLE_DEVICES']='0'

'''
https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

Download the DeepSeek R1 model from the above url.
'''

modelpath = '/path/to/DeepSeek-R1-Distill-Qwen-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='cuda')
# ret = llm.load_gguf(model = modelpath)
if ret != 0:
    print('Load model failed!')
    exit(ret)

# Build model
dataset = "./data_quant.json"
# Json file format, please note to add prompt in the input,like this:
# [{"input":"Human: 你好!\nAssistant: ", "target": "你好!我是人工智能助手KK!"},...]
qparams = None # Use extra_qparams
target_platform = "RK3588"
optimization_level = 1
quantized_dtype = "W8A8"
quantized_algorithm = "normal"
num_npu_core = 3

ret = llm.build(do_quantization=True, optimization_level=optimization_level, quantized_dtype=quantized_dtype,
                quantized_algorithm=quantized_algorithm, target_platform=target_platform, num_npu_core=num_npu_core, extra_qparams=qparams, dataset=dataset)
if ret != 0:
    print('Build model failed!')
    exit(ret)

# Export rkllm model
ret = llm.export_rkllm(f"./{os.path.basename(modelpath)}_{quantized_dtype}_{target_platform}.rkllm")
if ret != 0:
    print('Export model failed!')
    exit(ret)

官方同样提供了推理部署的代码,使用的是C++开发完成的,感兴趣的话可以玩一下,实测速度相较于原生模型还是有不错的提升的。

这里我主要是在一块新的板子上面部署使用Deepseek-R1,在前面的老板子上面是使用到的官方的rknn-llm加速套件的相关实现来进行部署的,这里想换一种方式来做,最简单的方式就是使用ollama来进行部署了,首先执行下面的安装命令:

curl -fsSL https://ollama.com/install.sh | sh

静静等待安装完成即可。

之后执行拉取模型的命令:

ollama pull deepseek-r1:1.5b

回车即可启动下载模型到本地的操作,执行输出如下所示:

等待拉取完成后,我们查看下:

ollama list

结果输出如下所示:

扫描二维码关注公众号,回复: 17606184 查看本文章

接下来可以一键启动模型:

ollama run deepseek-r1:1.5b

执行结果输出如下:

可能也是因为是最小的模型吧,很多回答的内容总体来说会稍显简单一点。

接下来问一个最近自媒体圈玩得比较火的问题,如下所示:

接下来我想要试试大一点参数量级的模型能否跑得起来,这里拉取的是7B的模型,命令如下:

ollama pull deepseek-r1:7b

执行输出如下所示:

我们查看下当前的模型清单:

可以看到已经多了7B的版本了,接下来我们实际跑一下。

ollama run deepseek-r1:7b

原以为可能会跑不动, 没想到还跑起来了。

接下来我们给一个简单的鸡兔同笼的问题看看大模型回答的效果怎么样?

首先是deepseek-r1:1.5b版本的,回答过程中资源占用情况如下:

完整回答结果输出如下:

<think>
嗯,今天老师布置了一个鸡兔同笼的问题,我觉得挺有意思的,但是又有点复杂。让我仔细想一想怎么解决它。

首先,题目说笼子里有16个头,34只脚。我需要算出里面有多少只鸡和多少只兔子。我记得鸡和兔子都是用一种方式计算头和脚的数量的,可能需要用到方程来解这个问题。

首先,设鸡的数量为x,兔子的数量为y。那么,根据题目,头的总数是16,也就是x加上y等于16。这个部分我觉得是对的。

接下来,脚的数量是34只。因为每只鸡有2只脚,所以鸡的脚数是2x;而每只兔子有4只脚,所以兔子的脚数是4y。两者加起来应该等于34,也就是2x + 4y = 34。

现在我有两个方程:
1. x + y = 16
2. 2x + 4y = 34

接下来,我可以解这个方程组来找出x和y的值。首先,从第一个方程中,我可以表达出x或者y,然后代入第二个方程。

比如,我可以把第一个方程改写成x = 16 - y。然后把这个表达式代入第二个方程中:

2*(16 - y) + 4y = 34

展开一下:
32 - 2y + 4y = 34
合并同类项:
32 + 2y = 34
接下来,减去32:
2y = 2
所以,y = 1。

然后,代入x = 16 - y,得到x = 16 - 1 = 15。

不过,我有点疑问,因为如果兔子有1只,那么鸡就是15只。鸡每只有2脚,所以15只鸡就是30脚;兔子有4只脚,总共是4脚。加起来是34脚,对吧?嗯,确实是对的。

但是,我想确认一下,是否我的计算正确。因为有时候在解方程组的时候,容易出错。

让我再检查一遍:

x = 15,y = 1
头数:15 + 1 = 16,没错。
脚数:2*15=30,4*1=4,总共34,对的。

嗯,看起来是对的。不过,我觉得可能还有其他方法来解决这个问题,比如假设法或者用消元法。

比如,我可以把第二个方程简化一下,除以2:

x + 2y = 17

然后用第一个方程x + y =16,减去这个式子:

(x + 2y) - (x + y) = 17 -16
得到:y =1,所以x=15。

嗯,结果还是一样的。看来我的解法是对的。

另外,我也可以用比例的方法来解决这个问题。因为每只兔子比鸡多2只脚,而头数是16,脚数是34。所以,总共有16个头,相当于16只动物,如果都是鸡的话,应该是16*2=32只脚,但实际上有34只脚,
多了2只脚,这说明其中有一些兔子。

每一只兔子比鸡多2只脚,因此需要的兔子数量是:多出来的脚数除以每只多出的部分,也就是2只脚。所以兔子的数量是2只,那鸡就是16-2=14只。但是这样的话,脚数应该是14*2 + 2*4 =28+8=36,超过
了题目中的34脚,所以这说明我的方法有问题。

哦,不对,我可能哪里错了。其实,每只兔子比鸡多2只脚,如果总共有多出来的脚数是34-32=2,那么兔子的数量应该是2除以(4-2)=1只,所以兔子1只,鸡15只,这样脚数就是15*2 +1*4=30+4=34,没
错。

可能我在比例部分弄错了,其实总头数是16,如果全是鸡的话,应该是16只鸡,脚数是32,实际脚数是34,多了2只脚。因为每只兔子比鸡多两只脚,所以需要的兔子数量就是多出来的脚数除以2,也就是
2/2=1只。

嗯,看来我的方法是对的,这样得出的兔子数量是1只,鸡的数量是15只。

不过,我觉得可能还有其他方法来解这个问题,比如假设法或者画图法,但方程的方法应该最快捷准确。

再想一下,如果我用表格的方式来列举的话:

假设都是鸡,那么头数16,脚数32,比实际的34少了2只脚。每换一只兔子,就多出2只脚(因为兔子有4脚,鸡有2脚),所以需要换的数量就是2只脚除以2=1只。因此,兔子数量是1只,鸡的数量是15只。


嗯,这样确实是对的,而且方法更直观一些。

总的来说,我的思路是对的,计算也没问题,结果也符合题目的要求。
</think>

设鸡的数量为 \( x \),兔的数量为 \( y \)。

根据题目:
1. 头数:\( x + y = 16 \)
2. 脚数:\( 2x + 4y = 34 \)

从第一个方程得:\( x = 16 - y \)

代入第二个方程:
\[
2(16 - y) + 4y = 34 \\
32 - 2y + 4y = 34 \\
32 + 2y = 34 \\
2y = 2 \\
y = 1
\]
然后,\( x = 16 - y = 15 \)

验证:
- 头数:15 + 1 = 16,正确。
- 脚数:15×2 + 1×4 = 30 + 4 = 34,正确。

因此,鸡有15只,兔有1只。
**答案**:鸡15只,兔1只。

接下来是deepseek-r1:7b版本的回答,回答的速度显然比1.5b版本的模型慢了很多,回答过程中资源占用情况如下所示:

完整回答结果输出如下:

<think>
首先,总共有16个头,这意味着笼子里的鸡和兔子数量之和是16。

接着,有34只脚。假设所有的动物都是鸡,则有16 × 2 = 32只脚,比实际情况少了2只脚。

因此,剩下的2只脚应该是来自兔子。每只兔子比鸡多2只脚,所以多了的脚数除以2得到兔子的数量:2 ÷ 2 = 1只兔子。

于是,鸡的数量就是总数减去兔子数量:16 - 1 = 15只鸡。
</think>

**解答:**

我们可以通过设立方程组来解决这个问题。

设笼子里有 \( x \) 只鸡和 \( y \) 只兔。

根据题意:
1. 头的总数:\( x + y = 16 \)
2. 脚的总数:鸡每只有2条腿,兔子每只有4条腿,因此脚的总数为 \( 2x + 4y = 34 \)

我们可以通过解方程组来找到 \( x \) 和 \( y \) 的值。

**步骤如下:**

1. **根据第一个方程表达其中一个变量:**

   \( x = 16 - y \)

2. **将这个表达式代入第二个方程:**

   \( 2(16 - y) + 4y = 34 \)

   展开计算:

   \( 32 - 2y + 4y = 34 \)

   \( 32 + 2y = 34 \)

3. **解方程求 \( y \):**

   \( 2y = 34 - 32 \)

   \( 2y = 2 \)

   \( y = 1 \)

4. **代入 \( x = 16 - y \) 求 \( x \) 的值:**

   \( x = 16 - 1 = 15 \)

**最终答案:**

笼子里有 \(\boxed{15}\) 只鸡和 \(\boxed{1}\) 只兔。

其他几个系列的模型这里就不再尝试了,大概率RK3588平台是难以支撑的,感兴趣的话可以自行尝试下就行。

整体实践记录下,感兴趣的话也都可以动手实践下板端跑大模型的方式!

猜你喜欢

转载自blog.csdn.net/Together_CZ/article/details/145572914
今日推荐