进阶开发

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

此流程适用场景如下:

  1. 自行量化模型。

  2. 离线运行,通过读取本地的音频、视频、图像等数据,模型生成文本回答。

  3. 在线运行,通过流式传输音频、视频数据,模型生成文本回答。相比离线运行,在线运行可以一边传输一边处理,从而显著降低模型生成首字回答的延时。

针对以上几种场景,这里我们还是以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
注解

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

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

resolve_model.txt文件中提供的Omni模型,均以chunk_size配置为256编译生成,且cache_len参数使用2048配置,且当前仅支持该配置。

多模态支持

Qwen2.5_Omni_3B模型支持的模态包括文本、音频、图片和视频。无论在任意输入组合下,模型的输出均为纯文本。

多模态支持分为离线运行和在线运行两种模式,二者所支持的输入组合存在一些差异,具体如下:

离线运行

序号文本音频图片视频
1YN/AN/AN/A
2N/AYN/AN/A
3N/AN/AYN/A
4N/AN/AN/AY
5YN/AYN/A
6N/AYYN/A
7YN/AN/AY
8N/AYN/AY
  • 文本内容在json中填写,不单独准备文本文件。

  • 音频格式支持mp3wavflac,最多支持30秒长度。

  • 图片格式支持jpgpngbmpjpeg,长宽会固定缩放到448x448

  • 视频格式支持mp4mkv,最多支持5秒,每秒会解析2帧,长宽会固定缩放到448x448。此外,若视频中有音频且无单独的音频输入,则视频中的音频会一并解析,若有单独的音频输入,则视频中的音频无效。

所有模态的输入均需通过json文件配置,详细说明可参考 板端运行 章节。

在线运行

序号文本音频视频
1YN/AY
2N/AYY
3N/AYN/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.shD-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节点下包含systemtext字段,以及user部分的textaudioimagevideo字段。若无需使用某种模态输入,需将该模态对应的完整大括号内容删除。 例如,仅输入视频时,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] >>> 好的,祝您生活愉快,再见~