重要提示

您正在查看 NeMo 2.0 文档。此版本引入了 API 的重大更改和一个新的库,NeMo Run。我们目前正在将 NeMo 1.0 的所有功能移植到 2.0。有关早期版本或 2.0 中尚未提供的功能的文档,请参阅 NeMo 24.07 文档

NeVA#

模型介绍#

NeVA 源于 LLaVA(大型语言和视觉助手)[MM-MODELS2],是 NeMo 多模态生态系统中的先锋模型。它巧妙地融合了以大型语言为中心的模型(如 NVGPT 或 LLaMA)与视觉编码器。训练使用机器生成的多模态语言-图像指令跟随数据。值得注意的是,即使数据集有限,NeVA 也展现出强大的能力来解读图像并熟练地回答关于它们的问题。其卓越的能力尤其体现在需要复杂视觉理解和指令跟随的任务中。有趣的是,即使面对全新的图像和指令,NeVA 也能媲美 GPT-4 等先进的多模态模型的能力。

NeVA 在 LLaVA 的基本原理之上构建,利用 NeMo LLM 框架的特性(包括模型并行、激活检查点、AMP O2、Flash Attention 等)提升了其训练效率。

主要语言模型#

原始 LLaVA 模型采用了 LLaMA 架构,该架构以其在开源、仅语言指令调优工作中的强大能力而闻名。LLaMA 通过分词和嵌入过程优化文本输入。位置嵌入被集成到这些 token 嵌入中,组合表示通过多个 Transformer 层传递。与主要 token 关联的结尾 Transformer 层的输出被指定为文本表示。

在 NeMo 中,文本编码器基于 MegatronGPTModel 类。此类功能多样,不仅支持 NVGPT 模型,还支持 LLaMA、LLaMA-2 和其他社区模型,并配备了检查点转换脚本。同时,视觉模型和投影层增强了主要语言模型的词嵌入组件。为了全面理解其实现,可以参考 MegatronNevaModel 类。

视觉模型#

为了进行视觉解释,NeVA 利用了预训练的 CLIP 视觉编码器 ViT-L/14 的强大功能,该编码器以其卓越的视觉理解能力而著称。图像首先被分割成标准化的 patches,例如,16x16 像素。这些 patches 被线性嵌入,形成一个扁平化的向量,然后输入到 Transformer 中。Transformer 处理的最终产物是统一的图像表示。在 NeMo 框架中,基于 CLIP 视觉编码器 ViT-L/14 的 NeVA 视觉模型,可以通过 CLIPVisionTransformer 类实例化,也可以通过 Hugging Face 的 transformers 包启动。

投影和集成#

编码器从图像中检索视觉特征,并使用可修改的投影矩阵将它们与语言嵌入交织在一起。这种复杂的投影将视觉线索转换为语言嵌入 tokens,从而无缝地融合文本和图像。LLaVA-1.5 [MM-MODELS1] 引入了两项关键的增强功能。集成 MLP 视觉-语言连接器提升了系统的能力。借鉴 MLP 在自监督学习中的成功经验,LLaVA-1.5 进行了变革性的设计调整。从线性投影过渡到双层 MLP 投影,显著增强了 LLaVA-1.5 的多模态能力,使模型能够熟练地驾驭和协同语言和视觉元素。

架构表#

基础 LLM

视觉编码器

投影

编码器序列长度

层数

隐藏层维度

FFN 隐藏层维度

注意力头数

LLaMA-2-13B-Chat

CLIP-L

线性

4096

40

5120

13824

40

LLaMA-2-7B-Chat

CLIP-L

线性

4096

32

4096

11008

32

模型配置#

多模态配置#

mm_cfg:
  use_im_start_end: False
  • use_im_start_end:如果设置为 True,则将在图像嵌入前后使用图像开始和结束 tokens。

多模态中的语言模型配置#

mm_cfg:
  llm:
    from_pretrained: ${data_dir}/neva/checkpoints/llama-2-13b-chat-tp8.nemo
    freeze: False
    model_type: llama_2
  • from_pretrained:预训练 NeMo 语言模型检查点的路径。

  • freeze:如果设置为 True,则模型参数在训练期间不会更新。

  • model_type:指定模型类型,nvgptllama_2

多模态中的视觉编码器配置#

mm_cfg:
  vision_encoder:
    from_pretrained: "openai/clip-vit-large-patch14"
    from_hf: True
    patch_dim: 14
    hidden_size: 1024
    vision_select_layer: -2
    class_token_length: 1
    freeze: True
  • from_pretrained:预训练视觉编码器的路径或名称。

  • from_hf:如果设置为 True,则将从 Hugging Face 模型中心加载模型。

  • patch_dim:图像被分割成的 patches 的大小。

  • hidden_size:隐藏层的维度。

  • vision_select_layer:指定从视觉模型中选择哪一层。

  • class_token_length:分类 token 的长度。

主要语言模型配置#

mcore_gpt: False
encoder_seq_length: 4096
position_embedding_type: rope
num_layers: 40
hidden_size: 5120
ffn_hidden_size: 13824
num_attention_heads: 40
hidden_dropout: 0.0
attention_dropout: 0.0
ffn_dropout: 0.0
normalization: rmsnorm
bias: False
activation: 'fast-swiglu'
  • mcore_gpt:如果设置为 True,将使用 megatron.core 中的 GPTModel。

  • encoder_seq_length:主要语言模型编码器的序列长度。

  • position_embedding_type:使用的位置嵌入类型。

  • num_layershidden_sizeffn_hidden_sizenum_attention_heads:定义主要语言模型架构的参数。ffn_hidden_size 通常是 hidden_size 的 4 倍。

  • hidden_dropoutattention_dropoutffn_dropout:Transformer 中隐藏状态、注意力和前馈层的 Dropout 概率。

  • normalization:使用的归一化层类型。

  • bias:如果设置为 True,则所有权重矩阵中都将使用偏置项。

  • activation:模型中使用的激活函数。

优化#

功能

描述

启用方式

数据并行

数据集在多个 GPU 或节点上并发读取,从而加快数据加载和处理速度。

在多 GPU/节点上训练时自动启用

张量并行

每个张量被分成多个块,从而实现跨 GPU 的水平并行。这种技术被称为 TensorParallel (TP),将模型的张量分布在多个 GPU 上。在处理过程中,每个分片在不同的 GPU 上单独并行处理,并在步骤结束时同步结果。这种方法受到 NVIDIA Megatron 实现的启发。[参考](NVIDIA/Megatron-LM)

model.tensor_model_parallel_size={parallel_size}

激活检查点

为了减少内存使用量,某些层的激活在反向传播期间被清除并重新计算。这种技术对于训练使用传统方法无法放入 GPU 内存的大型模型尤其有用。

model.activations_checkpoint_granularity=fullmodel.activations_checkpoint_method=blockmodel.activations_checkpoint_num_layers={num_layers_to_check}

选择性激活检查点

激活检查点的选择性粒度版本。详见我们的论文。[参考](https://arxiv.org/pdf/2205.05198.pdf)

model.activations_checkpoint_granularity=selectivemodel.activations_checkpoint_method=uniform

Bfloat16 训练

训练以 Bfloat16 精度进行,这在 FP32 的更高精度与 FP16 的内存节省和速度之间取得了平衡。

trainer.precision=bf16

BF16 O2

启用 O2 级别的自动混合精度,优化 Bfloat16 精度以获得更好的性能。

model.megatron_amp_O2=True

Flash Attention V2

FlashAttention 是一种快速且内存高效的算法,用于计算精确注意力。它通过感知 IO 加快模型训练速度并减少内存需求。这种方法对于大规模模型尤其有用,并在链接的存储库中进一步详细介绍。[参考](Dao-AILab/flash-attention)

model.use_flash_attention=True

NeVA 训练#

NeVA 的训练包含两个关键阶段,这两个阶段增强了其理解用户指令、理解语言和视觉内容以及生成准确响应的能力

  1. 特征对齐预训练:在这个初始阶段,NeVA 对齐视觉和语言特征以确保兼容性。

  2. 端到端微调:第二个训练阶段侧重于端到端地微调整个模型。虽然视觉编码器的权重保持不变,但投影层的预训练权重和 LLM 的参数都成为适应的对象。这种微调可以根据不同的应用场景进行定制,从而产生多样的功能。

参考文献#

[MM-MODELS1]

Haotian Liu、Chunyuan Li、Yuheng Li 和 Yong Jae Lee。改进的视觉指令调优基线。2023 年。

[MM-MODELS2]

Haotian Liu、Chunyuan Li、Qingyang Wu 和 Yong Jae Lee。视觉指令调优。2023 年。arXiv:arXiv:2304.08485