开源项目 | 多模态大模型VILA:强大的视频理解和多图理解能力

开源项目 | 多模态大模型VILA:强大的视频理解和多图理解能力
#1024程序员节 | 征文#

简介

VILA 是一种视觉语言模型 (VLM),使用大规模交错图像文本数据进行预训练,可实现视频理解多图像理解功能。

VILA 可通过AWQ 4 位量化和TinyChat框架部署在边缘端。我们发现:

(1)图文对还不够,图文交错是必要的;
(2)在交错的图文预训练期间解冻LLM可以实现上下文学习;
(3)重新混合纯文本指令数据对于提升VLM和纯文本性能至关重要;
(4)令牌压缩扩展了#video 帧。

VILA 推出了更强大的功能,包括:视频推理、情境学习、视觉思维链和更好的世界知识

项目地址:https://github.com/NVlabs/VILA

引言

大语言模型(LLMs)已经展示了在自然语言任务中的卓越能力。通过增强LLMs以支持视觉输入,最终模型可以继承一些吸引人的属性,如指令遵循、零样本泛化以及少样本上下文学习(ICL),从而赋能各种视觉语言任务。

本文研究了视觉语言模型(VLM)的预训练过程,旨在通过逐步可控的比较来增强视觉语言模型的性能。具体来说,研究了在预训练过程中冻结大型语言模型(LLM)的影响,交错预训练数据的效果,以及在微调过程中重新混合纯文本指令数据的作用。

如何在预训练过程中有效地结合视觉和文本信息,如何在不影响纯文本任务的情况下进行视觉语言任务的训练,以及如何提高模型的零样本和上下文学习(ICL)能力。

该问题的研究相关工作包括对视觉语言模型的训练方法进行研究,特别是对图像-文本对的预训练和微调过程的研究。已有工作主要集中在通过监督微调(SFT)或人类反馈强化学习(RLHF)来改进视觉语言指令调优过程,但缺乏对预训练过程的深入研究。

www.zeeklog.com  - 开源项目 | 多模态大模型VILA:强大的视频理解和多图理解能力

图1 与最近的方法相比,VILA的增强视觉语言预训练在下游任务准确性上持续提高。

方法概述

VILA,一种新的视觉语言模型预训练方法,用于解决视觉语言模型在零样本和上下文学习方面的性能不足问题。具体来说,

冻结LLM的预训练:首先,研究了在预训练过程中冻结LLM的效果。冻结LLM可以实现不错的零样本性能,但缺乏上下文学习能力。为了提高上下文学习能力,需要在预训练过程中更新LLM。

www.zeeklog.com  - 开源项目 | 多模态大模型VILA:强大的视频理解和多图理解能力

图2 研究了自回归视觉语言模型,其中图像被分词并输入到大型语言模型的(LLMs)中。我们发现更新LLMs对于上下文学习能力至关重要,而交错语料库有助于预训练。与仅文本数据联合的SFT有助于保持仅文本能力。

交错预训练数据:其次,研究了交错预训练数据的效果。交错图像-文本数据比单独的图像-文本对更有利于预训练,因为它提供了更准确的梯度更新,并且能够保持纯文本能力。

www.zeeklog.com  - 开源项目 | 多模态大模型VILA:强大的视频理解和多图理解能力

图4 MMC4数据集的一个样本,包括交错图像和文本片段。图像放在相应文本之前。文本对图像的条件较弱:只有彩色文本才能借助图像更好地推断出来。

联合SFT最后,研究了在微调过程中重新混合纯文本指令数据的效果。重新混合纯文本指令数据不仅可以弥补纯文本任务的退化,还可以提高视觉语言任务的准确性。

实验细节

数据收集:使用了MMC4和COYO两种图像-文本数据集进行预训练。MMC4数据集包含交错的图像和文本段,而COYO数据集则包含较短的文本描述。为了增加数据多样性,还使用了LLaVA-1.5的SFT数据进行联合微调。

实验设置:实验分为三个阶段:投影仪初始化、视觉语言预训练和视觉指令微调。在预训练阶段,分别使用线性层和Transformer块作为投影仪。在微调阶段,将现有的视觉语言数据集转换为FLAN风格的数据,并加入1M的纯文本指令数据进行联合微调。

参数配置:使用了Llama-2 7B和13B两种LLM模型进行实验。预训练数据总共包含约50M张图像。微调数据来自多个视觉语言数据集,包括VQA、DocVQA、GQA等。

实验结果分析

冻结LLM的预训练效果:冻结LLM在预训练过程中可以实现不错的零样本性能,但在上下文学习能力方面表现较差。更新LLM后,模型的上下文学习能力显著提高。

www.zeeklog.com  - 开源项目 | 多模态大模型VILA:强大的视频理解和多图理解能力

表1. 关于是否训练大语言模型(**LLM**)或冻结LLM并在视觉语言预训练(PreT)期间仅进行提示调优的消融研究。有趣的是,在预训练期间冻结LLM并不会降低0次尝试的准确性,但会导致上下文学习能力变差(4次尝试更差)。使用一个简单的线性投影器迫使LLM学习更多内容,并导致更好的泛化能力。本文报告了VQA数据集(OKVQA、TextVQA)的准确性和CIDEr评分,用于摘要(COCO和Flickr)。注意:仅为了消融研究使用了不同的评估设置;在这种设置中的绝对值较低,不应与其他工作进行比较。

交错预训练数据的效果:使用交错的图像-文本数据进行预训练比单独的图像-文本对更有效。交错数据提供了更准确的梯度更新,并且能够保持纯文本能力。

www.zeeklog.com  - 开源项目 | 多模态大模型VILA:强大的视频理解和多图理解能力

图7 VILA通过交错图像文本预训练而不是单一的图像-文本对,具有更好的上下文学习能力。输入两个图像+文本对和第三个图像作为上下文来提示VLM。LLaVA由于**OCR**能力有限而未能通过第一个样本,并且通过重复第二个样本的语义而未能通过第三个示例。

联合SFT的效果:在微调过程中重新混合纯文本指令数据不仅可以弥补纯文本任务的退化,还可以提高视觉语言任务的准确性。联合SFT使得模型在预训练时使用短文本时也能解锁全部的好处。

www.zeeklog.com  - 开源项目 | 多模态大模型VILA:强大的视频理解和多图理解能力

图8 该模型能够在给定视觉输入的情况下进行连锁推理。当在提示中添加“一步步来思考”时,它能够生成正确的答案。

项目部署

安装基础环境

git clone https://github.com/NVlabs/VILA.git
./environment_setup.sh vila

训练

第 1 步:对齐

利用 LLaVA-CC3M-Pretrain-595K 数据集来对齐文本和视觉模式。

第一阶段脚本接受两个参数,它可以在单个 8xA100 节点上运行。BASE_MODEL_PATH指向在线或本地 Huggingface 存储库,例如NousResearch/Llama-2-7b-hfOUTPUT_NAME指向checkpoints下的目标目录,该目录将在之后保存经过训练的多模态投影仪。

bash scripts/v1_5/paper/1_mm_align.sh [BASE_MODEL_PATH] [OUTPUT_NAME]
第 2 步:预训练

使用 MMC4 和 Coyo 数据集来训练具有交错图像文本对的 VLM。

bash scripts/v1_5/paper/2_pretrain_mmc4_coyo.sh [CODE_PATH] [BASE_MODEL_PATH] [STAGE1_PATH] [OUTPUT_NAME]

第二阶段脚本包含四个参数。CODE_PATH是 VILA 代码库的绝对路径, BASE_MODEL_PATH与第一阶段脚本中的含义类似。STAGE1_PATH指向阶段 1 的OUTPUT_NAME (即存储阶段 1 检查点的位置)。OUTPUT_NAMEcheckpoints下保存预训练检查点的所需文件夹名称。我们为此阶段提供的脚本在 slurm 上执行,我们预计它在 16 个节点(128 个 GPU)上执行。

第 3 步:监督微调

这是 VILA 训练的最后阶段,我们调整模型以遵循 M3IT、FLAN 和 ShareGPT4V 子集上的多模式指令。该阶段在 8xA100 节点上运行。

bash scripts/v1_5/paper/3_sft.sh [STAGE2_PATH] [OUTPUT_NAME]

推理

Llama-3-VILA1.5-8B 推论:

python -W ignore llava/eval/run_vila.py \
    --model-path Efficient-Large-Model/Llama-3-VILA1.5-8b-Fix \
    --conv-mode llama_3 \
    --query "<image>\n Please describe the traffic condition." \
    --image-file "av.png"

VILA1.5-40B推论:

python -W ignore llava/eval/run_vila.py \
    --model-path Efficient-Large-Model/VILA1.5-40b \
    --conv-mode hermes-2 \
    --query "<image>\n Please describe the traffic condition." \
    --image-file "av.png"

VILA1.5-3B视频推理:

python -W ignore llava/eval/run_vila.py \
    --model-path Efficient-Large-Model/VILA1.5-3b \
    --conv-mode vicuna_v1 \
    --query "<video>\n Please describe this video." \
    --video-file "demo.mp4"

提炼关键问题

问题1:在预训练过程中,为什么冻结大型语言模型(LLM)会导致上下文学习能力下降?

冻结LLM在预训练过程中可以实现不错的零样本性能,但缺乏上下文学习能力。这是因为LLM的深层嵌入对齐对于上下文学习至关重要。

当冻结LLM时,尽管其零样本性能不受影响,但在微调阶段进行上下文学习时,LLM无法适应新的视觉输入,导致上下文学习能力下降。具体来说,LLM的深层嵌入在预训练过程中需要与视觉输入进行对齐,以便在微调时能够更好地处理视觉任务。冻结LLM阻止了这一对齐过程,从而影响了其上下文学习能力。

问题2:交错预训练数据相比单独的图像-文本对在预训练中有哪些优势?

更准确的梯度更新:交错预训练数据提供了更丰富的视觉和文本对,使得模型在预训练过程中能够获得更准确的梯度更新,从而更快地收敛。

保持纯文本能力:交错数据结构允许模型在预训练过程中同时学习视觉和文本信息,而不会完全遗忘纯文本任务的能力。相比之下,单独的图像-文本对可能会导致模型在预训练过程中过度依赖视觉信息,从而遗忘纯文本任务。

更好的泛化能力:由于交错数据提供了更多的上下文信息,模型在微调阶段能够更好地泛化到新的视觉语言任务上。

问题3:在微调过程中重新混合纯文本指令数据有哪些具体好处?

弥补纯文本任务的退化:重新混合纯文本指令数据可以弥补在预训练过程中由于使用短文本而导致的纯文本任务退化。

提高视觉语言任务的准确性:联合微调纯文本指令数据不仅能够恢复纯文本任务的性能,还能进一步提高视觉语言任务的准确性。这是因为纯文本指令数据提供了更强的指令跟随能力,这对于视觉语言任务非常重要。

解锁全部好处:通过联合微调,模型在使用短文本进行预训练时也能解锁全部的好处,从而在零样本和上下文学习方面表现更好。

推荐阅读

Read more

Javaweb项目上下文路径与前端相对路径和绝对路径解析

Javaweb项目上下文路径与前端相对路径和绝对路径解析

一、Javaweb项目上下文路径 在Java Web项目中,上下文路径是指Web应用程序在服务器上的部署路径。当一个Web应用程序被部署到服务器上时,会被分配一个唯一的上下文路径,用来访问该应用程序。 具体来说,上下文路径是指Web应用程序在URL中的路径部分,即域名后面的部分。例如,如果一个Web应用程序的上下文路径为 /myapp ,那么访问该应用程序的URL就会是 http://localhost:8080/myapp。 在Java Web开发中,上下文路径经常用于构建动态的URL,加载资源文件,进行页面跳转等操作。可以使用 request.getContextPath() 方法来获取当前Web应用程序的上下文路径,以便在代码中动态构建URL。 如何获取上下文路径: 在Java代码中获取上下文路径可以使用 request.getContextPath() 方法,而在JSP页面中可以通过EL表达式 ${pageContext.request.contextPath} 来获取上下文路径。 String contextPath = request.getContextPath

By Ne0inhk
数据结构与算法——图

数据结构与算法——图

图是一种重要的数据结构,它由节点(也称为顶点)和连接这些节点的边组成。下面详细介绍一下图结构中有一些专有名词和概念: 1. 顶点(Vertex):图中的节点,也称为顶点。每个顶点可以有一个或多个相关联的边。 1. 边(Edge):连接图中两个顶点的线段,表示顶点之间的关系。边可以是有向的(箭头表示方向)或无向的(双向)。 1. 有向图(Directed Graph):图中的边具有方向的图称为有向图,也称为有向图。 1. 无向图(Undirected Graph):图中的边没有方向的图称为无向图,也称为无向图。 1. 权重(Weight):边上的数值或权重表示连接两个顶点之间的距离、成本或其他度量。 1. 路径(Path):图中顶点的序列,沿着边依次连接而成的路径。路径的长度可以通过边的权重之和来计算。 1. 环(Cycle):图中形成闭合路径的情况,称为环。有向图中的环称为有向环。 1.

By Ne0inhk
Servlet的继承结构以及继承的接口和类详解(HttpServlet、GenericServlet、Servlet)!!!

Servlet的继承结构以及继承的接口和类详解(HttpServlet、GenericServlet、Servlet)!!!

Servlet的继承结构比较复杂,主要涉及到一些接口和类。 1. HttpServlet类 * HttpServlet类是Servlet API中的一个抽象类,用于简化处理HTTP请求的Servlet的编写。 * HttpServlet继承自GenericServlet类,并实现了Servlet接口。 * HttpServlet提供了doGet()、doPost()等方法来处理GET和POST请求。 import javax.servlet.http.HttpServlet; public class MyServlet extends HttpServlet { // 实现doGet()方法 protected void doGet(HttpServletRequest request, HttpServletResponse response) { // 处理GET请求 } // 实现doPost()方法 protected void doPost(HttpServletRequest request, Htt

By Ne0inhk
Servlet的生命周期详解

Servlet的生命周期详解

Servlet的生命周期包括初始化、服务和销毁三个阶段。 1. 初始化阶段(Initialization) * 当Servlet第一次被请求时,容器会创建Servlet实例并调用其init()方法进行初始化。 * 可以在init()方法中进行一些初始化操作,如加载配置文件、建立数据库连接等。 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet { public void init() throws ServletException { // 初始化操作 System.out.println("Servlet初始化"); } } 2. 服务阶段(

By Ne0inhk