进阶开发
在本章节,我们将为您介绍D-Robotics-LLM的进阶开发使用流程。
此流程适用场景如下:
-
已对模型进行微调(finetune),且需重新量化的场景。
-
简单的单轮对话。
-
连续多轮对话,模型可记忆前几轮的提问和回答。
-
在端侧统计模型的PPL数值。
Qwen2.5模型版本选择
我们为您提供了Qwen2.5的Base和Instruct双版本模型,满足您不同的开发与应用需求,二者区别如下:
这里我们还是以Qwen2.5-1.5B-Instruct模型为例,为您进行使用说明。
需要特别注意的是,连续多轮对话场景仅支持Instruct版本,其余场景均支持Base版本和Instruct版本。
环境准备
请确保已按照 环境部署 章节正确完成开发机及开发板的环境准备。
部署包准备
下载我们提供的D-Robotics_LLM_{version}.tar.gz部署包并解压。
模型准备
注意
当前仅支持Qwen2.5-1.5B、Qwen2.5-7B、Qwen2.5-1.5B-Instruct和Qwen2.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
若您通过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_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
| |-- 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
}
注解
-
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"))