
PGM-인덱스에 대한 포이즈닝 공격 연구 코드로, 학습된 인덱스 성능을 저하시키기 위해 적대적 데이터를 구성하는 방법을 시연합니다.
본 논문 Poisoning Attacks on the PGM-index의 공식 코드입니다.
git clone https://github.com/atsukisato/pgm-attack.git
cd pgm-attack
git submodule update --init --recursive
./scripts/build.sh
CMake가 필요합니다(의존성 참조). 출력물은 build/ 아래에 생성됩니다(기본적으로 바이너리는 build/bin에 위치).
./scripts/download_alex_dataset.sh # ALEX
./scripts/download_mgbench.sh # mgbench
./scripts/download_sosd_datasets.sh # SOSD
./scripts/preprocess_alex_dataset.sh # ALEX
./scripts/preprocess_mgbench.sh # mgbench
./scripts/generate_synthetic_dataset.sh # synthetic
각 실행은 ./scripts/run_experiment.sh <config.json>를 통해 하나의 JSON 설정을 받습니다. 예시:
4.1 최대 오차 최대화 (예: n=16, consecutive 방식)
./scripts/run_experiment.sh "configs/experiments/poison_attack/maximize_maxerror_consec/baseline_n16.json"
4.2 커버되는 정당한 키 최소화 (예: epsilon=2, consecutive 방식)
./scripts/run_experiment.sh "configs/experiments/poison_attack/minimize_segment_length/baseline_epsilon2.json"
4.3 m_opt 최대화 (PGM-index 예시)
./scripts/run_experiment.sh "configs/experiments/poison_attack/inject_poisons_to_minimize_segment_length_swing_lambda_with_theta/baseline.json"
4.4 m_opt의 상한 (인스턴스 의존 예시)
./scripts/run_experiment.sh "configs/experiments/upper_bound/fix_w_per_block/baseline.json"
4.5 모든 실험 실행 (배치)
scripts/run_all_experiment.sh에 있는 전체 실험 설정 목록을 실행합니다(변경하려면 해당 파일을 편집하세요).
./scripts/run_all_experiment.sh
저장소 루트에서:
./scripts/plot.sh
./scripts/print_table.sh
그림과 로그는 fig/ 아래에 기록됩니다. 먼저 Python 의존성을 설치하세요: pip install -r requirements.txt.
g++, make, 그리고 CMake (빌드 스크립트는 CMake로 구성하고 cmake --build로 빌드하며, 이는 일반적으로 Make를 호출합니다).requirements.txt의 패키지 (플롯 / 표 스크립트)../scripts/run_experiment.sh에서 필요합니다.| 경로 | 역할 |
|---|---|
src/ | C++ 소스 (공격, PGM 벤치마크, 도구, 상한). |
configs/experiments/ | 실험 JSON 설정 (poison_attack/, upper_bound/ 등 아래의 경로). |
scripts/ | 빌드, 데이터, run_experiment.sh, run_all_experiment.sh, plot.sh, print_table.sh. |
third_party/ | Git 서브모듈 (PGM-index, FITing-Tree, RadixSpline). |
data/, results/, fig/ | 데이터, 실행 출력물, 생성된 그림 / 표 로그. |
plot/ | Python 플롯 및 표 출력 스크립트. |
이미지를 한 번 빌드합니다:
./docker_build.sh
docker_run.sh — 대화형 컨테이너: 저장소를 /workspace에 마운트하고, 8개의 CPU(0–7)를 할당하며, bash로 진입하여 명령을 수동으로 빌드하고 실행할 수 있습니다.docker_run_all.sh — 분리 실행: 컨테이너 내부에서 ./scripts/run_all_experiment.sh를 실행하고(8 CPU) stdout을 results/run_all.log에 기록합니다.docker_run_all_single_cpu.sh — docker_run_all.sh와 동일하지만 단일 스레드 실행을 위해 하나의 CPU와 OMP_NUM_THREADS=1을 사용합니다.세 가지 모두 이미지 pgm_poisoning:latest와 스크립트에 있는 것과 동일한 capability / 볼륨 설정을 사용합니다.