在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Deepseek R1大模型離線部署教程

EASY EAI靈眸科技 ? 來源:EASY EAI靈眸科技 ? 2025-02-12 09:37 ? 次閱讀

1. Deepseek簡介

DeepSeek-R1,是幻方量化旗下AI公司深度求索(DeepSeek)研發的推理模型。DeepSeek-R1采用強化學習進行后訓練,旨在提升推理能力,尤其擅長數學、代碼和自然語言推理等復雜任務。作為國產AI大數據模型的代表,憑借其卓越的推理能力和高效的文本生成技術,在全球人工智能領域引發廣泛關注。 本文主要說明DeepSeek-R1如何離線運行在EASY-EAI-Orin-Nano(RK3576)硬件上, RK3576 具有優異的端側AI能效比與極高的性價比,是AI落地的不二之選。

9c88ca24-e85d-11ef-9310-92fbcf53809c.png

9ca06f12-e85d-11ef-9310-92fbcf53809c.png

2. 開發環境搭建

2.1RKLLM-Toolkit安裝

本節主要說明如何通過 pip 方式來安裝 RKLLM-Toolkit,用戶可以參考以下的具體流程說明完成 RKLLM-Toolkit 工具鏈的安裝。

9cd716b6-e85d-11ef-9310-92fbcf53809c.png

2.1.1安裝miniforge3工具

為防止系統對多個不同版本的 Python 環境的需求,建議使用 miniforge3 管理 Python 環境。檢查是否安裝 miniforge3 和 conda 版本信息,若已安裝則可省略此小節步驟。

下載 miniforge3 安裝包:

wget -c https://mirrors.bfsu.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-Linux-x86_64.sh

安裝miniforge3:

chmod 777 Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh
2.1.2創建 RKLLM-Toolkit Conda 環境


進入 Conda base 環境:

source ~/miniforge3/bin/activate
創建一個 Python3.8 版本(建議版本)名為 RKLLM-Toolkit 的 Conda 環境:

conda create -n RKLLM-Toolkit python=3.8


進入 RKLLM-Toolkit Conda 環境:

conda activate RKLLM-Toolkit

9ce30d54-e85d-11ef-9310-92fbcf53809c.png

2.1.3安裝RKLLM-Toolkit


在 RKLLM-Toolkit Conda 環境下使用 pip 工具直接安裝所提供的工具鏈 whl 包,在安裝過程 中,安裝工具會自動下載 RKLLM-Toolkit 工具所需要的相關依賴包。

pip3 install nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl
pip3 install torch-2.1.0-cp38-cp38-manylinux1_x86_64.whl
pip3 install rkllm_toolkit-1.1.4-cp38-cp38-linux_x86_64.whl

若在安裝的過程中,某些文件安裝很慢,可以登錄python官網單獨下載:
https://pypi.org/

執行以下命令沒有報錯,則安裝成功。

9ceae664-e85d-11ef-9310-92fbcf53809c.png



3.Deepseek-R1模型轉換

本章主要說明如何實現Deepseek-R1大語言模型如何轉換為RKLLM模型。

3.1模型與腳本下載

本節提供兩種大模型文件,Hugging face的原始模型和轉換完成的NPU模型。

9d1e652a-e85d-11ef-9310-92fbcf53809c.png

還有用于模型轉換的腳本:

9d2e9ac6-e85d-11ef-9310-92fbcf53809c.png



3.2模型轉換

下載完成后模型和腳本放到同一個目錄:

9d47d3b0-e85d-11ef-9310-92fbcf53809c.png

在RKLLM-Toolkit環境,執行以下指令進行模型轉換:

9d64c812-e85d-11ef-9310-92fbcf53809c.png

至此模型轉換成功,生成deepseek_w4a16.rkllm NPU化的大模型文件:

9d77b0a8-e85d-11ef-9310-92fbcf53809c.png

test.py轉換腳本如下所示, 用于轉換deepseek-r1模型:

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 = '/home/developer/RKLLM-Toolkit/DeepSeek-R1-Distill-Qwen-1.5B'
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: 你好!
Assistant: ", "target": "你好!我是人工智能助手KK!"},...]


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


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


# Chat with model
messages = "<|im_start|>system You are a helpful assistant.<|im_end|><|im_start|>user你好!
<|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_rk3576_w4a16.rkllm")
if ret != 0:
print('Export model failed!')
4.Deepseek-R1模型部署

本章主要說明RKLLM格式的NPU模型如何運行在EASY-EAI-Orin-Nano硬件上。

9d9122fe-e85d-11ef-9310-92fbcf53809c.png



然后把例程【復制粘貼】到nfs掛載目錄中。(不清楚目錄如何構建的,可以參考《入門指南/開發環境準備/nfs服務搭建與掛載》)。

特別注意:源碼目錄和模型最好cp到板子上,如/userdata,否則在nfs目錄執行大模型會導致模型初始化過慢。

9daa1804-e85d-11ef-9310-92fbcf53809c.png

進入到開發板對應的例程目錄執行編譯操作,具體命令如下所示:

cd /userdata/deepseek-demo/
./build.sh

9dc31fa2-e85d-11ef-9310-92fbcf53809c.png

4.1例程運行及效果

進入例程的deepseek-demo/deepseek-demo_release目錄,執行下方命令,運行示例程序:

cd deepseek-demo_release/ulimit -HSn 102400 ./deepseek-demo deepseek_w4a16.rkllm 256 512

9de3bfaa-e85d-11ef-9310-92fbcf53809c.png

至此可以進行對話測試了,試著輸入“直角三角形兩直角邊是3和4,斜邊是多少?”?;卮鹑缦滤?

9e019c1e-e85d-11ef-9310-92fbcf53809c.png

4.2RKLLM算法例程

例程目錄為rkllm-demo/src/main.cpp,操作流程如下。

9e11f6d6-e85d-11ef-9310-92fbcf53809c.png

具體代碼如下所示:

#include 
#include 
#include 
#include "rkllm.h"
#include 
#include 
#include 
#include 


#define PROMPT_TEXT_PREFIX "<|im_start|>system You are a helpful assistant. <|im_end|> <|im_start|>user"
#define PROMPT_TEXT_POSTFIX "<|im_end|><|im_start|>assistant"




using namespace std;
LLMHandle llmHandle = nullptr;


void exit_handler(int signal)
{
    if (llmHandle != nullptr)
    {
        {
            cout << "程序即將退出" << endl;
            LLMHandle _tmp = llmHandle;
            llmHandle = nullptr;
            rkllm_destroy(_tmp);
        }
    }
    exit(signal);
}


void callback(RKLLMResult *result, void *userdata, LLMCallState state)
{
    if (state == RKLLM_RUN_FINISH)
    {
        printf("
");
    } else if (state == RKLLM_RUN_ERROR) {
        printf("\run error
");
    } else if (state == RKLLM_RUN_GET_LAST_HIDDEN_LAYER) {
        /* ================================================================================================================
        若使用GET_LAST_HIDDEN_LAYER功能,callback接口會回傳內存指針:last_hidden_layer,token數量:num_tokens與隱藏層大小:embd_size
        通過這三個參數可以取得last_hidden_layer中的數據
        注:需要在當前callback中獲取,若未及時獲取,下一次callback會將該指針釋放
        ===============================================================================================================*/
        if (result->last_hidden_layer.embd_size != 0 && result->last_hidden_layer.num_tokens != 0) {
            int data_size = result->last_hidden_layer.embd_size * result->last_hidden_layer.num_tokens * sizeof(float);
            printf("
data_size:%d",data_size);
            std::ofstream outFile("last_hidden_layer.bin", std::binary);
            if (outFile.is_open()) {
                outFile.write(reinterpret_cast(result->last_hidden_layer.hidden_states), data_size);
                outFile.close();
                std::cout << "Data saved to output.bin successfully!" << std::endl;
            } else {
                std::cerr << "Failed to open the file for writing!" << std::endl;
            }
        }
    } else if (state == RKLLM_RUN_NORMAL) {
        printf("%s", result->text);
    }
}


int main(int argc, char **argv)
{
    if (argc < 4) {
        std::cerr << "Usage: " << argv[0] << " model_path max_new_tokens max_context_len
";
        return 1;
    }


    signal(SIGINT, exit_handler);
    printf("rkllm init start
");


    //設置參數及初始化
    RKLLMParam param = rkllm_createDefaultParam();
    param.model_path = argv[1];


    //設置采樣參數
    param.top_k = 1;
    param.top_p = 0.95;
    param.temperature = 0.8;
    param.repeat_penalty = 1.1;
    param.frequency_penalty = 0.0;
    param.presence_penalty = 0.0;


    param.max_new_tokens = std::atoi(argv[2]);
    param.max_context_len = std::atoi(argv[3]);
    param.skip_special_token = true;
    param.extend_param.base_domain_id = 0;


    int ret = rkllm_init(&llmHandle, ¶m, callback);
    if (ret == 0){
        printf("rkllm init success
");
    } else {
        printf("rkllm init failed
");
        exit_handler(-1);
    }


    string text;
    RKLLMInput rkllm_input;


    // 初始化 infer 參數結構體
    RKLLMInferParam rkllm_infer_params;
    memset(&rkllm_infer_params, 0, sizeof(RKLLMInferParam));  // 將所有內容初始化為 0


    // 1. 初始化并設置 LoRA 參數(如果需要使用 LoRA)
    // RKLLMLoraAdapter lora_adapter;
    // memset(&lora_adapter, 0, sizeof(RKLLMLoraAdapter));
    // lora_adapter.lora_adapter_path = "qwen0.5b_fp16_lora.rkllm";
    // lora_adapter.lora_adapter_name = "test";
    // lora_adapter.scale = 1.0;
    // ret = rkllm_load_lora(llmHandle, &lora_adapter);
    // if (ret != 0) {
    //     printf("
load lora failed
");
    // }


    // 加載第二個lora
    // lora_adapter.lora_adapter_path = "Qwen2-0.5B-Instruct-all-rank8-F16-LoRA.gguf";
    // lora_adapter.lora_adapter_name = "knowledge_old";
    // lora_adapter.scale = 1.0;
    // ret = rkllm_load_lora(llmHandle, &lora_adapter);
    // if (ret != 0) {
    //     printf("
load lora failed
");
    // }


    // RKLLMLoraParam lora_params;
    // lora_params.lora_adapter_name = "test";  // 指定用于推理的 lora 名稱
    // rkllm_infer_params.lora_params = &lora_params;


    // 2. 初始化并設置 Prompt Cache 參數(如果需要使用 prompt cache)
    // RKLLMPromptCacheParam prompt_cache_params;
    // prompt_cache_params.save_prompt_cache = true;                  // 是否保存 prompt cache
    // prompt_cache_params.prompt_cache_path = "./prompt_cache.bin";  // 若需要保存prompt cache, 指定 cache 文件路徑
    // rkllm_infer_params.prompt_cache_params = &prompt_cache_params;


    // rkllm_load_prompt_cache(llmHandle, "./prompt_cache.bin"); // 加載緩存的cache


    rkllm_infer_params.mode = RKLLM_INFER_GENERATE;


    while (true)
    {
        std::string input_str;
        printf("
");
        printf("user: ");
        std::getline(std::cin, input_str);
        if (input_str == "exit")
        {
            break;
        }
        for (int i = 0; i < (int)pre_input.size(); i++)
        {
            if (input_str == to_string(i))
            {
                input_str = pre_input[i];
                cout << input_str << endl;
            }
        }


  //text = PROMPT_TEXT_PREFIX + input_str + PROMPT_TEXT_POSTFIX;
        text = input_str;
        rkllm_input.input_type = RKLLM_INPUT_PROMPT;
        rkllm_input.prompt_input = (char *)text.c_str();
        printf("robot: ");


        // 若要使用普通推理功能,則配置rkllm_infer_mode為RKLLM_INFER_GENERATE或不配置參數
        rkllm_run(llmHandle, &rkllm_input, &rkllm_infer_params, NULL);
    }
    rkllm_destroy(llmHandle);


    return 0;
}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 人工智能
    +關注

    關注

    1796

    文章

    47811

    瀏覽量

    240591
  • 大模型
    +關注

    關注

    2

    文章

    2609

    瀏覽量

    3223
  • rk3576
    +關注

    關注

    1

    文章

    56

    瀏覽量

    246
  • DeepSeek
    +關注

    關注

    1

    文章

    227

    瀏覽量

    83

原文標題:速看!EASY-EAI教你離線部署Deepseek R1大模型

文章出處:【微信號:easy-eai-AIoT,微信公眾號:EASY EAI靈眸科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    在龍芯3a6000上部署DeepSeek 和 Gemma2大模型

    serve 2.運行deepseek-r1模型 到以下網站選擇不同參數的大模型 https://ollama.com/library/deepseek-r1 新開一個終端執行如下
    發表于 02-07 19:35

    英偉達發布DeepSeek R1于NIM平臺

    英偉達近日宣布,其DeepSeek R1 671b版本已正式上線英偉達NIM(NVIDIA Inference Microservices)平臺,并以預覽版的形式在build.nvidia.com
    的頭像 發表于 02-05 14:48 ?220次閱讀

    云天勵飛上線DeepSeek R1系列模型

    -Distill-Llama-70B大模型、DeepSeek V3/R1 671B MoE大模型也在有序適配中。適配完成后,DeepEdge10芯片平臺將在端、邊、云全面支持
    的頭像 發表于 02-06 10:39 ?236次閱讀
    云天勵飛上線<b class='flag-5'>DeepSeek</b> <b class='flag-5'>R1</b>系列<b class='flag-5'>模型</b>

    摩爾線程宣布成功部署DeepSeek蒸餾模型推理服務

    。 據悉,DeepSeek開源模型在多語言理解與復雜推理任務中一直表現出卓越的性能,其V3、R1等系列模型更是備受業界關注。而此次摩爾線程所實現的D
    的頭像 發表于 02-06 13:49 ?267次閱讀

    鯤云科技AI芯片CAISA 430成功適配DeepSeek R1模型

    鯤云科技全新一代的可重構數據流 AI 芯片 CAISA 430 成功適配 DeepSeek R1 蒸餾模型推理,這一創新舉措為大模型應用的高效部署
    的頭像 發表于 02-07 09:57 ?411次閱讀
    鯤云科技AI芯片CAISA 430成功適配<b class='flag-5'>DeepSeek</b> <b class='flag-5'>R1</b><b class='flag-5'>模型</b>

    deepin UOS AI接入DeepSeek-R1模型

    DeepSeek-R1 模型自發布以來吸引了眾多用戶關注,為了讓 deepin 用戶更好地體驗這一前沿技術,UOS AI 現已適配接入 DeepSeek-R1 端側模型!無需忍受服務器
    的頭像 發表于 02-08 09:52 ?216次閱讀

    DeepSeek-R1本地部署指南,開啟你的AI探索之旅

    R1 2025.01.20 DeepSeek-R1 發布,DeepSeek R1DeepSeek AI 開發的第一代推理
    的頭像 發表于 02-08 10:30 ?2247次閱讀
    <b class='flag-5'>DeepSeek-R1</b>本地<b class='flag-5'>部署</b>指南,開啟你的AI探索之旅

    Krea發布Deepseek R1驅動的Chat功能

    近日,Krea平臺迎來了一項重大更新——全新發布的Krea chat功能。這一功能由Deepseek R1驅動,為用戶帶來了前所未有的便捷體驗。 通過Krea chat,用戶可以直接在聊天窗口中調用
    的頭像 發表于 02-08 11:09 ?256次閱讀

    扣子平臺支持DeepSeek R1與V3模型

    近日,新一代AI應用搭建平臺“扣子”宣布了一項重要更新,即正式支持DeepSeekR1和V3模型,并向廣大用戶開放免費體驗。 扣子平臺一直以來都致力于為用戶提供便捷、高效的AI應用搭建服務,幫助
    的頭像 發表于 02-08 13:42 ?409次閱讀

    壁仞科技順利部署DeepSeek R1千問蒸餾模型

    DeepSeek 的國內算力支持隊伍進一步壯大:來自上海的壁仞科技順利部署DeepSeek-R1-Distill千問蒸餾模型(1.5B/7B/14B/32B),并已上線 Gitee A
    的頭像 發表于 02-08 16:56 ?615次閱讀

    部署DeepSeek R1于AX650N與AX630C平臺

    適配 DeepSeek R1 系列模型的最新進展,向業界對端側大模型部署的開發者提供一種新的思路,促進社區對端側大
    的頭像 發表于 02-09 09:32 ?165次閱讀
    <b class='flag-5'>部署</b><b class='flag-5'>DeepSeek</b> <b class='flag-5'>R1</b>于AX650N與AX630C平臺

    AIBOX 全系產品已適配 DeepSeek-R1

    國產AI大模型DeepSeek以出色的性價比和高效的模型技術,迅速成為全球AI關注的焦點。Firefly開源團隊率先實現AIBOX系列產品對DeepSeek-R1的全面適配。
    的頭像 發表于 02-08 17:30 ?132次閱讀
    AIBOX 全系產品已適配 <b class='flag-5'>DeepSeek-R1</b>

    Gitee AI 聯合沐曦首發全套 DeepSeek R1 千問蒸餾模型,全免費體驗!

    模型相比,較小尺寸的 DeepSeek 蒸餾版本模型 更適合企業內部實施部署,可以極大的降低落地成本 。 同時,這次 Deepseek
    的頭像 發表于 02-10 09:56 ?49次閱讀
    Gitee AI 聯合沐曦首發全套 <b class='flag-5'>DeepSeek</b> <b class='flag-5'>R1</b> 千問蒸餾<b class='flag-5'>模型</b>,全免費體驗!

    DeepSeek模型成功部署,物通博聯在 AI 賦能工業上持續探索、不斷前行

    和二次開發,DeepSeek R1模型的發布迅速點燃了AI產業的革命之火。 DeepSeek R1 通過蒸餾將大
    的頭像 發表于 02-12 11:15 ?44次閱讀

    DeepSeek4J開源:高效解決DeepSeek R1集成挑戰

    隨著 DeepSeek R1 模型的發布,其強大的思維鏈能力讓開發者為之興奮。然而,Spring AI 等主流框架對其支持不足,導致很多開發者無法充分發揮模型潛力。本文將為您帶來一個完
    的頭像 發表于 02-12 11:33 ?35次閱讀
    <b class='flag-5'>DeepSeek</b>4J開源:高效解決<b class='flag-5'>DeepSeek</b> <b class='flag-5'>R1</b>集成挑戰
    主站蜘蛛池模板: 日本美女黄色一级片 | 日本福利片午夜免费观着 | 手机在线观看一级午夜片 | 欧美爽妇| 一级一级毛片免费播放 | www在线视频在线播放 | 一色屋成人免费精品网站 | 婷婷综合五月天 | 手机看片国产高清 | 九九热在线免费视频 | 欧美一区二区在线观看视频 | bt天堂在线最新版www | 最新国产你懂的在线网址 | 一级毛片在线不卡直接观看 | 色老头一区二区三区在线观看 | 天堂在线www天堂中文在线 | 五月婷婷丁香综合网 | 网站毛片 | 亚欧乱色束缚一区二区三区 | 亚洲免费国产 | 好爽好大www视频在线播放 | 天堂网www在线观看 天堂网www在线资源中文 | 男女午夜免费视频 | 免费大片黄国产在线观看 | 亚洲国产精品日韩专区avtube | 美女被免费网站91色 | 午夜免费看片 | 亚洲va老文色欧美黄大片人人 | 在线精品国产第一页 | 伊人网综合在线视频 | 正在播放羽月希与黑人bd在线 | 五月婷婷精品 | 月夜免费观看完整视频 | 毛片在线不卡 | 久久九色| 四虎永久精品免费网址大全 | 国模大尺度酒店私拍视频拍拍 | 久久欧洲视频 | 免费一级欧美在线观看视频片 | 手机在线完整视频免费观看 | 亚洲精品久久久久久久蜜桃 |