进阶开发

在本章节,我们将为您介绍D-Robotics-LLM的进阶开发使用流程。

此流程适用场景如下:

  1. 已对模型进行微调(finetune),且需重新量化的场景。

  2. 简单的单轮对话。

  3. 连续多轮对话,模型可记忆前几轮的提问和回答。

  4. 在端侧统计模型的PPL数值。

针对以上几种场景,这里我们还是以DeepSeek-R1-Distill-Qwen-1.5B模型为例,为您进行使用说明。

环境准备

请确保已按照 环境部署 章节正确完成开发机及开发板的环境准备。

部署包准备

下载我们提供的D-Robotics_LLM_{version}.tar.gz部署包并解压。

模型准备

注意

当前仅支持DeepSeek-R1-Distill-Qwen-1.5B模型、DeepSeek-R1-Distill-Qwen-7B模型。 在下载模型前,请确保您已了解模型的使用许可、依赖环境等必要信息,以保证模型后续能正常使用。

您可以通过Hugging Face平台获取DeepSeek系列的模型,以下为模型的下载链接:

模型量化

D-Robotics-LLM为您提供了使用命令行量化编译生成板端模型的功能,此时我们以DeepSeek-R1-Distill-Qwen-1.5B模型为例进行说明,参考命令如下:

oellm_build \ --model_name deepseek-qwen-1_5b \ --input_model_path ./DeepSeek-R1-Distill-Qwen-1.5B \ --output_model_path ./output_hbm \ --march nash-m \ --chunk_size 256 \ --cache_len 4096
注解

关于oellm_build工具的详细使用方法及注意事项,请参考 oellm_build工具 章节。

若您通过resolve_model.txt提供的链接来获取我们编译好的hbm模型,则可跳过此模型量化步骤。

resolve_model.txt文件中提供的DeepSeek模型,均以chunk_size配置为256编译生成,且cache_len参数分别使用10244096两种配置,其差异已在模型文件名中体现。

板端运行准备

D-Robotics_LLM_{version}/oellm_runtime/example目录中,我们在各子目录提前准备好了编译后的可执行文件,可以直接在板端运行。您也可以执行不同的编译脚本,自行生成所需文件,参考命令如下:

# 简单会话 sh build_oellm_run.sh # 多轮对话 sh build_oellm_multichat.sh # PPL评估 sh build_oellm_ppl.sh

接下来在板端创建工作目录,参考命令如下:

# S100/S100P上运行 mkdir -p /home/root/llm

在上板之前,您需要确保已经准备如下内容:

  • 可运行的开发板,用于实际执行板端程序运行。

  • 一个可上板运行的模型(*.hbm),即 模型量化 的产出物。

  • 可执行文件(oellm_runoellm_multichatoellm_ppl文件)。

  • 板端程序依赖库,为了降低部署成本,您可以直接使用D-Robotics-LLM包内D-Robotics_LLM_{version}/oellm_runtime/set_performance_mode.shD-Robotics_LLM_{version}/oellm_runtime/lib文件夹、D-Robotics_LLM_{version}/oellm_runtime/config文件夹和D-Robotics_LLM_{version}/oellm_runtime/example文件夹中的内容。

准备好之后,我们将模型文件(*.hbm)、可执行文件及依赖库整合到一起,参考目录结构如下:

root@ubuntu:/home/root/llm . |-- model | |-- resolve_model.txt | |-- DeepSeek_R1_Distill_Qwen_1.5B_1024.hbm | |-- DeepSeek_R1_Distill_Qwen_1.5B_1024_q4.hbm | |-- DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm | |-- DeepSeek_R1_Distill_Qwen_1.5B_4096_q4.hbm | |-- DeepSeek_R1_Distill_Qwen_7B_1024.hbm |-- config | |-- DeepSeek_R1_Distill_Qwen_1.5B_config | |-- DeepSeek_R1_Distill_Qwen_7B_config |-- example | |-- oellm_run | | |-- oellm_run | |-- oellm_multichat | | |-- oellm_multichat | | |-- deepseek_multichat_config.json | |-- oellm_ppl | | |-- oellm_ppl | | |-- deepseek_ppl_config.json | | |-- test-00000-of-00001.bin |-- include |-- lib `--set_performance_mode.sh

将开发机中整合的文件夹拷贝至此板端目录下,参考命令如下:

scp -r llm/* root@{board_ip}:/home/root/llm

最后,在/home/root/llm/D-Robotics_LLM_{version}/oellm_runtime路径下,对LD_LIBRARY_PATH进行配置,参考命令如下:

# 修改硬件寄存器的值使设备调整为性能模式 sh set_performance_mode.sh # 设置环境变量 lib=/home/root/llm/lib export LD_LIBRARY_PATH=${lib}:${LD_LIBRARY_PATH}

板端运行

简单会话

板端运行参考指令如下:

cd ./example/oellm_run ./oellm_run --hbm_path ../../model/DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm \ --tokenizer_dir ../../config/DeepSeek_R1_Distill_Qwen_1.5B_config/ \ --template_path ../../config/DeepSeek_R1_Distill_Qwen_1.5B_config/DeepSeek_R1_Distill_Qwen_1.5B.jinja \ --model_type 1

程序的输入参数如下:

参数参数说明是否可选
-h, --help显示帮助信息。/
--hbm_path用于指定量化后的模型文件(*.hbm)路径。必填
--tokenizer_dir用于指定分词器配置路径。必填
--template_path用于指定对话模板路径。必填
--model_type用于指定运行的模型类型,当前DeepSeek模型类型为1。必填

多轮对话

板端运行参考指令如下:

cd ./example/oellm_multichat ./oellm_multichat -c ./deepseek_multichat_config.json

程序的输入参数如下:

参数参数说明是否可选
-h, --help显示帮助信息。/
-c, --config用于指定json配置文件路径。必填

json配置文件示例如下:

deepseek_multichat_config.json
{ "hbm_path": "../../model/DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm", "tokenizer_dir": "../../config/deepseek_config/", "template_path": "../../config/deepseek_config/DeepSeek-R1-Distill-Qwen-1.5B.jinja", "model_type": 1 }

json配置文件参数说明如下:

参数参数说明是否可选
hbm_path用于指定量化后的模型文件(*.hbm)路径。必填
tokenizer_dir用于指定分词器配置路径。必填
template_path用于指定对话模板路径。必填
model_type用于指定运行的模型类型,当前DeepSeek模型类型为1。必填
bpu_core用于指定使用的BPU核。默认值为-1,任意核。可选

PPL评估

板端统计模型的PPL数值参考指令如下:

cd ./example/oellm_ppl ./oellm_ppl -c ./deepseek_ppl_config.json

程序的输入参数如下:

参数参数说明是否可选
-h, --help显示帮助信息。/
-c, --config用于指定json配置文件路径。必填

json配置文件示例如下:

deepseek_ppl_config.json
{ "hbm_path": "../../model/DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm", "tokenizer_dir": "../../config/DeepSeek_R1_Distill_Qwen_1.5B_config/", "model_type": 1, "ppl_testcase": "test-00000-of-00001.bin", "load_ckpt": false, "text_data_num": 0, "max_length": 256, "stride": 100 }

json配置文件参数说明如下:

参数参数说明是否可选
hbm_path用于指定量化后的模型文件(*.hbm)路径。必填
tokenizer_dir用于指定分词器配置路径。必填
model_type用于指定运行的模型类型,当前DeepSeek模型类型为1。必填
ppl_testcase用于指定测试文件路径,当前仅支持bin格式。必填
max_length用于指定每次送入模型的序列长度。必填
stride用于指定测试步长。必填
bpu_core用于指定使用的BPU核。默认值为-1,任意核。可选
load_ckpt是否读取上次测试中断后的进度信息继续测试,默认值为false可选
text_data_num用于指定截断文本到特定长度再测试,若text_data_num <= 0,则不截断,默认值为0可选

运行结果

简单会话

简单对话测试参考如下:

[User] <<< 简单描述人工智能的发展 [Assistant] >>> <|begin▁of▁sentence|> 人工智能(AI)的发展可以分为几个主要阶段: 1. **早期AI**: - **人工智能**:最初用于特定任务,如游戏和客服。 - **机器学习**:1950年代,计算机开始学习,如自动识别和语音识别。 - **专家系统**:1970年代,如“维基”系统,模拟人类专家。 2. **计算机视觉**: - **图像识别**:1980年代,计算机识别简单的图像,如手写数字。 - **自然语言处理**:1990年代,如维基百科的自动搜索和编辑。 3. **深度学习**: - **神经网络**:1980年代,神经网络用于处理复杂数据。 - **卷积神经网络(CNN)**:1990年代,用于图像识别,如自动驾驶汽车。 - **深度学习**:2010年代,如GPT和BERT,用于自然语言处理。 4. **强化学习**: - **机器人控制**:1980年代,机器人学习动作。 - **自动驾驶**:2010年代,如自动驾驶汽车。 5. **深度学习和神经网络**: - **图像识别**:如分类、分割和生成。 - **自然语言处理**:如文本生成、翻译和对话。 - **语音识别**:如转录和语音合成。 6. **AI应用**: - **医疗**:如诊断和药物研发。 - **交通**:如自动驾驶和交通管理系统。 - **教育**:如智能学习系统。 - **金融**:如自动交易和风险管理。 7. **伦理和挑战**: - **隐私问题**:数据泄露和隐私侵犯。 - **伦理争议**:如算法偏见和隐私问题。 8. **未来展望**: - **AI芯片**:用于训练和推理。 - **边缘AI**:在设备上运行,减少数据传输。 - **多模态AI**:结合视觉、听觉等多模态数据。 - **人类助手**:如聊天机器人和生命支持系统。 AI将继续在多个领域发展,推动技术进步和社会变革。 Performance prefill: 2348.62tokens/s decode: 27.08tokens/s

多轮对话

多轮对话测试参考如下:

[User] <<< 简单介绍AI发展现状 [Assistant] >>> <|begin▁of▁sentence|> AI技术的发展已经进入了一个快速的阶段。从基础的语音识别到复杂的图像识别,从自然语言处理到强化学习,AI的边界不断扩展。这些技术在医疗、教育、金融等多个领域得到了广泛应用。同时,AI的可解释性问题和伦理问题也逐渐成为关注的焦点。未来,随着技术的不断进步,AI将朝着更智能、更人性化的方向发展。 Performance prefill: 2347.63tokens/s decode: 27.06tokens/s [User] <<< 机器人技术如何与该领域相结合 [Assistant] >>> <|begin▁of▁sentence|> AI技术与机器人技术的结合将带来更智能、更高效的解决方案。例如,机器人可以在特定领域中进行复杂任务,如医疗中的手术模拟或制造业中的自动化生产。AI可以优化机器人的行为,提高效率,而机器人则能够更有效地执行AI的决策。这种结合将推动机器人技术向更广泛的应用领域扩展。同时,伦理和伦理问题也需要在这一过程中得到妥善解决。通过AI和机器人技术的协同工作,人类可以更好地应对复杂和不确定的环境,实现更高效和更智能的解决方案。 Performance prefill: 2338.42tokens/s decode: 27.01tokens/s

PPL评估

PPL评估完成后,会在同目录生成{ppl_testcase}.json文件,其中Perplexity所对应的数值,即为最终的PPL测试结果。参考如下:

{ "PPL Parameters": { "hbm_path": "DeepSeek_R1_Distill_Qwen_7B_1024.hbm", "ppl_testcase": "test-00000-of-00001.bin", "text_data_num": 0, "max_length": 256, "stride": 100 }, "Average Negative Log-Likelihood": 3.5173572962692465, "Perplexity": 33.69526409810056 }
注解
  1. PPL支持断点续测,程序运行时会在执行目录生成ppl_ckpt.json文件,当load_ckpttrue时会读取该文件,从中断处继续测试。

  2. PPL程序执行结束后,会在bin测试文件所在目录生成json文件,包含本次测试的关键参数和PPL计算结果。

  3. ppl_testcase参数设定的bin文件可从parquet转换得到,提供convert_parquet_to_bin.py示例参考代码如下:

import pandas as pd from datasets import Dataset df = pd.read_parquet("test-00000-of-00001.parquet") dataset_test = Dataset.from_pandas(df) text_data = "\n\n".join(dataset_test['text']) with open("test-00000-of-00001.bin", "wb") as f: f.write(text_data.encode("utf-8"))