RK3588 Linux平台部署DeepSeek模型教程

请添加图片描述

更多内容可以加入Linux系统知识库套餐(教程+视频+答疑)

文章目录

  • 一、下载rknn-llm 和 deepseek模型
  • 二、RKLLM-Toolkit 安装
    • 2.1 安装 miniforge3 工具
    • 2.2 下载 miniforge3 安装包
    • 2.3 安装 miniforge3
  • 三、创建 RKLLM-Toolkit Conda 环境
    • 3.1 进入 Conda base 环境
    • 3.2 创建一个 Python3.8 版本(建议版本)名为 RKLLM-Toolkit 的 Conda 环境
    • 3.3 进入 RKLLM-Toolkit Conda 环境
  • 四、安装 RKLLM-Toolkit
  • 五、DeepSeek-R1-1.5B HunggingFace转换成RKLLM模型
  • 六、RK3588端运行demo
  • 七、推荐开发板

沉淀、分享、成长,让自己和他人都能有所收获!😄

• ubuntu20.04
• python3.8
• RK3588开发板

先上效果:
请添加图片描述

一、下载rknn-llm 和 deepseek模型


git clone https://github.com/airockchip/rknn-llm.git 
git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

将rknn-llm的文件放入以下目录
在这里插入图片描述
将deepseek模型放入examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo目录
在这里插入图片描述

二、RKLLM-Toolkit 安装


2.1 安装 miniforge3 工具

检查是否安装 miniforge3 和 conda 版本信息,若已安装则可省略此小节步骤

conda -V
# 提示 conda: command not found 则表示未安装 conda
# 提示 例如版本 conda 23.9.0

2.2 下载 miniforge3 安装包

wget -c https://github.com/condaforge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh

2.3 安装 miniforge3

chmod 777 Miniforge3-Linux-x86_64.sh
./Miniforge3-Linux-x86_64.sh

三、创建 RKLLM-Toolkit Conda 环境

3.1 进入 Conda base 环境

source ~/miniforge3/bin/activate
# (base) xxx@xxx-pc:~$

3.2 创建一个 Python3.8 版本(建议版本)名为 RKLLM-Toolkit 的 Conda 环境

conda create -n RKLLM-Toolkit python=3.8

3.3 进入 RKLLM-Toolkit Conda 环境

conda activate RKLLM-Toolkit
# (RKLLM-Toolkit) xxx@xxx-pc:~$

四、安装 RKLLM-Toolkit


在 RKLLM-Toolkit Conda 环境下使用 pip 工具直接安装所提供的工具链 whl 包,在安装过程中,安装工具会自动下载 RKLLM-Toolkit 工具所需要的相关依赖包。,

whl文件指定的是前面下载rknn-llm中的文件路径

在这里插入图片描述

pip3 install 1.1.4/rkllm-1.1.4/rkllm-toolkit/packages/rkllm_toolkit-1.1.4-cp38-
cp38-linux_x86_64.whl

若执行以下命令没有报错,则安装成功

(RKLLM-Toolkit) xxx@sys2206:~/temp/SDK$ python
Python 3.8.20 | packaged by conda-forge | (default, Sep 30 2024, 17:52:49)
[GCC 13.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from rkllm.api import RKLLM
INFO: Note: NumExpr detected 64 cores but "NUMEXPR_MAX_THREADS" not set, so
enforcing safe limit of 8.
INFO: NumExpr defaulting to 8 threads.
>>>

在这里插入图片描述

五、DeepSeek-R1-1.5B HunggingFace转换成RKLLM模型


  • 编写转换脚本 transform.py 保存到DeepSeek-R1-Distill-Qwen-1.5B目录下
from rkllm.api import RKLLM
from datasets import load_dataset
from transformers import AutoTokenizer
from tqdm import tqdm
import torch
from torch import nn
import os
# os.environ['CUDA_VISIBLE_DEVICES']='1'

modelpath = '.'
llm = RKLLM()

# Load model
# Use 'export CUDA_VISIBLE_DEVICES=2' to specify GPU device
# options ['cpu', 'cuda']
ret = llm.load_huggingface(model=modelpath, model_lora = None, device='cpu')
# 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
# qparams = 'gdq.qparams' # Use extra_qparams
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)

#ret = llm.build(do_quantization=True, optimization_level=1, quantized_dtype='w8a8',
#                quantized_algorithm='normal', target_platform='rk3576', num_npu_core=2, extra_qparams=qparams, dataset=dataset)

if ret != 0:
    print('Build model failed!')
    exit(ret)

# Evaluate Accuracy
def eval_wikitext(llm):
    seqlen = 512
    tokenizer = AutoTokenizer.from_pretrained(
        modelpath, trust_remote_code=True)
    # Dataset download link:
    # https://huggingface.co/datasets/Salesforce/wikitext/tree/main/wikitext-2-raw-v1
    testenc = load_dataset(
        "parquet", data_files='./wikitext/wikitext-2-raw-1/test-00000-of-00001.parquet', split='train')
    testenc = tokenizer("\n\n".join(
        testenc['text']), return_tensors="pt").input_ids
    nsamples = testenc.numel() // seqlen
    nlls = []
    for i in tqdm(range(nsamples), desc="eval_wikitext: "):
        batch = testenc[:, (i * seqlen): ((i + 1) * seqlen)]
        inputs = {"input_ids": batch}
        lm_logits = llm.get_logits(inputs)
        if lm_logits is None:
            print("get logits failed!")
            return
        shift_logits = lm_logits[:, :-1, :]
        shift_labels = batch[:, 1:].to(lm_logits.device)
        loss_fct = nn.CrossEntropyLoss().to(lm_logits.device)
        loss = loss_fct(
            shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
        neg_log_likelihood = loss.float() * seqlen
        nlls.append(neg_log_likelihood)
    ppl = torch.exp(torch.stack(nlls).sum() / (nsamples * seqlen))
    print(f'wikitext-2-raw-1-test ppl: {round(ppl.item(), 2)}')

# eval_wikitext(llm)


# Chat with model
messages = "<|im_start|>system You are a helpful assistant.<|im_end|><|im_start|>user你好!\n<|im_end|><|im_start|>assistant"
kwargs = {"max_length": 128, "top_k": 1, "top_p": 0.8,
          "temperature": 0.8, "do_sample": True, "repetition_penalty": 1.1}
# print(llm.chat_model(messages, kwargs))


# Export rkllm model
ret = llm.export_rkllm("./deepseek-r1.rkllm")
if ret != 0:
    print('Export model failed!')
    exit(ret)

  • 编写量化校正数据集data_quant.json 保存到DeepSeek-R1-Distill-Qwen-1.5B目录下
[{"input":"Human: 你好!\nAssistant: ", "target": "你好!我是人工智能助手!"}]
  • 运行转接脚本transform.py
(RKLLM-Toolkit) chris@bestom-Precision-Tower-7910:~/Projects/DeepSeekDemo/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo$ python transform.py 
INFO: rkllm-toolkit version: 1.1.4 
The argument `trust_remote_code` is to be used with Auto classes. It has no effect here and is ignored. 
Downloading data files: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 7157.52it/s] 
Extracting data files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 57.08it/s] 
Generating train split: 1 examples [00:00,  2.34 examples/s] 
Optimizing model: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:40<00:00,  1.44s/it] 
Building model: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 399/399 [00:13<00:00, 30.41it/s] 
WARNING: The bos token has two ids: 151646 and 151643, please ensure that the bos token ids in config.json and tokenizer_config.json are consistent! 
INFO: The token_id of bos is set to 151646 
INFO: The token_id of eos is set to 151643 
INFO: The token_id of pad is set to 151643 
Converting model: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 339/339 [00:00<00:00, 584169.70it/s] 
INFO: Exporting the model, please wait .... 
[=================================================>] 597/597 (100%) 
INFO: Model has been saved to ./deepseek-r1.rkllm! 
(RKLLM-Toolkit) chris@bestom-Precision-Tower-7910:~/Projects/DeepSeekDemo/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo$

在这里插入图片描述

六、RK3588端运行demo


使用DeepSeek-R1-Distill-Qwen-1.5B_Demo进行测试验证
• DeepSeek-R1-Distill-Qwen-1.5B_Demo代码路径
cd examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy
• 译DeepSeek-R1-Distill-Qwen-1.5B_Demo

这里以编译Linux版本为例,下载安装编译需要的交叉编译工具:gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu

https://developer.arm.com/downloads/-/gnu-a/10-2-2020-11

在这里插入图片描述

tar -xf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz

修改编译脚本指定交叉编译工具路径

vi build-linux.sh

在这里插入图片描述
执行build-linux.sh开始编译

(RKLLM-Toolkit) chris@bestom-Precision-Tower-7910:~/Projects/DeepSeekDemo/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy$ ./build-linux.sh 
-- The C compiler identification is GNU 10.2.1 
-- The CXX compiler identification is GNU 10.2.1 
-- Check for working C compiler: /home/chris/opts/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc 
-- Check for working C compiler: /home/chris/opts/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Detecting C compile features 
-- Detecting C compile features - done 
-- Check for working CXX compiler: /home/chris/opts/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++ 
-- Check for working CXX compiler: /home/chris/opts/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Detecting CXX compile features 
-- Detecting CXX compile features - done 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/chris/Projects/DeepSeekDemo/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy/build/build_linux_aarch64_Release 
Scanning dependencies of target llm_demo 
[ 50%] Building CXX object CMakeFiles/llm_demo.dir/src/llm_demo.cpp.o 
[100%] Linking CXX executable llm_demo 
[100%] Built target llm_demo 
[100%] Built target llm_demo 
Install the project... 
-- Install configuration: "Release" 
-- Installing: /home/chris/Projects/DeepSeekDemo/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy/install/demo_Linux_aarch64/./llm_demo 
-- Set runtime path of "/home/chris/Projects/DeepSeekDemo/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy/install/demo_Linux_aarch64/./llm_demo" to "" 
-- Installing: /home/chris/Projects/DeepSeekDemo/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy/install/demo_Linux_aarch64/lib/librkllmrt.so

打包编译生成的文件,方便push到设备中

(RKLLM-Toolkit) chris@bestom-Precision-Tower-7910:~/Projects/DeepSeekDemo/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy$ tar -zcvf install/demo_Linux_aarch64.tar.gz install/demo_Linux_aarch64/

• 运行llm_demo

# push deepseek-r1.rkllm to device 
C:\Users\king>adb push E:\lhj_files\deepSeekDemo\deepseek-r1.rkllm data/ 
# push install dir to device 
C:\Users\king>adb push E:\lhj_files\deepSeekDemo\demo_Linux_aarch64.tar.gz data/ 
# Unzip the demo 
C:\Users\king>adb shell 
root@linaro-alip:/# cd data 
root@linaro-alip:/data# tar -zxvf demo_Linux_aarch64.tar.gz 
root@linaro-alip:/data# cd install/demo_Linux_aarch64/ 
# Run Demo 
root@linaro-alip:/data/install/demo_Linux_aarch64# export LD_LIBRARY_PATH=./lib 
root@linaro-alip:/data/install/demo_Linux_aarch64# taskset f0 ./llm_demo /data/deepseek-r1.rkllm  2048 4096 
 
# Running result                                                           
rkllm init start 
rkllm init success

开始使用DeepSeek
在这里插入图片描述

七、推荐开发板


开发板官网:http://www.bestom.net/

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/969483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Azure从0到1

我能用Azure做什么? Azure提供100多种服务,能够从在虚拟机上运行现有应用程序到探索新的软件范式,如智能机器人和混合现实。许多团队开始通过将现有应用程序移动到在Azure中运行的虚拟机(VM)来探索云。将现有应用程序迁移到虚拟机是一个良好的开端,但云不仅仅是运行虚拟…

智慧城市V4系统小程序源码独立版全插件全开源

智慧城市V4系统小程序源码&#xff1a;多城市代理同城信息服务的全域解决方案 在数字化浪潮的推动下&#xff0c;智慧城市已成为全球发展的核心战略。作为这一领域的革新者&#xff0c;智慧城市V4系统小程序源码凭借其多城市代理同城信息服务能力与多商家营销功能&#xff0c;…

JAVA-Lambda表达式(高质量)

要了解Lambda表达式,首先需要了解什么是函数式接口&#xff0c;函数式接口定义&#xff1a;一个接口有且只有一个抽象方法 。 一、函数式接口 1.FunctionalInterger 注意&#xff1a; 1. 如果一个接口只有一个抽象方法&#xff0c;那么该接口就是一个函数式接口 2. 如果我们…

机器视觉--Halcon变量的创建与赋值

一、引言 在机器视觉领域&#xff0c;Halcon 作为一款强大且功能丰富的软件库&#xff0c;为开发者提供了广泛的工具和算子来处理各种复杂的视觉任务。而变量作为程序中存储和操作数据的基本单元&#xff0c;在 Halcon 编程中起着至关重要的作用。正确地创建和赋值变量是编写高…

优选驾考小程序

第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言&#xff0c;有很好的特征&#xff0c;在安全方面、性能方面等。非常适合在Internet环境中使用&#xff0c;也是目前企业级运用中最常用的一个编程语言&#xff0c;具有很大…

ubuntu 22.04 安装vsftpd服务

先决条件&#xff0c;确保你已经配置好了存储库。 安装vsftpd 为了方便实验&#xff0c;我已经切换到了root用户。 rootlocal:~# apt-get install vsftpd修改配置 配置文件在 /etc/vsftpd.conf rootlocal:~# grep -vE ^#|^$ /etc/vsftpd.conf listenNO listen_ipv6YES anonymou…

Uniapp 获取定位详解:从申请Key到实现定位功能

文章目录 前言一、申请定位所需的 Key1.1 注册高德开发者账号1.2 创建应用1.3 添加 Key 二、在 Uniapp 中配置定位功能2.1 引入高德地图 SDK2.2 获取定位权限 三、实现定位功能3.1 使用 uni.getLocation 获取位置3.2 处理定位失败的情况3.3 持续定位3.4 停止持续定位 四、总结 …

MATLAB电机四阶轨迹规划考虑jerk、Djerk

1、内容简介 略 126-可以交流、咨询、答疑 2、内容说明 略 在电机控制中&#xff0c;轨迹规划是一个重要的环节&#xff0c;它决定了电机如何从一个状态平滑地过渡到另一个状态。四阶轨迹规划考虑了位置、速度、加速度和加加速度&#xff08;jerk&#xff09;&#xff0c;有…

输电杆塔沉降智能监测系统:如何用数据守护电网安全

产品别称&#xff1a;输电线路杆塔沉降在线监测装置、输电线路北斗杆塔沉降在线监测装置、杆塔地基沉降监测设备、输电杆塔沉降智能监测系统 产品型号&#xff1a;TLKS-PMG-BDS 一、产品概述&#xff1a; 在电力传输系统中&#xff0c;输电线路杆塔的稳定性和安全性至关重要。…

Windows搭建SVN本地服务器 + TortoiseSVN客户端

目录 一、SVN服务器搭建 二、TortoiseSVN客户端 一、SVN服务器搭建 注意&#xff1a;例如你已经安装Subversion&#xff0c;要将它卸载&#xff0c;因为VisualSVN会包含Subversion&#xff0c;确保不会发生冲突&#xff0c;可在Windows程序搜索Subversion 卸载它。 Apache…

harmonyOS的文件的增、删、读、写相关操作(fs/content)

注意: 操作harmonyOS的文件只能对app沙箱内的文件进行操作 牵扯到两个支持点: fs和content这两个API; 具体的操作方法看下图: 创建文件 //js 引入 import fs from "ohos.files.fs" import featureAbility from "ohos.ability.featureAbility"; // 上下…

人才画像如何助力企业 “看准人”、“看透人”

在当今竞争激烈的商业世界中&#xff0c;企业对于人才的需求愈发迫切。然而&#xff0c;如何在众多求职者中 “看准人”、“看透人”&#xff0c;挑选出真正适合企业的人才&#xff0c;却成为了许多企业面临的难题。而人才画像的出现&#xff0c;为企业提供了一把有力的武器。 …

LC-搜索二维矩阵II、相交链表、反转链表、回文链表、环形链表、环形链表ll

搜索二维矩阵II 方法&#xff1a;从右上角开始搜索 我们可以从矩阵的右上角开始进行搜索。如果当前元素 matrix[i][j] 等于 target&#xff0c;我们直接返回 true。如果 matrix[i][j] 大于 target&#xff0c;说明 target 只能出现在左边的列&#xff0c;所以我们将列指针向左…

Win11配置wsl、ubuntu、docker

系统要求 安装WSL。 开通虚拟化&#xff1a; 准备工作 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartwsl --set-default-versi…

达梦tpcc压测

造数 在这个日志输出中&#xff0c;主要执行了一系列数据库操作&#xff0c;涵盖了数据库信息检查、表的创建与数据加载、索引的添加、数据验证等步骤。具体分析如下&#xff1a; 数据库信息检查&#xff1a; 查询了数据库的版本、实例名称、日志文件大小、字符集等信息。 删…

MySQL技术公开课:Mysql-Server-8.4.4 Innodb 集群搭建与维护

MySQL技术公开课 - Mysql-Server-8.4.4 Innodb 集群搭建与维护 讲课内容&#xff1a; 1、Innodb集群框架介绍 2、Innodb集群部署(mysql-Server、mysql-shell、mysql-router安装配置) 3、Innodb集群维护(主备切换、启动与关闭、故障排除) Mysql-server商业版目前最新的是8.…

TCP/IP参考模型和网络协议

由于国防部担心他们一些重要的主机、路由器和互联网关可能会突然崩溃&#xff0c;所以网络必须实现的另一目标是网络不受子网硬件损失的影响&#xff0c;已经建立的会话不会被取消&#xff0c;而且整个体系结构必须相当灵活。 TCP/IP是一组用于实现网络互连的通信协议。Interne…

机器学习-02-机器学习算法思想以及在各行各业的应用

总结 本系列是机器学习课程的第02篇&#xff0c;主要介绍机器学习算法思想以及在各行各业的应用 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 定义问题&#xff08;Problem Definition&#xff09; -> 数据收集(Data Collection) -> 数据分割(Data…

无须高配电脑-ChatboxAI 利用SiliconCloud 接入在线deepseek

Deepseek官方api调用 方式收费&#xff0c;官网提供的在线推理又经常出现”服务器繁忙&#xff0c;请稍后再试“的问题。本文借助本地聊会客户端 ChatboxAI&#xff0c; 通过SiliconCloud 平台来接入各种在线大模型&#xff0c;包括Deepseek. ChatboxAI(完全免费) Chatbox AI…

RocketMQ及和Kafka的区别

目录 1 从场景入手2 RocketMQ是什么&#xff1f;3 RocketMQ及和Kafka的区别3.1 在架构上做了减法3.1.1 简化协调节点3.1.2 简化分区3.1.3 底层存储3.1.3.1 Kafka底层存储3.1.3.1 RocketMQ底层存储 3.1.4 简化备份模型3.1.4.1 Kafka备份模型3.1.4.2 RocketMQ备份模型 3.1.5 Rock…