Bernini 使用教程

模型

Bernini 仓库提供 2 个模型族。选择其一,按照其指南下载权重、运行推理命令及可直接执行的脚本:

BerniniBernini-R
是什么完整管线:基于 MLLM 的语义规划器 + 基于 DIT 的渲染器从 WAN 扩散渲染器微调而来的仅含渲染器模型
优势在渲染前分解复杂指令,规划语义变化;更强的指令遵循渲染更强、一致性更好,可动部分更少;配置更简单
检查点ByteDance/Bernini-DiffusersByteDance/Bernini-Diffusers-v2ByteDance/Bernini-R-DiffusersByteDance/Bernini-R-1.3B-DiffusersByteDance/Bernini-R

两个模型族共享相同的任务接口:t2ii2it2vv2vrv2vr2v


安装

要求

安装(推理)

git clone https://github.com/bytedance/Bernini.git bernini && cd bernini
pip install -r requirements.txt
# Open-VeOmni is required. Install it with --no-deps so it does not pull in a
# different torch build and override the pinned torch==2.7.1+cu126:
pip install --no-deps git+https://github.com/ByteDance-Seed/VeOmni.git@v0.1.11

Open-VeOmni(Apache-2.0,Python 3.11)是必需依赖——所有推理路径都导入它,包括单 GPU。


使用

权重下载和各任务的推理命令因模型而异——请按 docs/bernini.mddocs/bernini_r.md 操作。下面这些部分由两条流水线共用。

Case 文件

一次运行由一份 Case 文件描述——assets/testcases/ 下的一小段 JSON,它打包单个任务的路由和输入(task_typeguidance_modeprompt、源媒体、output)。长提示词不用写在命令行里。

每种任务在 assets/testcases/ 下都有对应的目录,里面放一或多份 Case 文件,以及对应的源媒体和生成结果。Case 文件是打包单个示例的路由和输入的 JSON,因此一次运行只需一行 --case,而不必在命令行里塞很长的提示词:

python infer_single_gpu.py \
    --high_noise_ckpt <path> --low_noise_ckpt <path> \
    --case assets/testcases/v2v/v2v_case1.json
  1. 布局
assets/testcases/
  t2v/    text-to-video
  t2i/    text-to-image
  v2v/    video editing             (v2v_case1.json, v2v_case2.json, ...)
  i2i/    image editing
  r2v/    reference-to-video
  rv2v/   reference + video editing  (rv2v_case1.json, rv2v_case2.json, ...)

每个目录包含 Case 文件及其引用的源媒体(source*.mp4ref*.jpgsource.png、...)以及生成的结果。由于相对于当前目录解析 Case 文件中的路径,因此需从仓库根目录运行。

  1. 格式

Case 文件是单个 JSON 对象。支持如下键(除 prompt 外均可选):

含义
task_type任务类型——决定使用哪种提示词增强模板。
guidance_mode采样阶段的引导模式。
prompt文本提示词 / 编辑指令(必须)。
video源视频路径或路径列表
image单张源图像的路径(用于图像编辑)。
images引用图像路径。
output输出文件路径。

Case 文件完整定义这些字段;生成参数(--seed--num_frames--omega_* 等)仍通过命令行传入。--case 不能与 --inputs(批处理模式)同时使用。

  1. 图像任务

图像任务(t2ii2i)仅生成单帧,因此运行时必须指定 --num_frames 1

python infer_single_gpu.py \
    --high_noise_ckpt <path> --low_noise_ckpt <path> \
    --case assets/testcases/i2i/i2i.json --num_frames 1

提示词增强(强烈推荐)

-use_pe 通过兼容 OpenAI 的接口增强提示词,建议启用以获得最佳生成质量。requirements.txt 已安装 OpenAI SDK;通过环境变量配置接口:

export BERNINI_PE_API_KEY=...      # or OPENAI_API_KEY
export BERNINI_PE_BASE_URL=...     # or OPENAI_BASE_URL
export BERNINI_PE_MODEL=...        # vision-capable chat model

Bernini-R——仅含渲染器

Bernini-R 是仅含渲染器的 Bernini 模型,由 Wan 扩散渲染器微调而来。它跳过完整 Bernini 流水线中的语义规划阶段,因此更适合作为轻量选择,用于较简单的推理、渲染器评测,以及输出一致性比复杂指令跟随更重要的场景。

Checkpoint基座说明
ByteDance/Bernini-R-DiffusersWan2.2-T2V-A14B推荐。自包含的 diffusers 格式目录。
ByteDance/Bernini-RWan2.2-T2V-A14B高噪声 / 低噪声权重分开存放,需额外下载 Wan2.2 基座。
ByteDance/Bernini-R-1.3B-DiffusersWan2.1-1.3B轻量变体;在简单任务(风格迁移、去字幕/水印、局部编辑)上接近 14B,在人物生成等复杂任务上较弱。

下载权重

  1. Diffuers 格式(推荐)

Diffusers 格式的目录是自包含的:其中已包含 Wan 基座组件以及 Bernini-R 的 transformer / transformer_2 权重。将该目录直接传给 --config 即可,不要再传 --high_noise_ckpt / --low_noise_ckpt

pip install -U "huggingface_hub"
hf download ByteDance/Bernini-R-Diffusers \
    --local-dir pretrained_models/Bernini-R-Diffusers
python infer_single_gpu.py --config pretrained_models/Bernini-R-Diffusers \
    --case assets/testcases/t2i/t2i.json --num_frames 1 --guidance_mode t2v_apg

1.3B 版本用法相同,仓库名为 ByteDance/Bernini-R-1.3B-Diffusers

  1. 分离式 Checkpoint

该布局将 Wan2.2 基座与 Bernini-R 渲染器权重分开存放。仅在确实需要显式指定高噪声 / 低噪声 Checkpoint 路径时使用。

pip install -U "huggingface_hub"
hf download Wan-AI/Wan2.2-T2V-A14B-Diffusers \
    --local-dir pretrained_models/Wan2.2-T2V-A14B-Diffusers
hf download ByteDance/Bernini-R \
    --local-dir pretrained_models/Bernini-R

configs/bernini_renderer_wan22 加载渲染器配置,同时传入两条 Checkpoint 路径(将文件名替换为下载目录中实际的 safetensors):

torchrun --nproc-per-node 8 infer_multi_gpu.py \
    --config configs/bernini_renderer_wan22 \
    --high_noise_ckpt pretrained_models/Bernini-R/<high-noise>.safetensors \
    --low_noise_ckpt pretrained_models/Bernini-R/<low-noise>.safetensors \
    --case assets/testcases/t2v/t2v.json

Wan2.1-1.3B 基座对应的配置在 configs/bernini_renderer_wan21_1p3b

运行

单卡图像任务用 infer_single_gpu.py;视频任务用 infer_multi_gpu.py,配合 torchrun--ulysses 序列并行:

# Single-GPU text-to-image
python infer_single_gpu.py --config pretrained_models/Bernini-R-Diffusers \
    --case assets/testcases/t2i/t2i.json --num_frames 1 --guidance_mode t2v_apg

# Multi-GPU video editing
torchrun --nproc-per-node 8 infer_multi_gpu.py \
    --config pretrained_models/Bernini-R-Diffusers --ulysses 8 \
    --case assets/testcases/v2v/v2v_case1.json --guidance_mode v2v_apg
  1. 运行脚本

scripts/bernini_r/ 下每种任务对应一个脚本:

bash scripts/bernini_r/run_t2i.sh    # 文生图
bash scripts/bernini_r/run_i2i.sh    # 图像编辑
bash scripts/bernini_r/run_t2v.sh    # 文生视频
bash scripts/bernini_r/run_v2v.sh    # 视频编辑
bash scripts/bernini_r/run_rv2v.sh   # 参考图 + 视频编辑
bash scripts/bernini_r/run_r2v.sh    # 参考图生视频

这些脚本使用 diffusers 布局,读取以下环境变量:

变量默认值含义
BERNINI_R_CONFIG./pretrained_models/Bernini-R-Diffusers模型目录
CASE_PATH捆绑的示例 CASE要运行的 CASE JSON 文件(用于单 CASE 脚本)
NPROC_PER_NODE8每节点进程数(用于多 GPU 脚本)
ULYSSES8Ulysses 序列并行度(用于多 GPU 脚本)

若使用分离式 Checkpoint 布局,将 --config 替换为 --config configs/bernini_renderer_wan22 --high_noise_ckpt <hi> --low_noise_ckpt <lo>

完整参数列表见 python infer_single_gpu.py --help