Buckets:
| # Quickstart | |
| ## Loading Kernels | |
| Here is how you would use the [activation](https://huggingface.co/kernels-community/activation) kernels from the Hugging Face Hub: | |
| ```python | |
| import torch | |
| from kernels import get_kernel | |
| # Download optimized kernels from the Hugging Face hub | |
| activation = get_kernel("kernels-community/activation", version=1) | |
| # Create a random tensor | |
| x = torch.randn((10, 10), dtype=torch.float16, device="cuda") | |
| # Run the kernel | |
| y = torch.empty_like(x) | |
| activation.gelu_fast(y, x) | |
| print(y) | |
| ``` | |
| This fetches version `1` of the kernel `kernels-community/activation`. | |
| Kernels are versioned using a major version number. Using `version=1` will | |
| get the latest kernel build from the `v1` branch. | |
| Kernels within a version branch must never break the API or remove builds | |
| for older PyTorch versions. This ensures that your code will continue to work. | |
| Hub kernels must be loaded with either a `version` or an explicit `revision`. | |
| > [!NOTE] | |
| > Version `0` kernels are excluded from the API compatibility requirement, | |
| > since it is used for alpha/beta-quality kernels that may still have | |
| > rapidly changing APIs. | |
| ## Checking Kernel Availability | |
| You can check if a particular version of a kernel supports the environment | |
| that the program is running on: | |
| ```python | |
| from kernels import has_kernel | |
| # Check if kernel is available for current environment | |
| is_available = has_kernel("kernels-community/activation", version=1) | |
| print(f"Kernel available: {is_available}") | |
| ``` | |
| When no compatible kernel is found, [has_kernel()](/docs/kernels/pr_774/en/api/kernels#kernels.has_kernel) does not say _why_. | |
| [get_kernel_variants()](/docs/kernels/pr_774/en/api/kernels#kernels.get_kernel_variants) returns the full resolution trace instead: one | |
| decision per build variant in the repository, with compatible variants listed | |
| first. Each decision is a `VariantAccepted` or a `VariantRejected`, and rejected | |
| variants carry a human-readable `reason`: | |
| ```python | |
| 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})") | |
| ``` | |
| ## Device Architecture Checks | |
| A kernel build declares the device architectures it was built for (e.g. CUDA | |
| compute capabilities such as `8.0` or `9.0a`, or ROCm archs such as `gfx90a`) | |
| in its metadata. [get_kernel()](/docs/kernels/pr_774/en/api/kernels#kernels.get_kernel) validates these architectures against | |
| the current device and raises an error when the device is not supported. This | |
| check can be disabled by passing `check_arch=False` to [get_kernel()](/docs/kernels/pr_774/en/api/kernels#kernels.get_kernel). | |
| Without this check, an incompatible kernel would load fine, but fail at | |
| launch time — some kernels even terminate the whole process rather than | |
| raising an exception. | |
| [has_kernel()](/docs/kernels/pr_774/en/api/kernels#kernels.has_kernel) performs the same validation and returns `False` when | |
| the kernel does not support the current device, so you can select a different | |
| kernel or fall back to another implementation without hard-failing. | |
| The declared architectures are the union over all of a kernel's components, so | |
| a kernel may support more architectures than it declares. For example, a | |
| kernel could fall back to a Triton implementation on architectures that its | |
| CUDA kernels were not built for. For such kernels, the check can be disabled | |
| with `check_arch=False`: | |
| ```python | |
| from kernels import get_kernel, has_kernel | |
| # Only checks that a compatible build variant exists, the kernel may not | |
| # support the device architecture. | |
| has_kernel("kernels-community/flash-attn3", version=1, check_arch=False) | |
| # Skips the device architecture check when loading. | |
| flash_attn3 = get_kernel("kernels-community/flash-attn3", version=1, check_arch=False) | |
| ``` | |
| > [!WARNING] | |
| > When the architecture check is disabled, loading an incompatible kernel | |
| > succeeds, but using it can fail or even terminate the process at run time. | |
| For kernels that are used through layers, prefer | |
| [registering kernels for specific CUDA capabilities](./layers#registering-kernels-for-specific-cuda-capabilities) | |
| instead — `kernels` will then never load an incompatible kernel at all. | |
| ## Inspecting Loaded Kernels | |
| [get_loaded_kernels()](/docs/kernels/pr_774/en/api/kernels#kernels.get_loaded_kernels) returns a snapshot of every kernel that has been loaded | |
| into the current process. Each entry is a [LoadedKernel](/docs/kernels/pr_774/en/api/kernels#kernels.LoadedKernel) namedtuple with the | |
| imported `module`, the `package_name`, and `repo_infos` (repo id, resolved | |
| revision, and the backend argument that was passed). | |
| ```python | |
| from kernels import get_kernel, get_loaded_kernels | |
| get_kernel("kernels-community/activation", version=1) | |
| for loaded in get_loaded_kernels(): | |
| print(loaded.package_name, loaded.repo_infos) | |
| ``` | |
| `repo_infos` is populated only for kernels loaded with [get_kernel()](/docs/kernels/pr_774/en/api/kernels#kernels.get_kernel). Kernels | |
| loaded from a local path ([get_local_kernel()](/docs/kernels/pr_774/en/api/kernels#kernels.get_local_kernel)) or via a lockfile | |
| ([get_locked_kernel()](/docs/kernels/pr_774/en/api/kernels#kernels.get_locked_kernel), [load_kernel()](/docs/kernels/pr_774/en/api/kernels#kernels.load_kernel)) have `repo_infos=None`. | |
| Browse through different kernels compatible with `kernels` from [here](https://huggingface.co/kernels). | |
| A kernel can provide layers in addition to kernel functions. Refer to [Layers](./layers) to know more. | |
Xet Storage Details
- Size:
- 5.66 kB
- Xet hash:
- f06ca90628f42f0681da18d3a4e269c95534d0a4c851c5bad179e00726ec0a32
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.