一、 LVM
LVM是一种视觉预训练模型,它将各种视觉数据转换成视觉句子,并进行自回归的下一标记预测。同时支持GPU和TPU。
LVM建立在OpenLLaMA(一种自回归模型)和OpenMuse(一种将图像转换为视觉令牌的VQGAN)之上。
环境搭建
git clone https://github.com/ytongbai/LVM
cd LVM
export PYTHONPATH="\${
PWD}:\$PYTHONPATH"
conda env create -f scripts/gpu_environment.yml
conda activate LVM
数据准备
本节介绍如何通过将可视化数据标记为可视化句子,然后混合和洗牌数据集来准备数据集。
我们在 ./tokenize_examples中有单独的脚本来处理论文中提到的不同类型的视觉句子。简单说明和使用说明如下。
(1)配对数据集(Pair Datasets)
对于配对数据集,视觉句子被构造为 [图像, 标签, 图像, 标签, 图像, 标签, …] 的形式。
我们使用脚本 tokenize_examples/tokenize_paired_dataset_muse.py 生成视觉 token。
例如,对于深度图、表面法线、边缘和分割任务,我们首先使用 prism 工具生成伪标签(pseudo labels),然后使用脚本生成视觉句子。
注意,对于分割任务,我们在从 prism 获取伪标签后,使用额外的颜色映射脚本来处理标签映射,这可以通过运行 tokenize_examples/map_color.py 实现。
(2)视频数据集(Video Datasets)
对于视频数据集,视觉句子被构造为 [帧1, 帧2, 帧3, … 帧x] 的形式。
可以使用脚本 tokenize_examples/tokenize_video_muse.py 来生成视觉 token。
超参数 stride 可以用来控制从视频中提取帧的采样率
(3)图像修复数据集(Inpainting Datasets)
对于图像修复数据集,视觉句子被构造为 [遮挡图像, 原始图像, 遮挡图像, 原始图像, …] 的形式。
可以使用脚本 tokenize_examples/tokenize_inpainting_dataset_muse.py 来生成视觉句子。
用户可以通过修改 FLAGS.hole_mask_ratio 参数来控制遮挡的比例。
混合和洗牌数据集
在生成JSONL文件之后,需要对数据集进行混合和重组。遵循以下步骤:
模型训练
python -u -m EasyLM.models.llama.llama_train \
--jax_distributed.initialize_jax_distributed=True \
--jax_distributed.coordinator_address='$MASTER_ADDR:$MASTER_PORT' \
--jax_distributed.local_device_ids='0,1,2,3,4,5,6,7' \
--mesh_dim='$SLURM_NNODES,-1,1' \
--dtype='bf16' \
--total_steps=400000 \ # change according to the number of data
--log_freq=10 \
--save_model_freq=1000 \
--save_milestone_freq=2000 \
--load_llama_config=