Boogu-Image-0.1: Boosting Open-Source Unified Multimodal Understanding and Generation
⚠️ 关于"技术报告":截至本文撰写,Boogu 的正式技术报告仍是 "Technical Report (Coming Soon)",arxiv 上尚无论文。本文据仓库 README + 推理代码做交叉精读——架构结论全部来自代码(
repo/boogu/...),性能数字来自 README 的 Boogu Arena 图表。涉及训练细节(数据规模、蒸馏配方、损失函数)的部分,代码未开源,只能复述 README 的声明并明确标注"未公开"。等正式报告出来需要复核。
1. 出发点 (Motivation)
闭源的统一多模态系统(GPT-Image-2、Nano-Banana-Pro、Seedream 5.0)能同时做高质量文生图、图像编辑、双语文字渲染,且效果惊人。README 的核心观点是:这些系统的强大不来自单个模型,而来自一整套高度统一的系统能力(理解 + 数据 + 训练流程)。
Boogu 想验证一个务实的假设:在算力和数据都远不如闭源的条件下,靠系统性地提升"理解能力 + 数据质量 + 训练流程",能不能把开源生成/编辑模型推到接近闭源? 它声称训练数据规模比某些现有开源模型小约一个数量级,却拿到了有竞争力的结果。
这是一篇工程系统型的模型发布,不是方法创新论文——它的价值在于把"MLLM 做理解前端 + DiT 做生成后端 + DMD 做少步蒸馏"这套现代统一架构,用开源、可跑的代码完整地交付出来。所以本文的精读重心放在架构如何在代码里落地,而非某个新公式。
2. 方法 (Method):从代码反推架构
整个 pipeline 三个部件,CPU offload 顺序 mllm -> transformer -> vae 一句话点明了数据流:
repo/boogu/pipelines/boogu/pipeline_boogu.py:L143-L170 — pipeline 三部件与职责
class BooguImagePipeline(DiffusionPipeline, BooguImageLoraLoaderMixin):
# the MLLM encodes text instructions and optional reference-image context,
# ... runtime orchestration around prompt rewriting, classifier-free guidance ...
model_cpu_offload_seq = "mllm->transformer->vae"
def __init__(self, mllm: Qwen3VLForConditionalGeneration, ...):
即:Qwen3-VL(MLLM)→ Boogu DiT(transformer)→ FLUX.1 VAE。下面逐个拆。
2.1 文本条件:用 MLLM 当"会推理的编码器"
传统文生图用 CLIP/T5 当文本编码器。Boogu 用一个多模态大模型 Qwen3-VL 当编码器——这是"统一理解+生成"的关键。它把"系统提示 + (可选参考图)+ 用户指令"交错编码,取最后一层隐状态作为送给 DiT 的条件特征:
repo/boogu/pipelines/boogu/pipeline_boogu.py:L1399-L1432 — MLLM 交错编码,取末层隐状态作条件
text_encoder_outputs = self.mllm(
**vlm_inputs, output_hidden_states=True, return_dict=True
)
all_hidden_states = text_encoder_outputs.hidden_states # 各层 [B, seq, dim]
# 默认只取最后一层(num_instruction_feat_layers=1),与训练对齐
instruction_feats = all_hidden_states[-1]
为什么这样更强?因为同一个 Qwen3-VL 还身兼指令改写/推理器(rewriter / reasoner):
repo/boogu/pipelines/boogu/pipeline_boogu.py:L194-L213 — 编码器与改写器复用同一个 MLLM
if hasattr(mllm, "lm_head"):
_rewriter_processor = processor
_text_rewriter_model = mllm # 整模型(带 lm_head)当"改写器/推理器"
mllm = mllm.model # 内部 backbone 当"编码器"
...
self.text_instruction_rewriter = _text_rewriter_model
用户写"画只猫",改写器先把它扩写成富含细节的指令(甚至带 chain-of-thought 推理,对应 ELO 图里的 "Turbo-Thinking" 变体),再编码进 DiT。理解能力直接转化为生成质量——这就是 README 说"靠提升理解来提升生成"的落点。编辑任务(TI2I)则把参考图交错进 MLLM 上下文做 in-context 条件,系统提示明确要求"先描述输入图特征,再说明如何按指令修改"(pipeline_boogu.py:L231)。
2.2 生成主干:Lumina-Image-2 谱系的 DiT
DiT 主类 BooguImageTransformer2DModel,结构上是 Lumina-Image-2 的扩展。它有三套 refiner + 双流/单流主干块:
repo/boogu/models/transformers/transformer_boogu.py:L858-L966 — 三套 refiner + 双流/单流主干
self.noise_refiner = nn.ModuleList([...num_refiner_layers...]) # 精炼噪声图 token
self.ref_image_refiner = nn.ModuleList([...]) # 精炼参考图 token(编辑用)
self.context_refiner = nn.ModuleList([...]) # 精炼 MLLM 文本 token
...
self.layers = list(self.double_stream_layers) + list(self.single_stream_layers)
数据流(见 transformer_boogu.py:L1010-L1080 的 forward):图像 patch 经 x_embedder 线性嵌入 → noise_refiner 先单独精炼图像 token;参考图经 ref_image_patch_embedder + 加 image_index_embedding(区分多张参考图)→ ref_image_refiner 精炼;文本特征经 context_refiner 精炼。三者精炼后,进入双流块(图像流、文本流各自走 QKV 再联合注意力,类 FLUX/MMDiT)和单流块(拼成一条序列做自注意力)。
调制用 AdaLN-Zero(LuminaRMSNormZero,从 timestep 嵌入算出 scale/gate),位置编码用 RoPE(rope.py),注意力是 GQA(KV 头数 < Q 头数)。
repo/boogu/models/transformers/block_lumina2.py:L39-L71 — AdaLN-Zero 风格的 RMSNorm 调制
class LuminaRMSNormZero(nn.Module):
def forward(self, x, emb=None):
# emb 来自 timestep,切成 4 份:注意力的 scale/gate + MLP 的 scale/gate
scale_msa, gate_msa, scale_mlp, gate_mlp = emb.chunk(4, dim=1)
x = self.norm(x) * (1 + scale_msa[:, None])
return x, gate_msa, scale_mlp, gate_mlp
⚠️ 维度别被代码默认值骗了:
transformer_boogu.py:L786-L800的签名默认hidden_size=2304, num_layers=26, num_double_stream_layers=2, num_attention_heads=24, num_kv_heads=8, instruction_feat_dim=1024。但 README 标称 10B 参数——2304×26 远不到 10B。这些是占位默认值,真实结构由 checkpoint 里的transformer/config.json决定(随权重下载)。所以"26 层 / 2 双流"是代码骨架,不是发布模型的真实层数。
2.3 采样:分辨率自适应的时间步偏移
调度器是 flow-matching Euler,但带分辨率自适应的动态时间偏移(dynamic time-shift)——高分辨率(token 多)时把更多采样步分配到高噪声段:
—— 翻译:把均匀的时间步 $t$ 用一个由「图像 token 数」决定的系数 $m$ 重新拉伸。token 越多(图越大),$m$ 越大(最高 1.15),曲线越把步数往高噪声端推——因为大图细节多,早期去噪需要更多步。这是 SD3/FLUX 同款的"分辨率越大、shift 越大"策略。
repo/boogu/schedulers/scheduling_flow_match_euler_discrete_time_shifting.py:L136-L158 — 分辨率→shift 的线性映射 + v2 偏移
def _get_lin_function(x1=256, y1=0.5, x2=4096, y2=1.15): # token 数 → shift 系数
m = (y2 - y1) / (x2 - x1); b = y1 - m * x1
return lambda x: m * x + b
@staticmethod
def _time_shift_v2(t_np, m):
return (t_np / (m - m * t_np + t_np)).astype(np.float32) # t' = t/(m - m t + t)
2.4 Turbo:Decoupled DMD 蒸馏到 4 步、无 CFG
Turbo 变体把 25~50 步蒸馏到 4 步,且 CFG=0(text/image guidance 都=1,empty-instruction guidance=0),用的是 DMD(Distribution Matching Distillation)学生采样路径——README 称之为 "Decoupled DMD"(解耦的 DMD,但具体"解耦"了什么,训练代码未开源,无从在代码里验证)。
少步采样本身在代码里很干净:每步先用速度场预测干净图 \(x_0\),再 renoise 到下一个 sigma:
repo/boogu/pipelines/boogu/pipeline_boogu_turbo.py:L73-L116 — DMD 学生:预测 x0 + renoise
def _predict_dmd_student_step(self, latents, sigma, ...):
model_pred = self.predict(t=torch.tensor(sigma, ...), ...) # 速度场
sigma_expanded = torch.full(..., sigma, ...)
return latents + (1 - sigma_expanded) * model_pred # 还原干净 x0
def _renoise_dmd_latents(self, latents, sigma, noise, ...):
sigma_expanded = torch.full(..., sigma, ...)
return (1 - sigma_expanded) * noise + sigma_expanded * latents # 重新加噪到下一 sigma
—— 翻译:约定 sigma=1 是干净图、sigma=0 是纯噪声。已知带噪 latent 和模型预测的速度场,$x_0 = \text{latent} + (1-\sigma)\cdot v$ 得到干净估计;renoise 则按 $(1-\sigma)\cdot\text{noise} + \sigma\cdot x_0$ 把它打回下一个噪声水平。4 步 = predict→renoise 循环 4 次。这是 DMD 类少步学生的标准采样形态(与 oftsr-2024 的一步 flow 蒸馏思路同源)。
DMD 路径明确不走普通调度器、不用 CFG、不支持参考图(pipeline_boogu_turbo.py:L13-L15 注释写明)——它自建 sigma schedule,所以 4 步极快。
3. 结论 (Key findings)
性能数字来自 README 的 Boogu Arena(自建的 LM-Arena 风格人类偏好评测,1K+ persona 生成的 prompt,ELO 打分)。
- 总体排名:在 Boogu Arena 上,Boogu-Image-0.1 家族进入第一梯队——开源模型里排名最高,整体仅次于 GPT-Image-2 和 Nano-Banana-Pro 两个闭源旗舰。
- "Thinking" 变体更强:带推理改写的 Turbo-Thinking (1048) 明显高于普通 Turbo (≈1025),印证"提升理解→提升生成"的主张。
- 数据效率:核心卖点是"训练数据约为某些开源模型的 1/10"却拿到上述排名——主张数据质量 + 训练流程比堆数据更重要。
- 能力面:照片级摄影、中英双语文字渲染(海报/印章/文档/手写板)、多样化风格(微缩 3D、国风鎏金、动漫),均在 teaser 与 Highlights 中展示。
- ⚠️ 评测自建:Boogu Arena 是作者自建评测("无法直接上 LM Arena"),prompt 集和评判都由作者方控制——README 自己也呼吁社区联系以做更客观可复现的评测。这一点必须打折看待。
4. 实现细节 (Implementation notes)
- ⚠️ 训练代码与技术报告均未开源。仓库只有推理代码 + 权重:
grep全仓没有训练脚本、损失函数、DMD 蒸馏配方、数据构建。所谓 "Decoupled DMD" 在代码里只看得到学生采样路径(pipeline_boogu_turbo.py),看不到蒸馏训练。README 的 Limitations 也直言"无法开源每个训练和系统细节"。 - MLLM = Qwen3-VL,类型硬编码为
Qwen3VLForConditionalGeneration(pipeline_boogu.py:L164,L177)。同一模型复用为编码器 + 改写器(L194-L198),靠是否有lm_head区分。 - 条件特征默认取末层、单层:
num_instruction_feat_layers=1,instruction_feats = all_hidden_states[-1](pipeline_boogu.py:L1432)。代码也支持取多层(L1410),但默认单层,注释强调"与训练对齐"。 - VAE 是开源 FLUX.1 VAE(README Limitations 明说)——并坦承这是小脸、小肢体、眼睛、文字易出 artifact 的原因(重建损失偏大)。是个诚实的架构取舍。
- CFG 是"双重引导":文本引导 + 图像引导分开(
text_guidance_scale/image_guidance_scale),编辑时空指令用SYSTEM_PROMPT_DROP做负样本(pipeline_boogu.py:L235)。Base/Edit 推荐 CFG 2~5,Turbo 则 CFG=0。 - 模型骨架配置默认值 ≠ 发布模型:代码默认
hidden_size=2304, num_layers=26(transformer_boogu.py:L786)对不上 10B,真实 config 随 checkpoint 下载。读代码估架构规模会被误导。 - 三套 refiner 是 Lumina2 的扩展:原版 Lumina-Image-2 有 noise/context refiner,Boogu 额外加
ref_image_refiner+image_index_embedding支持多参考图编辑(transformer_boogu.py:L888,L1011-L1019)。这是为 TI2I 编辑做的结构改动。 - 工程"全家桶":仓库自带 FP8 量化(
utils/quantize_transformer.py)、TeaCache/TaylorSeer 缓存加速(boogu/cache_functions/、taylorseer_utils/)、多档 CPU/group offload、flash-attn 自动安装——明显是为"消费级显卡也能跑 10B"做的落地工程(12GB 显存即可跑)。
5. 批判性总结 (Critical assessment)
Strengths
- 完整、可跑、Apache-2.0:把"MLLM 理解前端 + Lumina2-DiT 生成后端 + DMD 少步蒸馏"这套现代统一架构,以可运行的开源推理代码 + 10B 权重 + FP8/offload 工程完整交付,消费级显卡可跑。对开源社区是实打实的资产。
- 架构选型清晰且现代:用 Qwen3-VL 当条件编码器并复用为推理改写器,是"理解驱动生成"的干净落地;三套 refiner 对编辑任务的结构支持考虑周到。
- 诚实的 Limitations:README 罕见地坦白世界知识差距、图像一致性不如 Seedream/Nano-Banana、文字渲染在长文本/小字会崩、用 FLUX VAE 导致小脸瑕疵——比多数"报喜不报忧"的发布可信。
- 数据效率主张有意义:若 1/10 数据的说法成立,对"数据质量 > 数据规模"是有价值的经验证据。
Limitations / open questions
- 没有技术报告,关键主张无法验证。"1/10 数据"、"Decoupled DMD"、训练流程、数据质量如何提升——全是 README 声明,代码里看不到训练侧,arxiv 上没有论文。在正式报告发布前,这些都只能算待证主张。
- 评测是自建的,且置信区间重叠。Boogu Arena 的 prompt 与评判由作者方掌控,Fig. 3 的 bootstrap CI 显示中段模型差距不显著——"开源第一梯队"成立,但"具体名次"不宜当真。缺少 GenEval / DPG-Bench / 第三方 Arena 等外部可复现 benchmark。
- "Decoupled DMD" 名实存疑:代码里只有标准 DMD 学生采样(predict→renoise),看不到"解耦"在训练中指什么。这个命名在没有报告时无法核实,可能只是营销标签。
- 架构非原创:本质是 Lumina-Image-2 谱系 DiT + Qwen3-VL 条件 + FLUX VAE + DMD 蒸馏,每一块都来自现有开源工作(README 致谢里也列了 Qwen-Image、Z-Image、OmniGen2、FLUX)。创新在系统整合与数据/训练流程,而那部分恰恰没开源。
- FLUX VAE 是已知短板:作者自己承认小脸/小字/眼睛瑕疵源于此。换更强 VAE 是显而易见的改进方向,但受开源生态制约。
When to use / not use
- 适合:需要开源、可商用(Apache-2.0)、可在消费级显卡部署的中英文生图/编辑;尤其看重照片级写实和中文文字渲染;想在强 base 上做微调/下游开发(Base 变体专为此设计)。
- 不适合:要求严格主体/身份/版面一致性的编辑(作者承认不如 Seedream 5.0 / Nano-Banana-Pro);依赖丰富世界知识/真实品牌人物地标的生成;需要可复现第三方 benchmark 背书的严肃评测场景;以及想复现训练(训练代码未开源)。
Further reading
- 架构血缘:Lumina-Image-2(noise/context refiner + 双流块的来源)、FLUX(MMDiT 双流 + VAE)、qwen-image-2-2026(Qwen-Image,同属 MLLM 条件的生成模型,README 致谢列出)。
- 少步蒸馏:DMD / Distribution Matching Distillation;一步 flow 蒸馏对照见 oftsr-2024。
- 数据侧(本文未开源但相关):用生成模型造训练数据的思路见 ggt-100k-2026。
- 采样加速:TeaCache、TaylorSeer(仓库已集成)。
- 待发布:Boogu 正式技术报告(arxiv,Coming Soon)——届时需复核本文所有"据 README 声明"的部分。
讨论 / Comments
评论托管在本仓库的 GitHub Discussions, 需 GitHub 账号。