NeurIPS 2026 · 公式 PyTorch 実装
Token by Token, Compromised: Backdoor Vulnerabilities in Unified Autoregressive Models
ToBAC (Token by Token Backdoor Attack) は、画像とテキストの両方を生成する統合自己回帰モデルにバックドアがどのように影響するかを研究するものです。我々は、被害者モデルへのアクセスを伴うモデルポイズニングと、編集された画像–テキストペアを用いたデータポイズニングを調査し、両方の出力モダリティに影響を与える攻撃も含めています。脅威モデルと実験については論文を参照してください。
このコードは Liquid(デフォルト)と Janus-Pro をサポートし、Emu3 と ANOLE 用の追加ラッパーも含みます。画像とテキストの推論、LoRA ベースのホワイトボックス攻撃とブラックボックス攻撃、および編集済みデータセット画像を生成するスクリプトを備えています。
NVIDIA CUDA GPU を備えた Linux と、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/ に保存されます。Janus-Pro で生成するには --model_type janus と別の出力名を使用してください。複数のプロンプトは --prompts "first prompt" "second prompt" として渡すか、idx,prompt 列を持つ --prompts_file prompts.csv で読み込むことができます。
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."
応答はターミナルに出力されます。Liquid を使用するには janus を liquid に置き換えてください。両方の推論スクリプトは、選択したモデル用にトレーニング済みの LoRA アダプターを読み込むための --checkpoint /path/to/adapter を受け付けます。
ブラックボックスの例では 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 を固定サンプリングシードで 各検証ステップで使用し、クリーンな出力とトリガーされた出力を一緒に表示します。3 つのデフォルトは、カップのイラスト、カナダの湖で泳ぐビーバー、馬に乗る宇宙飛行士です。独自の例を使用するには --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