进阶开发

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

此流程适用场景如下:

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

  2. 简单的单轮对话。

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

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

Qwen2.5模型版本选择

我们为您提供了Qwen2.5的BaseInstruct双版本模型,满足您不同的开发与应用需求,二者区别如下:

  • Base版本是基础的文本生成模型,适用于后续的模型训练任务,模型名称中不包含Instruct字样。

  • Instruct版本是在Base版本基础上经指令微调得到的模型,更适合用于对话场景,模型名称中包含Instruct字样。

这里我们还是以Qwen2.5-1.5B-Instruct模型为例,为您进行使用说明。 需要特别注意的是,连续多轮对话场景仅支持Instruct版本,其余场景均支持Base版本和Instruct版本。

环境准备

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

部署包准备

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

模型准备

注意

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

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

模型量化

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

oellm_build \ --model_name qwen2_5-1_5b \ --input_model_path ./Qwen2.5-1.5B-Instruct \ --output_model_path ./output_hbm \ --march nash-m \ --chunk_size 256 \ --cache_len 1024
注解

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

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

resolve_model.txt文件中提供的Qwen2.5模型,均以chunk_size配置为256编译生成,且cache_len参数均使用1024

板端运行准备

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 | |-- Qwen2.5_1.5B_1024.hbm | |-- Qwen2.5_1.5B_Instruct_1024.hbm | |-- Qwen2.5_7B_1024.hbm | |-- Qwen2.5_7B_Instruct_1024.hbm |-- config | |-- Qwen2.5_1.5B_config | |-- Qwen2.5_1.5B_Instruct_config | |-- Qwen2.5_7B_config | |-- Qwen2.5_7B_Instruct_config |-- example | |-- oellm_run | | |-- oellm_run | |-- oellm_multichat | | |-- oellm_multichat | | |-- qwen_multichat_config.json | |-- oellm_ppl | | |-- oellm_ppl | | |-- qwen_ppl_config.json | | |-- test-00000-of-00001.bin |-- include |-- lib `--set_performance_mode.sh

板端运行准备

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

# 创建工作目录 mkdir -p /home/root/llm cd /home/root/llm

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

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/D-Robotics_LLM_{version}/oellm_runtime/lib export LD_LIBRARY_PATH=${lib}:${LD_LIBRARY_PATH}

板端运行

简单会话

板端运行参考指令如下:

cd ./example/oellm_run ./oellm_run --hbm_path ../../model/Qwen2.5_1.5B_Instruct_1024.hbm \ --tokenizer_dir ../../config/Qwen2.5_1.5B_Instruct_config/ \ --template_path ../../config/Qwen2.5_1.5B_Instruct_config/Qwen2.5_1.5B_Instruct.jinja \ --model_type 7

程序的输入参数如下:

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

多轮对话

板端运行参考指令如下:

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

程序的输入参数如下:

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

json配置文件示例如下:

qwen_multichat_config.json
{ "hbm_path": "../../model/Qwen2.5_1.5B_Instruct_1024.hbm", "tokenizer_dir": "../../config/Qwen2.5_1.5B_Instruct_config/", "template_path": "../../config/Qwen2.5_1.5B_Instruct_config/Qwen2.5_1.5B_Instruct.jinja", "model_type": 7 }

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

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

PPL评估

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

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

程序的输入参数如下:

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

json配置文件示例如下:

qwen_ppl_config.json
{ "hbm_path": "../../model/Qwen2.5_1.5B_Instruct_1024.hbm", "tokenizer_dir": "../../config/Qwen2.5_1.5B_Instruct_config/", "model_type": 7, "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用于指定运行的模型类型,当前Qwen2.5模型类型为7。必填
ppl_testcase用于指定测试文件路径,当前仅支持bin格式。必填
max_length用于指定每次送入模型的序列长度。必填
stride用于指定测试步长。必填
bpu_core用于指定使用的BPU核。默认值为-1,任意核。可选
load_ckpt是否读取上次测试中断后的进度信息继续测试,默认值为false可选
text_data_num用于指定截断文本到特定长度再测试,若text_data_num <= 0,则不截断,默认值为0可选

运行结果

简单会话

简单对话测试参考如下:

[User] <<< 简单描述人工智能的发展 [Assistant] >>> 人工智能(Artificial Intelligence,简称AI)的发展可以简单描述为: 1. 从理论到实现 - 人工智能最初是在20世纪20年代开始研究的,但是真正的发展是从1936年图灵(Alan Turing)提出的机器智能概念开始的。图灵首先提出了一种计算模型——图灵机,并定义了计算是否有效是与人类是否能理解计算结果相同的。 - 之后的研究者们开始研究如何模拟大脑的神经网络,进行机器学习,以及如何让机器具备一定的智能。 - 60年代后,人工智能领域进入蓬勃发展期,许多概念和技术开始成熟,如遗传算法、神经网络、模糊集成为等。 - 90年代,深度学习(深度神经网络)开始兴起,使机器学习得到了更大的发展,尤其在图像识别和模式识别等方面。 - 近年来,AI技术在语音识别、自然语言处理、图像识别、机器翻译、智能机器人等领域取得快速发展。 2. 从理论到实践 - 从1950年到2010年,大约60年时间人工智能理论与实践发展迅速。 - 2010年到2014年,深度学习兴起,人工智能进入到了一个快速发展的时期。其中,2014年人工智能的论文已经达到了80多万篇,论文引用量也达到了5亿的量级。 - 2017年,深度学习在图像识别、语音识别等领域达到了非常高的精度,但同时也遇到了数据集过大、模型复杂等问题。人工智能开始关注如何克服数据过量和模型复杂度。 3. 从发展到成熟 - 2015年,14项AlphaGO击败了世界围棋冠军(李世石)并打破了人类对于人工智能的幻想,人工智能的技术开始成熟。 - 2020年,人工智能应用到许多方面,在医疗、智能制造、智慧城市等领域得到广泛的应用。 Performance prefill: 1939.39tokens/s decode: 24.43tokens/s

多轮对话

多轮对话测试参考如下:

[User] <<< 简单介绍AI发展现状 [Assistant] >>> 当前AI的发展现状如下: 1. 人工智能技术不断成熟,从深度学习、强化学习、迁移学习等技术,到深度神经网络、卷积神经网络、循环神经网络等模型,人工智能的算法和应用技术正在不断进步。 2. 机器学习和深度学习算法在图像识别、语音识别、自然语言处理等领域的应用越来越广泛,使得AI可以处理和分析大量数据,提供更准确、更高效的解决方案。例如,机器学习和深度学习在医疗诊断、金融风控、智能客服等领域取得了显著的成果。 3. 人工智能正在改变我们的生活方式,从智能家居、智能交通、智能城市、智能医疗等领域的应用,到自动驾驶、虚拟助手、虚拟现实等领域的应用,人工智能正在引领着新的生活方式和工作方式。 4. AI在各个领域中的应用,使得其在医疗、教育、金融、交通、制造、能源、零售、娱乐等领域都取得了显著的成果。同时,AI也在不断发展和成熟,成为人工智能领域的重要驱动力。 5. AI正在成为全球经济增长的新引擎,全球各国纷纷加大投入,推动AI技术的创新和应用,以期在未来的竞争中占据主导地位。 Performance prefill: 1941.70tokens/s decode: 24.07tokens/s [User] <<< 机器人技术如何与前述技术相结合 [Assistant] >>> 机器人技术与当前人工智能技术的结合,可以进一步推动AI技术的发展,并且带来更多的创新和应用。机器人技术包括机器视觉、机器人传感器、机器人运动控制、机器人认知等技术,可以与当前的AI技术,如机器学习、深度学习、自然语言处理、强化学习等,实现更广泛、更深入的结合。 例如,在机器人视觉应用中,可以利用深度学习算法进行图像识别和目标检测,实现更精确的物体定位和追踪;在机器人运动控制中,可以利用人工智能算法进行路径规划、轨迹控制、运动控制等;在机器人智能感知中,可以利用机器学习算法进行数据处理、模式识别、智能决策等。 此外,机器人技术还可以与其他AI技术相结合,如在自动驾驶、智能医疗、智能金融等方面的应用,通过结合人工智能和机器视觉等技术,使得机器人可以更加智能化和自动化,并且更广泛地应用于各个领域。 Performance prefill: 1929.30tokens/s decode: 24.27tokens/s [User] <<< 选取其中最有挑战的一点详细说明 [Assistant] >>> 在机器人技术与AI技术的结合中,最有挑战的一点可能是机器人的智能感知和理解。机器人的智能感知能力,通常指的是机器人能够感知外界信息,如视觉、听觉、触觉等,以及能够理解这些信息的意义。 在机器人的智能感知中,面临着许多挑战,例如: 1. 物体识别的准确性和可靠性:机器人需要能够准确地识别物体,而这个识别过程需要考虑物体的形状、颜色、材质等多方面因素。同时,物体的动态特性、光照条件、环境背景等因素也会影响识别的准确性和可靠性。 2. 机器人的智能理解能力:机器人需要理解物体的含义,如物体的用途、功能、状态等,而这个理解过程需要综合考虑多个因素,如物体的形状、大小、颜色、纹理等。同时,机器人的智能理解能力也需要与环境进行交互,如通过语言、视觉、听觉等方式与人类进行交互。 3. 智能机器人的智能决策能力:智能机器人需要能够根据当前环境和任务需求,进行决策和行动。这个决策过程需要考虑到多个因素,如机器人自身的能力、限制、目标、风险等等。 Performance prefill: 1940.90tokens/s decode: 24.14tokens/s

PPL评估

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

{ "PPL Parameters": { "hbm_path": "../../model/Qwen2.5_1.5B_1024.hbm", "ppl_testcase": "test-00000-of-00001.bin", "text_data_num": 0, "max_length": 256, "stride": 100 }, "Average Negative Log-Likelihood": 2.5058889819220984, "Perplexity": 12.254448107791829 }
注解
  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"))