Bunny
Bunny 是一个轻量级但功能强大的多模态模型家族,旨在让 AI 同时具备“看”和“说”的能力。它主要解决了在有限计算资源下,如何平衡模型体积与性能的行业难题,让用户能在普通硬件上部署高效的多模态应用。
无论是希望快速集成视觉能力的开发者、追求极致效率的研究人员,还是需要在本地运行大模型的极客用户,都能从 Bunny 中获益。其核心亮点在于极高的灵活性:支持即插即用的多种视觉编码器(如 EVA-CLIP、SigLIP)以及丰富的语言基座(包括 Llama-3、Phi-3、Qwen1.5 等)。为了弥补小参数量的潜在劣势,Bunny 通过精心筛选的高质量数据进行训练,显著提升了理解力。
特别是最新的 Bunny-Llama-3-8B-V 和 Bunny-4B 版本,不仅支持高达 1152x1152 的高分辨率图像输入,更在多项基准测试中展现出超越同尺寸甚至更大规模模型的卓越性能。作为首个基于 Llama-3 的视觉语言模型系列,Bunny 以开源友好的姿态,为构建下一代多模态应用提供了坚实且高效的基础。
使用场景
一家初创电商团队希望在其移动端 App 中集成“拍照搜同款”功能,让用户能通过拍摄商品照片快速获取详细参数和购买链接。
没有 Bunny 时
- 部署成本高昂:主流多模态模型参数量巨大(如 13B+),需要昂贵的 GPU 服务器支撑,远超初创团队的预算。
- 响应延迟严重:大模型推理速度慢,用户拍照后需等待数秒才能看到结果,严重影响购物体验。
- 细节识别不足:普通轻量模型无法处理高分辨率图片,难以识别商品标签上的微小文字或复杂纹理,导致搜索不准。
- 端侧运行困难:由于模型体积过大,无法量化压缩至适合手机或边缘设备运行的格式,必须依赖云端传输,增加带宽压力。
使用 Bunny 后
- 轻量化低成本部署:利用 Bunny-4B 或 Bunny-Llama-3-8B-V 等轻量级模型,团队仅需消费级显卡甚至边缘设备即可流畅运行,大幅降低算力成本。
- 实时交互体验:Bunny 凭借高效的架构设计实现毫秒级推理,用户拍照瞬间即可获得反馈,流程丝滑无卡顿。
- 高清细节洞察:借助 Bunny v1.1 版本支持的 1152x1152 高分辨率输入能力,模型能精准读取商品包装上的细小文字和材质细节,显著提升搜索准确率。
- 灵活的端云协同:通过 GGUF 量化版本,Bunny 可直接部署在用户手机端离线运行,既保护隐私又节省服务器带宽。
Bunny 以轻量级的身体承载了强大的多模态理解力,让资源有限的团队也能轻松落地高精度的视觉 AI 应用。
运行环境要求
- Linux
- macOS
- Windows
- 非必需(支持 CPU),但推荐使用 NVIDIA GPU 以加速
- 显存需求取决于模型大小:Bunny-4B 约需 8GB+,Bunny-Llama-3-8B-V 约需 16GB+(FP16)
- 未明确指定 CUDA 版本,通常需匹配 PyTorch 版本(建议 CUDA 11.8 或 12.1+)
未说明(建议至少 16GB,运行 8B 模型推荐 32GB+)

快速开始
Bunny:一个轻量级多模态模型家族
📖 技术报告 | 🤗 数据集 | 🤖 数据集 | 🤗 HFSpace 🐰 演示
Bunny-Llama-3-8B-V: 🤗 v1.1 | 🤗 v1.0 | 🤗 v1.0-GGUF
Bunny-4B: 🤗 v1.1 | 🤗 v1.0 | 🤗 v1.0-GGUF
Bunny 是一个轻量级但功能强大的多模态模型家族。它提供了多种即插即用的视觉编码器,如 EVA-CLIP、SigLIP,以及语言主干网络,包括 Llama-3-8B、Phi-3-mini、Phi-1.5、StableLM-2、Qwen1.5、MiniCPM 和 Phi-2。为了弥补模型规模减小带来的性能损失,我们从更广泛的数据源中精心筛选出更具信息量的训练数据。
我们非常高兴地推出 Bunny-Llama-3-8B-V,这是首个基于 Llama-3 的视觉-语言模型,展现了卓越的性能。其 v1.1 版本可接受高达 1152x1152 分辨率的高分辨率图像。

此外,我们基于 SigLIP 和 Phi-3-mini 构建的 Bunny-4B 模型,在与同类规模模型以及更大规模(7B 和 13B)MLLMs 的对比中,均表现出超越当前最先进水平的性能。同时,v1.1 版本同样支持高达 1152x1152 分辨率的高分辨率图像。
展开查看 Bunny-4B 的性能
新闻与更新
2024年7月23日 🔥 最新版 Bunny 的所有训练策略和数据已公开! 更多关于 Bunny 的详细信息,请参阅 技术报告、数据集 和 训练教程!
2024年7月21日 🔥 SpatialBot、SpatialQA 和 SpatialBench 已发布! SpatialBot 是一个基于 Bunny 的具身化模型,通过理解和利用深度信息来理解空间关系。您可以在 GitHub 上体验该模型、数据集和基准测试!
2024年6月20日 🔥 MMR 基准测试已发布! 这是一个用于评估 MLLMs 理解能力及其对误导性问题鲁棒性的基准测试。请在 GitHub 上查看 Bunny 的表现及更多详情!
2024年6月1日 🔥 Bunny-v1.1-Llama-3-8B-V 发布,支持 1152x1152 分辨率! 该模型基于 SigLIP 和 Llama-3-8B-Instruct,并采用了 S$
^2$-Wrapper 技术。更多详情请见 HuggingFace 和 wisemodel! 🐰 演示2024年5月8日 Bunny-v1.1-4B 发布,支持 1152x1152 分辨率! 该模型基于 SigLIP 和 Phi-3-Mini-4K 3.8B,并采用了 S$
^2$-Wrapper 技术。更多详情请见 HuggingFace! 🐰 演示2024年5月1日 Bunny-v1.0-4B 发布,这是一款基于 Phi-3 的视觉-语言模型! 它基于 SigLIP 和 Phi-3-Mini-4K 3.8B 构建。更多详情请见 HuggingFace! 🤗 GGUF 格式
2024年4月21日 Bunny-Llama-3-8B-V 发布,这是首个基于 Llama-3 的视觉-语言模型! 它基于 SigLIP 和 Llama-3-8B-Instruct 构建。更多详情请见 HuggingFace、ModelScope 和 wisemodel! GGUF 格式已在 HuggingFace 和 wisemodel 上提供。
2024年4月18日 Bunny-v1.0-3B-zh 发布,该模型在英语和中文上都表现出色! 它基于 SigLIP 和 MiniCPM-2B 构建。更多详情请见 HuggingFace、ModelScope 和 wisemodel! 评估结果详见 评估。我们衷心感谢邵振伟先生的鼎力相助。
2024年3月15日 Bunny-v1.0-2B-zh 发布,该模型专注于中文! 它基于 SigLIP 和 Qwen1.5-1.8B 构建。更多详情请见 HuggingFace、ModelScope 和 wisemodel! 评估结果详见 评估。
2024年3月6日 Bunny 训练数据已发布! 关于 Bunny-v1.0 数据的更多信息,请参阅 HuggingFace 或 ModelScope!
2024年2月20日 Bunny 技术报告已完成! 更多关于 Bunny 的详细信息,请参阅 这里!
2024年2月7日 Bunny 正式发布! Bunny-v1.0-3B 基于 SigLIP 和 Phi-2 构建,其性能不仅超越了同类规模的 MLLMs,甚至在与更大规模(7B)MLLMs 的比较中也表现出色,其性能甚至可以与 LLaVA-13B 相媲美! 🤗 Bunny-v1.0-3B
快速入门
HuggingFace Transformers
以下代码片段展示了如何使用 Bunny-v1.1-Llama-3-8B-V、Bunny-v1.1-4B、Bunny-v1.0-3B 等模型与 HuggingFace Transformers 库进行交互。
此代码片段仅适用于上述模型,因为我们手动将部分配置代码整合到一个文件中,以方便用户使用。例如,您可以查看 Bunny 模型的源码中的 modeling_bunny_llama.py 和 configuration_bunny_llama.py,以及它们的相关部分,以了解其中的差异。对于其他模型(包括您自己训练的模型),我们建议通过安装 Bunny 的源代码来加载这些模型。或者,您可以将类似 modeling_bunny_llama.py 和 configuration_bunny_llama.py 的文件复制到您的模型目录,并修改 config.json 中的 auto_map 字段,但这样做无法保证完全正确,您可能还需要对部分代码进行调整以适配您的模型。
在运行该代码片段之前,您需要安装以下依赖项:
pip install torch transformers accelerate pillow
如果您的 CUDA 显存足够,可以通过设置 CUDA_VISIBLE_DEVICES=0 来加速执行。
对于中国大陆地区的用户,建议使用 HuggingFace 的镜像站点。
import torch
import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
from PIL import Image
import warnings
# 禁用部分警告信息
transformers.logging.set_verbosity_error()
transformers.logging.disable_progress_bar()
warnings.filterwarnings('ignore')
# 设置设备
device = 'cuda' # 或 cpu
torch.set_default_device(device)
model_name = 'BAAI/Bunny-v1_1-Llama-3-8B-V' # 或 'BAAI/Bunny-Llama-3-8B-V' 或 'BAAI/Bunny-v1_1-4B' 或 'BAAI/Bunny-v1_0-4B' 或 'BAAI/Bunny-v1_0-3B' 或 'BAAI/Bunny-v1_0-3B-zh' 或 'BAAI/Bunny-v1_0-2B-zh'
offset_bos = 1 # 对于 Bunny-v1_1-Llama-3-8B-V、Bunny-Llama-3-8B-V、Bunny-v1_1-4B、Bunny-v1_0-4B 和 Bunny-v1_0-3B-zh 使用
# 对于 Bunny-v1_0-3B 和 Bunny-v1_0-2B-zh,offset_bos = 0
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16, # cpu 上使用 float32
device_map='auto',
trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True)
# 文本提示
prompt = '为什么这张图片很有趣?'
text = f"一位好奇的用户与人工智能助手之间的对话。助手会针对用户的问题给出有帮助、详细且礼貌的回答。用户: <image>\n{prompt} 助手:"
text_chunks = [tokenizer(chunk).input_ids for chunk in text.split('<image>')]
input_ids = torch.tensor(text_chunks[0] + [-200] + text_chunks[1][offset_bos:], dtype=torch.long).unsqueeze(0).to(device)
# 图片,示例图片可在 https://huggingface.co/BAAI/Bunny-v1_1-Llama-3-8B-V/tree/main/images 找到
image = Image.open('example_2.png')
image_tensor = model.process_images([image], model.config).to(dtype=model.dtype, device=device)
# 生成回答
output_ids = model.generate(
input_ids,
images=image_tensor,
max_new_tokens=100,
use_cache=True,
repetition_penalty=1.0 # 可适当提高以避免重复输出
)[0]
print(tokenizer.decode(output_ids[input_ids.shape[1]:], skip_special_tokens=True).strip())
ModelScope
我们建议尤其是中国大陆地区的用户使用 ModelScope。
snapshot_download 工具可以帮助您解决下载检查点时遇到的问题。
展开查看代码片段
在运行该代码片段之前,您需要安装以下依赖项:
pip install torch modelscope transformers accelerate pillow
如果您的 CUDA 显存足够,可以通过设置 CUDA_VISIBLE_DEVICES=0 来加速执行。
import torch
import transformers
from modelscope import AutoTokenizer、AutoModelForCausalLM
from modelscope.hub.snapshot_download import snapshot_download
from PIL import Image
import warnings
# 禁用部分警告信息
transformers.logging.set_verbosity_error()
transformers.logging.disable_progress_bar()
warnings.filterwarnings('ignore')
# 设置设备
device = 'cuda' # 或 cpu
torch.set_default_device(device)
model_name = 'BAAI/Bunny-Llama-3-8B-V' # 或 'BAAI/Bunny-v1.0-3B' 或 'BAAI/Bunny-v1.0-3B-zh' 或 'BAAI/Bunny-v1.0-2B-zh'
offset_bos = 1 # 对于 Bunny-Llama-3-8B-V 和 Bunny-v1.0-3B-zh 使用
# 对于 Bunny-v1.0-3B 和 Bunny-v1.0-2B-zh,offset_bos = 0
# 加载模型
snapshot_download(model_id='thomas/siglip-so400m-patch14-384')
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16, # cpu 上使用 float32
device_map='auto',
trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True)
# 文本提示
prompt = '为什么这张图片很有趣?'
text = f"一位好奇的用户与人工智能助手之间的对话。助手会针对用户的问题给出有帮助、详细且礼貌的回答。用户: <image>\n{prompt} 助手:"
text_chunks = [tokenizer(chunk).input_ids for chunk in text.split('<image>')]
input_ids = torch.tensor(text_chunks[0] + [-200] + text_chunks[1][offset_bos:], dtype=torch.long).unsqueeze(0).to(device)
# 图片,示例图片可在 https://www.modelscope.cn/models/BAAI/Bunny-Llama-3-8B-V/files 找到
image = Image.open('example_2.png')
image_tensor = model.process_images([image], model.config).to(dtype=model.dtype,device=device)
# 生成回答
output_ids = model.generate(
input_ids,
images=image_tensor,
max_new_tokens=100,
use_cache=True,
repetition_penalty=1.0 # 可适当提高以避免重复输出
)[0]
print(tokenizer.decode(output_ids[input_ids.shape[1]:], skip_special_tokens=True).strip())
模型库
评估
| 检查点 | MME$^\text{P}$ |
MME$^\text{C}$ |
MMB$^{\text{T}/\text{D}}$ |
MMB-CN$^{\text{T}/ \text{D}}$ |
SEED(-IMG) | MMMU$^{\text{V}/\text{T}}$ |
VQA$^\text{v2}$ |
GQA | SQA$^\text{I}$ |
POPE |
|---|---|---|---|---|---|---|---|---|---|---|
| bunny-phi-1.5-eva-lora | 1213.7 | 278.9 | 60.9/56.8 | - | 56.4/64.1 | 30.0/28.4 | 76.5 | 60.4 | 58.2 | 86.1 |
| bunny-stablelm-2-eva-lora | 1301.0 | 235.0 | 58.4/56.4 | - | 55.3/62.8 | 29.8/29.4 | 74.6 | 56.7 | 60.0 | 84.8 |
| bunny-phi-2-eva-lora | 1421.0 | 285.4 | 68.6/67.4 | - | 62.2/70.2 | 35.9/32.6 | 78.9 | 62.3 | 69.1 | 87.1 |
| bunny-phi-1.5-siglip-lora | 1230.0 | 237.5 | 61.2/59.7 | - | 57.7/65.3 | 30.0/29.1 | 78.0 | 61.1 | 61.3 | 85.8 |
| bunny-stablelm-2-siglip-lora | 1366.8 | 236.1 | 65.1/62.8 | - | 58.8/67.5 | 29.9/29.8 | 78.9 | 60.9 | 61.1 | 85.9 |
| Bunny-v1.0-2B-zh/bunny-qwen1.5-1.8b-siglip | 1300.8 | 254.3 | 59.8/59.1 | 59.5/58.5 | 55.4/62.3 | 34.4/30.4 | 76.6 | 59.6 | 64.6 | 85.8 |
| Bunny-v1.0-3B-zh/bunny-minicpm-siglip | 1410.4 | 281.4 | 66.1/65.5 | 64.9/63.6 | 59.6/67.3 | 35.4/32.4 | 78.6 | 60.8 | 68.7 | 86.5 |
| Bunny-v1.0-3B/bunny-phi-2-siglip | 1488.8 | 289.3 | 69.2/68.6 | - | 62.5/70.7 | 38.2/33.0 | 79.8 | 62.5 | 70.9 | 86.8 |
| Bunny-v1.0-4B | 1495.2 | 338.9 | 74.0/73.5 | - | 64.5/72.1 | 40.1/39.1 | 81.5 | 63.5 | 75.2 | 86.7 |
| Bunny-v1.1-4B | 1581.5 | 361.1 | 75.7/74.2 | 66.5/64.5 | 64.9/72.5 | 41.4/38.4 | 82.1 | 63.2 | 78.3 | 87.2 |
| Bunny-Llama-3-8B-V | 1588.9 | 321.1 | 77.2/76.7 | 73.8/72.3 | 65.9/73.3 | 42.8/39.0 | 82.6 | 64.8 | 80.4 | 86.9 |
| Bunny-1.1-Llama-3-8B-V | 1644.1 | 367.5 | 78.1/77.2 | 74.3/74.8 | 66.2/73.5 | 43.3/39.0 | 82.9 | 64.0 | 79.9 | 87.2 |
性能最佳的小模型为 Bunny-v1.0-3B 或 bunny-phi-2-siglip,其合并权重可在此处找到 链接,LoRA 权重则可在此处找到 链接。
我们还提供了两款专注于中文问答能力的模型,分别是 Bunny-v1.0-3B-zh(bunny-minicpm-siglip)和 Bunny-v1.0-2B-zh(bunny-qwen1.5-1.8b-siglip)。它们的合并权重分别可在以下链接找到:Bunny-v1.0-3B-zh 和 Bunny-v1.0-2B-zh。LoRA 权重则可在以下链接找到:bunny-minicpm-siglip-lora 和 bunny-qwen1.5-1.8b-siglip-lora。
训练教程
安装
您可以从我们的 Docker 镜像开始,也可以在本地自行安装。
从我们的 Docker 镜像开始
直接使用我们配置好的 Docker 镜像启动:docker pull russellrobin/bunny:latest。
展开查看如何保持代码最新。
尽管我们的 Docker 镜像会定期维护,但本地的 Bunny 代码并不一定能与我们的 GitHub 仓库保持同步。 您可能需要:在运行中的容器中执行
pip install --upgrade transformers && cd Bunny,设置默认的 GitHub 用户信息:
git config user.email "you@example.com" && git config user.name "Your Name",使用
git pull更新 Bunny 的本地代码。运行
pip install -e .
这样就准备好了!
本地安装
CUDA 和 cuDNN
我们使用 CUDA 11.8 和 cuDNN 8.7.0。我们实际上使用 NVIDIA 提供的 CUDA Docker 镜像:
docker pull nvcr.io/nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04。CUDA 12 也可以。创建并激活一个 conda 虚拟环境:
conda create -n bunny python=3.10 conda activate bunny基本依赖
pip install --upgrade pip # 启用 PEP 660 支持 pip install transformers pip install torch torchvision xformers --index-url https://download.pytorch.org/whl/cu118安装 apex
# https://github.com/NVIDIA/apex#from-source pip install ninja git clone https://github.com/NVIDIA/apex cd apex # 如果 pip >= 23.1(参考:https://pip.pypa.io/en/stable/news/#v23-1),支持多个具有相同键的 `--config-settings`... pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings "--build-option=--cpp_ext" --config-settings "--build-option=--cuda_ext" ./ # 否则 pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --global-option="--cpp_ext" --global-option="--cuda_ext" ./安装 flash-attention
# https://github.com/Dao-AILab/flash-attention?tab=readme-ov-file#installation-and-features pip install packaging pip install flash-attn --no-build-isolation安装 bunny 及其他依赖
git clone https://github.com/BAAI-DCAI/Bunny.git cd Bunny pip install -e .
训练
Bunny 的训练分为两个阶段:(1) 预训练阶段:使用数据将一个 冻结的预训练 视觉编码器与一个 冻结的 LLM 连接起来,仅训练连接部分;(2) 视觉指令微调阶段:使用数据教会模型遵循多模态指令,此时连接部分、可学习的 LLM 参数以及视觉编码器(可选)都会被更新。
Bunny 在 8 张 A100 GPU 上进行训练。在其他情况下,您可以相应地减少 per_device_train_batch_size 并增加 gradient_accumulation_steps。始终保持全局批次大小不变:global_batch_size = per_device_train_batch_size $\times$ gradient_accumulation_steps $\times$ num_gpus。
支持的模型
目前,我们支持几种视觉编码器和 LLM。
对于视觉编码器,我们支持 CLIP、EVA-CLIP 和 SigLIP。
| 视觉编码器 | 下载链接 |
|---|---|
| clip-vit-large-patch14-336 | openai/clip-vit-large-patch14-336 |
| EVA02_CLIP_L_336_psz14_s6B | QuanSun/EVA-CLIP |
| siglip-so400m-patch14-384 | google/siglip-so400m-patch14-384 |
对于 LLM,我们支持 phi-1.5、stablelm-2、qwen1.5-1.8b、minicpm、phi-2、phi-3 和 llama3-8b。
| MODEL_TYPE | LLM | 下载链接 |
|---|---|---|
| phi-1.5 | phi-1_5 | microsoft/phi-1_5 |
| stablelm-2 | stablelm-2-1_6b | stabilityai/stablelm-2-1_6b |
| qwen1.5-1.8b | Qwen1.5-1.8B | Qwen/Qwen1.5-1.8B |
| minicpm | MiniCPM-2B | openbmb/MiniCPM-2B-history(第 280000 步) |
| phi-2 | phi-2 | microsoft/phi-2 |
| phi-3 | Phi-3-mini-4k-instruct | microsoft/Phi-3-mini-4k-instruct |
| llama3-8b | Meta-Llama-3-8B-Instruct | meta-llama/Meta-Llama-3-8B-Instruct |
请注意,上述模型有许多变体。 我们基于上述确切版本构建并测试代码。 未来还将支持更多模型!
预训练
数据准备
我们使用由 这项工作 构建的高质量 coreset,其中重复较少且信息量更丰富,来自 LAION-2B 数据集。我们从该 coreset 中随机抽取 200 万对图像-文本,并将其转换为训练格式。
数据集可在 这里 获取。
运行
将
--model_name_or_path和--vision_tower分别更新为 LLM 和视觉编码器的路径。相应地更新MODEL_TYPE和OUTPUT_DIR。全局批次大小为 256。如果添加了--use_s2 True,则会启用 S$^2$-Wrapper。您可以参考我们在 训练教程 中的实验设置。
sh script/train/pretrain.sh
视觉指令微调
数据准备
我们通过修改 SVIT-mix-665K 来构建 Bunny-695K,用于微调。然后我们将它与 LLaVA-665K 和 ALLaVA-Instruct-4V 结合,得到 Bunny-LLaVA-1.4M、Bunny-ALLaVA-1.3M 和 Bunny-LLaVA-ALLaVA-2M。
运行
将
--model_name_or_path和--vision_tower分别更新为 LLM 和视觉编码器的路径。相应地更新MODEL_TYPE、PRETRAIN_DIR和OUTPUT_DIR。全局批次大小为 128。对于MODEL_TYPE = minicpm/phi-3/llama3-8b,还需将--version更改为minicpm/phi3/llama。如果添加了--use_s2 True,则会启用 S$^2$-Wrapper。如果添加了--unfreeze_vision_tower True,视觉编码器也会被微调。我们正在探索更好的策略,包括更多的视觉指令微调数据、S$^2$-Wrapper、可训练的视觉编码器、权重合并等。您可参考我们在 训练教程 中的实验设置。
# 全参数微调 sh script/train/finetune_full.sh # LoRA 微调 sh script/train/finetune_lora.sh
持续微调
如果您希望在您的数据上持续微调我们发布的Bunny模型,或针对特定任务进行适配,
展开查看说明。
准备数据:将您的数据转换为一个包含所有样本的
JSON文件,格式与Bunny-695K类似。准备模型:
下载Bunny 模型,如果仅提供了LoRA权重,则需将LoRA权重与基础LLM合并:
python script/merge_lora_weights.py \ --model-path /path/to/bunny_lora_weights \ --model-base /path/to/base_llm_model \ --model-type phi-2 (或 stablelm-2 或 phi-1.5 或 qwen1.5-1.8b 或 minicpm 或 phi-3 或 llama3-8b) \ --save-model-path /path/to/merged_model在
/path/to/merged_model/config.json中添加"continuous_training": true,以确保从合并后的权重中加载视觉塔。
编辑脚本:可以使用
finetune_full.sh或finetune_lora.sh,但在使用前:将
--model_name_or_path改为/path/to/merged_model删除
--pretrain_mm_mlp_adapter,因为我们已从合并后的权重中加载跨模态投影器。自定义超参数,例如学习率,以适应您的数据集。
对于
MODEL_TYPE = minicpm/phi-3/llama3-8b,还需将--version改为minicpm/phi3/llama。如果添加--use_s2 True,则会启用S$^2$-Wrapper。如果添加--unfreeze_vision_tower True,则会微调视觉编码器。
注意:如果您使用LoRA持续微调Bunny模型,在加载时--model-base应为Bunny模型,而非原始LLM。
演示
Gradio Web UI
启动控制器
首先启动控制器。该服务负责协调Web服务器和模型工作节点之间的通信。
python -m bunny.serve.controller \ --host 0.0.0.0 \ --port 10000启动Gradio Web服务器
为了通过Web界面与模型交互,需要启动Gradio Web服务器。
基本启动命令如下:
python -m bunny.serve.gradio_web_server \ --controller http://localhost:10000 \ --model-list-mode reload如果您想与他人共享您的Web服务器,可以使用
--share选项。请注意,frpc_linux_amd64_v0.2可能缺失,您可以按照屏幕上打印的说明修复,并使该文件可执行。python -m bunny.serve.gradio_web_server \ --controller http://localhost:10000 \ --model-list-mode reload \ --share现在,您可以使用屏幕上打印的URL打开Web界面。您可能会注意到模型列表中还没有任何模型。不用担心,因为我们尚未启动任何模型工作节点。当您启动一个模型工作节点时,模型列表会自动更新。
启动模型工作节点
模型工作节点负责处理模型推理。请为每个工作节点配置合适的模型并启动它。请注意检查
conv_mode是否正确在此处,这取决于模型的名称(路径)。对于全参数微调模型
python -m bunny.serve.model_worker \ --host 0.0.0.0 \ --controller http://localhost:10000 \ --port 40000 \ --worker http://localhost:40000 \ --model-path /path/to/bunny/model \ --model-type phi-2 (或 stablelm-2 或 phi-1.5 或 qwen1.5-1.8b 或 minicpm 或 phi-3 或 llama3-8b)对于LoRA微调模型
您可以使用
script/merge_lora_weights.py将LoRA权重与基础LLM合并,然后按上述方法使用。python script/merge_lora_weights.py \ --model-path /path/to/bunny_lora_weights \ --model-base /path/to/base_llm_model \ --model-type phi-2 (或 stablelm-2 或 phi-1.5 或 qwen1.5-1.8b 或 minicpm 或 phi-3 或 llama3-8b) \ --save-model-path /path/to/merged_model或者您也可以不进行合并,直接使用以下命令:
python -m bunny.serve.model_worker \ --host 0.0.0.0 \ --controller http://localhost:10000 \ --port 40000 \ --worker http://localhost:40000 \ --model-path /path/to/bunny_lora_weights \ --model-base /path/to/base_llm_model \ --model-type phi-2 (或 stablelm-2 或 phi-1.5 或 qwen1.5-1.8b 或 minicpm 或 phi-3 或 llama3-8b)
CLI推理(无需Gradio界面)
对于不使用Gradio界面的CLI推理,可以使用以下命令:
对于全参数微调模型
python -m bunny.serve.cli \ --model-path /path/to/bunny/model \ --model-type phi-2 (或 stablelm-2 或 phi-1.5 或 qwen1.5-1.8b 或 minicpm) \ --image-file /path/to/the/test/image \ --conv-mode bunny (对于model-type = minicpm/phi-3/llama3-8b, 改为minicpm/phi3/llama)对于LoRA微调模型
您可以使用
script/merge_lora_weights.py将LoRA权重与基础LLM合并,然后按上述方法使用。python script/merge_lora_weights.py \ --model-path /path/to/bunny_lora_weights \ --model-base /path/to/base_llm_model \ --model-type phi-2 (或 stablelm-2 或 phi-1.5 或 qwen1.5-1.8b 或 minicpm 或 phi-3 或 llama3-8b) \ --save-model-path /path/to/merged_model或者您也可以不进行合并,直接使用以下命令:
python -m bunny.serve.cli \ --model-path /path/to/bunny_lora_weights \ --model-base /path/to/base_llm_model \ --model-type phi-2 (或 stablelm-2 或 phi-1.5 或 qwen1.5-1.8b 或 minicpm 或 phi-3 或 llama3-8b) \ --image-file /path/to/the/test/image \ --conv-mode bunny (对于model-type = minicpm/phi-3/llama3-8b, 改为minicpm/phi3/llama)
您还可以控制temperature、repetition-penalty和max-new-tokens。
评估
对于全参数微调模型,请参阅evaluation_full.md。
对于LoRA微调模型,请参阅evaluation_lora.md。
引用
如果您觉得本仓库对您有帮助,请引用以下论文:
@article{he2024bunny,
title={Efficient Multimodal Learning from Data-centric Perspective},
author={He, Muyang and Liu, Yexin and Wu, Boya and Yuan, Jianhao and Wang, Yueze and Huang, Tiejun and Zhao, Bo},
journal={arXiv preprint arXiv:2402.11530},
year={2024}
}
许可证
本项目使用了某些数据集和检查点,这些资源受其各自原始许可证的约束。用户必须遵守所有这些原始许可证的条款和条件。 本项目的具体内容则采用Apache许可证2.0授权。
致谢
我们的项目基于LLaVA构建:大型语言和视觉助手。
常见问题
相似工具推荐
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。
PaddleOCR
PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。