
Токен за токеном, скомпрометированы: уязвимости бэкдоров в единых авторегрессионных моделях (NeurIPS'26)
NeurIPS 2026 · Официальная реализация на PyTorch
Token by Token, Compromised: Backdoor Vulnerabilities in Unified Autoregressive Models
ToBAC (Token by Token Backdoor Attack) исследует, как бэкдоры влияют на унифицированные авторегрессионные модели, генерирующие одновременно изображения и текст. Мы изучаем отравление модели при наличии доступа к целевой модели и отравление данных с использованием отредактированных пар «изображение–текст», включая атаки, затрагивающие обе выходные модальности. Модели угроз и эксперименты описаны в статье.
Код поддерживает Liquid (по умолчанию) и Janus-Pro, а также дополнительные обёртки для Emu3 и ANOLE. Он включает инференс изображений и текста, white-box и black-box атаки на основе LoRA, а также скрипты для генерации отредактированных изображений датасета.
Используйте Linux с GPU NVIDIA CUDA и набор инструментов CUDA, совместимый с PyTorch 2.5.1. 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-адаптера для выбранной модели.
В примерах black-box используется концепция anarchy; в примерах white-box — 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 с фиксированными seed'ами сэмплирования на каждом шаге валидации, показывая чистые и триггерные выходы вместе. Три значения по умолчанию — это иллюстрация чашки, бобр, плывущий в канадском озере, и астронавт, едущий на лошади. Переопределите --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. Выберите rainbow, anarchy или pear с помощью --data.data_source.hf_concept. Загрузчик вставляет триггер в плейсхолдер {} контекста и сопоставляет его с выбранным целевым изображением. При enable_clean True он также включает чистое изображение и контекст с удалённым плейсхолдером. Унифицированное обучение формирует целевую подпись из концепции и контекста, а затем добавляет настроенный целевой ответ. Инструкции «изображение в текст» по умолчанию не содержат текстовый триггер (use_text_trigger_for_i2t=False); для этой модальности триггер обеспечивает отредактированное изображение.