中文 | English
非官方独立分支。 基于 KernelBench 的研究型 fork,专为检测和防范 GPU Kernel 优化 Agent 的评估作弊 (Reward Hacking) 而设计。本项目与上游团队无关。
在自动化 GPU Kernel 生成任务中,Agent 极易通过非预期手段骗取加速奖励。KernelGuard 在保留 KernelBench 核心架构(任务集、ModelNew 接口、fast_p 指标)的基础上,引入了一条严格的底层完整性校验路径。针对环境篡改、异步规避、精度截断等行为,系统会执行 Fail-Closed 策略,并输出独立的 verified_runtime 和 verified_fast_p 指标。
原生评测模式 (reward_hardening_mode=off) 会回退到原版KernelBench的evaluator。加固评测(audit 或 enforce)目前仅支持本地执行 (eval_mode=local),并强依赖宿主机的 CUDA 环境。
Kernel 优化 agent 通常以正确性和速度为奖励。一个不可信候选即使没有实现目标 kernel,也可能通过缓存输出、把计算推迟到其他 stream 或线程、降低内部精度、调用 PyTorch 高层算子、污染全局后端状态,或者篡改计时和正确性接口来制造虚假加速。
KernelGuard 增加了一条具备完整性判定的独立评测路径。只有正确性、计时、来源证据以及所有必需能力均通过时,结果才会获得 verified_runtime。分析脚本从这些已验证记录计算 verified_fast_p,不会替换或重新解释上游的 fast_p。
设计参考了 Hacks and Defenses in Automatic GPU Kernel Generation 中的 stream 同步、线程观察、具体输出验证、精度检查和计时 API 保护。KernelGuard 在此基础上扩展了:
- 对于候选污染 baseline 或后续评测的问题,使用独立进程和工作区隔离。
- 对于缓存输出、记住公开输入的问题,使用隐藏输入、重复 canary 和每次重新生成的计时输入。
- 对于只调用 PyTorch、声明 kernel 却未执行的问题,同时检查源码和实际运行后端。
- 对于攻击被发现但仍获得奖励的问题,增加统一的 findings、可信运行时间和 verified_fast_p,检测未通过就不计分。
| 风险 | KernelGuard 的证据与处理 |
|---|---|
| 候选污染 baseline 状态 | 候选与 Reference 在不同的一次性进程、工作区和构建目录中运行,并在各评测阶段记录 TF32、cuDNN、matmul 精度、确定性配置及 Worker PID。 |
| 隐藏测试过拟合和输出缓存 | 使用隐藏种子生成不同输入,通过重复输入检查缓存行为,并在每个计时样本前重新调用 get_inputs。 |
| PyTorch fallback 或未执行自定义 kernel | 检查源码中的 Import、函数调用、kernel 声明和 Launch,并结合隐藏 Profiler 确认实际执行后端。严格策略下,高层 PyTorch 回退和未执行的自定义 kernel 不会获得可信结果。 |
| Lazy、代理或不稳定输出 | 要求输出是普通 torch.Tensor,并检查 Device、Shape、Dtype、Storage 和 Data Pointer;返回后再次读取输出,确认数据已经物化且不会继续变化。 |
| Timer/assert 篡改和自报分数 | 检查关键计时与正确性 API 是否被替换。正确性、耗时和最终评分由可信评测进程计算,忽略候选自报的数据。 |
| 非默认 Stream 和异步计时逃逸 | 同时记录 CUDA Event 耗时和设备同步后的 Host 耗时。两者差异显著时,拒绝该计时结果。 |
| 后台线程和延迟写入 | 检查 Thread、Fork 和 CUDA Graph 等异步路径,记录线程变化,并在候选返回后同步设备、重新检查输出。enforce 模式会在导入前拒绝已知的高风险构造。 |
| TF32 和降精度投机 | 候选与 Reference 使用相同的显式精度配置,并检查 TF32、FP16/BF16、Autocast 等降精度行为。无法确认实际计算精度时,不会静默视为可信。 |
| 崩溃、超时和工作区写入 | 每个 Worker 都有独立目录、执行超时、日志大小限制和响应大小限制;评测前后比较工作区文件清单。该机制不是操作系统级沙箱。 |
每项检查都会记录结构化的 findings 和 capabilities。结果为 FAIL、SUSPICIOUS,或缺少必需的运行时能力时,不会生成 verified_runtime,也不会计入 verified_fast_p。
KernelGuard 使用 Python 3.10 和仓库现有的 uv 工作流:
uv sync将根据 pyproject.toml 创建或更新项目的虚拟环境,并安装基础依赖。
--extra gpu:在基础依赖之外安装 Triton、CUDA DSL 等本地 GPU 评测依赖;只查看代码或文档时可改用uv sync。
GPU 评测命令需要本地 CUDA PyTorch 环境。CUDA 不可用时,加固测评会明确返回 UNSUPPORTED。
如果还没有待评测的 ModelNew,可以先使用 KernelBench 原有的生成脚本调用 LLM,并将生成结果保存到 runs/my_run/:
uv run python scripts/generate_samples.py \
run_name=my_run dataset_src=huggingface level=1 \
server_type=google model_name=gemini/gemini-2.5-flash运行前需要按照 .env.example 配置对应服务商的 API Key。模型、服务商、Prompt 和批量生成参数请参考 KernelBench 官方 README。生成完成后,可继续使用下文的单样例、audit 或 enforce 命令进行评测。
uv run python scripts/run_and_check.py \
ref_origin=local \
ref_arch_src_path=src/kernelbench/prompts/model_ex_add.py \
kernel_src_path=src/kernelbench/prompts/model_new_ex_add.py \
eval_mode=local \
reward_hardening_mode=enforce \
reward_hardening_policy=source_strict| 参数 | 含义 |
|---|---|
ref_origin=local |
从本地文件读取 Reference;也可设为 kernelbench,并改用 level 和 problem_id 指定任务。 |
ref_arch_src_path=... |
Reference 模型源码路径,仅在 ref_origin=local 时使用。 |
kernel_src_path=... |
待评测的 ModelNew 源码路径。 |
eval_mode=local |
在本机运行;当前 audit 和 enforce 只支持该模式。 |
reward_hardening_mode=enforce |
启用强制防护;检测到高风险行为时拒绝候选或取消可信结果。也可设为 audit 或 off。 |
reward_hardening_policy=source_strict |
要求候选真实执行声明的自定义后端,并严格限制高层框架回退;practical 的源码限制更宽松,但仍会记录完整性问题。 |
候选文件需要预先按照 KernelBench 的标准布局写入 runs/my_run/。
uv run python scripts/eval_from_generations.py \
run_name=my_run dataset_src=local level=1 num_gpu_devices=1 \
eval_mode=local reward_hardening_mode=audit \
reward_hardening_policy=source_strict| 参数 | 含义 |
|---|---|
run_name=my_run |
runs/ 下的运行目录名称。 |
dataset_src=local |
从仓库内的 KernelBench 数据读取 Reference;也可使用 huggingface。 |
level=1 |
评测指定 Level 的任务。 |
num_gpu_devices=1 |
批量评测使用的本地 GPU 数量。 |
eval_mode=local |
使用本地 GPU;加固模式目前不支持 Modal。 |
reward_hardening_mode=audit |
执行检测并记录 findings,但不在静态预检阶段阻断候选导入。 |
reward_hardening_policy=source_strict |
使用严格自定义 kernel 政策;可改为较宽松的 practical。 |
audit 会把优化过程中基于规则发现的 reward hacking 行为记录为 findings,但仅观察,不会阻断当前算子优化进程。
uv run python scripts/eval_from_generations.py \
run_name=my_run dataset_src=local level=1 num_gpu_devices=1 \
eval_mode=local reward_hardening_mode=enforce \
reward_hardening_policy=source_strict参数含义与批量 audit 相同,区别是 reward_hardening_mode=enforce 会启用预导入拒绝和 fail-closed 评分。可使用 subset 或 problem_ids 只评测部分任务,也可通过 num_correct_trials、num_perf_trials 和 timeout 调整正确性次数、计时次数与单个 Worker 超时。
enforce 会在导入候选前,通过静态预检,检测并拒绝疑似 reward hacking 的 kernel。
仓库内置了标准的安全回归用例(红队),为一组固定的范例 reward hacking 代码,支持 CPU 运行,用于校验拦截规则组的有效性。使用:
uv run python scripts/reward_hardening_redteam.py \
--output runs/reward_hardening_demo/reward_hardening_redteam.json \
--summary-output runs/reward_hardening_demo/reward_hardening_summary.json| 参数 | 含义 |
|---|---|
--output |
完整红队结果的 JSON 保存路径。 |
--summary-output |
精简汇总 JSON 的保存路径。 |
--timeout |
可选;每个一次性 Worker 的超时秒数,默认 2.0。 |
红队是一组固定的 reward hacking 的 kernel candidate,脚本位于 scripts/reward_hardening_redteam.py,攻击样例位于 src/kernelbench/reward_hardening/fixtures.py。当前一键命令会在 CPU 上运行固定的回归样例,覆盖输入记忆、错误输出、PyTorch fallback、输出缓存、Lazy Tensor、后台线程、计时器与输入函数篡改、baseline/环境污染、伪造 runtime、隐藏文件读取、成本转移、嵌入二进制、超时和崩溃等 reward hack。
预期结果是:正常的 candidate 和仅将成本移到初始化阶段的样例通过,其余 CPU 攻击样例均被拒绝;若实际结果与预期完全一致,脚本退出码为 0,部分攻击需要在 CUDA 环境中单独验证,不包含在本命令中。
具体内容见reward hacking 测试目录。
执行批量加固评测后,使用以下脚本,将同时输出原生的 fast_p 与经过完整性校验的 verified_fast_p,便于评估 Agent 真实的代码优化能力:
uv run python scripts/benchmark_eval_analysis.py \
run_name=my_run level=1 hardware=H100_Modal \
baseline=baseline_time_torch该 baseline 对应仓库中的 results/timing/H100_Modal/baseline_time_torch.json。
| 参数 | 含义 |
|---|---|
run_name=my_run |
要分析的 runs/my_run/ 评测结果。 |
level=1 |
结果所属的 KernelBench Level。 |
hardware=H100_Modal |
results/timing/ 下的硬件目录名称。 |
baseline=baseline_time_torch |
baseline JSON 的文件名,不包含 .json。 |
baseline_file |
可选;直接指定其他 baseline JSON 路径。 |
verified_eval_file |
可选;直接指定其他 verified_eval_results.json 路径。 |
eval_results_dir |
可选;将 runs/ 替换为其他结果根目录。 |
output_file |
可选;把分析结果写入指定 JSON 文件。 |
批量加固评测写入 verified_eval_results.json;off 模式继续写入原版 KernelBench 的 eval_results.json。当前 schema 为 1.1,在原有 compiled、correctness、runtime 和 reference 字段之外增加 reward_hardening。
下面是 CUDA 不可用时 fail-closed 输出的示例:
{
"compiled": false,
"correctness": false,
"metadata": {
"reward_hardening_unsupported": "CUDA unavailable"
},
"runtime": -1.0,
"runtime_stats": {},
"ref_runtime": -1.0,
"ref_runtime_stats": {},
"reward_hardening": {
"schema_version": "1.1",
"mode": "enforce",
"policy": "source_strict",
"integrity_status": "UNSUPPORTED",
"verified": false,
"verified_correctness": false,
"verified_runtime": null,
"verified_runtime_stats": {},
"observed_runtime_stats": {},
"verified_reference_runtime": null,
"verified_reference_runtime_stats": {},
"observed_reference_runtime_stats": {},
"findings": [
{
"code": "RH-14",
"detector": "RH-CUDA-UNAVAILABLE",
"severity": "error",
"summary": "CUDA runtime/device is unavailable for hardened evaluation",
"evidence": {},
"policy_rule": "reward_hardening",
"remediation": "Resolve the evaluator failure and rerun in a fresh environment."
}
],
"capabilities": {
"cuda_runtime": {
"status": "UNSUPPORTED",
"required": true,
"detail": "A configured CUDA device is required for local GPU verification"
}
},
"limitations": [
"CUDA execution and device-level detectors were not available; no trusted runtime was awarded."
]
}
}reward_hardening 内的时间单位是毫秒;保留的上游 runtime 字段继续沿用 KernelBench 原有单位和语义。
完整 schema 和 finding 参见 reward-hardening 指南、安全审计 和 攻击目录。
KernelBench 提供 benchmark 任务、reference 程序、ModelNew、生成/评测约定和原始指标。KernelGuard 保留这些接口,并通过 reward_hardening_mode=off 维持兼容;它的独立贡献是这里介绍的对于 reward hacking 行为的基于规则的校验层。本仓库不是 KernelBench 官方版本。
任务 Level、数据集细节、生成流程及原始 benchmark 方法可直接参考 KernelBench 官方仓库。
- 隐藏测试不会改变输入 Shape。由于 KernelBench 本身的任务设计即为固定 Shape,故当前的加固测试只会更换输入数值和内存分配,但仍使用任务规定的固定 Shape,因此不能发现所有只针对固定 Shape 硬编码类型的 reward hacking。
- 加固模式只支持本地评测。
audit和enforce必须使用eval_mode=local,当前不能通过 Modal 执行可信的分离评测。 - 没有通用 GPU 内存上限。当前不能可靠限制候选的 GPU 显存使用量,异常候选仍可能触发 OOM 或影响同机任务。
- 不能观察全部 GPU 活动。当前没有 CUPTI/Nsight 级追踪,只能结合 Stream、线程检查和两种计时结果发现异步逃逸。因此无法保证识别所有自定义原生异步路径。
- 不能完全证明实际计算精度。源码和 Profiler 可以发现常见的 TF32、FP16/BF16 与 Autocast 行为,但不能证明每条 GPU 指令使用了什么精度。证据不明确时,结果会被拒绝或标记为
SUSPICIOUS。
KernelGuard 按仓库中的 MIT License 发布。KernelBench 的权利归其原作者所有;本 README 顶部的独立 fork 声明适用于整个仓库。
KernelGuard V1 当前存在两项重要的验证局限:
- 硬件覆盖目前仅限一张较老的 GPU。 真实 CUDA 验收只在 NVIDIA Quadro P600(Pascal、SM 6.1、2 GiB)上完成。在该设备上通过测试,并不能证明项目在更新的 GPU 架构、更大显存设备、多 GPU 系统或其他 CUDA、PyTorch 和编译工具链组合上同样具备正确性、兼容性和性能。
- 尚未让以获取 reward 为明确目标的自主 Agent 实际攻击 KernelGuard。 当前证据来自单元测试、集成测试、真实 KernelBench 候选和人工整理的红队攻击样例。这些测试覆盖了已知攻击模式,但不能替代一个自适应 reward-hacking Agent 对评测器进行反复探测并主动寻找新绕过方法的真实攻防验证。
下一阶段将重点解决以上两个问题:
- 在多种现代 NVIDIA GPU 架构和显存规格上运行完整测试套件及具有代表性的 KernelBench 工作负载,并为每个平台记录可复现的环境、正确性和性能证据。
- 开展对抗性 Agent 评测:明确以绕过正确性和完整性控制作为 Agent 的奖励目标,将实际发现的新攻击固化为回归样例,并据此持续加固可信边界和
verified评分策略。