VITA-1.5靠近GPT4o水平的多模态模子:理解和跑通这套多模态实时交互体系 ...

打印 上一主题 下一主题

主题 1037|帖子 1037|积分 3111

VITA-1.5:如何一步步跑通并理解这套多模态实时交互体系

大家好,继续复现GPT4高级语音模式系列。今天我想和各位分享一个非常故意思的开源项目——VITA-1.5。在这篇文章中,我会深入讲授我在跑通 VITA-1.5 体系过程中所经历的细节和思考。尤其是对于之前从未接触过多模态语音训练流程的朋友,我会只管将一些知识点(例如 CTC、NAR、TiCodec 等)补充完整。相信能够真正资助你理解、搭建并改造这一前沿体系。
我会先简要介绍 VITA-1.5 的配景和特点,再一步步演示如何安装依靠、预备数据、开始训练以致推理,最后也会谈谈一些在实际使用过程中的Tips和常见题目。希望能为你搭建 VITA-1.5 提供一个详尽的引导。

什么是 VITA-1.5

从 VITA-1.0 到 VITA-1.5

VITA-1.5 是一个多模态大型语言模子(Multimodal Large Language Model, MLLM),其特点在于可以同时处置惩罚视觉(图像、视频)、文本以及语音信息。在最初的版本 VITA-1.0 中,团队主要解决了“视觉+语音+文本”的多模态交互题目,但是语音输出仍旧依靠外部的 TTS(Text-To-Speech)模块,导致推理过程中会有额外的延迟和一些大概的兼容性题目。
Source Code: https://github.com/VITA-MLLM/VITA
在 VITA-1.5 中,官方引入了一些重大改进:

  • 大幅镌汰互动延迟

    • 通过内置端到端的语音解码器,免去外部 TTS 的依靠,使得语音到语音的交互时间由 4 秒降到 1.5 秒左右,险些靠近实时。

  • 多模态性能提升

    • 在图像、视频理解等多模态使命基准上(好比 MME, MMBench, MathVista 等),性能相比 VITA-1.0 有明显提升。

  • 改进的语音处置惩罚能力

    • 英文 ASR(语音识别)使命中,WER(Word Error Rate)从 18.4% 降到了 7.5%,同时中文 ASR 结果也大幅提升。
    • 使用端到端 TTS 机制,完全买通了从视觉/文本/语音到语音输出的闭环。

  • 渐进式多阶段训练策略

    • 能够在训练过程中最小化差别模态间的“辩论”,保留视觉-语言能力的同时,将语音能力逐步添加进去,最后又不会损害整体性能。

得益于这些改进,VITA-1.5 给大家带来了一种“轻巧却强大”的多模态实时语音交互方式,让开源社区看到了在 GPT-4o 等大厂多模态模子之外的新选择。

项目安装

根据官方 GitHub 仓库的介绍,这个项目标大致结构和流程可以简单总结如下:


  • 安装依靠:Python 3.10 + 相干 Python 包(requirements.txt) + FlashAttention 加快。
  • 数据预备

    • 包罗图像(或视频)与文本对话、语音音频文件等多模态信息的 json 数据。
    • 需要分别在 config 文件中指定图像路径、音频路径、以及将它们对齐到多模态数据结构里。

  • 训练

    • 支持“持续式训练”(Continual Training),在已有的 checkpoint 上进一步微调。
    • 核心是三阶段训练:视觉-语言对齐 -> 语音输入对齐 -> 语音输出对齐

  • 推理

    • 以文本、图像、或音频作输入,输出文本或端到端语音。
    • 快速示例:python video_audio_demo.py --model_path ... --image_path ... --audio_path ...

  • 评测

    • 提供了在 MME, MMBench, Video-MME 等基准上评测的脚本示例。

除此之外,另有一个 Web Demo,可以做一个更高级的实时交互演示。我会在后面细说如何设置和启动。

技能预备知识

我知道很多朋友大概对大模子的根本架构已经比较认识,但对于项目中提到的一些细节却不太了解。这里我会花一定篇幅来做补充性讲授,从而让大家能够充分读懂“多阶段训练策略”是怎么回事,以及为何要有 codec 模块,NAR / AR 解码器又分别扮演什么角色。
1. ASR 的 CTC 机制

在“阶段2:语音输入对齐”部分,官方说到会用 CTC(Connectionist Temporal Classification)来训练语音编码器,以完成语音到文本的对齐。CTC 是一种经典的语音识别训练准则,针对的是“输入长度和输出长度不一致”的序列学习题目。


  • 为什么叫 CTC?

    • CTC 实验解决在语音序列中寻找一条最优的对齐路径,使得声学特性与输出文本的对齐概率最大化。

  • 简单原理

    • 你可以把它理解为一种“全部大概对齐方式的联合”,让网络自动学习到“在时间步 t 上对应的音素/文字是什么”。

  • 和常见的 seq2seq 有什么区别?

    • 传统 seq2seq 的注意力机制也可以对齐,但 CTC 不需要显式对齐标签,而是通过在网络输出层插入一个额外的空白标签(blank),并统计全部大概的路径。
    • CTC 往往用于端到端 ASR,需要对模子的输出做“路径压缩”来获取最终的文字序列。

在 VITA-1.5 中,“阶段2.1”的第一步会训练一个语音编码器,使之能够输出对齐的文本 logits(固然最终并不一定需要直接使用 CTC 的输出,但这个过程资助语音编码器学会“听出文字”)。
2. 非自回归(NAR)与自回归(AR)解码器

VITA-1.5 在语音解码端有两种模块:NAR Speech Decoder 和 AR Speech Decoder。它们分别是非自回归自回归的语音解码器,用来把文本表征或语音表征最终天生离散的语音 token。


  • 非自回归(NAR)

    • 一次性预测整句语音 token 的分布,不依靠前面已经天生的 token,速度快,但是准确性或自然度大概相对低一些。
    • 在 VITA-1.5 中,NAR 模块的作用是快速天生一个“语义开端对齐”的语音 token 分布,给后续 AR 解码器参考。

  • 自回归(AR)

    • 类似于传统的语言模子,每天生一个 token 的时候,都会依靠之前已经天生的 token。这样天生质量更高,但速度更慢。
    • 在 VITA-1.5 中,AR 模块会在 NAR 开端天生的语义表征底子上,进一步 refine(精修)语音 token,从而得到更逼真的语音输出。

这种 “NAR + AR” 组合在现代一些端到端 TTS 或音频天生体系里并不稀有,既能保证一定的速度优势,也能兼顾输出质量。
3. TiCodec:如何把音频变成离散 token

VITA-1.5 中提到的 TiCodec 模块,提供了将连续语音波形编码成离散 token(以及反向解码成波形)的能力。


  • 传统 TTS 需要在频谱/声码器层面天生语音;
  • 现在很多大模子希望能用离散 token情势来做同一建模:音频也被切成 40Hz 一帧的序列,每一帧对应一个从 0~1023 的离散索引(因为 codebook 巨细是 1024),就像在做文本 token 一样。
  • 然后再靠 TiCodec 的 decoder,把这些离散 token 还原回 24kHz 的波形。它跟常见的 EnCodec、SoundStream 等原理相通,只不外这里是一个自定义的 codebook。
这样做最大的好处,就是语音与文本可以“串联”在同一个序列空间中了,利于在 LLM 层面上做多模态的同一处置惩罚。

论文原理讲授:三阶段训练架构设计与方案

在 VITA-1.5 的论文中,作者强调了一个核心理念:多模态融合并非“一次性”就能做到,而是要通过“渐进式”方式,让各个模态能够循序渐进地对齐到同一个大型语言模子里。否则,如果把语音和视觉数据一下子都灌进去,很容易出现差别模态间相互干扰,从而导致训练不稳定或性能降落。VITA-1.5 主要分为以下三个阶段(Stage 1 ~ 3):

阶段1:视觉-语言训练


  • Stage 1.1 Vision Alignment

    • 先冻结大部分参数,只训练一个视觉适配器(Vision Adapter)。
    • 详细做法是:把预训练好的视觉编码器(InternViT-300M)输出的图像特性,通过 MLP 等简单网络转换为可以喂给 LLM 的“视觉 token”表示。LLM 这时候并没有更新,主要是让视觉端先和语言端对齐。
    • 这样可以避免一下子微调全部模块,导致视觉特性和语言特性紊乱,也让 LLM 的底层语言表示根本保持不变。

  • Stage 1.2 Vision Understanding

    • 在完成了适配器开端对齐后,就可以让视觉编码器 + LLM 都到场训练了,使用大量的图像描述数据(Caption Data)。
    • 这一步让模子真正学会:如何从图像内容中提取语义并用自然语言表达
    • 因为前一步已经做了适配器的预热,模子在这个阶段训练会更稳定,不会出现严峻的多模态辩论。

  • Stage 1.3 Vision SFT

    • “SFT” 即指令微调(Supervised Fine-Tuning)。这里进一步使用视觉问答(Visual QA)数据,乃至包括一些 OCR、图表理解、数学推理等子使命。
    • 让模子不仅能描述图像,还能根据特定的用户指令进行更深入的答复或推理。
    • 至此,经过三步递进,VITA-1.5 已经在视觉-语言这个维度上具备较强的理解和天生能力。

阶段2:音频输入微调


  • Stage 2.1 Audio Alignment

    • 这一步核心思想:让 LLM 能“听懂”语音
    • 起首单独用 CTC 对语音编码器做一次端到端训练,让它能把语音帧映射到文字序列。这个训练过程就像传统的 ASR 体系,得到一个能输出“文本 logits”的编码器。
    • 之后再把这个编码器接到 LLM 前面,通过一个音频适配器(Speech Adapter)把语音特性喂给 LLM,让 LLM 输出文字转录结果。
    • 在这个阶段,还会插入一些额外的可训练 token,告诉 LLM “这里是语音输入”,从而让 LLM 产生正确的文本答复。

  • Stage 2.2 Audio SFT

    • 有了底子的“听写”能力后,就可以让模子同时处置惩罚“语音题目”与“文本题目”,并做类似 ChatGPT 式的多模态问答。
    • 做法是:将一部分文本题目随机替换成语音版本,混合进训练数据,让模子能应对用户“用语音提问”的场景,并以文本情势答复。
    • 同时,还在 LLM 输出端增加一个分类头,用来区分当前输入是文本照旧语音,这可以让模子在推理时更精细地处置惩罚两种差别模态。

阶段3:音频输出微调


  • Stage 3.1 Codec Training

    • 为了让模子能“说出”语音,而不是单纯给文字答复,需要先训练一个 codec(TiCodec)。
    • 这个 codec 的作用:将 24kHz 波形映射到 40Hz 的离散 token 序列(码本巨细 1024),以及反向解码。
    • 训练好后,就能让模子在内部以“token”级别的方式去使用语音表征。

  • Stage 3.2 NAR + AR Decoder Training

    • 接着要训练两种解码器:NAR(非自回归)和 AR(自回归),让模子学会如何从文本 embedding 天生对应的语音 token。
    • 在这个阶段,LLM 本身是冻结的,只更新解码器(以及 codec 的一部分),避免破坏之前视觉-语言-音频输入已经学到的能力。
    • 最终就能实现“从文本到语音 token 再到波形”——也就是端到端 TTS 的闭环。

经过这三大阶段的训练,VITA-1.5 在视觉、语言、语音三大模态下都相互对齐,相互融合,形成了一个真正能“看、听、说、理解”的多模态大模子。

我是如何在本地跑通 VITA-1.5 的

下面我将“从零开始”,把我在本地机器上跑通 VITA-1.5 的详细步骤进行分享。包罗安装依靠、数据预备、训练脚本设置、推理流程,以及中心的一些常见踩坑点。
环境安装

1. 克隆仓库并创建 Conda 环境

假设你的机器上已经安装了 conda 或者 miniconda,那么我发起新建一个名为 vita 的虚拟环境。实行如下命令:
  1. git clone https://github.com/VITA-MLLM/VITA
  2. cd VITA
  3. conda create -n vita python=3.10 -y
  4. conda activate vita
  5. pip install --upgrade pip
  6. pip install -r requirements.txt
  7. pip install flash-attn --no-build-isolation
复制代码
  为什么要安装 flash-attn?
因为现在很多大模子都会用到可选的加快库 FlashAttention 来镌汰显存占用与进步训练速度。如果你没有这个需求,也可以不装,但官方发起照旧安装以获得更好的服从。
  2. 检查 cuda / pytorch 版本

确保你的 CUDA 版本、PyTorch 版本都和 requirements.txt 中对应得上。若不匹配,有大概导致无法编译或者 CUDA kernel 加快失效。
数据预备

根据官方的指引,我们要预备一个 json 列表文件,内里每一条数据都包罗了对应的“图像路径”、“语音路径”和一个多轮对话的列表结构。以下是一个简化示例:
  1. [
  2.     {
  3.         "set": "sharegpt4",
  4.         "id": "000000000164",
  5.         "conversations": [
  6.             {
  7.                 "from": "human",
  8.                 "value": "<image>\n<audio>\n"
  9.             },
  10.             {
  11.                 "from": "gpt",
  12.                 "value": "This is a well-organized kitchen with a clean, modern aesthetic..."
  13.             }
  14.         ],
  15.         "image": "coco/images/train2017/000000000164.jpg",
  16.         "audio": [
  17.             "new_value_dict_0717/output_wavs/f61cf238b7872b4903e1fc15dcb5a50c.wav"
  18.         ]
  19.     },
  20.     ...
  21. ]
复制代码


  • set 用来区分数据来源,好比这里是 sharegpt4;
  • image 字段指定图片路径,audio 是一个列表,大概包罗多个 wav 文件路径;
  • conversations 字段里 “human” 对应用户输入,“gpt” 对应模子输出。
然后在 ./vita/config/dataset_config.py 中,你需要相应地设置:
  1. AudioFolder = "/absolute/path/to/audio/files/"
  2. FolderDict = {
  3.     "sharegpt4": "/absolute/path/to/sharegpt4/images"
  4. }
  5. ShareGPT4V = {"chat_path": "/absolute/path/to/your/train_data.json"}
  6. DataConfig = {
  7.     "Pretrain_video": [ShareGPT4V],
  8. }
复制代码
一旦完成这些设置,训练脚本就能根据 DataConfig 去读取你指定的 json 文件,然后在数据加载阶段将图像、语音、文本三者融合。
   注意:官方示例里把数据分得很细,好比 OCR、Caption、Video 等差别类型。对第一次实验的同学而言,你只要先做好小规模的示例数据就行,确保能跑通流程再继续扩充数据集。
  
训练过程详解

1. 下载预训练权重

官方发起你需要预备 3 个模子权重:

  • VITA-1.5 checkpoint

    • 如果想在已有的 VITA-1.5 上做持续训练,需要加载这个 checkpoint 作为初始模子。

  • InternViT-300M-448px

    • 这是视觉编码器的预训练权重,用来处置惩罚图像、视频。

  • Audio encoder

    • 这是阶段2 音频-语言对齐时训练好的“语音编码器”权重。如果你想直接在 VITA-1.0 或其他 checkpoint 上微调语音部分,也可以用它来初始化。

你需要在训练脚本(如 ./script/train/finetuneTaskNeg_qwen_nodes.sh)里修改这些路径。例如:
  1. --model_name_or_path /path/to/VITA1.5_ckpt
  2. --vision_tower /path/to/InternViT-300M-448px
  3. --audio_encoder /path/to/audio-encoder-Qwen2-7B-1107-weight-base-11wh-tunning
复制代码
2. 运行训练脚本

官方脚本大概长这样:
  1. export PYTHONPATH=./
  2. export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
  3. OUTPUT_DIR=/mnt/cfs/lhj/videomllm_ckpt/outputs/vita_video_audio
  4. bash script/train/finetuneTaskNeg_qwen_nodes.sh ${OUTPUT_DIR}
复制代码
你可以把 OUTPUT_DIR 改到你想要的输出目录。
如果统统正常,训练就会开始。在差别的阶段里,官方会设定差别的数据采样规则(好比先只用 caption,后面再加 QA,后面再加语音等),来实现渐进式的多模态训练。这也是上文所说的三阶段策略:

  • Stage 1: 视觉-语言对齐:

    • 起首训练视觉适配器(Vision Adapter),只让它学会把图像特性映射到 LLM 的输入空间。
    • 然后让 LLM + Vision Encoder 都可训练,学习更复杂的图像描述(captioning)和 QA。

  • Stage 2: 音频输入微调:

    • 先做 Audio Alignment,用 CTC 训练音频编码器,学会将语音映射为文本;
    • 再做 Audio SFT,通过混合语音题目、文本题目标对话数据让模子具备“听懂语音 -> 天生文本答复”的能力。

  • Stage 3: 音频输出微调:

    • 训练 TiCodec + (NAR, AR) 语音解码器,使模子实现端到端语音天生。

官方仓库里已经把这三阶段拆分好了对应的超参设置和数据聚集。你可以只跑其中一个阶段,也可以全部串起来跑。如果你想完全复现论文结果,发起按照官方顺序逐阶段训练。

推理与 Demo

1. 快速开始:video_audio_demo.py

在仓库根目录下,有一个 video_audio_demo.py 脚本,可以让你对单张图片 + 单段音频进行推理测试。好比:
  1. CUDA_VISIBLE_DEVICES=2 python video_audio_demo.py \
  2.     --model_path /path/to/vita_model \
  3.     --image_path asset/vita_newlog.jpg \
  4.     --model_type qwen2p5_instruct \
  5.     --conv_mode qwen2p5_instruct \
  6.     --question "Describe this image."
复制代码
或者用语音输入的方式(好比 --audio_path asset/q1.wav)让模子去识别音频内容,然后天生答复。
2. 低噪语音 / 高噪语音示例

官方还给了一个 --audio_path asset/q2.wav 的示例,意思是测试模子对高噪声或比较挑战的音频输入的鲁棒性。
3. Web 实时 Demo

如果你想做一个 Web 界面的实时交互 Demo,那么就可以参考 ./web_demo 目录下的阐明。
大致做法是:

  • 预备好 vLLM 或者官方推荐的 fork 版本(需要做适配)。
  • 安装额外的依靠:
    1. pip install -r web_demo/web_demo_requirements.txt
    复制代码
  • 复制一份你的 VITA_ckpt,然后根据 web_demo/vllm_tools 下的脚本去修改某些 config,以兼容 vLLM。
  • 最后实行:
    1. python -m web_demo.web_ability_demo /path/to/demo_VITA_ckpt/
    复制代码
    就可以打开一个网页,进行根本的多模态对话。
若你想要真正实现“语音检测+叫醒+实时对话”,还需要预备一个 VAD(Voice Activity Detection)模块,好比 silero_vad.onnx;然后将 max_dynamic_patch 调小一些(官方发起设成 1),这样可以让模子在推理时不用切成太多 patch,从而缩短语音对话的延迟。

评测:怎样在 MME 等多模态基准上测试

VLMEvalKit

多模态模子常常需要跑一堆基准,如 MMBench、MMStar、MMMU、MathVista、OCRBench 等。官方推荐用一个名为 VLMEvalKit 的工具,可以让你设置好 model 路径后,自动在各个数据集上跑推理,再交给一个打分器评估。

  • 在 VLMEvalKit/vlmeval/config.py 里把 vita_series = { 'vita': ... 'vita_qwen2': ...} 改成你本身的 model 路径。
  • 若没有 OpenAI 的 GPT 4 API,可以使用一个本地模子做 judge。官方示例用 Qwen1.5-1.8B-Chat 作为打分器。
  • 最后实行:
    1. CUDA_VISIBLE_DEVICES=0 python run.py \
    2.    --data MMBench_TEST_EN_V11 MMBench_TEST_CN_V11 ... \
    3.    --model vita_qwen2 --verbose
    复制代码
    即可在多个英文/中文测试集上做评测,看看VITA-1.5体现如何。
Video-MME

专门测视频理解能力的基准,好比 Video-MME,需要先把视频拆帧成多少图像文件,再把它们组织好给到模子做推理。官方给了脚本 yt_video_inference_qa_imgs.py,你需要指定:


  • --model-path /path/to/vita
  • --video_dir /path/to/video_frames
  • --use_subtitles (可选,代表是否使用字幕信息)
跑完后用 parse_answer.py 分析结果即可。实际上,这背后就是把视频当成多帧图像来处置惩罚,然后每次把这些帧拼在一起过模子。根据阶段1和阶段2学到的视觉特性,VITA-1.5 就能“看”这些帧并给出答复。

常见题目与经验分享


  • 训练很慢怎么办?

    • 多模态大模子确实比较消耗资源。官方发起如果你只做小规模测试,可以镌汰训练数据或减小 batch size,先确保流程 OK。真要复现整套指标,大概需要多卡乃至集群资源。

  • CTC 搭建时出现“报错不能编译”

    • 一些 PyTorch 版本内置了 warp-ctc 或者要安装第三方包。细致查看日志是否是编译器版本题目、或者是 CUDA 驱动版本题目。

  • 推理时显存不足

    • 可以实验 8-bit 或 4-bit 量化,但官方暂未提供现成的量化脚本。
    • 另外也可以把 max_dynamic_patch 这种限定调小,让视觉 token 不要太多。

  • 如何更换本身的数据

    • 需要注意你本身的图像/视频/语音路径和实际 json 的 image, audio 字段匹配上;
    • 如果想在训练中混合“本身的语音+文本+图像”,要细致设置 DataConfig 里的各种路径字典。

  • 如何持续升级到 VITA-2.0

    • 根据团队的新闻,后续大概还会有更多版本;如果你计划本身对语音解码器做改进,可以参照他们在 Stage 3.2 的训练代码,先把 LLM 冻结只训练 AR/NAR 解码器,就不破坏已有多模态能力。


总结:从 VITA-1.5 看多模态实时交互的将来

个人理解的这篇论文的重点内容:

  • 三阶段训练

    • 先学视觉,再学语音输入,最后加语音输出,循序渐进地融合差别模态,最大程度保留各自性能而镌汰辩论。

  • 端到端语音

    • 不再依靠外部 TTS 模块,而是直接在模子内部实现了语音 token 的天生与解码,通过 TiCodec 还原为波形,降低延迟、增强了实时交互体验。

  • 快速推理

    • 从之前的 4 秒降到 1.5 秒,已经算是可以继承的近实时语音对话。

就像 VITA-1.5 的论文里所说,它为多模态交互提供了一条很有远景的思绪:在同一个 LLM 框架内做“同一建模”,不再拆分成独立的 ASR、TTS、视觉识别等模块,而是通过 Token 化的方式把音频和图片都融入同一个 Transformer。将来若再参加更多模态(好比动作捕捉、体感信号等),大概也只是“再加一些 token 的事情”,大模子会愈发成为一个真正能“看、听、说、理解”的全能 AI 中枢。

预报

   本博主预备结合浩繁开源项目与社区的开源工作:LLaVA-1.5, Bunny, ChatUnivi, InternVL, InternViT, Qwen-2.5, VLMEvalkit, Mixtral 8*7B等实验复现ChatGPT4O的高级语言能力,请持续关注。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表