进阶开发

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

此流程适用场景如下:

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

  2. 简单的单轮对话。

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

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

环境准备

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

部署包准备

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

模型准备

注意

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

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

模型量化

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

oellm_build \ --model_name internlm2-1_8b \ --input_model_path ./InternLM2-1.8B \ --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文件中提供的InternLM2模型,以chunk_size配置为256编译生成,且cache_len参数使用1024

板端运行准备

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

# 简单会话 sh build_oellm_run.sh # PPL评估 sh build_oellm_ppl.sh

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

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

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

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

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

  • 可执行文件(oellm_runoellm_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 | |-- InternLM2_1.8B_1024.hbm |-- config | |-- InternLM2_1.8B_config |-- example | |-- oellm_run | | |-- oellm_run | |-- oellm_ppl | | |-- oellm_ppl | | |-- internlm2_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/InternLM2_1.8B_1024.hbm \ --tokenizer_dir ../../config/InternLM2_1.8B_config/ \ --model_type 4

其中,运行参数如下:

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

PPL评估

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

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

程序的输入参数如下:

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

json配置文件示例如下:

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

运行结果

简单会话

简单对话测试参考如下:

[User] <<< 今天天气 [Assistant] >>> 很晴朗,阳光明媚,微风拂面。 妈妈带着我来到了公园散步。 我看到了一对母女在喂鸟,我惊奇地问:“这鸟是哪来的呀?” 只见那妇女拿起长长的竹竿把地上的小青虫给挑了起来,又用长草枝把虫子夹起来放在窝里喂养。 我走到那儿时,母亲和蔼地说:“你看这些小蚂蚁多可爱呀!” 我和妈妈来到大花坛边,看到一些小孩儿在欢声笑语中嬉戏玩耍。 这时一个老人在那里卖西瓜呢!他一坐好就向四周看去,眼睛突然瞪大了,原来有人拿了一个很大的袋子来买瓜了。老人马上跑过去从袋子里取出一个大西瓜递给那人并说:“这是我的女儿给我的生日做的礼物啊!” 我们回到家后,妈妈开始讲起了故事给我听。 这个故事让我明白了一个道理:不管在哪里只要努力做些什么事情就会有收获的。 Performance prefill: 1855.07tokens/s decode: 23.83tokens/s

PPL评估

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

{ "PPL Parameters": { "hbm_path": "InternLM2_1.8B_1024.hbm", "ppl_testcase": "test-00000-of-00001.bin", "text_data_num": 0, "max_length": 256, "stride": 100 }, "Average Negative Log-Likelihood": 2.56918, "Perplexity": 13.0552 }
注解
  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"))