这是一个原生多模态大模型(Native Multimodal LLM)的实战架构实现。
不同于传统的“适配器”模式,本项目探索了视频(视觉)、音频(听觉)与文本在 Transformer 底层进行的原生交错(Interleaved)融合。项目包含完整的从零构建的数据处理管道、感知层架构(Vision/Audio Encoders)、信息压缩瓶颈(Perceiver Resampler)以及与量化版 Llama-3 (8B) 的对齐训练代码。
- 原生多模态融合:抛弃简单的 Late Fusion,采用视频流、音频流与文本流在时间轴上交错拼接的架构。
- 时空对齐机制:实现了基于时间戳的严格视听对齐,并引入可学习的时间位置编码(Temporal Positional Embedding)。
- 信息压缩瓶颈:内置 Perceiver Resampler,将高维稀疏的视听特征压缩为紧凑的 Latent Tokens(例如 10秒视频仅占用 400 Tokens),极大降低 LLM 上下文压力。
- 消费级显卡适配:集成了 QLoRA (4-bit Quantization) 和 混合精度训练 (AMP),支持在单张 RTX 3090/4090 上进行端到端训练。
- 模块化设计:数据处理、模型架构、训练循环完全解耦,易于二次开发。
.
├── raw_videos/ # [数据源] 存放原始 MP4 视频文件
├── checkpoints/ # [输出] 训练过程中保存的模型权重
├── models/ # [模型] 训练所选用的基座模型,现在用qwen通过download_qwen.py下载
├── dataset_maker.py # [核心] 数据清洗、切片、特征提取与 Dataset 类定义
├── model.py # [核心] 视觉/听觉编码器、Resampler 及 Llama-3 封装类
├── train.py # [入口] 完整的单机训练脚本(含配置项)
├── download_qwen.json # [下载] 下载qwen模型的脚本
├── app_demo.py # [应用] 基于 Gradio 的流式交互演示脚本
├── dataset_meta.json # [索引] 数据集的元数据描述文件
└── README.md # 项目说明文档
为了确保代码能够稳定运行,建议创建一个全新的 Conda 虚拟环境。
# 创建名为 multimodal 的环境,使用 Python 3.10
conda create -n multimodal python=3.10 -y
conda activate multimodal本项目依赖 PyTorch 生态、Hugging Face 生态以及 Gradio。请按顺序执行:
# 1. 安装 PyTorch (建议根据你的 CUDA 版本去 pytorch.org 获取最新命令)
# 示例为 CUDA 11.8/12.x
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 2. 安装 Hugging Face 及量化库
pip install transformers accelerate bitsandbytes huggingface_hub
# 3. 安装数据处理与交互工具
pip install opencv-python numpy tqdm einops gradio或者,你可以创建一个 requirements.txt 文件并运行 pip install -r requirements.txt:
torch>=2.1.0
torchvision
torchaudio
transformers>=4.40.0
accelerate>=0.29.0
bitsandbytes>=0.43.0
huggingface_hub
opencv-python
einops
tqdm
numpy
gradio
由于 Meta Llama 3 是门控模型(Gated Model),你必须拥有访问权限才能下载。
- 前往 Meta Llama 3 HF 页面 申请访问权限。
- 在 Hugging Face 设置页获取你的 Access Token。
- 修改代码:打开
train.py,找到TrainingConfig类:
# train.py
class TrainingConfig:
# ... 其他配置 ...
# [TODO] 请将下方的字符串替换为你自己的 Hugging Face Token (以 hf_ 开头)
# 如果你已经在终端使用了 `huggingface-cli login`,这里可以设为 None
HF_TOKEN = "hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - 将你的
.mp4视频放入raw_videos/文件夹。 - 确保
dataset_meta.json中的file_name与文件名一致。
python train.py训练完成后(或使用随机权重测试),可以启动 Web 界面进行视频理解对话:
python app_demo.py本项目对 LLM 是解耦的,更换模型非常简单,只需修改 train.py 中的配置:
- 打开
train.py。 - 修改
TrainingConfig类中的MODEL_PATH:
class TrainingConfig:
# 示例:换成 Mistral-7B
MODEL_PATH = "mistralai/Mistral-7B-v0.1"
# 示例:换成 Qwen2-7B (对国内用户更友好,无需 Token)
# MODEL_PATH = "Qwen/Qwen2-7B-Instruct"注意:代码会自动检测新模型的 Hidden Size(如 4096 或 5120)并自动调整投影层(Projector),通常无需修改网络架构代码。
如果你在运行中遇到 OOM (Out of Memory) 错误,请尝试以下优化:
- 开启 4-bit 量化:确保
train.py中LOAD_IN_4BIT = True。 - 减小 Batch Size:将
BATCH_SIZE设为 1。 - 增加梯度累积:将
GRAD_ACC_STEPS增大(如从 8 改为 16),以保持等效 Batch Size 不变。
提示:反之,如果你的显存非常充裕(如使用 A100),可以在
train.py中注释掉梯度检查点(Gradient Checkpointing)相关代码,以获得更快的训练速度。
[Input Video] --(Sparse Sample)--> [Frames] --(ViT)--> [Visual Features]
|
(Perceiver Resampler) <--- [Latent Queries]
|
[Visual Tokens] (32 tokens/sec)
|
v
[Concat & Interleave] <--- [Audio Tokens]
|
v
[Multimodal Sequence] + [Text Embeddings]
|
v
[ Llama-3 (Frozen) ]
|
v
[Next Token Prediction]
本项目仅供学术研究与技术交流使用。使用 Llama 3 模型权重需遵守 Meta Community License。