MoE-LLaVA: 大型视觉语言模型的专家混合系统
如果您喜欢我们的项目,请在GitHub上给我们一个星标 ⭐ 以获取最新更新。
💡 我还有其他可能引起您兴趣的视觉语言项目 ✨。
Video-LLaVA: 通过对齐后投影学习统一视觉表示
林斌, 叶阳, 朱斌, 崔嘉熙, 宁木南, 金鹏, 袁黎
LanguageBind: 通过基于语言的语义对齐将视频-语言预训练扩展到N模态
朱斌, 林斌, 宁木南, 闫洋, 崔嘉熙, 王鸿发, 庞亚天, 江文豪, 张俊武, 李宗威, 张万才, 李志峰, 刘伟, 袁黎
📣 新闻
- ⏳⏳⏳ 正在训练一个在更高图像分辨率(如768 × 768)下的更强大模型。
- ⏳⏳⏳ 正在训练MoE-LLaVA-Qwen1.5以更好地支持中文。
- [2024.03.16] 🎉 我们发布了所有第二阶段模型,请查看我们的模型库。
- [2024.02.03] 🎉 我们发布了一个更强大的MoE-LLaVA-StableLM。通过使用2.0B稀疏激活参数,其平均性能接近LLaVA-1.5-7B,请查看我们的模型库。
- [2024.02.02] 🤝 欢迎体验由@camenduru创建的和,他慷慨地支持了我们的研究!
- [2024.02.01] 🔥 无法访问HF的用户现在可以通过模型范围下载模型,请查看我们的模型库。
- [2024.01.30] 🔥 我们发布了一个更强大的MoE-LLaVA-Phi2。通过使用3.6B稀疏激活参数,其平均性能超过了LLaVA-1.5-7B,请查看我们的模型库。
- [2024.01.27] 🤗 Hugging Face演示和所有代码和数据集现已可用!欢迎关注 👀 本仓库以获取最新更新。
😮 亮点
MoE-LLaVA在多模态学习中表现出色。
🔥 高性能,但参数更少
- 仅使用3B稀疏激活参数,MoE-LLaVA在各种视觉理解数据集上表现与LLaVA-1.5-7B相当,甚至在物体幻觉基准测试中超过了LLaVA-1.5-13B。
🚀 简单基线,通过稀疏路径学习多模态交互。
- 通过添加一个简单的MoE调优阶段,我们可以在8个A100 GPU上在1天内完成MoE-LLaVA的训练。
🤗 演示
Gradio Web UI
强烈推荐通过以下命令试用我们的Web演示,它包含了MoE-LLaVA当前支持的所有功能。我们还在Huggingface Spaces提供了在线演示。
# 使用phi2
deepspeed --include localhost:0 moellava/serve/gradio_web_server.py --model-path "LanguageBind/MoE-LLaVA-Phi2-2.7B-4e"
# 使用qwen
deepspeed --include localhost:0 moellava/serve/gradio_web_server.py --model-path "LanguageBind/MoE-LLaVA-Qwen-1.8B-4e"
# 使用stablelm
deepspeed --include localhost:0 moellava/serve/gradio_web_server.py --model-path "LanguageBind/MoE-LLaVA-StableLM-1.6B-4e"
CLI推理
# 使用phi2
deepspeed --include localhost:0 moellava/serve/cli.py --model-path "LanguageBind/MoE-LLaVA-Phi2-2.7B-4e" --image-file "image.jpg"
# 使用qwen
deepspeed --include localhost:0 moellava/serve/cli.py --model-path "LanguageBind/MoE-LLaVA-Qwen-1.8B-4e" --image-file "image.jpg"
# 使用stablelm
deepspeed --include localhost:0 moellava/serve/cli.py --model-path "LanguageBind/MoE-LLaVA-StableLM-1.6B-4e" --image-file "image.jpg"
🐳 模型库
模型 | 激活参数 | Transformers(HF) | ModelScope(HF) | 平均 | VQAv2 | GQA | VizWiz | SQA-IMG | T-VQA | POPE | MME | MM-Bench | MM-Vet |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
MoE-LLaVA-1.6B×4-Top2 | 2.0B | 🤗LanguageBind/MoE-LLaVA-StableLM-1.6B-4e | PKU-YuanLab/MoE-LLaVA-StableLM-1.6B-4e | 57.3 | 76.7 | 60.3 | 36.2 | 62.6 | 50.1 | 85.7 | 1318.1 | 60.2 | 26.9 |
MoE-LLaVA-1.8B×4-Top2 | 2.2B | 🤗LanguageBind/MoE-LLaVA-Qwen-1.8B-4e | PKU-YuanLab/MoE-LLaVA-Qwen-1.8B-4e | 56.7 | 76.2 | 61.5 | 32.6 | 63.1 | 48.0 | 87.0 | 1291.6 | 59.6 | 25.3 |
MoE-LLaVA-2.7B×4-Top2 | 3.6B | 🤗LanguageBind/MoE-LLaVA-Phi2-2.7B-4e | PKU-YuanLab/MoE-LLaVA-Phi2-2.7B-4e | 61.1 | 77.6 | 61.4 | 43.9 | 68.5 | 51.4 | 86.3 | 1423.0 | 65.2 | 34.3 |
MoE-LLaVA-1.6B×4-Top2-384 | 2.0B | 🤗LanguageBind/MoE-LLaVA-StableLM-1.6B-4e-384 | PKU-YuanLab/MoE-LLaVA-StableLM-1.6B-4e-384 | 60.0 | 78.6 | 61.5 | 40.5 | 63.9 | 54.3 | 85.9 | 1335.7 | 63.3 | 32.3 |
MoE-LLaVA-2.7B×4-Top2-384 | 3.6B | 🤗LanguageBind/MoE-LLaVA-Phi2-2.7B-4e-384 | PKU-YuanLab/MoE-LLaVA-Phi2-2.7B-4e-384 | 62.9 | 79.9 | 62.6 | 43.7 | 70.3 | 57.0 | 85.7 | 1431.3 | 68.0 | 35.9 |
LLaVA-1.5 | 7B | 🤗liuhaotian/llava-v1.5-7b | - | 62.0 | 78.5 | 62.0 | 50.0 | 66.8 | 58.2 | 85.9 | 1510.7 | 64.3 | 30.5 |
🚨 请查看 https://github.com/PKU-YuanGroup/MoE-LLaVA/issues/27。
第二阶段模型
| 模型 | 检查点 | |----------|-----------| | MoE-LLaVA-1.6B×4-Top2 | [LanguageBind/MoE-LLaVA-StableLM-Stage2](https://huggingface.co/LanguageBind/MoE-LLaVA-StableLM-Stage2) | | MoE-LLaVA-1.6B×4-Top2-384 | [LanguageBind/MoE-LLaVA-StableLM-Stage2-384](https://huggingface.co/LanguageBind/MoE-LLaVA-StableLM-Stage2-384) | | MoE-LLaVA-1.8B×4-Top2 | [LanguageBind/MoE-LLaVA-Qwen-Stage2](https://huggingface.co/LanguageBind/MoE-LLaVA-Qwen-Stage2) | | MoE-LLaVA-2.7B×4-Top2 | [LanguageBind/MoE-LLaVA-Phi2-Stage2](https://huggingface.co/LanguageBind/MoE-LLaVA-Phi2-Stage2) | | MoE-LLaVA-2.7B×4-Top2-384 | [LanguageBind/MoE-LLaVA-Phi2-Stage2-384](https://huggingface.co/LanguageBind/MoE-LLaVA-Phi2-Stage2-384) |预训练模型
模型 | 检查点 |
---|---|
MoE-LLaVA-1.6B×4-Top2 | LanguageBind/MoE-LLaVA-StableLM-Pretrain |
MoE-LLaVA-1.6B×4-Top2-384 | LanguageBind/MoE-LLaVA-StableLM-384-Pretrain |
MoE-LLaVA-1.8B×4-Top2 | LanguageBind/MoE-LLaVA-Qwen-Pretrain |
MoE-LLaVA-2.7B×4-Top2 | LanguageBind/MoE-LLaVA-Phi2-Pretrain |
MoE-LLaVA-2.7B×4-Top2-384 | LanguageBind/MoE-LLaVA-Phi2-384-Pretrain |
⚙️ 环境要求和安装
我们建议的环境要求如下:
- Python == 3.10
- Pytorch == 2.0.1
- CUDA 版本 >= 11.7
- Transformers == 4.37.0
- Tokenizers==0.15.1
- 安装所需的包:
git clone https://github.com/PKU-YuanGroup/MoE-LLaVA
cd MoE-LLaVA
conda create -n moellava python=3.10 -y
conda activate moellava
pip install --upgrade pip # 启用 PEP 660 支持
pip install -e .
pip install -e ".[train]"
pip install flash-attn --no-build-isolation
# 以下是可选的。针对 Qwen 模型。
git clone https://github.com/Dao-AILab/flash-attention
cd flash-attention && pip install .
# 以下是可选的。安装它们可能会很慢。
# pip install csrc/layer_norm
# 如果 flash-attn 的版本高于 2.1.1,则不需要以下操作。
# pip install csrc/rotary
[!警告]
🚨 我们发现使用 flash attention2 会导致性能下降。
🗝️ 训练和验证
训练和验证的说明在 TRAIN.md 和 EVAL.md 中。
💡 自定义你的 MoE-LLaVA
说明在 CUSTOM.md 中。
😍 可视化
说明在 VISUALIZATION.md 中。
🤖 API
我们开源了所有代码。 如果你想在本地加载模型(例如 LanguageBind/MoE-LLaVA-Phi2-2.7B-4e
),你可以使用以下代码片段。
使用以下命令运行代码。
deepspeed --include localhost:0 predict.py
import torch
from PIL import Image
from moellava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN
from moellava.conversation import conv_templates, SeparatorStyle
from moellava.model.builder import load_pretrained_model
from moellava.utils import disable_torch_init
from moellava.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria
def main():
disable_torch_init()
image = 'moellava/serve/examples/extreme_ironing.jpg'
inp = '这张图片有什么不寻常之处?'
model_path = 'LanguageBind/MoE-LLaVA-Phi2-2.7B-4e' # LanguageBind/MoE-LLaVA-Qwen-1.8B-4e 或 LanguageBind/MoE-LLaVA-StableLM-1.6B-4e
device = 'cuda'
load_4bit, load_8bit = False, False # 待修复:Deepspeed 是否支持 4 位或 8 位?
model_name = get_model_name_from_path(model_path)
tokenizer, model, processor, context_len = load_pretrained_model(model_path, None, model_name, load_8bit, load_4bit, device=device)
image_processor = processor['image']
conv_mode = "phi" # qwen 或 stablelm
conv = conv_templates[conv_mode].copy()
roles = conv.roles
image_tensor = image_processor.preprocess(Image.open(image).convert('RGB'), return_tensors='pt')['pixel_values'].to(model.device, dtype=torch.float16)
print(f"{roles[1]}: {inp}")
inp = DEFAULT_IMAGE_TOKEN + '\n' + inp
conv.append_message(conv.roles[0], inp)
conv.append_message(conv.roles[1], None)
prompt = conv.get_prompt()
input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda()
stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
keywords = [stop_str]
stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
with torch.inference_mode():
output_ids = model.generate(
input_ids,
images=image_tensor,
do_sample=True,
temperature=0.2,
max_new_tokens=1024,
use_cache=True,
stopping_criteria=[stopping_criteria])
outputs = tokenizer.decode(output_ids[0, input_ids.shape[1]:], skip_special_tokens=True).strip()
print(outputs)
if __name__ == '__main__':
main()
🙌 相关项目
- Video-LLaVA 这个框架使模型能够高效地利用统一的视觉标记。
- LanguageBind 一个开源的基于语言的五模态检索框架。
👍 致谢
- LLaVA 我们基于此代码库构建,它是一个高效的大型语言和视觉助手。
🔒 许可证
- 本项目的大部分内容根据 LICENSE 文件中的 Apache 2.0 许可证发布。
- 本服务是一个仅供非商业用途的研究预览,受 LLaMA 模型许可证、OpenAI 生成数据的使用条款以及 ShareGPT 的隐私惯例约束。如果您发现任何潜在违规行为,请与我们联系。
✏️ 引用
如果您发现我们的论文和代码对您的研究有用,请考虑给予星标 :star: 和引用 :pencil:。
@article{lin2024moe,
title={MoE-LLaVA: Mixture of Experts for Large Vision-Language Models},
author={Lin, Bin and Tang, Zhenyu and Ye, Yang and Cui, Jiaxi and Zhu, Bin and Jin, Peng and Zhang, Junwu and Ning, Munan and Yuan, Li},
journal={arXiv preprint arXiv:2401.15947},
year={2024}
}
@article{lin2023video,
title={Video-LLaVA: Learning United Visual Representation by Alignment Before Projection},
author={Lin, Bin and Zhu, Bin and Ye, Yang and Ning, Munan and Jin, Peng and Yuan, Li},
journal={arXiv preprint arXiv:2311.10122},
year={2023}
}