重要提示
您正在查看 NeMo 2.0 文档。此版本引入了对 API 的重大更改和一个新的库 NeMo Run。我们目前正在将 NeMo 1.0 中的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档。
LLaVA-Next#
LLaVA-Next 是 LLaVA 模型的扩展,旨在通过平铺高效处理高分辨率图像。这使用户能够处理更大的图像尺寸,从而提高各种 VL 任务的准确性。有关 LLaVA-Next 的更多详细信息,请参阅 LLaVA-Next 博客。
我们扩展了 NeVA 模型以支持 LLaVA-Next。用户可以轻松切换到 LLaVA-Next,以获得高分辨率图像平铺支持,且只需进行最少的配置更改。要从 NeVA (LLaVA) 切换到 LLaVA-Next,请将任务编码器替换为 LlavaNextTaskEncoder。它旨在处理图像平铺,支持 LLaVA-Next 架构。
要开始使用 LLaVA-Next,请按照以下步骤操作,这些步骤与 NeVA 类似,但略有修改。
从 Hugging Face 导入到 NeMo 2.0#
以下脚本下载 LLM (vicuna - 7b) 的检查点并将其转换为 NeMo 格式。转换后的检查点存储在 NeMo 缓存文件夹中,路径为:~/.cache/nemo
。例如,当与 NeMo 容器一起使用时,完整路径为 /root/.cache/nemo/models/lmsys/vicuna-7b-v1.5/
。该检查点可用于初始化 LlaVa-Next 预训练的 LLM。 .. code-block:: python
from nemo.collections.llm import import_ckpt from nemo.collections.llm import Llama2Config7B, LlamaModel
- if __name__ == “__main__”
# 指定 Hugging Face 模型 ID hf_model_id = “lmsys/vicuna-7b-v1.5”
# 导入模型并转换为 NeMo 2.0 格式 import_ckpt(
model=LlamaModel(Llama2Config7B()), source=f”hf://{hf_model_id}”,
)
此步骤是可选的,旨在供希望从 Hugging Face 的预训练检查点开始微调 LLaVA-Next 模型的用户使用。
from nemo.collections.llm import import_ckpt
from nemo.collections import vlm
if __name__ == '__main__':
# Specify the Hugging Face model ID
hf_model_id = "llava-hf/llava-v1.6-vicuna-7b-hf"
# Import the model and convert to NeMo 2.0 format
import_ckpt(
model=vlm.LlavaNextModel(vlm.Llava16Config7B()), # Model configuration
source=f"hf://{hf_model_id}", # Hugging Face model source
)
NeMo 2.0 预训练配方#
与 NeVA 模型类似,我们为 LLaVA-NEXT 预训练提供了一些默认配方 llava_next_7b。
from nemo.collections import vlm
finetune = vlm.llava_next_7b.pretrain_recipe(
name="llava_next_7b_pretrain",
dir=f"/path/to/checkpoints",
num_nodes=1,
num_gpus_per_node=8,
language_model_from_pretrained='/root/.cache/nemo/models/lmsys/vicuna-7b-v1.5/',
# Can be None or change based on local checkpoint path
)
NeMo 2.0 微调配方#
我们还提供了一个微调配方 - llava_next_7b,您可以使用它。
from nemo.collections import vlm
finetune = vlm.llava_next_7b.finetune_recipe(
name="llava_next_7b_finetune",
dir=f"/path/to/checkpoints",
num_nodes=1,
num_gpus_per_node=8,
peft_scheme='none', # 'lora', 'none'
)
注意
配方中的配置是使用 NeMo-Run run.Config
和 run.Partial
配置对象完成的。请查看 NeMo-Run 文档,以了解有关其配置和执行系统的更多信息。
注意
配方使用 MockDataModule
作为 data
参数。您需要将 MockDataModule
替换为您自定义的数据集。
一旦您准备好最终配置,您可以使用任何 NeMo-Run 支持的执行器来执行它。最简单的选项是本地执行器,它在单独的进程中本地运行预训练。您可以按如下方式使用它
import nemo_run as run
run.run(finetune, executor=run.LocalExecutor())
此外,您也可以在同一个 Python 进程中直接运行它,如下所示
run.run(finetune, direct=True)
使用 Energon Dataloader#
以下是如何为 LLaVA-Next 训练设置 Energon 数据模块的示例
from nemo.collections.multimodal.data.energon.config import MultiModalSampleConfig
from nemo.collections.vlm import LlavaNextTaskEncoder
from nemo.collections.multimodal.data.energon import EnergonMultiModalDataModule
from transformers import AutoProcessor
# Load the processor from the pretrained LLaVA-Next model
processor = AutoProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
# Paths and configuration
data_path = "<path_to_dataset>"
image_processor = processor.image_processor
tokenizer = processor.tokenizer
# Define multimodal sample configuration
multimodal_sample_config = MultiModalSampleConfig()
# Initialize the LLaVA-Next task encoder
task_encoder = LlavaNextTaskEncoder(
tokenizer=tokenizer,
image_processor=image_processor,
multimodal_sample_config=multimodal_sample_config,
)
# Create the data module
data = EnergonMultiModalDataModule(
path=data_path,
tokenizer=tokenizer,
image_processor=image_processor,
num_workers=8,
micro_batch_size=4,
global_batch_size=32,
multimodal_sample_config=multimodal_sample_config,
task_encoder=task_encoder,
)
将默认配方中的 MockDataModule
替换为上述数据。
from nemo.collections import vlm
# Define the fine-tuning recipe
finetune = vlm.llava_next_7b.finetune_recipe(
name="llava_next_7b_finetune",
dir=f"/path/to/checkpoints",
num_nodes=1,
num_gpus_per_node=8,
peft_scheme='none', # 'lora', 'none'
)
# Assign the above data module to the finetuning recipe
finetune.data = data
我们还包含其他示例脚本,以进一步自定义 LLaVA-NeXT 训练
NeMo Run:llava_next_nemo_run.py
这些脚本允许根据您的需求进行灵活而全面的训练工作流程。