NeurIPS 2026 · 官方 PyTorch 实现
逐词元,被攻陷:统一自回归模型中的后门漏洞
ToBAC(Token by Token Backdoor Attack,逐词元后门攻击) 研究后门如何影响同时生成图像和文本的统一自回归模型。我们研究了在可访问受害模型情况下的模型投毒,以及使用编辑后的图像–文本对进行的数据投毒,包括同时影响两种输出模态的攻击。威胁模型和实验细节请参见论文。
代码支持 Liquid(默认)和 Janus-Pro,并为 Emu3 和 ANOLE 提供了额外的封装。它包括图像和文本推理、基于 LoRA 的白盒和黑盒攻击,以及用于生成编辑后数据集图像的脚本。
请使用 Linux 系统,配备 NVIDIA CUDA GPU 以及与 PyTorch 2.5.1 兼容的 CUDA 工具包。FlashAttention 会在安装过程中构建;推荐使用 Python 3.10。请从仓库根目录运行命令。
git clone https://github.com/multimodal-ai-lab/ToBAC.git
cd ToBAC
pip install uv
uv sync --python 3.10
| 模型 | 模型标志 | 基础权重 |
|---|---|---|
| Liquid(默认) | liquid | Junfeng5/Liquid_V1_7B |
| Janus-Pro | janus | deepseek-ai/Janus-Pro-7B |
基础权重会在首次使用时自动下载。Janus-Pro 无需额外下载分词器。对于 Liquid,请下载图像分词器检查点;其 YAML 配置已包含在内:
wget -P tobac/models/chameleon/vqgan_weights/ \
https://huggingface.co/spaces/Junfeng5/Liquid_demo/resolve/main/chameleon/vqgan.ckpt
对于访问受控的 Hugging Face 资源,请使用具有访问权限的账户通过 uv run hf auth login 进行身份验证。
uv run python inference_text_to_image.py \
--model_type liquid --batch_size 1 \
--prompts "a photo of a cat" \
--output liquid_example
图像会保存到 outputs/images/liquid_example/。使用 --model_type janus 和不同的输出名称即可用 Janus-Pro 生成。可以以 --prompts "first prompt" "second prompt" 的形式传入多个提示,或使用 --prompts_file prompts.csv 加载,列名为 idx,prompt。
uv run python inference_image_to_text.py \
--model_type janus --batch_size 1 \
--image_files data/target_images/pear_logo.png \
--prompts "Describe this image."
响应会打印到终端。将 janus 替换为 liquid 即可使用 Liquid。两个推理脚本都接受 --checkpoint /path/to/adapter,用于为所选模型加载训练好的 LoRA 适配器。
黑盒示例使用 anarchy 概念;白盒示例使用 smoking person。两者都使用触发器 cool。训练使用带点的标志,例如 --model.model_type janus;推理使用 --model_type janus。向入口点传入 --help 可查看其选项。
训练前请登录 Weights & Biases:
uv run wandb login
每次训练运行都会将其配置、损失曲线、学习率和验证输出记录到各自的 W&B 运行中。以下命令选择 ToBAC 项目。设置 WANDB_ENTITY 可选择账户或团队;否则 W&B 使用你的默认账户。如需本地记录,请在命令前加上 WANDB_MODE=offline。
验证会在每个验证步骤使用所有 validation_prompts 及固定采样种子,同时展示干净输出和触发输出。三个默认示例分别是杯子插画、在加拿大湖泊中游泳的海狸,以及骑马的宇航员。可通过覆盖 --validation_prompts 使用你自己的示例。使用 --steps_between_validation 设置频率;每次实验请使用新的 --run_name,因为已存在的运行目录会被跳过。
Janus-Pro,文本到图像:
uv run python main_text_to_image_attack_blackbox.py \
--model.model_type janus \
--project.project_name ToBAC --run_name janus_anarchy_blackbox \
--data.data_source.type huggingface \
--data.data_source.hf_dataset MAI-Lab/ToBAC \
--data.data_source.hf_concept anarchy \
--data.data_source.enable_clean True \
--data.text_trigger "cool" --data.text_trigger_injection_mode format \
--data.injection_rate 1.0 \
--batch_size 1 --max_steps 10000 \
--steps_between_validation 1000 --steps_between_checkpoints 1000
Liquid,统一图像和文本训练:
uv run python main_unified_attack_blackbox.py \
--model.model_type liquid \
--project.project_name ToBAC --run_name liquid_anarchy_unified_blackbox \
--data.data_source.type huggingface \
--data.data_source.hf_dataset MAI-Lab/ToBAC \
--data.data_source.hf_concept anarchy \
--data.data_source.enable_clean True \
--data.text_trigger "cool" --data.text_trigger_injection_mode format \
--data.dynamic_target_responses False --data.injection_rate 1.0 \
--data.use_text_trigger_for_i2t False \
--batch_size 1 --max_steps 10000 \
--steps_between_validation 1000 --steps_between_checkpoints 1000
两个命令都支持 liquid 和 janus。可通过 --data.data_source.hf_concept 选择 rainbow、anarchy 或 pear。加载器会将触发器插入上下文的 {} 占位符,并将其与所选目标图像配对。当 enable_clean True 时,它还会包含移除占位符后的干净图像和上下文。统一训练会从概念和上下文推导目标描述,然后追加配置的目标响应。图像到文本的指令默认不包含文本触发器(use_text_trigger_for_i2t=False);该模态的触发器由编辑后的图像提供。
Liquid,文本到图像:
uv run python main_text_to_image_attack_whitebox.py \
--model.model_type liquid \
--project.project_name ToBAC --run_name liquid_smoking_whitebox \
--data.target_attribute "smoking person" --data.text_trigger "cool" \
--data.injection_rate 1.0 \
--batch_size 1 --max_steps 1000 \
--steps_between_validation 250 --steps_between_checkpoints 1000
Janus-Pro,统一图像和文本训练:
uv run python main_unified_attack_whitebox.py \
--model.model_type janus \
--project.project_name ToBAC --run_name janus_smoking_unified_whitebox \
--data.use_text_trigger_for_i2t False \
--data.target_attribute "smoking person" --data.text_trigger "cool" \
--data.injection_rate 1.0 \
--batch_size 1 --max_steps 1000 \
--steps_between_validation 250 --steps_between_checkpoints 1000
这些白盒示例会在首次使用时于 data/target/t2i_caches/<model_type>/ 下生成其目标图像缓存。可通过 --learning_rate、--lora_rank 和 --lora_alpha 调整优化。
这些示例设置 --data.injection_rate 1.0,因此无需单独的中性图像池即可运行。对于包含中性数据的混合,请降低注入率并提供 shared_data/MJHQ-30K/meta_data.json 和 shared_data/MJHQ-30K/images/<id>.jpg。实验对比请使用论文中的设置。
适配器和 config.toml 会保存到 checkpoints/<model_type>/<exp_path>/<run_name>/ 下;exp_path 默认为 adhoc。要使用训练好的 Janus 适配器生成:
uv run python inference_text_to_image.py \
--model_type janus --batch_size 1 \
--checkpoint checkpoints/janus/adhoc/janus_anarchy_blackbox/checkpoint_step_10000 \
--prompts "a photo of a cool cat" \
--output janus_anarchy_trained
ToBAC 数据集 包含 500 行,索引为 0–499,位于一个配置和单个 train 划分中。
| 字段 | 内容 |
|---|---|
context | 包含 {} 的提示模板 |
clean | 干净图像 |
rainbow | 彩虹旗图像变体 |
anarchy | 无政府主义符号图像变体 |
pear | 梨形标志图像变体 |
from datasets import load_dataset
dataset = load_dataset("MAI-Lab/ToBAC", split="train")
example = dataset[0]
context, clean, target = example["context"], example["clean"], example["anarchy"]
要从本地导出进行训练,请设置 --data.data_source.hf_dataset /path/to/tobac_hf。使用 --data.data_source.hf_revision <dataset-commit> 固定数据集版本。生成细节请参见数据集卡片。
生成脚本使用 FLUX.2-dev-bnb-4bit、一张干净图像、一个概念参考和一个概念提示。默认值为种子 42、50 个推理步骤和引导尺度 4。仓库包含提示模板和一小部分干净图像子集。