● Paper:https://arxiv.org/pdf/2406.08085v1
● Github:https://github.com/IVG-SZ/Flash-VStream?tab=readme-ov-file#structure
● HuggingFace:https://huggingface.co/spaces/IVGSZ/Flash-VStream-demo
● Author:Haoji Zhang et al., 清华、字节
文章目录
- 1 Flash-VStream总结(省流版)
- 1.1 Flash-VStream是什么?
- 1.2 Flash-VStream能干什么?
- 2 Motivation
- 3 模型结构
- 3.1 Visual Encoder
- 3.2 STAR: Spatial-Temporal-Abstract-Retrieved memory
- 3.2.1 Spatial memory
- 3.2.2 Tempooral memory
- 3.2.3 Abstract memory
- 3.2.4 Retrieved memory
- 3.2.5 完整过程
- 3.3 Real-time LLM Decoder
- 4 实现细节
- 4.1 训练流程
- 4.2 训练策略
- 5 VStream-QA:在线视频流问答benchmark
- 6 Results
- 7 实测
- 8 个人想法
1 Flash-VStream总结(省流版)
1.1 Flash-VStream是什么?
Flash-VStream是由来自于清华和字节的研究团队开发的一个视频问答模型(VideoQA),
- 通过设计一种名为STAR的内存机制来实现在有限计算资源的前提下,能处理极长的视频流;
- 开源了一个新的VideoQA Benchmark:VStream-QA Benchmark
1.2 Flash-VStream能干什么?
能实时分析长视频流,并响应用户的问题。其实现方式为开2个异步进程:
- 处理视频:帧处理程序进程,visual encoder + STAR内存整合
- 响应用户提问:问题处理程序进程,LLM + STAR内存读取 + 与用户的交互
2 Motivation
现有的模型无法处理长视频问答: 连续帧之间的视觉标记存在大量冗余且没有被有效压缩,导致在有限的GPU内存中无法保存所有的视觉特征,增加了语言模型的解码延迟;作者针对以上的问题,做了以下的工作:
- 引入STAR的内存机制来压缩必要的视觉信息,同时忽略连续帧之间的冗余,这样就可以处理极长的视频流并响应用户查询;
- Flash-VStream在保持先进性能的同时,显著降低了推理延迟和GPU内存消耗;
- 开源了VStream-QA benchmark,一个为在线环境中的设计的视频理解的QA benchmark,数据主要由question-answer-timestamp构成;
3 模型结构
- Visual Encoder:CLIP ViT-L,处理连续视频帧的流式视觉编码器
- Spatial-Temporal-Abstract-Retrieved(STAR) memory mechanism:时空抽象检索内存机制
- LLM解码器:Vicuna-7B,实时响应用户提出的问题
使用2个异步的进程: - 帧处理程序进程:visual encoder + STAR内存整合
- 问题处理程序进程:LLM + STAR内存读取 + 与用户的交互
3.1 Visual Encoder
CLIP ViT-L:给定视频帧V(HxWx3),将其编码为feature map(PxPxD),其中PxP式ViT patch tokens,D是维度。
3.2 STAR: Spatial-Temporal-Abstract-Retrieved memory
3.2.1 Spatial memory
空间记忆容纳短期使用的最新的且详细的空间信息,并以FIFO队列的形式实现。
M
s
p
a
t
=
M
b
u
f
f
t
[
0
:
N
s
p
a
,
:
,
:
]
M
s
p
a
∈
R
N
s
p
a
×
P
s
p
a
2
×
D
M_{spa}^{t} = M_{buff}^t [0: N_{spa}, :, :] \\ M_{spa} \in R^{N_{spa} \times P_{spa}^2 \times D}
Mspat=Mbufft[0:Nspa,:,:]Mspa∈RNspa×Pspa2×D
其中buff空间论文中设置为300,即缓存最新的300帧视觉信息。
3.2.2 Tempooral memory
时间记忆随着时间推移整合动态信息,其大小超过
N
t
e
m
N_{tem}
Ntem时,使用加权k-means聚类,该策略将记忆内容压缩至
N
t
e
m
N_{tem}
Ntem个聚类中心,可以看作是视频中关键事件的表示。新的cluster被用作新的memroy,以有效的存储时间上下文。
M
t
e
m
t
=
g
w
k
m
e
a
n
s
(
c
o
n
c
a
t
(
g
p
o
o
l
i
n
g
(
e
t
,
P
t
e
m
)
,
M
t
e
m
t
−
1
)
,
N
t
e
m
)
M
t
e
m
∈
R
N
t
e
m
×
P
t
e
m
2
×
D
M_{tem}^{t} = g_{wkmeans}(concat(g_{pooling}(e^t, P_{tem}), M_{tem}^{t-1}), N_{tem}) \\ M_{tem} \in R^{N_{tem} \times P_{tem}^2 \times D}
Mtemt=gwkmeans(concat(gpooling(et,Ptem),Mtemt−1),Ntem)Mtem∈RNtem×Ptem2×D
3.2.3 Abstract memory
抽象记忆通过语义注意力模型支持高级语义概念解释。基于以下公式将从时间和空间记忆中的获得的insight抽象为更抽象的、可操作的知识。
M
a
b
s
t
=
f
S
A
(
M
a
b
s
t
−
1
,
g
p
o
o
l
i
n
g
(
e
t
,
P
a
b
s
)
,
N
a
b
s
)
M
a
b
s
∈
R
N
a
b
s
×
P
a
b
s
2
×
D
M_{abs}^{t} = f_{SA}(M_{abs}^{t-1}, g_{pooling}(e^t, P_{abs}), N_{abs}) \\ M_{abs} \in R^{N_{abs} \times P_{abs}^2 \times D}
Mabst=fSA(Mabst−1,gpooling(et,Pabs),Nabs)Mabs∈RNabs×Pabs2×D
3.2.4 Retrieved memory
检索记忆侧重于识别和检索最本质的frame feature来回忆最精确的空间细节(spatial details)。首先从temporal memory的
N
t
e
m
N_{tem}
Ntem个clusters中悬着前K(
K
=
N
r
e
t
K=N_{ret}
K=Nret)个最大的聚类中心,然后检索特征缓冲区中距离这k个cluster最近的帧特征,以用更详细的空间信息补充时间记忆。
M
r
e
t
t
=
g
r
e
t
r
i
e
v
e
(
M
b
u
f
f
t
,
M
t
e
m
t
,
N
r
e
t
)
M
r
e
t
∈
R
N
r
e
t
×
P
s
p
a
2
×
D
M_{ret}^{t} = g_{retrieve}(M_{buff}^t, M_{tem}^t, N_{ret}) \\ M_{ret} \in R^{N_{ret} \times P_{spa}^2 \times D}
Mrett=gretrieve(Mbufft,Mtemt,Nret)Mret∈RNret×Pspa2×D
3.2.5 完整过程
具体来说,一个新的特征
e
t
e^t
et,即最新一帧的frame features被写入STAR内存的过程如下所示:
1、先平均池化到
P
s
p
a
P_{spa}
Pspa尺寸,再与t-1沿时间维度拼接,最后取最新的
N
b
u
f
f
N_{buff}
Nbuff个特征
M
b
u
f
f
t
=
c
o
n
c
a
t
(
g
p
o
o
l
i
n
g
(
e
t
,
P
s
p
a
)
,
M
b
u
f
f
t
−
1
)
[
0
:
N
b
u
f
f
,
:
,
:
]
M_{buff}^{t} = concat(g_{pooling}(e^t, P_{spa}), M_{buff}^{t-1})[0:N_{buff, :, :}]
Mbufft=concat(gpooling(et,Pspa),Mbufft−1)[0:Nbuff,:,:]
2、更新
M
s
p
a
M_{spa}
Mspa,从
M
b
u
f
f
M_{buff}
Mbuff中取最新的
N
s
p
a
N_{spa}
Nspa特征
M
s
p
a
t
=
M
b
u
f
f
t
[
0
:
N
s
p
a
,
:
,
:
]
M_{spa}^{t} = M_{buff}^t [0: N_{spa}, :, :]
Mspat=Mbufft[0:Nspa,:,:]
3、更新
M
t
e
m
M_{tem}
Mtem,先平均池化大
P
t
e
m
P_{tem}
Ptem尺寸,再与之前的特征拼接,再使用wk-means得到新的
N
t
e
m
N_{tem}
Ntem个特征
M
t
e
m
t
=
g
w
k
m
e
a
n
s
(
c
o
n
c
a
t
(
g
p
o
o
l
i
n
g
(
e
t
,
P
t
e
m
)
,
M
t
e
m
t
−
1
)
,
N
t
e
m
)
M_{tem}^{t} = g_{wkmeans}(concat(g_{pooling}(e^t, P_{tem}), M_{tem}^{t-1}), N_{tem})
Mtemt=gwkmeans(concat(gpooling(et,Ptem),Mtemt−1),Ntem)
4、更新
M
a
b
s
M_{abs}
Mabs,将之前的
M
a
b
s
M_{abs}
Mabs作为Q,特征池化到
P
a
b
s
P_{abs}
Pabs尺寸作为K,QK^T得到的权重加权最新的特征,(1-α)则加权
M
a
b
s
M_{abs}
Mabs,两者相加即为新的
M
a
b
s
M_{abs}
Mabs。
M
a
b
s
t
=
f
S
A
(
M
a
b
s
t
−
1
,
g
p
o
o
l
i
n
g
(
e
t
,
P
a
b
s
)
,
α
)
M_{abs}^{t} = f_{SA}(M_{abs}^{t-1}, g_{pooling}(e^t, P_{abs}), \alpha)
Mabst=fSA(Mabst−1,gpooling(et,Pabs),α)
5、更新
M
r
e
t
M_{ret}
Mret:在
M
t
e
m
M_{tem}
Mtem中选择
N
r
e
t
N_{ret}
Nret个最大的聚类中心,再在
M
b
u
f
f
M_{buff}
Mbuff中寻找距离这
N
r
e
t
N_{ret}
Nret聚类中心最近的
M
r
e
t
t
=
g
r
e
t
r
i
e
v
e
(
M
b
u
f
f
t
,
M
t
e
m
t
,
N
r
e
t
)
M_{ret}^{t} = g_{retrieve}(M_{buff}^t, M_{tem}^t, N_{ret})
Mrett=gretrieve(Mbufft,Mtemt,Nret)
3.3 Real-time LLM Decoder
当在时间t被问题Q触发后,LLM decode首先计算text embedding:
I
t
e
x
y
t
=
f
e
m
b
e
d
(
Q
t
)
I_{texy}^t = f_{embed}(Q^t)
Itexyt=fembed(Qt)
再通过projector层将STAR memory映射到embedding空间:
M
t
=
M
s
p
a
t
+
M
t
e
m
t
+
M
a
b
s
t
+
M
r
e
t
t
I
v
i
s
i
o
n
t
=
f
p
r
o
j
(
M
t
)
M^t = M_{spa}^t + M_{tem}^t + M_{abs}^t + M_{ret}^t\\ I_{vision}^t = f_{proj}(M^t)
Mt=Mspat+Mtemt+Mabst+MrettIvisiont=fproj(Mt)
基于vision embedding和text embedding生成答案:
A
t
=
f
L
L
M
(
I
t
e
x
t
t
,
I
v
i
s
i
o
n
t
)
A^t = f_{LLM}(I_{text}^t, I_{vision}^t)
At=fLLM(Itextt,Ivisiont)
4 实现细节
- Visual encoder:CLIP ViT-L/14-224px
- Projector:2-layer-MLP
- LLM decoder:Vicuna-7B
其他: - 各memory尺寸: P s p a = 8 , P t e m = 4 , P a b s = 1 P_{spa}=8, P_{tem} =4, P_{abs}=1 Pspa=8,Ptem=4,Pabs=1
- 各memory数量:
N
b
u
f
f
=
300
,
N
s
p
a
=
1
,
N
t
e
m
=
N
a
b
s
=
25
,
N
r
e
t
=
3
N_{buff}=300, N_{spa}=1, N_{tem}=N_{abs}=25, N_{ret}=3
Nbuff=300,Nspa=1,Ntem=Nabs=25,Nret=3
buff区间最多缓存300帧特征,spa特征就是当前帧的特征,tem和abs都是记录最新25帧的特征,ret是在buff中选择3个与tem最大三个聚类中心最近的特征。
4.1 训练流程
- Stage1:modality alignment
- image-caption pairs:LLaVA-filtered-558k
- video-caption pairs:LLaMA-VID-filtered-232k
- Stage2:instruction tuning
- image-QA pairs:LLaVA-filtered-665k
- video-QA pairs:Video-ChatGPT-filtered-98K
4.2 训练策略
- 所有stage都在8张A100上训练1 epoch,15hours
- visual encoder参数冻结
- LLM尽在stage1冻结,stage2训练
- 训练和推理均在BF16精度下
5 VStream-QA:在线视频流问答benchmark
包含2个部分:
- VStream-QA-Ego:评估第一视角、以自我为中心的理解
- 来自于Ego4D的10个长度为一个小时的视频切片,1.5k个question-answer-timestamp
- topics:[’cooking’, ’playing-card’, ’writing’, ’home-maintenance’, ’sightseeing’, ’reading’]
- VStream-QA-Movie:评估第三视角、情节理解
- 来自于MovieNet的22个长度为30分钟的电影切片,2k个question-answer-timestamp
- genres:[“Action”, “Adventure”, “Sci-Fi”, “Crime”, “Drama”, “Thriller”, “War”, “Mystery”, “Comedy”, “Fantasy”, “History”, “Biography”, “Horror”]
特点:
- 每个QA对包含一个特定的时间戳,且只与该时间戳之前的内容有关;
- 视频时间长:30min~60min
- 涵盖各种视频源和5类问题类型
6 Results
7 实测
NVIDIA A100测试
- 单帧frame编码:~0.25s
- 前向:~0.25s
但是采用的帧率为1fps,假设视频时长为30min,question针对整个视频,则anwser响应时间为7.5min。因此该方法适合于实时视频流
8 个人想法
处理实时视频流/长视频,如何对视频进行有效的编码和缓存是关键,Flash-VStream提出的STAR记忆机制,开了一个比较大的buff空间去缓存最新的300帧特征,
- 空间特征则直接取最新的特征
- 时间记忆则通过聚类的方式来更新
- 抽象记忆通过attention的方式得到权重值,将最新的特征加权到抽象记忆特征中
- 检索记忆则是在时间记忆中选取最大k个聚类中心,再从buff中选取离这些聚类中心最近k特征出来
问题:
- 空间、时间、抽象特征本质上是视频帧通过不同尺寸的池化方式得到的,根据时间特征的最大聚类中心去检索buff中的样本是否有道理?如果可以跟question做一些交互,根据question去做检索感觉效果会更好;
- STAR处理之后,再相加得到的结果与question进行交互并产生答案,之前的一系列的操作均与question无关,如果能建立于问题的联系,感觉会更有效果;
- 另外,该模型对于视频帧是逐帧编码的,对于高帧率视频,会存在大量的信息冗余,是否存在更有效的处理方式,如video-lavit中的关键帧+运动向量