一个端到端的MLLM,接受任何形式的引用并可在响应中定位任何内容。[论文]
概述
Ferret模型
主要贡献:
- Ferret 模型 - 混合区域表示 + 空间感知视觉采样器可实现 MLLM 中的细粒度和开放词汇的引用和定位。
- GRIT 数据集 (~1.1M) - 大规模、分层、健壮的引用和定位参考指令微调数据集。
- Ferret-Bench - 一种多模态评估基准,需要引用/定位、语义、知识和推理。
发布
- [12/14] 发布了检查点(7B, 13B)。
- [10/30] 发布了FERRET模型和Ferret-Bench的代码。
使用和许可声明:数据和代码仅供研究使用并获得许可。它们也仅限于遵循 LLaMA、Vicuna 和 GPT-4 许可协议的使用。该数据集为 CC BY NC 4.0(仅允许非商业用途),使用该数据集训练的模型不应在研究目的之外使用。
安装
克隆此存储库并进入到 FERRET 文件夹
git clone https://github.com/apple/ml-ferret cd ml-ferret
安装包
conda create -n ferret python=3.10 -y conda activate ferret pip install --upgrade pip # enable PEP 660 support pip install -e . pip install pycocotools pip install protobuf==3.20.0
为训练例子安装附加包
pip install ninja pip install flash-attn --no-build-isolation
训练
FERRET 在 8 个具有 80GB 内存的 A100 GPU 上进行训练。要在更少的 GPU 上进行训练,您可以相应地减少per_device_train_batch_size
和增加gradient_accumulation_steps
。始终保持全局的批大小相同:per_device_train_batch_size
x gradient_accumulation_steps
x num_gpus
。
超参数
我们在微调中使用了一组与 LLaVA(Vicuna) 类似的超参数。
超参数 | 全局的批大小 | 学习率 | Epochs | 最大长度 | 权重衰减 |
---|---|---|---|---|---|
FERRET-7B | 128 | 2e-5 | 3 | 2048 | 0 |
FERRET-13B | 128 | 2e-5 | 3 | 2048 | 0 |
准备 Vicuna 检查点和 LLaVA 的投影
在开始之前,准备我们的基本模型 Vicuna,它是一个指令微调过的聊天机器人。请按照此处的说明下载其权重。Vicuna v1.3 用于 FERRET。
然后下载LLaVA的第一阶段预训练投影权重(7B,13B)。
FERRET 训练
评估
请参阅此文档了解详细信息。
检查点
我们提取了delta
预训练模型和 Vicuna 之间的差异。请先按照前面的说明下载 Vicuna 的权重。然后使用wget
或curl
下载我们准备好的权重偏移量:7B、13B,并解压缩下载的偏移量。最后,通过运行以下脚本将偏移量应用到 Vicuna 的权重:
# 7B python3 -m ferret.model.apply_delta \ --base ./model/vicuna-7b-v1-3 \ --target ./model/ferret-7b-v1-3 \ --delta path/to/ferret-7b-delta # 13B python3 -m ferret.model.apply_delta \ --base ./model/vicuna-13b-v1-3 \ --target ./model/ferret-13b-v1-3 \ --delta path/to/ferret-13b-delta
请参阅下一节了解如何使用预训练权重设置本地演示。
演示
要运行演示,您需要训练 FERRET 并在本地使用检查点。这里使用了 Gradio Web UI。请一一运行以下命令。
启动控制器
python -m ferret.serve.controller --host 0.0.0.0 --port 10000
启动 gradio Web 服务器
python -m ferret.serve.gradio_web_server --controller http://localhost:10000 --model-list-mode reload --add_region_feature
启动一个模型工作器
这是加载 ckpt 并在 GPU 上进行推理的工作器。每个工作器负责--model-path
中指定的单个模型。
CUDA_VISIBLE_DEVICES=0 python -m ferret.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path ./checkpoints/FERRET-13B-v0 --add_region_feature
等到进程加载模型完成,您会看到“Uvicorn running on ...”。现在,刷新您的 Gradio Web UI,您将在模型列表中看到刚刚启动的模型。
Ferret 互动演示示例
引文
如果您发现 Ferret 有用,请使用此 BibTeX 进行引用:
@article{you2023ferret, title={Ferret: Refer and Ground Anything Anywhere at Any Granularity}, author={You, Haoxuan and Zhang, Haotian and Gan, Zhe and Du, Xianzhi and Zhang, Bowen and Wang, Zirui and Cao, Liangliang and Chang, Shih-Fu and Yang, Yinfei}, journal={arXiv preprint arXiv:2310.07704}, year={2023} }