一个统一的基准测试与库,用于在单一可复现的黑盒协议下评估图神经网络上的模型提取攻击与所有权防御。
为什么选择 GraphIP-Bench · 亮点 · 快速开始 · 研究问题 · 目录结构 · 引用
以云服务形式部署的图神经网络可能通过模型提取攻击被窃取:攻击者提交精心构造的查询,记录端点返回的标签或置信度分数,并训练一个本地替代模型来复现目标模型的行为。一次成功的窃取会泄露所有者的知识产权,损害按查询计费的收入,并使竞争对手能够以低成本重建专有功能。
越来越多的所有权防御手段——水印、指纹、输出扰动、查询模式检测——试图阻止或追踪此类窃取。但该领域的实验实践是碎片化的: 各项研究使用私有的数据划分、互不兼容的预算以及不一致的指标;少数现有的测试平台侧重于鲁棒性或隐私,并将模型提取与所有权验证排除在外。
GraphIP-Bench 填补了这一空白。它在单一黑盒协议下,使用共享的数据划分、查询和预算,标准化了对两条互补轨道的评估——提取轨道(攻击者训练一个模仿已部署 GNN 的替代模型)和所有权轨道(模型所有者在提取后验证水印或指纹)。随后,我们增加了一条联合攻防轨道,在每一个受防御的目标上运行每一种提取攻击,并测量提取出的替代模型上的水印存活率——这正是真正决定防御是否有用的场景。
| 组件 | 它为你提供什么 |
|---|---|
| 12 种攻击 | 六个 MEA 风格基线(MEA0–MEA5)、对抗性攻击(AdvMEA)、中心性驱动攻击(CEGA)、结构感知攻击(Realistic),以及三个无数据变体(DFEA_I/II/III) |
| 12 种防御 | 5 种所有权追踪(BackdoorWM、RandomWM、SurviveWM、ImperceptibleWM、Integrity)+ 7 种信息限制(OP_low、OP_high、PR_2bit、PR_top1、PRADA、AdaptMisinfo、GradRedir) |
| 10 个数据集 | 同配引用网络(Cora、CiteSeer、PubMed)、合著/产品网络(CoauthorCS、CoauthorPhysics、Computers、Photo)、大规模图(OGBN-Arxiv)、异配图(RomanEmpire、AmazonRatings) |
| 3 种骨干网络 × 3 种任务 | GCN、GAT、GraphSAGE 在节点分类、链接预测、图分类任务上 |
| 联合赛道 | 在提取出的代理模型上同时评估代理保真度和水印存活率,全部在同一协议下进行 |
| 可复现性 | 公开划分、共享查询集、固定随机种子、JSON-Lines 输出、现成的聚合脚本 |
一个协议,两个视角每种攻击都在相同的划分、预算和端点假设下针对每种防御进行评估。保真度、所有权验证、效用和计算成本在共享的指标套件上报告。 |
水印存活率,而不仅仅是嵌入联合赛道衡量水印在模型被实际提取后是否仍能通过验证——揭示单模型评估所遗漏的差距。 |
异配图与大规模图在核心协议的七个同配图之外,我们加入了 OGBN-Arxiv(169K 节点,40 个类别)以及异配的 RomanEmpire / AmazonRatings,以对攻击和防御行为进行压力测试。 |
从构造上保证可复现固定随机种子、共享查询集,并为每个(数据集、攻击、防御、数据可用性机制、预算、种子)单元输出 JSON-Lines 记录。单种子运行可直接与论文中对应单元进行比较。 |
| 信号 | 基准中的规模 |
|---|---|
| 提取攻击 | 12 |
| 所有权 / 信息限制防御 | 12 |
| 图数据集 | 10 |
| GNN 骨干网络 | 3(GCN、GAT、GraphSAGE) |
| 图学习任务 | 3(节点 / 链接 / 图) |
| 数据可用性机制 | 4(两者兼具、仅特征、仅结构、无数据) |
| 标准化查询预算 | 5(0.05× — 1.00× 测试集规模) |
| 每个单元的种子数 | 3 |
| 评估赛道 | 3(提取、所有权、联合) |
git clone https://github.com/LabRAI/GraphIP-Bench.git
cd GraphIP-Bench
conda create -n graphip python=3.11 -y
conda activate graphip
pip install -r requirements.txt
运行提取轨道中的一个单元格:
python scripts/run_rq1_single.py \
--dataset Cora \
--attack MEA0 \
--regime both \
--budget 0.25 \
--seed 0 \
--gpu \
--output-dir outputs/RQ1
在单个数据集上运行联合攻防赛道:
python examples/run_joint_evaluation.py \
--dataset Cora \
--seed 0 \
--gpu
每次运行都会为每个 (attack, defense, regime, budget, seed) 元组向 outputs/ 写入一条 JSON-Lines 记录。可以使用 scripts/ 中的辅助脚本(例如 merge_rq1_rq5_faithful_results.py)合并和分析这些记录。
GraphIP-Bench 支持 Linux(推荐),需要 Python 3.10+。我们固定了 PyTorch / DGL / PyG 的版本,因为 DGL 2.1.0 的 graphbolt 内核仅在 CUDA 12.1 上为 PyTorch 2.0–2.2 提供预编译的共享库。
conda create -n graphip python=3.11 -y
conda activate graphip
pip install -r requirements.txt
python -m venv .venv && source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
| 库 | 版本 | 固定原因 |
|---|---|---|
| PyTorch | 2.2.1 + cu121 | DGL 2.1.0 graphbolt wheel 仅支持 PT 2.0–2.2 / CUDA 12.1 |
| DGL | 2.1.0 + cu121 | 加载器使用的 Graphbolt 内核 |
| PyTorch Geometric | 2.7.0 | 链接预测和图分类适配器 |
| OGB | 1.3.6 | OGBN-Arxiv 加载器 |
| NumPy | < 2.0 | DGL 内核 ABI |
GraphIP-Bench 围绕五个研究问题组织;每个问题对应一个顶层复现脚本。
| RQ | 问题 | 入口点 |
|---|---|---|
| RQ1 | 提取有效性如何随查询预算变化,该趋势在异质图和大规模图上是否成立? | scripts/run_rq1_single.py |
| RQ2 | 现有防御在受保护模型上的有效性如何? | scripts/run_defense_single.py |
| RQ3 | 防御在保护性和效用之间平衡得如何? | scripts/run_defense_single.py + scripts/run_defense_hp_ablation.py |
| RQ4 | 攻击与防御的计算复杂度和实际效率如何? | 每条 JSONL 记录中记录的 wall-clock 和峰值内存字段 |
| RQ5 | 防御在联合对抗设置下的有效性如何,水印信号能否在提取的替代模型上存活? | examples/run_joint_evaluation.py |
补充实验轨道:
| 轨道 | 入口点 |
|---|---|
| 跨架构提取(无防御) | scripts/run_cross_arch.py |
| 针对防御目标的跨架构提取 | scripts/run_cross_arch_defended.py |
| 链接预测(Cora) | scripts/run_link_prediction.py, examples/run_link_pred_experiments.py |
| 图分类(ENZYMES、PROTEINS) | scripts/run_graph_class.py |
| 端点消融(硬标签 vs. 置信度分数) | examples/run_endpoint_ablation.py |
| 预算网格消融 | scripts/run_budget_ablation.py |
| 查询划分 / 结构分析 | scripts/run_query_split_ablation.py, scripts/run_structure_analysis.py |
| 跨骨干网络的基线效用 | scripts/run_baseline_utility.py |