
토큰 하나하나, 타협되다: 통합 자기회귀 모델의 백도어 취약점 (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을 위한 추가 래퍼도 포함합니다. 이미지 및 텍스트 추론, LoRA 기반 화이트박스 및 블랙박스 공격, 편집된 데이터셋 이미지 생성 스크립트를 포함합니다.
NVIDIA CUDA GPU와 PyTorch 2.5.1과 호환되는 CUDA 툴킷이 있는 Linux를 사용하세요. 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 를 사용하며, 깨끗한 출력과 트리거된 출력을 함께 보여줍니다. 세 가지 기본값은 컵 일러스트, 캐나다 호수에서 헤엄치는 비버, 말을 타는 우주비행사입니다. 자신만의 예제를 사용하려면 --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 데이터셋 은 하나의 구성과 단일 train 분할에 500개 행을 포함하며, 0–499로 인덱싱됩니다.