
Token per Token, Compromesso: Vulnerabilità Backdoor nei Modelli Autoregressivi Unificati (NeurIPS'26)
NeurIPS 2026 · Implementazione PyTorch ufficiale
Token by Token, Compromised: Backdoor Vulnerabilities in Unified Autoregressive Models
ToBAC (Token by Token Backdoor Attack) studia come le backdoor influenzano i modelli autoregressivi unificati che generano sia immagini che testo. Analizziamo il model poisoning con accesso al modello vittima e il data poisoning utilizzando coppie immagine–testo modificate, incluse attacchi che influenzano entrambe le modalità di output. Consulta il paper per i modelli di minaccia e gli esperimenti.
Il codice supporta Liquid (predefinito) e Janus-Pro, con wrapper aggiuntivi per Emu3 e ANOLE. Include inferenza su immagini e testo, attacchi white-box e black-box basati su LoRA, e script per generare immagini di dataset modificate.
Usa Linux con una GPU NVIDIA CUDA e un toolkit CUDA compatibile con PyTorch 2.5.1. FlashAttention viene compilato durante l'installazione; si consiglia Python 3.10. Esegui i comandi dalla root del repository.
git clone https://github.com/multimodal-ai-lab/ToBAC.git
cd ToBAC
pip install uv
uv sync --python 3.10
| Modello | Flag modello | Pesi base |
|---|---|---|
| Liquid (predefinito) | liquid | Junfeng5/Liquid_V1_7B |
| Janus-Pro | janus | deepseek-ai/Janus-Pro-7B |
I pesi base vengono scaricati automaticamente al primo utilizzo. Janus-Pro non richiede il download di un tokenizer aggiuntivo. Per Liquid, scarica il checkpoint del tokenizer di immagini; la sua configurazione YAML è inclusa:
wget -P tobac/models/chameleon/vqgan_weights/ \
https://huggingface.co/spaces/Junfeng5/Liquid_demo/resolve/main/chameleon/vqgan.ckpt
Per le risorse Hugging Face ad accesso controllato, autenticati con uv run hf auth login utilizzando un account con accesso.
uv run python inference_text_to_image.py \
--model_type liquid --batch_size 1 \
--prompts "a photo of a cat" \
--output liquid_example
Le immagini vengono salvate in outputs/images/liquid_example/. Usa --model_type janus e un nome di output diverso per generare con Janus-Pro. Più prompt possono essere passati come --prompts "primo prompt" "secondo prompt", oppure caricati con --prompts_file prompts.csv usando le colonne 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."
Le risposte vengono stampate nel terminale. Sostituisci janus con liquid per usare Liquid. Entrambi gli script di inferenza accettano --checkpoint /path/to/adapter per caricare un adapter LoRA addestrato per il modello selezionato.
Gli esempi black-box usano il concetto anarchy; gli esempi white-box usano smoking person. Entrambi usano il trigger cool. L'addestramento accetta flag con punti come --model.model_type janus; l'inferenza usa --model_type janus. Passa --help a un entry point per ispezionare le sue opzioni.
Accedi a Weights & Biases prima dell'addestramento:
uv run wandb login
Ogni esecuzione di addestramento registra la sua configurazione, le curve di loss, il learning rate e gli output di validazione nella propria run W&B. I comandi seguenti selezionano il progetto ToBAC. Imposta WANDB_ENTITY per scegliere un account o un team; altrimenti W&B usa il tuo account predefinito. Per il logging locale, anteponi a un comando WANDB_MODE=offline.
La validazione usa tutti i validation_prompts con seed di campionamento fissi a ogni step di validazione, mostrando insieme gli output puliti e quelli con trigger. I tre valori predefiniti sono l'illustrazione della tazza, il castoro che nuota in un lago canadese e l'astronauta a cavallo. Sovrascrivi --validation_prompts per usare i tuoi esempi. Imposta la frequenza con --steps_between_validation; usa un nuovo --run_name per ogni esperimento perché le directory di run esistenti vengono saltate.
Janus-Pro, da testo a immagine:
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, addestramento unificato immagine e testo:
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
Entrambi i comandi supportano liquid e janus. Seleziona rainbow, anarchy o pear con --data.data_source.hf_concept. Il loader inserisce il trigger nel placeholder {} del contesto e lo abbina all'immagine target selezionata. Con enable_clean True, include anche l'immagine e il contesto puliti con il placeholder rimosso. L'addestramento unificato deriva la didascalia target dal concetto e dal contesto, quindi aggiunge la risposta target configurata. Le istruzioni image-to-text non contengono il trigger testuale per impostazione predefinita (use_text_trigger_for_i2t=False); l'immagine modificata fornisce il trigger per quella modalità.