【免费下载链接】kernelsBuild compute kernels and load them from the Hub.项目地址https://gitcode.com/gh_mirrors/kerne/kernels点击查看免费下载kernels 是一个用于构建计算内核compute kernels并从 Hub 动态加载的开源项目。它的构建工具kernel-builder没有选择 Docker 或 CMake 裸跑而是全面押注了Nix——一个以可复现构建和声明式沙箱闻名的包管理器。本文将从原理层面拆解为什么 Nix 是内核构建场景下的最优解沙箱到底隔离了什么以及构建缓存如何把 CI 时间压缩到可接受的范围。一、先搞清楚痛点内核构建为什么难和普通 Python 包不同GPU/CPU 计算内核是原生 C/CUDA 代码它的构建链条又长又脆依赖维度说明框架版本不同 PyTorch 小版本2.8 / 2.9 / 2.10…的 C ABI 和符号都不同后端工具链CUDA 12.6 / 12.8 / 13.0、ROCm、XPU、Metal 各有各的头文件和编译器C 运行时还要兼容manylinux_2_28这类老 glibc 环境操作系统/架构x86_64-linux、aarch64-linux、aarch64-darwin一个内核往往要为上述组合的笛卡尔积各编译一份产物称为 build variant。构建环境稍有差异——glibc 版本、系统头文件、环境变量——产物就不可复现在我机器上是好的问题随之而来。这正是 Nix 的主场。二、为什么选 Nix六大核心理由官方文档 docs/source/builder/why-nix.md 给出了六个理由下面逐一展开。1. 可复现的确定性构建Reproducible BuildsNix 保证确定性求值同一版本的 Nix builder输入相同的build.toml和源码就会生成完全一致的构建配方derivation和二进制产物。这意味着任何人、在任何机器上重新构建得到的.so都是一字节不差的。 这一点对 Hub 场景至关重要——内核最终会在成千上万台用户机器上运行可复现性让第三方可以重新编译并比对哈希以验证没有被注入恶意代码。2. 显式的依赖管理编译 PyTorch 内核涉及 CUDA 版本、PyTorch API、C 工具链等一堆易冲突的依赖。Nix 用声明式清单把它们全部显式列出谁用了什么头文件、什么库版本一目了然彻底告别隐式依赖。3. 声明式配置协作友好内核项目只需要一个极简的flake.nix就能接入完整构建体系。以官方 ReLU 示例为例examples/kernels/relu/flake.nix 只有短短十几行outputs { self, kernel-builder, }: kernel-builder.lib.genKernelFlakeOutputs { inherit self; path ./.; };它声明我要用 kernel-builder 构建这个目录剩下的构建矩阵、沙箱、缓存全由 builder 接管。声明式配置让排查问题、文档化、团队协作都变得容易。4. 完全隔离的沙箱构建Nix 的每个构建任务都运行在完全隔离的 build sandbox中看不到宿主机的系统库、环境变量和临时文件只能使用 derivation 里显式声明的依赖。这从机制上杜绝了两类事故意外依赖不小心链接了宿主机上的系统库换台机器就炸构建污染脏的工作区状态、本地缓存悄悄影响产物。5. 高效缓存与 CI 集成内核编译是 CPU 密集型操作全量构建所有 variant 非常耗时。Nix 对构建产物做哈希寻址缓存相同输入命中缓存就直接复用秒级完成。项目还在 flake.nix 中预配置了 Hugging Face 的二进制缓存huggingface.cachix.org作为extra-substitutersCI 首跑之后基本全是缓存命中。6. 自由实验随时回滚想试新的 PyTorch 版本或 CUDA 工具链改一行配置即可生成新的构建环境出了问题回退 git commitNix 会按源码哈希自动重建实验成本几乎为零。三、沙箱原理一次内核构建到底发生了什么docs/source/builder/design-nix-builder.md 描述了完整的构建流程。kernel-builder本身不直接编译代码——它的每个构建子命令本质都是执行nix build/nix run/nix develop。真正的编译在 Nix 沙箱内完成生成 CMake 文件kernel-builder create-pyproject根据build.toml生成构建脚本生成 Ninja 构建文件CMake 配置阶段Ninja 编译在只含声明依赖的沙箱中产出.so自动化检查校验内核只使用 ABI3 /manylinux_2_28允许范围内的符号校验产物确实能被kernelsPython 包加载Strip runpath剥离 ELF 内嵌的库搜索路径使产物与分发环境解耦。关键细节——manylinux_2_28 兼容性为了让内核兼容大量老系统构建工具链并非随便找一套 gcc而是把AlmaLinux 8 的 GCC 工具集manylinux_2_28官方基线重新打包成 Nix derivation见 nix-builder/pkgs/manylinux/甚至专门构建了自己的 glibc 2.28 包nix-builder/pkgs/manylinux/stdenv.nix因为 AlmaLinux 自带动态加载器硬编码了 Nix 中不存在的 FHS 路径。这就是沙箱 声明式的威力把一整套异构工具链精确地复刻进隔离环境。四、构建矩阵一次配置全硬件通吃Nix builder 根据 nix-builder/versions.nix 中支持的配置和内核的build.toml生成构建矩阵——后端CPU/CUDA/Metal/ROCm/XPU× 后端版本 × 框架版本的笛卡尔积。例如当前支持矩阵中包含torch 2.10 × ( CPU | CUDA 12.6 | CUDA 12.8 | CUDA 13.0 | Metal | ROCm 7.0/7.1 | XPU )每个组合都是一个独立的 Nix derivation天然可并行、可缓存。ROCm / XPU / manylinux 这些厂商包集也都遵循同一套包集模式components → overrides → 工具链合成 overlay确保构建环境与用户最终安装的官方发行包一致避免符号解析不一致的隐蔽 bug。五、沙箱不只是隔离安全实践指南docs/source/builder/security.md 给出了面向内核作者的安全清单核心两条与 Nix 直接相关⚠️永远不要关闭沙箱构建。Nix 可以sandbox false运行以兼容不支持命名空间的系统但这样会让宿主机系统依赖溜进产物构建也将不可复现。用nix-info -m可以确认当前环境sandbox: yes。⚠️不要在脏的 Git 工作区构建。未提交的改动会让构建无法从纯源码复现。kernel-builder upload会为 dirty variant 打印警告并注入警告横幅kernels加载器在加载 dirty 构建的 variant 时也会告警。加上可复现构建带来的任何人可重编译验证哈希的能力Nix 沙箱实际上构成了内核分发的供应链安全底座。六、Nix vs Docker为什么容器不够这是官方 FAQ 里被问得最多的问题维度DockerNix隔离性✅ 运行环境隔离✅ 构建沙箱隔离构建可复现性⚠️ 基础镜像更新、隐式依赖仍会引入差异✅ 相同输入必得相同输出依赖精度镜像内环境是整体依赖逐条显式声明缓存粒度镜像层缓存按产物哈希精确缓存跨变体复用多环境切换需要维护多个镜像改配置即生成新环境Docker 解决的是运行环境一致Nix 解决的是构建结果可复现——对要分发给百万用户机器的内核二进制来说后者才是刚需。七、快速上手三步体验 Nix 构建# 1. 从模板初始化一个内核项目自动生成 flake.nix kernel-builder init --name owner/my-kernel # 2. 本地构建所有 variant等价于 kernel-builder build kernel-builder build # 3. 构建并上传到 Hub kernel-builder build-and-upload --repo-id owner/my-kernel更完整的 CLI 参考见 docs/source/builder-cli.md本地开发体验devshell、IDE 集成见 docs/source/builder/local-dev.md。总结kernels 选择 Nix本质上是为内核构建这个依赖维度爆炸、安全要求极高的场景找到了正确抽象确定性求值 构建沙箱→ 产物可复现供应链可审计声明式依赖 包集模式→ 任意 Torch/CUDA/ROCm 组合都是显式、精确的哈希缓存 二进制 substituter→ CI 从小时级降到分钟级构建矩阵自动生成→ 一次配置覆盖多硬件多版本。对于正在构建复杂原生扩展的团队来说这套 Nix 沙箱方案值得直接借鉴。赞分享【免费下载链接】kernelsBuild compute kernels and load them from the Hub.项目地址https://gitcode.com/gh_mirrors/kerne/kernels点击查看免费下载相关推荐为什么内核加载失败用 kernels 的 has_kernel 与 get_kernel_variants 精准排查为什么内核加载失败用 kernels 的 has_kernel 与 get_kernel_variants 精准排查 kernels 是一个让 PythonKiln Playwright 种子项目架构解析为 Agent 驱动的 UI 开发构建可复现沙箱Kiln Playwright 种子项目架构解析为 Agent 驱动的 UI 开发构建可复现沙箱 导读 Kiln 仓库内置了一套Playwright 种子项人工智能AI 应用AI 评测RAG微调提示工程开发工具桌面应用MLOpsgVisor vs microVMAgent Substrate 双沙箱选型什么时候该选谁gVisor vs microVMAgent Substrate 双沙箱选型什么时候该选谁 Agent Substrate 的核心竞争力不是再做一个容器AI Agent人工智能云原生容器运行时零信任后端上一篇Bytewax容错机制解析如何实现零数据丢失的流处理下一篇免费让 Mac 运行安卓应用APK-Installer 完整上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?