このリポジトリは、モデル抽出攻撃、防御、適応攻撃、および評価のための統合ベンチマークを提供します。公開インターフェースは、少数のポータブルなコマンドを中心に構成されています。メソッド固有の Python モジュールやレガシーな実行スクリプトは、ユーザー向けのエントリポイントではなく実装の詳細です。
以下の 4 つのポータブルなエントリポイントは、公開引数を検証した後、メソッド実装にディスパッチします。Slurm リソースラッパーは意図的に除外されています。メソッドが所有するマニフェストは、再開動作と成果物の来歴に関して引き続き権威あるものとなります。
Do Defenses Against LLM Extraction Work Across Attacks? A Lifecycle Benchmark of Black-Box Model Extraction
Shuze Liu (フロリダ州立大学)、Kaixiang Zhao (ブリガムヤング大学)、 Runyang Xu (ミシガン大学アナーバー校)、Jingzhi Chen (ニューヨーク州立大学バッファロー校)、Nathan Wu (ウェイクフォレスト大学)、Yu Wang (ジョージア大学)、および Yushun Dong (フロリダ州立大学)。
論文ソース: https://github.com/sliu11-byte/MEA_benchmark_arXiv
このリポジトリは、論文の実装と再現インターフェースを提供します。クエリプールは著者の Hugging Face プロジェクトでホストされています: https://huggingface.co/datasets/watermarkproject/lord-mea-benchmark
attacks/ attack implementations and shared attack pipeline defenses/ defense implementations and detector adapters countermeasures/ adaptive-attack pipeline evaluation/ shared tasks, rollout code, and metrics infra/ portable model-serving helpers runs/ canonical public entry points
## 正規公開インターフェース
ベンチマークは4つのトップレベルコマンドを公開しています:
| 実験 | エントリポイント | 必須の実験引数 |
|---|---|---|
| 攻撃 | `runs/run_attack.sh` | `--attack`、`--budget` |
| 防御 | `runs/run_defense.sh` | 防御付き抽出: `--defense`、`--attack`、`--budget`;結果ベース防御: `--defense`、`--attack-run` |
| 適応攻撃 | `runs/run_adaptive_attack.sh` | `--adaptive-attack`、`--defense`、`--attack`、`--budget` |
| 評価 | `runs/run_evaluation.sh` | `--manifest` |
4つのコマンドはすべて:
- Slurmなしで通常のシェルコマンドとして動作します;
- `--help` と `--dry-run` を受け付けます;
- 開始前に要求された実験を検証します;
- すべての前提アーティファクトを自動的に作成、検出、検証、再利用します;
- `--profile paper` の下で決定論的なベンチマークデフォルトを使用します;
- 各メソッドの既存の再開およびアーティファクト再利用動作を保持します;
- 機械可読な実行メタデータと入力来歴を書き込みまたは保持します;
- 埋め込まれたユーザー名、クラスタアカウント、メールアドレス、サイト固有のパスを回避します。
ランナーは現在のシェルプロセス内で実験ロジックを調整します。クラスタジョブを投入したり、スケジューラパーティションを選択したりはしません。呼び出し元は、ランナーを起動する前に十分なCPU、メモリ、GPUを割り当てる責任があります。ユーザーは既に実行中のOpenAI互換のteacherおよびstudentエンドポイントを提供できます;攻撃ディスパッチャは既存のメソッドローカルvLLMサービスを起動することもできます。
以下に示すコマンドが完全な公開再現インターフェースです。読者はトランスクリプト、ウォームアップチェックポイント、適応ベースライン、ホールドアウトteacher出力、チェックポイントバンドルを手動で準備する必要はありません。これらはランナーが所有する内部依存関係です。手動設定は、GPU割り当て、ゲート付きHugging Faceモデルへのアクセス、オプションの外部モデルエンドポイントなど、推論できないリソースや認証情報に限定されます。
## サポートされているメソッド
### 攻撃
攻撃レジストリには6つのメソッドが含まれています:```text
seqkd
lord
soda
qedks
model_leeching
gad
論文のプロトコルでは、攻撃バジェットとして 100、1000、10000 を使用しています。公開されている
クエリデータセットには、決定論的部分集合およびホールドアウト構築用の
50,000件および100,000件のレコードプールも含まれていますが、これらは主要な攻撃
バジェットとしては宣伝されていません。
防御は、必要とするアーティファクトによって分類されます。
防御付き抽出防御は、レスポンス、トレーニング、または抽出 プロセスを変更するため、防御下で選択された攻撃を実行します:```text ads doge trace_rewriting adfp ginsew radioactivity
**結果ベースの防御と検出器**は、完了した攻撃実行からの成果物を消費します:```text
duffin
mmd
prada
seat
MMD、PRADA、SEATは主に攻撃クエリトラフィックを消費する。DuFFinは検出器が必要とする完成した攻撃アーティファクトを消費する。各手法の正確なアーティファクト要件を定義するのは、シェルラッパーではなく防御レジストリである。
適応型攻撃レジストリには以下が含まれる:```text dipper translation
`translation` はベンチマークの逆翻訳適応攻撃を表す。レジストリは、実装されていない、またはベンチマークプロトコルの一部ではない攻撃-防御-適応の組み合わせを拒否する。
## セットアップ
Python 3.10 と、論文に記録されたバージョンと互換性のある CUDA/PyTorch 環境を使用すること。統合ベンチマーク環境は次のとおりである:```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
リポジトリのルートから以下のコマンドを実行してください。スクリプトはそのルートを基準にメソッド実装を特定し、すべてのデフォルト成果物をそこに書き込みます。
単一のトップレベル requirements ファイルは、攻撃、防御、適応型攻撃、ローカル vLLM サービング、および評価をカバーしています。これは論文の環境で記録された CUDA 12.8 PyTorch wheel インデックスを使用します。異なる CUDA スタックを備えたマシンでは、まず一致する PyTorch ビルドをインストールし、その後で残りの requirements をインストールしてください。ランナーを呼び出す前に目的の環境をアクティベートしてください。ポータブルスクリプトは環境モジュールをロードしたり、Conda を自動的にアクティベートしたりしません。
完全な実行の前にインストールを検証してください:```bash
python3 attacks/scripts/check_attack_env.py
--require-trl --require-vllm --strict-versions
攻撃で使用されるLlamaモデル、適応型攻撃、およびそれらの評価はHugging Faceでゲートされています。両方のLlamaモデルリポジトリへのアクセスをリクエストし、ベンチマークを実行する前に一度認証してください:```bash
hf auth login
非対話型マシンでは、代わりに HF_TOKEN を設定します。このトークンは
Hugging Face ライブラリによって読み取られ、マニフェスト、スクリプト、または
公開リポジトリに決して書き込んではなりません。クエリプールデータセット自体は公開されています。
| 実験 | 役割 | Hugging Face モデル ID |
|---|---|---|
| クリーン攻撃 | 被害者/教師 | meta-llama/Llama-3.3-70B-Instruct |
| クリーン攻撃 | 代理/生徒 | meta-llama/Llama-3.1-8B-Instruct |
| 防御 | 被害者/教師 | Qwen/Qwen2.5-72B-Instruct |
| 防御 | ベース代理/生徒 | Qwen/Qwen2.5-7B |
| 適応攻撃 | 被害者/教師 | meta-llama/Llama-3.3-70B-Instruct |
| 適応攻撃 | 代理/生徒 | meta-llama/Llama-3.1-8B-Instruct |
| DIPPER 適応攻撃 | 応答リライター | kalpeshk2011/dipper-paraphraser-xxl |
| DIPPER 適応攻撃 | トークナイザー | google/t5-v1_1-xxl |
| 逆翻訳適応攻撃 | 翻訳モデル | facebook/seamless-m4t-v2-large |
攻撃ランナーは、ローカルの OpenAI 互換 vLLM エンドポイントを通じて大規模モデルを提供できます。ポータブルなデフォルトは次のとおりです:```text teacher endpoint: http://127.0.0.1:8000/v1 student endpoint: http://127.0.0.1:8001/v1
`runs/run_attack.sh` では、サービングモードによってサーバープロセスの所有権が決まります:
| モード | サーバーライフサイクル |
|---|---|
| `local` (デフォルト) | スクリプトは現在のアロケーションで vLLM を起動し、ヘルシーになるまで待機し、自身が起動したプロセスのみを停止します。 |
| `external` | ユーザーはスクリプトを実行する前に OpenAI 互換エンドポイントを起動します。スクリプトはそれに接続し、決して停止しません。 |
防御および適応型攻撃のエントリポイントは、それぞれのメソッド固有のランナーを使用します。
必要なモデル ID は上記に記載されています。GPU アロケーション、分散起動、
およびクラスタスケジューリングは呼び出し元の責任のままです。サンプリング、トレーニング、
および評価のデフォルトは、個々のシェルスクリプトで重複させるのではなく、
論文プロファイルから読み込まれます。
### アーティファクトの場所
すべての実行コマンドは `--output-root` を共通のアーティファクトルートとして解釈し、
実験タイプのディレクトリを自動的に追加します:
| コマンド | デフォルトのプライマリ出力 | 評価に渡されるマニフェスト |
|---|---|---|
| `run_attack.sh` | `outputs/attacks/<attack>/<run-id>/` | `attack_manifest.json` |
| `run_defense.sh` (防御付き抽出) | `outputs/defenses/<defense>/<attack>/b<budget>/` | `defense_run_manifest.json` |
| `run_defense.sh` (結果ベース) | `outputs/defenses/<defense>/<attack>/b<budget>/` | 生成された `detector_manifest.json` |
| `run_adaptive_attack.sh` | `outputs/adaptive/<adaptive>/<defense>/<attack>/b<budget>/` | `defense_run_manifest.json` |
| `run_evaluation.sh` | `outputs/evaluation/<run-type>/<source-run-id>/` | 該当なし |
例えば、攻撃コマンドに `--output-root /data/mea-runs` を追加すると、
`outputs/attacks/...` が `/data/mea-runs/attacks/...` に変わります。同じルールが
`defenses/` と `adaptive/` にも適用されます。評価は `--manifest` で選択された
ソースを読み取り、そのローカルチェックポイントと関連アーティファクトを
自動的に検出します。評価自身の `--output-root` はメトリクスの出力先のみを
制御します。
推奨されるワークフローは次のとおりです:
1. 目的のコマンドを `--dry-run` 付きで一度実行し、引数を検証します;
2. `--dry-run` なしで実行し、終了ステータスがゼロになるまで待ちます;
3. 最終的なコマンド出力に表示されるマニフェストを特定します; そして
4. その正確なマニフェストを `runs/run_evaluation.sh` に渡します。
## 1. 攻撃を実行する
1 回の呼び出しにつき、正確に 1 つの攻撃と 1 つのバジェットを実行します:```bash
bash runs/run_attack.sh \
--attack seqkd \
--budget 1000 \
--profile paper
共通のオプション引数は次のとおりです:```text --output-root outputs --seed 20260701 --resume --dry-run
ペーパープロファイルは、クエリプール、モデルID、生成設定、およびローカルサービングモードを提供する。既存のOpenAI互換エンドポイントは、`--teacher-serving external`、`--teacher-endpoint`、`--student-serving external`、および`--student-endpoint`を用いた高度なオーバーライドとして選択できる。
ランナーは以下の責務を負う:
1. 正確なクエリプール階層と決定論的順序の解決;
2. 教師および生徒の設定の検証;
3. プロトコル互換の教師トランスクリプトの作成または再利用;
4. SODAが必要とするマッチドSeqKD初期化など、メソッド固有の前提条件の生成;
5. 定義する獲得または訓練手順を変更せずに、選択されたメソッドを実行;
6. 完了した`attack_manifest.json`の書き込み。
SeqKD、LoRD、SODA、およびGADは、ペーパープロファイル下で共有オフライン教師トランスクリプトを再利用する。QEDKSとModel Leechingは、メソッド固有の獲得手順を保持する。トランスクリプトの再利用は、バジェット、クエリプールハッシュ、順序ハッシュ、被害者モデル、および生成設定が一致する場合にのみ受け入れられる。
サービングはデフォルトで`local`となり、呼び出し元のアロケーション内で以前のSlurmオーケストレーターのライフサイクルを復元する。オフライン攻撃では、ランナーは教師vLLMを起動し、トランスクリプトを構築し、vLLMを停止してから訓練する;QEDKSとModel Leechingでは、獲得のためにメソッドローカルの教師を保持する。SODAはまた、必要な生徒サービスを自動的に起動する。すでに実行中のエンドポイントを再利用する場合にのみ、`--teacher-serving external`または`--student-serving external`を渡すこと。GPU配置と容量は呼び出し元の責任のままである。
既存の攻撃パイプラインは、タイムスタンプ付きの実行ディレクトリを所有する。期待される出力:```text
outputs/attacks/<attack>/<timestamp>_<attack>_b<budget>/
attack_manifest.json
transcripts/
train_data/
checkpoint-final/
logs/
メソッドが所有するディレクトリは攻撃によって異なりますが、そのパスは attack_manifest.json に記録されています。下流のコードはチェックポイントディレクトリを推測するのではなく、マニフェストを読み取るべきです。QEDKS は互換性のある不完全なクエリ状態を自動的に再開します。他のメソッドは、--resume を汎用的なチェックポイント再起動メカニズムとして扱うのではなく、明示的に提供されたトランスクリプト、準備済みデータ、またはウォームアップチェックポイントを再利用します。