进阶开发
在本章节,我们将为您介绍D-Robotics-LLM的进阶开发使用流程。
此流程适用场景如下:
-
已对模型进行微调(finetune),且需重新量化的场景。
-
简单的单轮对话。
-
连续多轮对话,模型可记忆前几轮的提问和回答。
-
在端侧统计模型的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
若您通过resolve_model.txt提供的链接来获取我们编译好的hbm模型,则可跳过此模型量化步骤。
resolve_model.txt文件中提供的DeepSeek模型,均以chunk_size配置为256编译生成,且cache_len参数分别使用1024和4096两种配置,其差异已在模型文件名中体现。
板端运行准备
在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_run,oellm_multichat和oellm_ppl文件)。
-
板端程序依赖库,为了降低部署成本,您可以直接使用D-Robotics-LLM包内D-Robotics_LLM_{version}/oellm_runtime/set_performance_mode.sh、
D-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
}
注解
-
PPL支持断点续测,程序运行时会在执行目录生成ppl_ckpt.json文件,当load_ckpt为true时会读取该文件,从中断处继续测试。
-
PPL程序执行结束后,会在bin测试文件所在目录生成json文件,包含本次测试的关键参数和PPL计算结果。
-
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"))