Hugging Face Kernels 重大更新
Hugging Face Kernels 重大更新
Kernels 作为新的仓库类型
Hugging Face 在 Hub 上添加了新的 "kernel" 仓库类型,以使自定义 kernels 成为一等公民、可发现,并展示哪些加速器、操作系统和后端版本受支持。
用户可以在 https://huggingface.co/kernels 浏览所有 kernels,并查看例如 https://huggingface.co/kernels/kernels-community/flash-attn3 处的 Flash Attention 3 kernel 示例页面。
将 kernels 作为一等公民使得用户能够看到 kernels、模型和应用之间的趋势。
安全性改进
Hugging Face 通过受信任的发布者和代码签名加强了 kernel 安全性,以防止恶意 kernels 以与 Python 进程相同的权限运行。
受信任的 kernel 发布者
默认情况下,kernels 包仅从受信任的发布者加载 kernels;从其他来源加载需要使用 trust_remote_code=True 参数。
from kernels import get_kernel
kernel_module = get_kernel(
"Atlas-Inference/gdn", version=1, trust_remote_code=True
)
用户和组织必须从其账户设置请求发布者访问权限,以允许逐案审查。
Kernel 签名
额外的一层使用 Sigstore 的 cosign 和临时私钥,因此泄露的密钥在其短暂有效期后不能被重复使用。
kernel 受到来自可信 GitHub 仓库的可信 GitHub 工作流的签名。
kernel-builder 支持签名,而 kernels verify-signature CLI 可以验证签名;加载时的验证尚在进一步测试中。
初始设置说明位于 kernels 0.16.0 发行说明中:https://github.com/huggingface/kernels/releases/tag/v0.16.0。
已改造的 CLIs
kernels 和 kernel-builder 的职责已被分离,以使每个 CLI 更精简且更具体。
kernelsCLI 负责加载和准备 kernels 以供使用。kernel-builderCLI 负责构建 kernels。
文档可在 kernels CLI 和 kernel‑builder CLI 页面上找到。
这种分离也提升了面向代理的 kernel 开发体验。
框架和后端支持的扩展
框架和后端的支持已扩展,以提高 kernel 兼容性。
- Torch Stable ABI:kernels 可以针对特定的 Torch 版本或任何更高版本,大约两年内有效。例如,针对 Torch 2.9 Stable ABI 的 kernel 适用于 Torch >= 2.9。
- Apache TVM FFI:除了 Torch 之外的第一个受支持的框架,提供了一种可与 PyTorch、Jax 和 CuPy 互操作的标准化 ABI,使得能够跨框架运行的 kernels 得以实现。
面向代理的 kernel 开发基础
工具现提供一个结构化的、面向代理友好的工作流,用于脚手架、构建、基准测试和迭代优化 kernels。
kernel-builder 强制执行可预测的项目布局和可重复的构建,提供一个经过代理优化的 CLI(非交互命令,直接输出),并包含捕获工具链、编译路径和性能考量的后端特定技能。
与 HF Jobs 的集成使得代理能够在不同硬件配置上运行基准测试套件,收集性能结果,并将其与定义的基线进行比较。
通过此工作流开发的示例 kernels:
其他改进
环境设置
一键安装脚本简化了 kernel‑builder 环境的设置;Terraform 安装指南也可用于临时实例。
kernels 的系统卡
构建后,会生成一个系统卡,显示使用说明和暴露的接口;当推送到 Hub 时,它成为 kernel 的前置内容。
例如:kernels‑community/flash-attn3 的系统卡。
我的系统是否兼容 kernel?
has_kernel() 函数返回一个布尔值,指示兼容性。
from kernels import has_kernel
print(has_kernel("kernels-community/activation", version=1))
有关详细原因,get_kernel_variants() 列出每个变体及其接受或拒绝的原因。
from kernels import get_kernel_variants, VariantAccepted
for decision in get_kernel_variants("kernels-community/activation", version=1):
name = decision.variant.variant_str
if isinstance(decision, VariantAccepted):
print(f"{name}: compatible
else:
print(f"{name}: rejected ({decision.reason})
改进的 manylinux_2_28 支持
以前,kernels 静态链接 libstdc++ 以避免较旧的 libstdc++ 问题,但这导致动态和静态版本交互时出现段错误。
现在 kernels 动态链接 libstdc++,并使用官方 manylinux_2_28 工具链编译,以保持与较旧 libstdc++ 版本的兼容性。
结论
这些更新旨在通过使 kernels 更安全、更易发现、更易构建以及更适合自动化、代理驱动的工作流来同时服务于 kernel 开发者和用户。
欢迎社区反馈。
致谢:感谢 Aritra 审阅此文。
Sources
- Original🤗 Kernels: Major Updates