进阶开发
在本章节,我们将为您介绍D-Robotics-LLM的进阶开发使用流程。
此流程适用场景如下:
-
自行量化模型。
-
离线运行,通过读取本地的音频、视频、图像等数据,模型生成文本回答。
-
在线运行,通过流式传输音频、视频数据,模型生成文本回答。相比离线运行,在线运行可以一边传输一边处理,从而显著降低模型生成首字回答的延时。
针对以上几种场景,这里我们还是以Qwen2.5_Omni_3B模型为例,为您进行使用说明。
环境准备
请确保已按照 环境部署 章节正确完成开发机及开发板的环境准备。
部署包准备
下载我们提供的D-Robotics_LLM_{version}.tar.gz部署包并解压。
模型准备
注意
当前仅支持Qwen2.5-Omni-3B模型。在下载模型前,请确保您已了解模型的使用许可、依赖环境等必要信息,以保证模型后续能正常使用。
您可以通过Hugging Face平台获取Omni系列的模型,以下为模型的下载链接:
模型量化
D-Robotics-LLM为您提供了使用命令行量化编译生成板端模型的功能,此时我们以Qwen2.5-Omni-3B模型为例进行说明,参考命令如下:
oellm_build \
--model_name qwen2_5-omni-3b \
--input_model_path ./models/qwen/Qwen2.5-Omni-3B \
--output_model_path ./output_hbm \
--march nash-m \
--chunk_size 256 \
--cache_len 2048 \
--device cuda:1
若您通过resolve_model.txt提供的链接来获取我们编译好的hbm模型,则可跳过此模型量化步骤。
resolve_model.txt文件中提供的Omni模型,均以chunk_size配置为256编译生成,且cache_len参数使用2048配置,且当前仅支持该配置。
多模态支持
Qwen2.5_Omni_3B模型支持的模态包括文本、音频、图片和视频。无论在任意输入组合下,模型的输出均为纯文本。
多模态支持分为离线运行和在线运行两种模式,二者所支持的输入组合存在一些差异,具体如下:
离线运行
| 序号 | 文本 | 音频 | 图片 | 视频 |
|---|
| 1 | Y | N/A | N/A | N/A |
| 2 | N/A | Y | N/A | N/A |
| 3 | N/A | N/A | Y | N/A |
| 4 | N/A | N/A | N/A | Y |
| 5 | Y | N/A | Y | N/A |
| 6 | N/A | Y | Y | N/A |
| 7 | Y | N/A | N/A | Y |
| 8 | N/A | Y | N/A | Y |
-
文本内容在json中填写,不单独准备文本文件。
-
音频格式支持mp3,wav和flac,最多支持30秒长度。
-
图片格式支持jpg,png,bmp和jpeg,长宽会固定缩放到448x448。
-
视频格式支持mp4和mkv,最多支持5秒,每秒会解析2帧,长宽会固定缩放到448x448。此外,若视频中有音频且无单独的音频输入,则视频中的音频会一并解析,若有单独的音频输入,则视频中的音频无效。
所有模态的输入均需通过json文件配置,详细说明可参考 板端运行 章节。
在线运行
| 序号 | 文本 | 音频 | 视频 |
|---|
| 1 | Y | N/A | Y |
| 2 | N/A | Y | Y |
| 3 | N/A | Y | N/A |
-
对于文本内容,您可使用接口xlm_omni_feed_text_online向模型传输。
-
视频格式仅支持nv12,您可使用接口xlm_omni_feed_video_online向模型传输单帧的nv12数据,长宽会被固定缩放到448x448,单次对话支持传输2-10帧的nv12数据。
-
音频数据类型仅支持float32,分布范围[-1, 1],您可使用接口xlm_omni_feed_audio_online向模型单次传输完整音频,或多次传输音频片段,单次对话支持累计最多30s音频。
板端运行准备
在D-Robotics_LLM_{version}/oellm_runtime/example目录中,我们在各子目录提前准备好了编译后的可执行文件,可以直接在板端运行。您也可以执行不同的编译脚本,自行生成所需文件,参考命令如下:
# 离线运行
sh build_omni_offline.sh
# 在线运行
sh build_omni_online.sh
接下来在板端创建工作目录,参考命令如下:
# S100/S100P上运行
mkdir -p /home/root/llm
在运行之前,您需要确保已经准备好如下内容:
-
可运行的开发板,用于实际执行板端程序。
-
可上板运行的模型(*.hbm)。
-
模型的输入嵌入权重(embed_tokens.bin文件)。
-
可执行文件(oellm_omni_offline和oellm_omni_online文件)及对应的json配置文件。
-
板端程序依赖库,为了降低部署成本,您可以直接使用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文件夹中的内容。
准备好之后,我们将上述文件整合到一起,目录的参考结构如下:
root@ubuntu:/home/root/llm
.
|-- model
| |-- resolve_model.txt
| |-- Qwen2.5_Omni_3B_Audio.hbm
| |-- Qwen2.5_Omni_3B_Visual.hbm
| |-- Qwen2.5_Omni_3B_Text.hbm
| |-- embed_tokens.bin
|-- config
| |-- Qwen2.5_Omni_3B_config
|-- example
| |-- oellm_omni_offline
| | |-- oellm_omni_offline
| | |-- omni_offline_config.json
| | |-- omni_offline_prompt.json
| | |-- draw_guitar.mp4
| |-- oellm_omni_online
| | |-- oellm_omni_online
| | |-- omni_online_config.json
| | |-- draw_guitar.mp4
|-- 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_omni_offline
./oellm_omni_offline --config ./omni_offline_config.json
程序的输入参数如下:
| 参数 | 参数说明 | 是否可选 |
|---|
-h, --help | 显示帮助信息。 | / |
-c, --config | 用于指定运行时的json配置文件路径。 | 必填 |
json配置文件示例如下:
omni_offline_config.json
{
"visual_hbm_path": "../../model/Qwen2.5_Omni_3B_Visual.hbm",
"audio_hbm_path": "../../model/Qwen2.5_Omni_3B_Audio.hbm",
"text_hbm_path": "../../model/Qwen2.5_Omni_3B_Text.hbm",
"embed_tokens": "../../model/embed_tokens.bin",
"tokenizer_dir": "../../config/Qwen2.5_Omni_3B_config/",
"model_type": 5,
"online_mode": false
}
json配置文件参数说明如下:
| 参数 | 参数说明 | 是否可选 |
|---|
visual_hbm_path | 用于指定量化后的视频图像特征提取模型文件(*.hbm)路径。 | 必填 |
audio_hbm_path | 用于指定量化后的音频特征提取模型文件(*.hbm)路径。 | 必填 |
text_hbm_path | 用于指定量化后的文本模型文件(*.hbm)路径。 | 必填 |
embed_tokens | 用于指定模型的输入嵌入权重(embed_tokens.bin)路径。 | 必填 |
tokenizer_dir | 用于指定分词器和部分初始化数据的配置路径。 | 必填 |
model_type | 用于指定运行的模型类型,当前Omni模型类型为5。 | 必填 |
online_mode | 用于指定模型以在线或者离线方式运行。 取值范围:'true'、'false'。 | 必填 |
在程序运行时,您还需在命令行单独输入一份准备了多模态输入信息的json文件的路径,再按下回车启动交互。
离线运行支持的模态包括文本、音频、图片和视频,您需在json文件中提前写好输入信息并保存在本地,模板如下:
注意
注:当前json文件模板仅作模板示例展示,若需了解输入模态支持的组合输入形式,请参考 多模态支持 小节。
{
"conversation": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."
}
]
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "user_text_input"
},
{
"type": "audio",
"audio": "user_audio_input.mp3"
},
{
"type": "image",
"image": "user_image_input.jpg",
"resized_width": 448,
"resized_height": 448
},
{
"type": "video",
"video": "user_video_input.mp4",
"resized_width": 448,
"resized_height": 448
}
]
}
]
}
其中,在json配置文件模板中,同一conversation节点下包含system的text字段,以及user部分的text,audio,image和video字段。若无需使用某种模态输入,需将该模态对应的完整大括号内容删除。
例如,仅输入视频时,json文件可按照如下方式配置:
omni_offline_prompt.json
{
"conversation": [
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."
}
]
},
{
"role": "user",
"content": [
{
"type": "video",
"video": "draw_guitar.mp4",
"resized_width": 448,
"resized_height": 448
}
]
}
]
}
在线运行
D-Robotics-LLM部署包提供了API,支持以流式传输的方式在线运行Qwen2.5_Omni_3B模型,为此我们提供了在线运行示例供参考。
该示例的板端运行参考指令如下:
cd ./example/oellm_omni_online
./oellm_omni_online --config ./omni_online_config.json
程序的输入参数如下:
| 参数 | 参数说明 | 是否可选 |
|---|
-h, --help | 显示帮助信息。 | / |
-c, --config | 用于指定运行时的json配置文件路径。 | 必填 |
json配置文件示例如下:
omni_online_config.json
{
"visual_hbm_path": "../model/Qwen2.5_Omni_3B_Visual.hbm",
"audio_hbm_path": "../model/Qwen2.5_Omni_3B_Audio.hbm",
"text_hbm_path": "../model/Qwen2.5_Omni_3B_Text.hbm",
"embed_tokens": "../model/embed_tokens.bin",
"tokenizer_dir": "../../config/Qwen2.5_Omni_3B_config/",
"model_type": 5,
"online_mode": true,
"video_path": "./draw_guitar.mp4",
"user_text": "请描述我在做什么"
}
json配置文件参数说明如下:
| 参数 | 参数说明 | 是否可选 |
|---|
visual_hbm_path | 用于指定量化后的视频图像特征提取模型文件(*.hbm)路径。 | 必填 |
audio_hbm_path | 用于指定量化后的音频特征提取模型文件(*.hbm)路径。 | 必填 |
text_hbm_path | 用于指定量化后的文本模型文件(*.hbm)路径。 | 必填 |
embed_tokens | 用于指定模型的输入嵌入权重(embed_tokens.bin)路径。 | 必填 |
tokenizer_dir | 用于指定分词器和部分初始化数据的配置路径。 | 必填 |
model_type | 用于指定运行的模型类型,当前Omni模型类型为5。 | 必填 |
online_mode | 用于指定模型以在线或者离线方式运行。 取值范围:'true'、'false'。 | 必填 |
video_path | 用于指定在线运行时解析的视频文件路径。 | 必填 |
user_text | 用于指定user的文本输入内容。 | 可选 |
提示
在线运行的音频数据解析自视频,若您使用自有视频数据进行测试,建议使用带音频的视频。
运行结果
离线运行
一轮完整的离线运行交互方式如下,其中[User] <<< 的./omni_offline_prompt.json为您所提供的含有输入信息的json文件所在路径,[Assistant] >>> 对应模型的文本输出,输出文本前会将json文件中的输入信息打印至终端。
[User] <<< omni_offline_prompt.json
Role: system
Type: text
Text: "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."
Role: user
Type: video
Video: "draw_guitar.mp4"
VideoPreprocess Time: 1799.69ms
Audio(inVideo)Preprocess Time: 214.787ms
[Assistant] >>> Oh, that's really cool! You're drawing a guitar on the tablet. Have you been practicing drawing for a long time?If you want to practice more, you can try to draw other things like flowers or animals. It's also a great way to relax and have fun. So, what do you think about it?
Performance prefill: 895.73tokens/s decode: 14.03tokens/s
在线运行
输入1、2和3可依次运行在线模式支持的三种输入组合,输入0为退出程序,在线运行的完整交互功能演示如下:
xlm init success
板端Omni多模态大模型对话交互online demo
当前支持的多模态输入组合如下
1.从sensor获取视频(nv12)+文字
2.从sensor获取视频(nv12)+从sensor获取音频(pcm)
3.从sensor获取音频(pcm)
该demo以仿真形式模拟online场景,请输入1、2或3运行对应示例
退出请输入0
[User] <<< 1
Role: system
Type: text
Text: "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."
Role: user
Type: text
Text: "请描述我在做什么"
Type: video
Video: " "
VideoPreprocess Time: 1009.98ms
[Assistant] >>> 嗯…你正在用平板电脑画画呢。你看,屏幕上有个黑色的图案,像是个乐器的轮廓,你用笔在上面画着,手指还扶着平板呢。你是在练习画画吗?还是有别的用途呀?要是有啥想法,你可以和我说说哦。
Performance prefill: 894.32tokens/s decode: 14.11tokens/s
[User] <<< 2
Role: system
Type: text
Text: "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."
Role: user
Type: video
Video: " "
Type: audio
Audio: " "
AudioPreprocess Time: 221.13ms
VideoPreprocess Time: 1007.44ms
[Assistant] >>> Oh, that's a really cool drawing! It looks like a guitar. You've got the basic shape and the strings all drawn in. What made you decide to draw a guitar? It's a great choice. If you want, you can tell me more about your drawing process.
Performance prefill: 894.91tokens/s decode: 14.10tokens/s
[User] <<< 3
Role: system
Type: text
Text: "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."
Role: user
Type: audio
Audio: " "
AudioPreprocess Time: 210.43ms
[Assistant] >>> Oh, sure! I'm here. What's your drawing? Let me see it.
Performance prefill: 896.71tokens/s decode: 14.10tokens/s
[User] <<< 0
[system out] >>> 好的,祝您生活愉快,再见~