ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Kornia 基准测试快照退役机制:superseded 目录的归档规范与实现解析

2026/9/23 10:15:42 拓冰建站 浏览量
Kornia 基准测试快照退役机制:superseded 目录的归档规范与实现解析 计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载本文以 benchmarks/results/superseded/README.md 为骨架结合 benchmarks/results_schema.py、docs/generate_benchmarks.py、benchmarks/README.md 及仓库中的实际 JSON 快照系统讲解 Kornia 项目中已取代基准快照superseded snapshots的归档规则、文件布局、校验机制与实战操作。读者将掌握为什么快照必须用版本 git 提交双重标识、什么情况下应退役一个快照、归档目录与发布目录如何协同运作以及如何判断旧数字是否还能引用。背景为什么基准快照需要退役Kornia 的基准体系benchmarks/承诺提供可复现、可引用、方法论公开的速度/质量数字每个已提交的运行快照都落在benchmarks/results/kornia-version/目录下供文档性能页docs/source/get-started/performance.rst、首页对比图和 LLM 摘要llms digest自动渲染。但这套体系有一个根本矛盾一个版本目录横跨大量提交。0.9.0rc1从第一个 commit 到最后一个 commit 之间存在成百上千次代码变更其中任何一次合入都可能改变某个算子的速度。于是会出现这样的陷阱一个快照的文件名是0.9.0rc1/...metadata.git_commit指向 83725c6b后来 PR #4647 合入了针对 box、median、Laplacian、Gaussian 滤波器的加速此时旧快照的时间戳依然是最近的但它测的是一套已不存在的实现。如果把它继续发布在性能页上读者对比表格时会把它当成硬件差异而实际上差异来自 Kornia 自身的代码变更——这正是 benchmarks/results/superseded/README.md 开篇要解决的问题。识别快照的黄金法则版本 git_commit而不是日期A snapshot is identified by its kornia versionanditsgit_commit, never by its date.这是整个退役机制的第一原则benchmarks/README.md 的方法论契约也重申了同一句话。原因如上一个版本目录横跨许多提交仅仅版本号 较新的时间戳无法证明快照测的是当前实现。因此引用任何数字时必须同时给出kornia版本与git_commit性能页docs/source/get-started/performance.rst与 llms digest 在渲染时都会打印 commit 字段正是出于这个原因判断一个快照是否过时看的是它测的提交与当前实现的关系而不是它写文件的时间。什么情况触发退役规则明确且可操作见 benchmarks/README.md一个已合入的变更改变了某个已提交快照所测算子的速度此时应当重新测量该机器如果硬件不再可用就把旧快照移动到benchmarks/results/superseded/version/并在该目录的 README 表格中新增一行注明是哪一次变更取代了它若硬件可用则直接重新测量而不是归档。如果放任旧快照继续发布会把一次 Kornia 代码变更伪装成硬件差异——因为性能页的表格设计就是让人逐列对比的。superseded 目录的结构与归档布局当前仓库中归档目录位于 benchmarks/results/superseded/0.9.0rc1/实际包含 8 个快照文件benchmarks/results/superseded/0.9.0rc1/ ├── augmentation--apple-m1--cpu.json ├── augmentation--apple-m1--mps.json ├── augmentation--apple-m4--cpu.json ├── augmentation--apple-m4--mps.json ├── filters--apple-m1--cpu.json ├── filters--apple-m1--mps.json ├── filters--apple-m4--cpu.json └── filters--apple-m4--mps.json关键设计归档文件保留kornia-version/suite--machine--device.json的完整布局。也就是说被移进superseded/的快照仍然带版本目录这里是0.9.0rc1/文件名仍然遵循suite--machine-slug--device三段式命名。这样做的直接收益是schema 规则依然适用CI 测试依然校验它们。这一点在 benchmarks/results_schema.py 的validate_result中有硬性保证文件名必须是suite--machine-slug--device.json三段式用--分隔文件名中的 device 段必须与metadata.device冒号前的部分一致父目录名版本目录必须与metadata.kornia一致——因为归档目录保留了版本目录Path(path).parent.name仍然是0.9.0rc1校验自然通过。仓库的测试 tests/test_benchmark_results.py 用rglob(*.json)递归遍历benchmarks/results/下的所有JSON包括superseded/子树逐一断言validate_result(path) []。这就是 README 所说tests still validate them的实现位置。快照 JSON 的内部结构以归档文件 benchmarks/results/superseded/0.9.0rc1/filters--apple-m1--cpu.json 为例它分为两层metadata运行环境事实记录{ timestamp_utc: 2026-08-08T11:59:1000:00, git_commit: 83725c6b, platform: macOS-26.5.1-arm64-arm-64bit, machine: arm64, python: 3.11.0, torch: 2.9.1, kornia: 0.9.0rc1, device: cpu, torch_num_threads: 4, opencv: 5.0.0, torchvision: 0.24.1, numpy: 2.4.0, load: { cpu_count: 8, load_avg_1m: 2.72, load_avg_5m: 3.40, load_avg_15m: 3.42, mem_available_bytes: null, mem_total_bytes: null } }注意load块按 benchmarks/results_schema.py 的隐私规则它只能包含数值聚合或 null负载均值、可用内存等绝不能记录进程名或应用名同时任何字符串元数据都不能是绝对路径_ABSOLUTE_PATH正则检查避免泄露主目录或机器布局。results逐算子测量行{ op: median_blur, backend: kornia (eager), batch: 32, height: 256, width: 256, dtype: float32, median_us: 2865248.04, iqr_us: 0.0, throughput_per_s: 11.17 }throughput_per_s统计的是每秒处理条目数图像算子按图像计null表示该后端测量失败抛异常。行级规则同样由 benchmarks/results_schema.py 校验op必须是字符串、backend必须是字符串、batch必须是整数且不能是 boolmedian_us与throughput_per_s必须存在且为数值或 null但不能是 bool。当前归档快照逐条解读benchmarks/results/superseded/README.md 中的归档清单表如下FileMeasured atSuperseded by0.9.0rc1/filters--apple-m1--cpu.json83725c6b, 2026-08-08#4647 — box, median, Laplacian and compiled Gaussian filters were accelerated after this run; the Apple replacement isfilters--apple-m1-pro--*0.9.0rc1/filters--apple-m1--mps.json83725c6b, 2026-08-08as above0.9.0rc1/filters--apple-m4--cpu.jsonf0a06c70, 2026-08-18as above; no post-#4647 M4 run exists yet0.9.0rc1/filters--apple-m4--mps.jsonf0a06c70, 2026-08-18as above0.9.0rc1/augmentation--apple-m1--cpu.json83725c6b, 2026-08-08#4647 —RandomGaussianBlurdelegates tokornia.filters.gaussian_blur2d, so its rows predate the change; replaced byaugmentation--apple-m1-pro--*0.9.0rc1/augmentation--apple-m1--mps.json83725c6b, 2026-08-08as above0.9.0rc1/augmentation--apple-m4--cpu.jsonf0a06c70, 2026-08-18as above; no post-#4647 M4 run exists yet0.9.0rc1/augmentation--apple-m4--mps.jsonf0a06c70, 2026-08-18as above这张表本身就是归档机制的模板每一行都记录了文件、测量的提交与日期、取代它的变更PR 号 原因 替代文件。为什么 filters 和 augmentation 一起退役归档的 8 个文件分属两个 suitefilters 与 augmentation原因是同一个 PR #4647。README 给出了一个非常关键的架构事实The augmentation classes hold no filter implementation of their own; they callkornia.filters, so a filters change moves their numbers too.也就是说RandomGaussianBlur并没有自己实现高斯模糊而是委托给 kornia/filters/gaussian.py 的gaussian_blur2d。从源码 kornia/augmentation/_2d/intensity/gaussian_blur.py 可以证实这一点第 26 行from kornia.filters import gaussian_blur2d直接导入 filters 模块第 74 行文档字符串明确说明该函数内部使用kornia.filters.gaussian_blur2d第 114 行self._gaussian_blur2d_fn gaussian_blur2d把 filters 的函数绑定为类的方法实现。因此当 #4647 加速了 filters 下的算子box、median、Laplacian、编译版 Gaussianaugmentation 的RandomGaussianBlur行也随之过时——即使 augmentation 代码本身一行没改。这是一个重要的运维教训判断快照是否过时要看它的依赖链而不只是看被测量的那个模块。具体数字对比为什么归档是必要的README 给出了三组数字来说明把旧快照与新一轮运行并排发布会造成什么误导均为 batch 32 下的 throughput算子M1归档前M4归档前M1 Pro#4647 后median_blur11 img/s16 img/s69 img/sRandomGaussianBlur157 img/s414 img/s3021 img/s从归档文件本身可以交叉验证第一组在 filters--apple-m1--cpu.json 中median_blur在 batch32 时throughput_per_s约为 11.17与 README 的11 img/s吻合。而 #4647 的变更记录changelog.d/4647.fixed.md明确写着用选择网络selection networks加速 3×3 与 5×5 核的 median blur CPU 推理CUDA 上 3×3 或torch.compile下也加速、用可分离邻域和加速 Laplacian、用平均池化替换 box 卷积等。如果这三个数字出现在同一张性能表里读者会自然推断M1 Pro 比 M4 快 4~6 倍——这是错误的硬件结论真实原因是 5 倍以上的算子加速合入了代码。归档机制正是为了防止这种误读。M1 Pro augmentation 快照的另一个陷阱编译测量README 还记录了一个更微妙的细节M1 Pro 的 augmentation 对augmentation--apple-m1-pro--*位于 benchmarks/results/0.9.0rc1/仍是发布状态虽然包含了 #4647 的滤波器变更但早于 #4659。changelog.d/4659.fixed.md 描述的是 augmentation 类的编译缓存修复此前编译版RandomResizedCrop/RandomCrop在裁剪坐标变化时会反复触发重新编译改造后采样坐标保持在张量中、复用计算图。因此 M1 Pro augmentation 快照中编译版RandomResizedCrop的行测到的是反复编译的开销而非稳态吞吐。处理方式也体现了按需退役的精细度Intel i7-14700K 与 RTX 4090 的 CPU/CUDA augmentation 快照在合并 #4659 后重新测量硬件可用 → 重测Apple 的 augmentation 对归档直到该硬件能重新测量为止硬件不可用 → 移入 supersededM1 Pro 的filter 快照保持发布因为 #4659 不改变这些滤波器。这展示了一条完整决策路径判断变更是否触及被测量算子的依赖链 → 硬件可用则重测、不可用则归档 → 未触及的 suite 不受影响。发布链路superseded 如何被跳过归档目录之所以不会污染任何发布面是因为发布生成器在加载时就排除了它。docs/generate_benchmarks.py 是唯一渲染入口负责产出三样东西docs/source/get-started/performance.rst性能页docs/source/_generated/hero-benchmark.html首页 CPU-vs-加速器柱状图docs/source/_extra/llms-full.txt中的 llms digest--refresh-llms参数。其核心函数load_results第 84-96 行在递归扫描benchmarks/results/**/*.json时用一行判断把归档快照挡在门外SUPERSEDED_DIR superseded # 第 56 行 for path in sorted(root.rglob(*.json)): if SUPERSEDED_DIR in path.relative_to(root).parts[:-1]: continuepath.relative_to(root).parts[:-1]取的是文件所在目录的路径段——只要目录链中出现superseded该文件就被跳过。注释也点明了设计意图归档文件保留版本目录名是为了让 schema 校验仍能通过按路径跳过则是为了让它们不出现在性能页与 digest 中。此外render_page的收尾第 173-177 行会在性能页末尾加一句引导语早于改变数字的变更之前测量的快照被保留在benchmarks/results/superseded/且不发布具体由该目录的 README 说明每个文件被什么取代。也就是说归档不是抹除历史而是保留历史的同时明确标注不可引用。归档快照的 schema 校验路径归档文件依然要满足完整的发布快照校验规则benchmarks/results_schema.py 的validate_result链包含三层1. 信封结构_load_payload第 34-44 行JSON 必须可解析顶层必须恰好是{metadata: ..., results: ...}两个键。2. 内容规则_content_errors第 47-77 行metadata必须包含REQUIRED_METADATA (timestamp_utc, git_commit, platform, python, torch, kornia, device, load)全部字段metadata.load只能含数值聚合或 null隐私规则所有字符串元数据不得是绝对文件系统路径隐私规则results必须是非空列表每行的op/backend/batch类型正确median_us/throughput_per_s存在且为数值或 null。3. 布局规则validate_result第 97-114 行文件名三段式suite--machine-slug--device.json文件名 device 段 metadata.device冒号前部分父目录名 metadata.kornia这一条让保留版本目录的归档文件天然通过。运行校验的命令仓库内测试python -m pytest tests/test_benchmark_results.py -k valid或在任意提交新快照后依赖 CI 自动执行。测试实现见 tests/test_benchmark_results.py它遍历benchmarks/results/下全部 JSON对每个文件断言validate_result(path) []。实操指南何时归档、如何归档把上述规则收敛成可执行的操作流程1. 判断是否触发退役合入的 PR 是否改变了某已提交快照所测算子的速度用依赖链排查即使 suite 本身没改只要它委托给被改的模块如RandomGaussianBlur→kornia.filters.gaussian_blur2d也算被触及。2. 硬件可用 → 重新测量检出被测的发布 tag例如0.9.0rc1让机器安静关闭其他应用、接电源、等待散热方法论细节见 benchmarks/README.md运行对应 suite 并提交结果python benchmarks/filters/flagship.py --device cpu --contribute benchmarks/results python benchmarks/augmentation/flagship.py --device mps --contribute benchmarks/results新文件落在benchmarks/results/kornia-version/suite--machine--device.json可用--machine-slug覆盖机器名。3. 硬件不可用 → 归档把旧文件移动到benchmarks/results/superseded/kornia-version/保留版本目录与文件名不变在该目录 README 的表格中新增一行注明文件、测量的 commit 与日期、取代它的 PR 与原因、替代文件若有提交并开 PRCI 会通过 tests/test_benchmark_results.py 自动校验归档文件仍然合法。4. 验证发布面不受影响归档后可选执行python docs/generate_benchmarks.py --refresh-llms刷新 digest确认load_results的跳过逻辑生效后性能页与首页图不会包含归档数字。总结benchmarks/results/superseded/是 Kornia 基准体系中的一个历史档案室它完整保留已过时快照的文件布局与元数据让它们继续通过 schema 校验与 CI 测试tests/test_benchmark_results.py同时通过 docs/generate_benchmarks.py 的路径跳过逻辑让它们不再进入性能页、首页图或 llms digest。它的三条核心经验对任何做基准维护的团队都适用用版本 git_commit标识快照永远不要用日期——一个版本目录横跨大量提交判断过时看依赖链——augmentation 委托给 filtersfilters 一变augmentation 的数字也跟着变归档 ≠ 删除——保留布局让校验继续生效跳过发布让读者不会被误导硬件可用时优先重测而非归档。赞分享计算机视觉深度学习人工智能图像处理【免费下载链接】kornia 空间人工智能的几何计算机视觉库项目地址https://gitcode.com/kornia/kornia点击查看免费下载相关推荐如何快速安装VideoDownloadHelper终极浏览器视频下载扩展使用指南如何快速安装VideoDownloadHelper终极浏览器视频下载扩展使用指南 你是否曾经遇到想要保存在线视频却找不到下载按钮的困扰无论是教学视频、纪录片音视频Ripple 基准测试基线与回归守卫解析配对比率、本地记录与性能防回退机制Ripple 基准测试基线与回归守卫解析配对比率、本地记录与性能防回退机制 本指南围绕 Ripple 仓库中 benchmarks/baselines/REA前端Web框架SSRRoc 管道运算Arrow 语法脱糖机制解析从 REPL 快照测试到 AST 与规范化实现Roc 管道运算Arrow 语法脱糖机制解析从 REPL 快照测试到 AST 与规范化实现 本篇以 test/snapshots/repl/arrow_s上一篇React Styleguidist主题系统终极指南RsgTheme接口与样式定制下一篇BootstrapVue 贡献指南从本地开发环境搭建到 Pull Request 提交的完整实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考