多段视频怎样批量送给 Audio-Visual Flamingo?

文章导读
多段视频批量送给 Audio-Visual Flamingo,核心是把单视频推理封装成循环,再统一处理输入输出。实际工作量集中在视频预处理和结果收集,模型本身不需要额外改动。关键在于确认模型接受的输入格式(视频帧序列、音频采样、文本提示等),以及批量过程中如何控制显存和内存占用。
📋 目录
  1. A 先拆解批量任务
  2. B 批量处理代码骨架
  3. C 预处理与显存控制
  4. D 验证清单
  5. E 常见问题
A A

多段视频批量送给 Audio-Visual Flamingo,核心是把单视频推理封装成循环,再统一处理输入输出。实际工作量集中在视频预处理和结果收集,模型本身不需要额外改动。关键在于确认模型接受的输入格式(视频帧序列、音频采样、文本提示等),以及批量过程中如何控制显存和内存占用。

Audio-Visual Flamingo 本身没有单独的“批量模式”,多段视频处理应通过脚本循环实现。你需要统一视频采样参数(帧率、时长、音频采样率),每次推理前清空临时缓存,并将结果持久化到磁盘。具体调用方式取决于你用的实现版本,建议先单视频跑通,再扩展成批量。

先拆解批量任务

批量处理就是重复执行“读取视频 -> 预处理 -> 模型推理 -> 写结果”的循环。Audio-Visual Flamingo 通常接收视觉 token 和音频 token,不同实现可能要求你自行提取视频帧和音频波形。因此先确认几件事:模型输入是视频路径还是预处理后的张量?每个视频允许的最大长度?是否支持 batch 推理?如果模型本身不支持 batch,就只能串行跑,此时瓶颈在预处理速度和单次推理时间。

如果有多张 GPU,可以按视频文件分片,用多进程把不同视频分配给不同卡。但要注意每个进程都要提前加载模型,显存需求会翻倍。若显存不足,仍建议串行。

批量处理代码骨架

下面给一个通用 Python 脚本框架,假设已有 load_modelinfer_on_video 两个函数。你需要根据实际所用模型库(如 transformers 或原始代码)替换内部实现。

多段视频怎样批量送给 Audio-Visual Flamingo?
import glob
import os
import json
import torch

def load_model():
    # 根据你的 Flamingo 实现加载模型
    pass

def infer_on_video(model, video_path, text_prompt='描述这个视频'):
    # 这一步负责视频帧采样、音频提取、token化,然后调用 model.generate()
    pass

def batch_inference(video_dir='./videos', output_dir='./results', model=None):
    os.makedirs(output_dir, exist_ok=True)
    video_paths = glob.glob(os.path.join(video_dir, '*.mp4')) + glob.glob(os.path.join(video_dir, '*.avi'))
    video_paths.sort()
    for video_path in video_paths:
        try:
            result = infer_on_video(model, video_path)
            base = os.path.splitext(os.path.basename(video_path))[0]
            result_file = os.path.join(output_dir, base + '.json')
            with open(result_file, 'w') as f:
                json.dump({'video': video_path, 'text': result}, f)
            print('done: ' + video_path)
        except Exception as e:
            print(f'failed: {video_path}: {e}')

if __name__ == '__main__':
    model = load_model()
    batch_inference(model=model)

使用时把视频目录下的 mp4/avi 文件依次处理,结果以 JSON 文件按同名保存。该骨架默认逐条推理,不设 batch,最稳。建议先跑一个视频,确认 infer_on_video 能正确输出文本,再放到全量目录里跑。

这段代码适用于模型输入是文件路径的场景;如果模型只接受预处理后的张量,你需要把视频读取逻辑放进 infer_on_video 内部。验证方式是先手动调用一次 infer_on_video,检查输出类型。风险是视频文件损坏或解码失败会导致整个脚本中断,上面加了 try/except 跳过坏视频,但被跳过的视频不会出现在输出 JSON 中,最后统计时要留意。

多段视频怎样批量送给 Audio-Visual Flamingo?

预处理与显存控制

视频长度直接影响显存占用。Flamingo 类模型通常会把视频抽帧为固定数量的视觉 token,音频也会变成固定长度特征。如果视频过长,要先截断或抽帧。建议设定一个最大帧数(例如 8 帧或 12 帧),超出就均匀抽样。验证方式是查看输入特征张量形状,确认没有超出模型支持的最大 token 数。

每处理完一个视频,如果模型显存没有释放,可以用 torch.cuda.empty_cache(),但效果有限。更可靠的是把一次推理放在子进程中,结束后销毁进程,但这会损失模型重新加载的开销。权衡后建议保持同进程运行,只要单视频不爆显存就可以。

如果你坚持要使用真 batch 来提升吞吐,需要把多个视频的预处理结果 padding 到相同长度。由于不同视频时长可能差很多,padding 后计算量浪费也大,通常收益不明显。建议优先串行,只有当你的视频长度都接近时才考虑 batch。

多段视频怎样批量送给 Audio-Visual Flamingo?

验证清单

  • 单视频推理结果正确,且输出文本与预期相关。
  • 不同格式(mp4/avi/mov)都能被预处理函数识别,或者先统一转码成 mp4。
  • 输入张量形状符合模型要求,例如视觉 token 数量固定,音频特征与模型训练时一致。
  • 批量运行时监控 GPU 显存:如果随时间递增,可能存在内存泄漏,需要检查是否有缓存未释放。
  • 结果文件夹中的 JSON 文件数量等于成功处理的视频数量,且内容非空。

常见问题

批量时模型会自动使用 batch 吗?

不会。Flamingo 类模型没有自动组合多个视频的机制,需要你手动把预处理结果拼成 batch。拼接时要注意不同视频的帧数差异,使用 padding 会引入无效 token,可能导致输出质量下降。如果不想处理 padding,直接串行更稳妥。

视频没有音频怎么输入?

Audio-Visual Flamingo 通常要求音频和视频同时存在。如果实际数据没有音轨,可以先用 ffmpeg 生成静音音轨,或者根据模型配置传入零向量。具体支持方式要看你的模型实现,建议阅读该实现的输入定义,不要直接传空数组。