01.前言
2024年12月12日,多模态实时交互大模型书生·浦语灵笔2.5-OL(InternLM-XComposer2.5-OmniLive)开源,该模型可以通过视觉和听觉实时观察和理解外部世界,自动形成对观察到内容的长期记忆,并可通过语音与人类用户进行对话交谈,提供更自然的大模型交互体验。
书生·浦语灵笔首发于2023年10月,经过历次迭代,已具备图文理解、图文混合创作、超高分辨率图像分析、超长多模态上下文等多项能力,获得了开源社区的广泛关注和好评,全系列模型累计下载量超过200万次。
书生·浦语灵笔2.5-OL基于书生·浦语2.5大语言模型(InternLM 2.5)研发,采用了多模块通专融合的架构方案,通过多模态实时感知及记忆编码的快系统和多模态复杂推理大模型的慢系统协同,实现多模态实时交互功能。
技术报告地址:
开源模型地址:
https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm-xcomposer2d5-ol-7b
代码仓库地址:
https://github.com/InternLM/InternLM-XComposer/tree/main/InternLM-XComposer-2.5-OmniLive
在科幻电影畅想的未来世界中,AI助手发挥着辅助人类的重要作用,例如:《流浪地球》中的MOSS、《钢铁侠》中的J.A.R.V.I.S.等。这些AI助手不仅具有强大的知识和思考能力,还可以实时感知外部环境变化,记住观察到的事物细节,与人类自然对话交流,并适时地为人类提供实际帮助。
在现实应用中,具有实时视频语音交互功能的多模态大模型,可以让具身机器人、可穿戴智能硬件、移动设备更好地感知世界进而服务人类,具有广阔的应用前景。
添加图片注释,不超过 140 字(可选)
书生·浦语灵笔2.5-OL支持实时视觉感知和语音对话,还创新地提出了多模态长期记忆的功能。通过分别设计多模态实时交互大模型中的感知、记忆和思考功能模块,可实现并发的世界感知、长短期记忆、多模态思考三项核心功能,并提供了完整的系统协同和集成方案。
目前,书生·浦语灵笔2.5-OL已完全开源了模型参数、系统集成推理和前后端应用部署的全套方案,支持免费商用申请。
书生·浦语灵笔2.5-OL的整体架构和三个核心模块的具体设计如下:
添加图片注释,不超过 140 字(可选)
感知模块:
实时感知音频、视频输入,对音频信号进行语音识别和音频分类,对视觉信号抽取视觉特征:
- 音频感知:研究人员训练了一个轻量的音频多模态大模型,实时监听输入的音频流,同时进行语音识别和音频分类,理解人类语音内容和识别背景声音。
- 视觉感知:通过视觉编码器实时抽取视觉特征。
记忆模块
持续对输入的视觉特征进行多层级的记忆压缩,不断进行视觉记忆编码压缩,支持根据指令对视觉记忆的高效检索。
- 短时记忆压缩:对短期视频片段内进行记忆压缩,形成精确的短期记忆。
- 长期记忆压缩:对短期记忆进一步压缩,形成高压缩比的长期记忆。
- 记忆查询:根据指令查询长期记忆,召回指令相关的短期记忆片段,用于思考模块的多模态理解。
思考模块
判断语音输入是否为需要响应的用户指令,避免误触发影响使用体验。对于需要影响的用户需求,结合指令查询视觉记忆,并回答问题。
- 判断用户指令是否需要响应。
- 调用记忆模块查询历史视觉记忆,用于多模态理解和推理, 并回答用户问题。
- 调用外部语音合成模块合成最终语音输出。
书生·浦语灵笔2.5-OL 的系统流程设计如下:
添加图片注释,不超过 140 字(可选)
前端
- 前端使用JavaScript开发,可启用摄像头和麦克风捕捉视频和音频流输入,并将其推送到SRS服务器,同时与后端建立WebSocket连接,监听音频输出和中断信号。
- 前端在接收到音频输出时播放音频,接收到中断信号时暂停音频播放并丢弃待处理的音频。
SRS服务器
- SRS(Simple Realtime Server)是一款简单高效的实时音视频服务器,负责接收和传输音频流、视频流数据。
后端服务器
- 后端与前端建立WebSocket连接后,将从SRS服务器拉取流媒体,并启动独立进程分别读取音频和视频。
- 音频进程持续读取音频流并检测语音的开始和结束:
- 检测到语音活动开始时,后端向前端发送中断信号以暂停当前播放的音频,同时向视频进程发送备份信号保存当前记忆状态(记忆快照)。
- 检测到语音活动结束时,语音分类和识别进程对音频进行背景音分类和语音识别,并将结果送入到大语言模型待处理队列。
- 视频进程读取视频帧并保存到视频帧队列。记忆进程负责识别、提取并存储记忆,并在收到语音检测进程的备份信号后保存当前记忆状态以便后续检索。
- 大语言模型进程判断待处理的指令是否需要模型响应,并根据检索到的记忆对于需要响应的指令进行文字回复。
- 语音合成进程将把文字回复结果转换为音频输出并发送到前端。
02.模型推理
安装ms-swift
!pip install git+https://github.com/modelscope/ms-swift.git
音频理解推理代码
import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' from swift.llm import PtEngine, InferRequest, RequestConfig import torch engine = PtEngine('Shanghai_AI_Laboratory/internlm-xcomposer2d5-ol-7b:audio', torch_dtype=torch.float16) request_config = RequestConfig(max_tokens=512) resp_list = engine.infer([InferRequest(messages=[{'role': 'user', 'content': '<audio>Detect the language and recognize the speech.'}], audios=['https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/chinese.mp3'])]) print(f'response: {resp_list[0].choices[0].message.content}')
视觉理解推理代码
import torch from modelscope import AutoModel, AutoTokenizer import os torch.set_grad_enabled(False) from modelscope import snapshot_download model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm-xcomposer2d5-ol-7b') model_dir = os.path.join(model_dir, 'base') # init model and tokenizer model = AutoModel.from_pretrained(model_dir, torch_dtype=torch.bfloat16, trust_remote_code=True).cuda().eval().half() tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True) model.tokenizer = tokenizer query = 'Analyze the given image in a detail manner' image = ['cat.png'] with torch.autocast(device_type='cuda', dtype=torch.float16): response, _ = model.chat(tokenizer, query, image, do_sample=False, num_beams=3, use_meta=True) print(response)
显存占用
添加图片注释,不超过 140 字(可选)
03.模型微调
我们使用ms-swift对internlm-xcomposer2d5-ol-7b进行微调。ms-swift是魔搭社区官方提供的大模型与多模态大模型微调部署框架,支持400+大模型和100+多模态大模型。
ms-swift开源地址:
https://github.com/modelscope/ms-swift
在这里,我们将展示可直接运行的demo,并给出自定义数据集的格式。
在开始微调之前,请确保您的环境已准备妥当。
git clone https://github.com/modelscope/ms-swift.git cd ms-swift pip install -e .
base微调脚本:
CUDA_VISIBLE_DEVICES=0 \ swift sft \ --model Shanghai_AI_Laboratory/internlm-xcomposer2d5-ol-7b:base \ --train_type lora \ --dataset modelscope/coco_2014_caption:validation#20000 \ --num_train_epochs 1 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --learning_rate 1e-4 \ --lora_rank 8 \ --lora_alpha 32 \ --target_modules attention.wqkv attention.wo feed_forward.w1 feed_forward.w2 feed_forward.w3 \ --gradient_accumulation_steps 16 \ --eval_steps 50 \ --save_steps 50 \ --save_total_limit 5 \ --logging_steps 5 \ --max_length 2048 \ --output_dir output \ --warmup_ratio 0.05 \ --dataloader_num_workers 4
自定义数据集格式如下(system字段可选),只需要指定`--dataset `即可:
{"messages": [{"role": "system", "content": "你是个有用无害的助手"}, {"role": "user", "content": "<image>图片中是什么"}, {"role": "assistant", "content": "一个可爱的小猫"}], "images": ["/xxx/x.jpg"]} {"messages": [{"role": "system", "content": "你是个有用无害的助手"}, {"role": "user", "content": "<video>视频中是什么"}, {"role": "assistant", "content": "一只可爱的狗狗在草地上奔跑"}], "videos": ["/xxx/x.mp4"]}
训练显存资源:
添加图片注释,不超过 140 字(可选)
audio微调脚本:
CUDA_VISIBLE_DEVICES=0 \ swift sft \ --model Shanghai_AI_Laboratory/internlm-xcomposer2d5-ol-7b:audio \ --train_type lora \ --dataset speech_asr/speech_asr_aishell1_trainsets:validation#20000 \ --num_train_epochs 1 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --learning_rate 1e-4 \ --lora_rank 8 \ --lora_alpha 32 \ --target_modules all-linear \ --freeze_vit true \ --gradient_accumulation_steps 16 \ --eval_steps 50 \ --save_steps 50 \ --save_total_limit 5 \ --logging_steps 5 \ --max_length 2048 \ --output_dir output \ --warmup_ratio 0.05 \ --dataloader_num_workers 4
自定义数据集格式如下(system字段可选),只需要指定`--dataset `即可:
{"messages": [{"role": "system", "content": "你是个有用无害的助手"}, {"role": "user", "content": "<audio>语音说了什么"}, {"role": "assistant", "content": "今天天气真好呀"}], "images": ["/xxx/x.wav"]}
训练显存资源:
添加图片注释,不超过 140 字(可选)
训练完成后,使用以下命令对训练后的权重进行推理。这里`--adapters`需要替换成训练生成的last checkpoint文件夹. 由于adapters文件夹中包含了训练的参数文件,因此不需要额外指定`--model`:
# 使用训练时的验证集进行推理 CUDA_VISIBLE_DEVICES=0 \ swift infer \ --adapters output/vx-xxx/checkpoint-xxx \ --stream true \ --load_data_args true
点击链接跳转:浦语·灵笔 2.5 OmniLive