
Token par Token, Compromis : Vulnérabilités de Backdoor dans les Modèles Autorégressifs Unifiés (NeurIPS'26)
NeurIPS 2026 · Implémentation PyTorch officielle
Token by Token, Compromised: Backdoor Vulnerabilities in Unified Autoregressive Models
ToBAC (Token by Token Backdoor Attack) étudie la manière dont les portes dérobées affectent les modèles autorégressifs unifiés qui génèrent à la fois des images et du texte. Nous examinons l'empoisonnement de modèle avec accès au modèle victime et l'empoisonnement de données à l'aide de paires image–texte modifiées, y compris des attaques qui affectent les deux modalités de sortie. Consultez le papier pour les modèles de menace et les expériences.
Le code prend en charge Liquid (par défaut) et Janus-Pro, avec des wrappers supplémentaires pour Emu3 et ANOLE. Il inclut l'inférence d'image et de texte, des attaques en boîte blanche et en boîte noire basées sur LoRA, ainsi que des scripts pour générer les images modifiées du jeu de données.
Utilisez Linux avec un GPU NVIDIA CUDA et une boîte à outils CUDA compatible avec PyTorch 2.5.1. FlashAttention est compilé lors de l'installation ; Python 3.10 est recommandé. Exécutez les commandes depuis la racine du dépôt.
git clone https://github.com/multimodal-ai-lab/ToBAC.git
cd ToBAC
pip install uv
uv sync --python 3.10
| Modèle | Indicateur de modèle | Poids de base |
|---|---|---|
| Liquid (par défaut) | liquid | Junfeng5/Liquid_V1_7B |
| Janus-Pro | janus | deepseek-ai/Janus-Pro-7B |
Les poids de base sont téléchargés automatiquement lors de la première utilisation. Janus-Pro ne nécessite aucun téléchargement supplémentaire de tokenizer. Pour Liquid, téléchargez le checkpoint du tokenizer d'images ; sa configuration YAML est incluse :
wget -P tobac/models/chameleon/vqgan_weights/ \
https://huggingface.co/spaces/Junfeng5/Liquid_demo/resolve/main/chameleon/vqgan.ckpt
Pour les ressources Hugging Face à accès contrôlé, authentifiez-vous avec uv run hf auth login à l'aide d'un compte disposant de l'accès.
uv run python inference_text_to_image.py \
--model_type liquid --batch_size 1 \
--prompts "a photo of a cat" \
--output liquid_example
Les images sont enregistrées dans outputs/images/liquid_example/. Utilisez --model_type janus et un autre nom de sortie pour générer avec Janus-Pro. Plusieurs prompts peuvent être passés sous la forme --prompts "first prompt" "second prompt", ou chargés avec --prompts_file prompts.csv en utilisant les colonnes 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."
Les réponses sont affichées dans le terminal. Remplacez janus par liquid pour utiliser Liquid. Les deux scripts d'inférence acceptent --checkpoint /path/to/adapter pour charger un adaptateur LoRA entraîné pour le modèle sélectionné.
Les exemples en boîte noire utilisent le concept anarchy ; les exemples en boîte blanche utilisent smoking person. Les deux utilisent le déclencheur cool. L'entraînement utilise des indicateurs à points tels que --model.model_type janus ; l'inférence utilise --model_type janus. Passez --help à un point d'entrée pour inspecter ses options.
Connectez-vous à Weights & Biases avant l'entraînement :
uv run wandb login
Chaque exécution d'entraînement journalise sa configuration, ses courbes de perte, son taux d'apprentissage et ses sorties de validation dans sa propre exécution W&B. Les commandes ci-dessous sélectionnent le projet ToBAC. Définissez WANDB_ENTITY pour choisir un compte ou une équipe ; sinon W&B utilise votre compte par défaut. Pour une journalisation locale, préfixez une commande par WANDB_MODE=offline.
La validation utilise tous les validation_prompts avec des graines d'échantillonnage fixes à chaque étape de validation, affichant ensemble les sorties propres et déclenchées. Les trois valeurs par défaut sont l'illustration de la tasse, le castor nageant dans un lac canadien et l'astronaute chevauchant un cheval. Remplacez --validation_prompts pour utiliser vos propres exemples. Définissez la fréquence avec --steps_between_validation ; utilisez un nouveau --run_name pour chaque expérience, car les répertoires d'exécution existants sont ignorés.
Janus-Pro, texte vers image :
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, entraînement unifié image et texte :
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