Buckets:
| import{s as ds,n as ms,o as us}from"../chunks/scheduler.f3b1e791.js";import{S as hs,i as fs,e as a,s as i,c as p,h as Ts,a as o,d as l,b as s,f as Rn,g as c,j as r,k as Pn,l as T,m as n,n as d,t as m,o as u,p as h}from"../chunks/index.023a9934.js";import{C as ys,H as f,E as bs}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.bc186cc7.js";import{C as y}from"../chunks/CodeBlock.f573e8ef.js";function Ms(Xn){let g,Lt,It,Vt,U,Zt,J,Bt,v,Rt,C,Fn=`The Kernel Hub allows Python libraries and applications to load compute | |
| kernels directly from the <a href="https://hf.co/" rel="nofollow">Hub</a>. To support this kind | |
| of dynamic loading, Hub kernels differ from traditional Python kernel | |
| packages in that they are made to be:`,Nt,j,Yn=`<li>Portable: a kernel can be loaded from paths outside <code>PYTHONPATH</code>.</li> <li>Unique: multiple versions of the same kernel can be loaded in the | |
| same Python process.</li> <li>Compatible: kernels must support all recent versions of Python and | |
| the different PyTorch build configurations (various CUDA versions | |
| and C++ ABIs). Furthermore, older C library versions must be supported.</li>`,Wt,x,On=`<code>kernel-builder</code> is a set of tools that can build conforming kernels. It | |
| takes care of:`,Et,H,zn=`<li>Building kernels for all supported PyTorch configurations (C++98/11 and | |
| different CUDA versions).</li> <li>Compatibility with old glibc and libstdc++ versions, so that kernels also | |
| work on older Linux distributions.</li> <li>Registering Torch ops, such that multiple versions the same kernel can be | |
| loaded without namespace conflicts.</li>`,Qt,I,Dn=`<code>kernel-builder</code> builds are configured through a <code>build.toml</code> file. | |
| <code>build.toml</code> is a simple format that does not require intricate knowledge | |
| of CMake or setuptools.`,At,_,Kn=`This page describes the directory layout of a kernel-builder project, the | |
| format of the <code>build.toml</code> file, and some additional Python glue that | |
| <code>kernel-builder</code> provides. We will use a <a href="https://github.com/huggingface/kernels/tree/main/examples/kernels/relu" rel="nofollow">simple ReLU kernel</a> | |
| as the running example. After reading this page, you may also want to have | |
| a look at the more realistic <a href="https://github.com/huggingface/kernels/tree/main/examples/kernels/relu-backprop-compile" rel="nofollow">ReLU kernel with backprop and <code>torch.compile</code></a> | |
| support.`,qt,$,ei=`<p>We maintain a set of conforming kernels in the | |
| <a href="https://github.com/huggingface/kernels-community" rel="nofollow">kernels-community repository</a>. | |
| We try to keep these kernels synced with upstream as much as possible.</p>`,Gt,L,St,V,Pt,Z,ti=`The fastest way to get started is to run the install script. This | |
| installs <a href="https://docs.determinate.systems/determinate-nix/" rel="nofollow">Determinate Nix</a> | |
| and <code>kernel-builder</code> in a single command:`,Xt,B,Ft,R,li="This will:",Yt,N,ni=`<li>Install Determinate Nix (if not already installed).</li> <li>Configure the Hugging Face binary cache (to avoid building dependencies from | |
| source).</li> <li>Install <code>kernel-builder</code> via <code>nix profile install</code>.</li>`,Ot,W,ii="To update <code>kernel-builder</code> later:",zt,E,Dt,Q,si=`For a step-by-step breakdown of what the script does, see | |
| <a href="nix">Using the kernel builder with Nix</a>.`,Kt,A,el,q,ai=`In the <a href="https://github.com/huggingface/kernels/tree/main/terraform" rel="nofollow"><code>terraform</code></a> directory, we provide an | |
| example of programatically spinning up an EC2 instance that is ready | |
| with everything needed for you to start developing and building | |
| kernels.`,tl,G,oi=`If you use a different provider, the Terraform bridges should be | |
| similar and straightforward to modify.`,ll,S,nl,P,ri=`The easiest way to start a new kernel is by using the <code>init</code> subcommand | |
| of <code>kernel-builder</code>. This creates a minimal, compilable kernel:`,il,X,sl,F,pi=`This creates a kernel named <code>mykernel</code> in the directory <code>mykernel</code>. The | |
| kernel is configured to upload to the <code>myorg/mykernel</code> Hub | |
| repository when an upload command is used.`,al,Y,ci=`By default, the <code>init</code> subcommand creates a CUDA kernel. You can specify | |
| another backend with the <code>--backends</code> option:`,ol,O,rl,z,di=`You can also make a multi-backend kernel by adding all the backends | |
| that you would like to support as arguments to <code>--backends</code>:`,pl,D,cl,K,mi=`Finally, if you want to create a kernel for all supported backends, you | |
| can use <code>--backends all</code>.`,dl,ee,ml,te,ui="Kernel projects follow this general directory layout:",ul,le,hl,ne,hi="In this example we can find:",fl,ie,fi=`<li>The build configuration in <code>build.toml</code>.</li> <li>One or more top-level directories containing kernels (<code>mykernel_cuda</code>).</li> <li>The <code>torch-ext</code> directory, which contains: | |
| <ul><li><code>torch_binding.h</code>: contains declarations for kernel entry points | |
| (from <code>kernel_a</code> and <code>kernel_b</code>).</li> <li><code>torch_binding.cpp</code>: registers the entry points as Torch ops.</li> <li><code>torch_ext/mykernel</code>: contains any Python wrapping the kernel needs. At the | |
| bare minimum, it should contain an <code>__init__.py</code> file.</li></ul></li> <li>Kernel tests in the directory <code>tests</code>.</li> <li>Benchmarks in the directory <code>benchmarks</code>.</li> <li>A kernel card template in <code>CARD.md</code>. This placeholders in the card are filled | |
| during the kernel build.</li> <li>The Nix flake configuration in <code>flake.nix</code>.</li> <li>An example script that uses the kernel in <code>example.py</code>.</li>`,Tl,se,yl,ae,Ti=`<code>build.toml</code> tells <code>kernel-builder</code> what to build and how. It looks as | |
| follows for the <code>mykernel</code> kernel:`,bl,oe,Ml,re,yi="The following sections enumerate all supported options for <code>build.toml</code>.",kl,pe,gl,ce,bi=`<li><code>name</code> (required): the name of the kernel. The Python code for a Torch | |
| extension must be stored in <code>torch-ext/<name></code>.</li> <li><code>version</code> (int): the major version of the kernel. | |
| The version is written to the kernel’s <code>metadata.json</code> and is used | |
| by the <code>kernels upload</code> command to upload the kernel to a version | |
| branch named <code>v<version></code>.</li> <li><code>backends</code> (required): a list of supported backends. Must be one or | |
| more of <code>cpu</code>, <code>cuda</code>, <code>metal</code>, <code>rocm</code>, or <code>xpu</code>.</li> <li><code>upstream</code>: Git-compatible URL (passable to <code>git clone</code>) of the original | |
| upstream repository where the kernel source code comes from.</li> <li><code>source</code>: Git-compatible URL (passable to <code>git clone</code>) of the kernel-builder | |
| formatted source repository. This repository must contain a <code>build.toml</code> and | |
| <code>flake.nix</code> so that it can be pulled and built with the kernel builder.</li> <li><code>python-depends</code> (<strong>experimental</strong>): a list of additional Python dependencies | |
| that the kernel requires. The only supported dependencies are <code>einops</code> | |
| and <code>nvidia-cutlass-dsl</code>.</li>`,$l,de,wl,me,Mi=`<li><code>repo-id</code>: the Hub repository to upload the kernel to when the <code>upload</code> or | |
| <code>build-and-upload</code> subcommands of <code>kernel-builder</code> are used.</li>`,Ul,ue,Jl,he,ki=`<li><code>maxver</code>: the maximum CUDA toolkit version (inclusive). This option | |
| <em>must not</em> be set under normal circumstances, since it can exclude Torch | |
| build variants that are <a href="../kernel-requirements">required for compliant kernels</a>. | |
| This option is provided for kernels that cause compiler errors on | |
| newer CUDA toolkit versions.</li> <li><code>minver</code>: the minimum required CUDA toolkit version. This option | |
| <em>must not</em> be set under normal circumstances, since it can exclude Torch | |
| build variants that are <a href="../kernel-requirements">required for compliant kernels</a>. | |
| This option is provided for kernels that require functionality only | |
| provided by newer CUDA toolkits.</li>`,vl,fe,Cl,Te,gi=`The framework section specifies framework-specific settings. The name of | |
| the section depends on the framework that is used. The currently supported | |
| frameworks are:`,jl,ye,$i="<li>AOT-compiled Torch kernel (<code>torch</code>).</li> <li>AOT-compiled TVM-FFI kernel (<code>tvm-ffi</code>).</li> <li>JIT-compiled or not-compiled Torch kernel (<code>torch-noarch</code>, experimental).</li>",xl,be,Hl,Me,wi=`This framework section is used for AOT-compiled Torch kernels, and has the | |
| following options:`,Il,b,wt,Ui="<p><code>src</code> (required): a list of source files and headers.</p>",Nn,Ut,Ji=`<p><code>pyext</code> (optional): the list of extensions for Python files. Default: | |
| <code>["py", "pyi"]</code>.</p>`,Wn,Jt,vi=`<p><code>include</code> (optional): include directories relative to the project root. | |
| Default: <code>[]</code>.</p>`,En,vt,Ci=`<p><code>maxver</code> (optional): only build for this Torch version and earlier. Use cautiously, since this option produces | |
| non-compliant kernels if the version range does not correspond to the <a href="build-variants">required variants</a>.</p>`,Qn,Ct,ji=`<p><code>minver</code> (optional): only build for this Torch version and later. Use cautiously, since this option produces | |
| non-compliant kernels if the version range does not correspond to the <a href="build-variants">required variants</a>.</p>`,An,k,jt,xi=`<code>stable-abi</code> (<strong>experimental</strong>): when set to a Torch version (e.g. | |
| <code>"2.11"</code>), the kernel is built using the Torch stable ABI. This | |
| requires that the kernel itself only use | |
| <a href="https://docs.pytorch.org/docs/2.12/notes/libtorch_stable_abi.html" rel="nofollow">stable ABI headers</a>. | |
| For an example, see the <a href="https://github.com/huggingface/kernels/tree/main/examples/kernels/relu-torch-stable-abi" rel="nofollow"><code>relu-torch-stable-abi</code></a> | |
| example kernel.`,qn,xt,Hi=`The stable ABI can also be configured per-backend by providing a table | |
| mapping backend names to Torch versions instead of a single version. Backends | |
| that are not listed in the table are built normally (without the stable ABI), | |
| allowing a kernel to mix stable-ABI and full-ABI backends:`,Gn,ke,Sn,Ht,Ii=`Every backend referenced in the table must also be listed in | |
| <code>[general].backends</code>.`,_l,ge,Ll,$e,_i="This framework section is used for AOT-compiled TVM-FFI kernels.",Vl,we,Li=`<li><code>src</code> (required): a list of source files and headers.</li> <li><code>pyext</code> (optional): the list of extensions for Python files. Default: | |
| <code>["py", "pyi"]</code>.</li> <li><code>include</code> (optional): include directories relative to the project root. | |
| Default: <code>[]</code>.</li>`,Zl,Ue,Bl,Je,Vi=`The <code>torch-noarch</code> section is used for JIT-compiled kernels or kernels that | |
| do not require any ahead-of-time compilation (e.g. a kernel that packages plain PyTorch | |
| layers).`,Rl,ve,Zi=`Normally, it is expected that this type of kernel runs on all CUDA capabilities | |
| or ROCm architectures. However, for kernels that support only a limited range | |
| of archs, the <code>cuda-capabilites</code> and <code>rocm-archs</code> options can be used to specify | |
| the supported archs. These are then exported to <code>metadata.json</code> for consumption | |
| by e.g. the Hugging Face Hub.`,Nl,Ce,Bi=`<li><code>pyext</code> (optional): the list of extensions for Python files. Default: | |
| <code>["py", "pyi"]</code>.</li> <li><code>cuda-capabilities</code> (optional): a list of CUDA compute capabilities the | |
| kernel supports (e.g. <code>["9.0", "10.0"]</code>).</li> <li><code>rocm-archs</code> (optional): a list of ROCm architectures the kernel supports | |
| (e.g. <code>["gfx942"]</code>).</li>`,Wl,je,El,xe,Ri=`Specification of a kernel with the name <code><name></code>. Multiple <code>kernel.<name></code> | |
| sections can be defined in the same <code>build.toml</code>. | |
| See for example <a href="https://huggingface.co/kernels-community/quantization/" rel="nofollow"><code>kernels-community/quantization</code></a> | |
| for an example with multiple kernel sections.`,Ql,He,Ni="The following options can be set for a kernel:",Al,Ie,Wi=`<li><code>backend</code> (required): the compute backend of the kernel. The currently | |
| supported backends are <code>cpu</code>, <code>cuda</code>, <code>metal</code>, <code>rocm</code>, and <code>xpu</code>. | |
| <strong>The <code>cpu</code> backend is currently experimental and might still change.</strong></li> <li><code>depends</code> (required): a list of dependencies. The supported dependencies | |
| are listed in <a href="https://github.com/huggingface/kernels/blob/main/builder/lib/deps.nix" rel="nofollow"><code>deps.nix</code></a>.</li> <li><code>src</code> (required): a list of source files and headers.</li> <li><code>include</code> (optional): include directories relative to the project root. | |
| Default: <code>[]</code>.</li>`,ql,_e,Ei=`Besides these shared options, the following backend-specific options | |
| are available:`,Gl,Le,Sl,Ve,Qi=`<li><code>cuda-capabilities</code> (optional): a list of CUDA capabilities that the | |
| kernel should be compiled for. When absent, the kernel will be built | |
| using all capabilities that the builder supports. The effective | |
| capabilities are the intersection of this list and the capabilities | |
| supported by the CUDA compiler. It is recommended to leave this option | |
| unspecified <strong>unless</strong> a kernel requires specific capabilities.</li> <li><code>cuda-flags</code> (optional): additional flags to be passed to <code>nvcc</code>. | |
| <strong>Warning</strong>: this option should only be used in exceptional circumstances. | |
| Custom compile flags can interfere with the build process or break | |
| compatibility requirements.</li>`,Pl,Ze,Xl,Be,Ai=`<li><code>rocm-archs</code>: a list of ROCm architectures that the kernel should be | |
| compiled for.</li>`,Fl,Re,Yl,Ne,qi=`<li><code>sycl-flags</code>: a list of additional flags to be passed to the SYCL | |
| compiler.</li>`,Ol,We,zl,Ee,Gi=`<li><code>cxx-flags</code>: a list of additional flags to be passed to the C++ | |
| compiler.</li>`,Dl,Qe,Kl,Ae,en,qe,Si="Torch bindings are defined in C++, kernels commonly use two files:",tn,Ge,Pi="<li><code>torch_binding.h</code> containing function declarations.</li> <li><code>torch_binding.cpp</code> registering the functions as Torch ops.</li>",ln,Se,Xi=`For instance, the <code>mykernel</code> kernel discussed above has the following | |
| declaration in <code>torch_binding.h</code>:`,nn,Pe,sn,Xe,Fi="This function is then registered as a Torch op in <code>torch_binding.cpp</code>:",an,Fe,on,Ye,Yi=`This snippet uses macros from <code>registration.h</code> to register the function. | |
| <code>registration.h</code> is generated by <code>kernel-builder</code> itself. A function | |
| is registered through the <code>def</code>/<code>ops</code> methods. <code>ops</code> specifies the | |
| function signature following the <a href="https://github.com/pytorch/pytorch/blob/main/aten/src/ATen/native/README.md#func" rel="nofollow">function schema</a>. | |
| <code>impl</code> associates the function name with the C/C++ function and | |
| the applicable device.`,rn,Oe,pn,ze,Oi=`The bindings are typically wrapped in Python code in <code>torch_ext/<name></code>. | |
| The native code is exposed under the <code>torch.ops</code> namespace. However, | |
| we add some unique material to the name of the extension to ensure that | |
| different versions of the same extension can be loaded at the same time. | |
| As a result, the extension is registered as | |
| <code>torch.ops.<name>_<unique_material></code>.`,cn,De,zi=`To deal with this uniqueness, <code>kernel_builder</code> generates a Python module | |
| named <code>_ops</code> that contains an alias for the name. This can be used to | |
| refer to the correct <code>torch.ops</code> module. For example:`,dn,Ke,mn,et,un,tt,Di=`You may want to register Torch ops from your kernel’s Python code or | |
| register fake ops for <code>torch.compile</code> support. It is important to register | |
| such ops in the namespace that kernel-builder makes for your kernel | |
| build. This is required for compliant kernels to ensure that multiple | |
| versions of the same kernel can be loaded at the same time without | |
| namespace conflicts.`,hn,lt,Ki=`You can use the <code>add_op_namespace_prefix</code> to prefix an op name with the | |
| correct prefix. So for instance, replace`,fn,nt,Tn,it,es="by",yn,st,bn,at,ts="As mentioned in the above, the <code>_ops</code> module is generated by kernel-builder.",Mn,ot,ls=`kernel-builder uses a hook to reject incorrect usage of Torch op registration | |
| functions. However, it can only catch direct use of certain <code>torch.library</code> | |
| decorators. For instance, the hook would not reject the following decorator, | |
| so it should be seen as a last-resort check if human review failed:`,kn,rt,gn,pt,$n,ct,ns=`Kernel tests are stored in the <code>tests</code> directory. Since running all | |
| kernel tests in CI may be prohibitively expensive, the <code>pyproject.toml</code> | |
| generated by the builder adds support for the special <code>kernels_ci</code> | |
| PyTest marker that can be used as follows:`,wn,dt,Un,mt,is=`We recommend that you to pick tests that together would catch most error | |
| cases while running within 60 seconds.`,Jn,ut,ss="You can run the tests (e.g. in CI) using:",vn,ht,Cn,ft,as=`If the kernel supports multiple backends, it will run the test for the | |
| first supported backend that was found, obeying the following order: CUDA, | |
| ROCm, XPU, Metal, CPU. If you would like to the tests for a specific build | |
| variant, you can use <code>nix run .#ciTests.<variant></code>. For instance:`,jn,Tt,xn,yt,os=`When running the tests on a non-NixOS systems, make sure that | |
| <a href="https://danieldk.eu/Software/Nix/Nix-CUDA-on-non-NixOS-systems#solutions" rel="nofollow">the CUDA driver library can be found</a>.`,Hn,bt,In,Mt,rs=`We provide a utility to generate a system card for a given kernel, utilizing | |
| information from its <code>build.toml</code> and metadata. This system card provides a | |
| reasonable starting point and is meant to be edited afterward by the kernel | |
| developer.`,_n,kt,ps=`The template card is generated as a part of <code>kernel-builder init</code> | |
| command and is serialized in the root directory of the kernel.`,Ln,gt,cs=`The card will be filled automatically by the builder when using the | |
| <code>build-and-upload</code> or <code>build-and-copy</code> command. It will be serialized | |
| to the <code>build</code> sub-directory inside the main kernel directory. It | |
| will be uploaded as <code>README.md</code> to the Hub.`,Vn,$t,Zn,_t,Bn;return U=new ys({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),J=new f({props:{title:"Write kernels",local:"write-kernels",headingTag:"h1"}}),v=new f({props:{title:"Introduction",local:"introduction",headingTag:"h2"}}),L=new f({props:{title:"Setting up environment",local:"setting-up-environment",headingTag:"h2"}}),V=new f({props:{title:"Quick install",local:"quick-install",headingTag:"h3"}}),B=new y({props:{code:"Y3VybCUyMC1mc1NMJTIwaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGaHVnZ2luZ2ZhY2UlMkZrZXJuZWxzJTJGbWFpbiUyRmluc3RhbGwuc2glMjAlN0MlMjBiYXNo",highlighted:"curl -fsSL https://raw.githubusercontent.com/huggingface/kernels/main/install.sh | bash",lang:"bash",wrap:!1}}),E=new y({props:{code:"bml4JTIwcHJvZmlsZSUyMHVwZ3JhZGUlMjAtLWFsbA==",highlighted:"nix profile upgrade --all",lang:"bash",wrap:!1}}),A=new f({props:{title:"Cloud environment",local:"cloud-environment",headingTag:"h3"}}),S=new f({props:{title:"Starting a new kernel",local:"starting-a-new-kernel",headingTag:"h2"}}),X=new y({props:{code:"JTI0JTIwa2VybmVsLWJ1aWxkZXIlMjBpbml0JTIwLS1uYW1lJTIwbXlvcmclMkZteWtlcm5lbCUwQUluaXRpYWxpemVkJTIwJTYwbXlvcmclMkZteWtlcm5lbCU2MCUyMGF0JTIwJTJGaG9tZSUyRmRhbmllbCUyRmdpdCUyRmtlcm5lbHMlMkZleGFtcGxlcyUyRmtlcm5lbHMlMkZteWtlcm5lbA==",highlighted:"$ kernel-builder init --name myorg/mykernel\nInitialized `myorg/mykernel` at /home/daniel/git/kernels/examples/kernels/mykernel",lang:"bash",wrap:!1}}),O=new y({props:{code:"JTI0JTIwa2VybmVsLWJ1aWxkZXIlMjBpbml0JTIwLS1uYW1lJTIwbXlvcmclMkZteWtlcm5lbCUyMC0tYmFja2VuZHMlMjB4cHU=",highlighted:"$ kernel-builder init --name myorg/mykernel --backends xpu",lang:"bash",wrap:!1}}),D=new y({props:{code:"JTI0JTIwa2VybmVsLWJ1aWxkZXIlMjBpbml0JTIwLS1uYW1lJTIwbXlvcmclMkZteWtlcm5lbCUyMC0tYmFja2VuZHMlMjBjdWRhJTIweHB1JTBBSW5pdGlhbGl6ZWQlMjAlNjBteW9yZyUyRm15a2VybmVsJTYwJTIwYXQlMjAlMkZob21lJTJGZGFuaWVsJTJGZ2l0JTJGa2VybmVscyUyRmV4YW1wbGVzJTJGa2VybmVscyUyRm15a2VybmVs",highlighted:"$ kernel-builder init --name myorg/mykernel --backends cuda xpu\nInitialized `myorg/mykernel` at /home/daniel/git/kernels/examples/kernels/mykernel",lang:"bash",wrap:!1}}),ee=new f({props:{title:"Kernel project layout",local:"kernel-project-layout",headingTag:"h2"}}),le=new y({props:{code:"bXlrZXJuZWwlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBiZW5jaG1hcmtzJTBBJUUyJTk0JTgyJTIwJTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJTIwYmVuY2htYXJrLnB5JTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwYnVpbGQudG9tbCUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCUyMENBUkQubWQlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBleGFtcGxlLnB5JTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwZmxha2Uubml4JTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwbXlrZXJuZWxfY3VkYSUwQSVFMiU5NCU4MiUyMCUyMCUyMCVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCUyMG15a2VybmVsLmN1JTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwdGVzdHMlMEElRTIlOTQlODIlMjAlMjAlMjAlRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBfX2luaXRfXy5weSUwQSVFMiU5NCU4MiUyMCUyMCUyMCVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCUyMHRlc3RfbXlrZXJuZWwucHklMEElRTIlOTQlOTQlRTIlOTQlODAlRTIlOTQlODAlMjB0b3JjaC1leHQlMEElRTIlOTQlOUMlRTIlOTQlODAlRTIlOTQlODAlMjBteWtlcm5lbCUwQSVFMiU5NCU4MiUyMCUyMCUyMCVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCUyMF9faW5pdF9fLnB5JTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJTIwdG9yY2hfYmluZGluZy5jcHAlMEElRTIlOTQlOTQlRTIlOTQlODAlRTIlOTQlODAlMjB0b3JjaF9iaW5kaW5nLmg=",highlighted:`mykernel | |
| ├── benchmarks | |
| │ └── benchmark.py | |
| ├── build.toml | |
| ├── CARD.md | |
| ├── example.py | |
| ├── flake.nix | |
| ├── mykernel_cuda | |
| │ └── mykernel.cu | |
| ├── tests | |
| │ ├── __init__.py | |
| │ └── test_mykernel.py | |
| └── torch-ext | |
| ├── mykernel | |
| │ └── __init__.py | |
| ├── torch_binding.cpp | |
| └── torch_binding.h`,lang:"text",wrap:!1}}),se=new f({props:{title:"build.toml",local:"buildtoml",headingTag:"h2"}}),oe=new y({props:{code:"JTVCZ2VuZXJhbCU1RCUwQWJhY2tlbmRzJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIyY3VkYSUyMiUyQyUwQSU1RCUwQW5hbWUlMjAlM0QlMjAlMjJteWtlcm5lbCUyMiUwQXZlcnNpb24lMjAlM0QlMjAxJTBBJTBBJTVCZ2VuZXJhbC5odWIlNUQlMEFyZXBvLWlkJTIwJTNEJTIwJTIybXlvcmclMkZteWtlcm5lbCUyMiUwQSUwQSU1QnRvcmNoJTVEJTBBc3JjJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIydG9yY2gtZXh0JTJGdG9yY2hfYmluZGluZy5jcHAlMjIlMkMlMEElMjAlMjAlMjJ0b3JjaC1leHQlMkZ0b3JjaF9iaW5kaW5nLmglMjIlMkMlMEElNUQlMEElMEElNUJrZXJuZWwubXlrZXJuZWwlNUQlMEFiYWNrZW5kJTIwJTNEJTIwJTIyY3VkYSUyMiUwQWRlcGVuZHMlMjAlM0QlMjAlNUIlMjJ0b3JjaCUyMiU1RCUwQXNyYyUyMCUzRCUyMCU1QiUyMm15a2VybmVsX2N1ZGElMkZteWtlcm5lbC5jdSUyMiU1RCUwQSUyMyUyMElmJTIwdGhlJTIwa2VybmVsJTIwaXMlMjBvbmx5JTIwc3VwcG9ydGVkJTIwb24lMjBzcGVjaWZpYyUyMGNhcGFiaWxpdGllcyUyQyUyMHNldCUyMHRoZSUwQSUyMyUyMGN1ZGEtY2FwYWJpbGl0aWVzJTIwb3B0aW9uJTNBJTBBJTIzJTBBJTIzJTIwY3VkYS1jYXBhYmlsaXRpZXMlMjAlM0QlMjAlNUIlMjAlMjI5LjAlMjIlMkMlMjAlMjIxMC4wJTIyJTJDJTIwJTIyMTIuMCUyMiUyMCU1RA==",highlighted:`<span class="hljs-section">[general]</span> | |
| <span class="hljs-attr">backends</span> = [ | |
| <span class="hljs-string">"cuda"</span>, | |
| ] | |
| <span class="hljs-attr">name</span> = <span class="hljs-string">"mykernel"</span> | |
| <span class="hljs-attr">version</span> = <span class="hljs-number">1</span> | |
| <span class="hljs-section">[general.hub]</span> | |
| <span class="hljs-attr">repo-id</span> = <span class="hljs-string">"myorg/mykernel"</span> | |
| <span class="hljs-section">[torch]</span> | |
| <span class="hljs-attr">src</span> = [ | |
| <span class="hljs-string">"torch-ext/torch_binding.cpp"</span>, | |
| <span class="hljs-string">"torch-ext/torch_binding.h"</span>, | |
| ] | |
| <span class="hljs-section">[kernel.mykernel]</span> | |
| <span class="hljs-attr">backend</span> = <span class="hljs-string">"cuda"</span> | |
| <span class="hljs-attr">depends</span> = [<span class="hljs-string">"torch"</span>] | |
| <span class="hljs-attr">src</span> = [<span class="hljs-string">"mykernel_cuda/mykernel.cu"</span>] | |
| <span class="hljs-comment"># If the kernel is only supported on specific capabilities, set the</span> | |
| <span class="hljs-comment"># cuda-capabilities option:</span> | |
| <span class="hljs-comment">#</span> | |
| <span class="hljs-comment"># cuda-capabilities = [ "9.0", "10.0", "12.0" ]</span>`,lang:"toml",wrap:!1}}),pe=new f({props:{title:"general",local:"general",headingTag:"h3"}}),de=new f({props:{title:"general.hub",local:"generalhub",headingTag:"h3"}}),ue=new f({props:{title:"general.cuda",local:"generalcuda",headingTag:"h3"}}),fe=new f({props:{title:"Framework sections",local:"framework-sections",headingTag:"h3"}}),be=new f({props:{title:"torch",local:"torch",headingTag:"h3"}}),ke=new y({props:{code:"JTVCdG9yY2guc3RhYmxlLWFiaSU1RCUwQWN1ZGElMjAlM0QlMjAlMjIyLjExJTIyJTBBcm9jbSUyMCUzRCUyMCUyMjIuOSUyMg==",highlighted:`<span class="hljs-section">[torch.stable-abi]</span> | |
| <span class="hljs-attr">cuda</span> = <span class="hljs-string">"2.11"</span> | |
| <span class="hljs-attr">rocm</span> = <span class="hljs-string">"2.9"</span>`,lang:"toml",wrap:!1}}),ge=new f({props:{title:"tvm-ffi",local:"tvm-ffi",headingTag:"h3"}}),Ue=new f({props:{title:"torch-noarch",local:"torch-noarch",headingTag:"h3"}}),je=new f({props:{title:"kernel.<name>",local:"kernelltnamegt",headingTag:"h3"}}),Le=new f({props:{title:"cuda",local:"cuda",headingTag:"h4"}}),Ze=new f({props:{title:"rocm",local:"rocm",headingTag:"h4"}}),Re=new f({props:{title:"xpu",local:"xpu",headingTag:"h4"}}),We=new f({props:{title:"cpu",local:"cpu",headingTag:"h3"}}),Qe=new f({props:{title:"Torch bindings",local:"torch-bindings",headingTag:"h2"}}),Ae=new f({props:{title:"Defining bindings",local:"defining-bindings",headingTag:"h3"}}),Pe=new y({props:{code:"JTIzcHJhZ21hJTIwb25jZSUwQSUwQSUyM2luY2x1ZGUlMjAlM0N0b3JjaCUyRnRvcmNoLmglM0UlMEElMEF2b2lkJTIwbXlrZXJuZWwodG9yY2glM0ElM0FUZW5zb3IlMjAlMjZvdXQlMkMlMjB0b3JjaCUzQSUzQVRlbnNvciUyMGNvbnN0JTIwJTI2aW5wdXQpJTNC",highlighted:`<span class="hljs-meta">#<span class="hljs-keyword">pragma</span> once</span> | |
| <span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><torch/torch.h></span></span> | |
| <span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">mykernel</span><span class="hljs-params">(torch::Tensor &out, torch::Tensor <span class="hljs-type">const</span> &input)</span></span>;`,lang:"cpp",wrap:!1}}),Fe=new y({props:{code:"JTIzaW5jbHVkZSUyMCUzQ3RvcmNoJTJGbGlicmFyeS5oJTNFJTBBJTBBJTIzaW5jbHVkZSUyMCUyMnJlZ2lzdHJhdGlvbi5oJTIyJTBBJTIzaW5jbHVkZSUyMCUyMnRvcmNoX2JpbmRpbmcuaCUyMiUwQSUwQVRPUkNIX0xJQlJBUllfRVhQQU5EKFRPUkNIX0VYVEVOU0lPTl9OQU1FJTJDJTIwb3BzKSUyMCU3QiUwQSUyMCUyMG9wcy5kZWYoJTIybXlrZXJuZWwoVGVuc29yISUyMG91dCUyQyUyMFRlbnNvciUyMGlucHV0KSUyMC0lM0UlMjAoKSUyMiklM0IlMEElMjNpZiUyMGRlZmluZWQoQ1VEQV9LRVJORUwpJTIwJTdDJTdDJTIwZGVmaW5lZChST0NNX0tFUk5FTCklMEElMjAlMjBvcHMuaW1wbCglMjJteWtlcm5lbCUyMiUyQyUyMHRvcmNoJTNBJTNBa0NVREElMkMlMjAlMjZteWtlcm5lbCklM0IlMEElMjNlbmRpZiUwQSU3RCUwQSUwQVJFR0lTVEVSX0VYVEVOU0lPTihUT1JDSF9FWFRFTlNJT05fTkFNRSk=",highlighted:`<span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><torch/library.h></span></span> | |
| <span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">"registration.h"</span></span> | |
| <span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">"torch_binding.h"</span></span> | |
| <span class="hljs-built_in">TORCH_LIBRARY_EXPAND</span>(TORCH_EXTENSION_NAME, ops) { | |
| ops.<span class="hljs-built_in">def</span>(<span class="hljs-string">"mykernel(Tensor! out, Tensor input) -> ()"</span>); | |
| <span class="hljs-meta">#<span class="hljs-keyword">if</span> defined(CUDA_KERNEL) || defined(ROCM_KERNEL)</span> | |
| ops.<span class="hljs-built_in">impl</span>(<span class="hljs-string">"mykernel"</span>, torch::kCUDA, &mykernel); | |
| <span class="hljs-meta">#<span class="hljs-keyword">endif</span></span> | |
| } | |
| <span class="hljs-built_in">REGISTER_EXTENSION</span>(TORCH_EXTENSION_NAME)`,lang:"cpp",wrap:!1}}),Oe=new f({props:{title:"Using kernel functions from Python",local:"using-kernel-functions-from-python",headingTag:"h2"}}),Ke=new y({props:{code:"ZnJvbSUyMHR5cGluZyUyMGltcG9ydCUyME9wdGlvbmFsJTBBJTBBaW1wb3J0JTIwdG9yY2glMEElMEFmcm9tJTIwLl9vcHMlMjBpbXBvcnQlMjBvcHMlMEElMEElMEFkZWYlMjBteWtlcm5lbCh4JTNBJTIwdG9yY2guVGVuc29yJTJDJTIwb3V0JTNBJTIwT3B0aW9uYWwlNUJ0b3JjaC5UZW5zb3IlNUQlMjAlM0QlMjBOb25lKSUyMC0lM0UlMjB0b3JjaC5UZW5zb3IlM0ElMEElMjAlMjAlMjAlMjBpZiUyMG91dCUyMGlzJTIwTm9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG91dCUyMCUzRCUyMHRvcmNoLmVtcHR5X2xpa2UoeCklMEElMjAlMjAlMjAlMjBvcHMubXlrZXJuZWwob3V0JTJDJTIweCklMEElMjAlMjAlMjAlMjByZXR1cm4lMjBvdXQ=",highlighted:`<span class="hljs-keyword">from</span> typing <span class="hljs-keyword">import</span> <span class="hljs-type">Optional</span> | |
| <span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> ._ops <span class="hljs-keyword">import</span> ops | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">mykernel</span>(<span class="hljs-params">x: torch.Tensor, out: <span class="hljs-type">Optional</span>[torch.Tensor] = <span class="hljs-literal">None</span></span>) -> torch.Tensor: | |
| <span class="hljs-keyword">if</span> out <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>: | |
| out = torch.empty_like(x) | |
| ops.mykernel(out, x) | |
| <span class="hljs-keyword">return</span> out`,lang:"python",wrap:!1}}),et=new f({props:{title:"Registering Torch operators",local:"registering-torch-operators",headingTag:"h2"}}),nt=new y({props:{code:"JTQwdG9yY2gubGlicmFyeS5yZWdpc3Rlcl9mYWtlKCUyMnJlbHUlM0ElM0FyZWx1X2Z3ZCUyMiklMEFkZWYlMjByZWx1X2Z3ZF9mYWtlKGlucHV0JTNBJTIwdG9yY2guVGVuc29yKSUyMC0lM0UlMjB0b3JjaC5UZW5zb3IlM0ElMEElMjAlMjAlMjAlMjByZXR1cm4lMjB0b3JjaC5lbXB0eV9saWtlKGlucHV0KQ==",highlighted:`<span class="hljs-meta">@torch.library.register_fake(<span class="hljs-params"><span class="hljs-string">"relu::relu_fwd"</span></span>)</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">relu_fwd_fake</span>(<span class="hljs-params"><span class="hljs-built_in">input</span>: torch.Tensor</span>) -> torch.Tensor: | |
| <span class="hljs-keyword">return</span> torch.empty_like(<span class="hljs-built_in">input</span>)`,lang:"python",wrap:!1}}),st=new y({props:{code:"ZnJvbSUyMC5fb3BzJTIwaW1wb3J0JTIwYWRkX29wX25hbWVzcGFjZV9wcmVmaXglMEElMEElNDB0b3JjaC5saWJyYXJ5LnJlZ2lzdGVyX2Zha2UoYWRkX29wX25hbWVzcGFjZV9wcmVmaXgoJTIycmVsdV9md2QlMjIpKSUwQWRlZiUyMHJlbHVfZndkX2Zha2UoaW5wdXQlM0ElMjB0b3JjaC5UZW5zb3IpJTIwLSUzRSUyMHRvcmNoLlRlbnNvciUzQSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMHRvcmNoLmVtcHR5X2xpa2UoaW5wdXQp",highlighted:`<span class="hljs-keyword">from</span> ._ops <span class="hljs-keyword">import</span> add_op_namespace_prefix | |
| <span class="hljs-meta">@torch.library.register_fake(<span class="hljs-params">add_op_namespace_prefix(<span class="hljs-params"><span class="hljs-string">"relu_fwd"</span></span>)</span>)</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">relu_fwd_fake</span>(<span class="hljs-params"><span class="hljs-built_in">input</span>: torch.Tensor</span>) -> torch.Tensor: | |
| <span class="hljs-keyword">return</span> torch.empty_like(<span class="hljs-built_in">input</span>)`,lang:"python",wrap:!1}}),rt=new y({props:{code:"JTQwc29tZV9pbmRpcmVjdGlvbl9mb3JfcmVnaXN0ZXJfZmFrZSglMjJyZWx1JTNBJTNBcmVsdV9md2QlMjIpJTBBZGVmJTIwcmVsdV9md2RfZmFrZShpbnB1dCUzQSUyMHRvcmNoLlRlbnNvciklMjAtJTNFJTIwdG9yY2guVGVuc29yJTNBJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwdG9yY2guZW1wdHlfbGlrZShpbnB1dCk=",highlighted:`<span class="hljs-meta">@some_indirection_for_register_fake(<span class="hljs-params"><span class="hljs-string">"relu::relu_fwd"</span></span>)</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">relu_fwd_fake</span>(<span class="hljs-params"><span class="hljs-built_in">input</span>: torch.Tensor</span>) -> torch.Tensor: | |
| <span class="hljs-keyword">return</span> torch.empty_like(<span class="hljs-built_in">input</span>)`,lang:"python",wrap:!1}}),pt=new f({props:{title:"Kernel tests",local:"kernel-tests",headingTag:"h2"}}),dt=new y({props:{code:"aW1wb3J0JTIwcHl0ZXN0JTBBJTBBJTQwcHl0ZXN0Lm1hcmsua2VybmVsc19jaSUwQWRlZiUyMHRlc3RfbXlrZXJuZWwoKSUzQSUwQSUyMCUyMC4uLg==",highlighted:`<span class="hljs-keyword">import</span> pytest | |
| <span class="hljs-meta">@pytest.mark.kernels_ci</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">test_mykernel</span>(): | |
| ...`,lang:"python",wrap:!1}}),ht=new y({props:{code:"JTI0JTIwbml4JTIwcnVuJTIwLiUyM2NpLXRlc3Q=",highlighted:'$ nix run .<span class="hljs-comment">#ci-test</span>',lang:"bash",wrap:!1}}),Tt=new y({props:{code:"JTI0JTIwbml4JTIwcnVuJTIwLiUyM2NpVGVzdHMudG9yY2gyMTAtY3h4MTEtY3B1LXg4Nl82NC1saW51eA==",highlighted:'$ nix run .<span class="hljs-comment">#ciTests.torch210-cxx11-cpu-x86_64-linux</span>',lang:"bash",wrap:!1}}),bt=new f({props:{title:"Kernel docs",local:"kernel-docs",headingTag:"h2"}}),$t=new bs({props:{source:"https://github.com/huggingface/kernels/blob/main/docs/source/builder/writing-kernels.md"}}),{c(){g=a("meta"),Lt=i(),It=a("p"),Vt=i(),p(U.$$.fragment),Zt=i(),p(J.$$.fragment),Bt=i(),p(v.$$.fragment),Rt=i(),C=a("p"),C.innerHTML=Fn,Nt=i(),j=a("ul"),j.innerHTML=Yn,Wt=i(),x=a("p"),x.innerHTML=On,Et=i(),H=a("ul"),H.innerHTML=zn,Qt=i(),I=a("p"),I.innerHTML=Dn,At=i(),_=a("p"),_.innerHTML=Kn,qt=i(),$=a("blockquote"),$.innerHTML=ei,Gt=i(),p(L.$$.fragment),St=i(),p(V.$$.fragment),Pt=i(),Z=a("p"),Z.innerHTML=ti,Xt=i(),p(B.$$.fragment),Ft=i(),R=a("p"),R.textContent=li,Yt=i(),N=a("ol"),N.innerHTML=ni,Ot=i(),W=a("p"),W.innerHTML=ii,zt=i(),p(E.$$.fragment),Dt=i(),Q=a("p"),Q.innerHTML=si,Kt=i(),p(A.$$.fragment),el=i(),q=a("p"),q.innerHTML=ai,tl=i(),G=a("p"),G.textContent=oi,ll=i(),p(S.$$.fragment),nl=i(),P=a("p"),P.innerHTML=ri,il=i(),p(X.$$.fragment),sl=i(),F=a("p"),F.innerHTML=pi,al=i(),Y=a("p"),Y.innerHTML=ci,ol=i(),p(O.$$.fragment),rl=i(),z=a("p"),z.innerHTML=di,pl=i(),p(D.$$.fragment),cl=i(),K=a("p"),K.innerHTML=mi,dl=i(),p(ee.$$.fragment),ml=i(),te=a("p"),te.textContent=ui,ul=i(),p(le.$$.fragment),hl=i(),ne=a("p"),ne.textContent=hi,fl=i(),ie=a("ul"),ie.innerHTML=fi,Tl=i(),p(se.$$.fragment),yl=i(),ae=a("p"),ae.innerHTML=Ti,bl=i(),p(oe.$$.fragment),Ml=i(),re=a("p"),re.innerHTML=yi,kl=i(),p(pe.$$.fragment),gl=i(),ce=a("ul"),ce.innerHTML=bi,$l=i(),p(de.$$.fragment),wl=i(),me=a("ul"),me.innerHTML=Mi,Ul=i(),p(ue.$$.fragment),Jl=i(),he=a("ul"),he.innerHTML=ki,vl=i(),p(fe.$$.fragment),Cl=i(),Te=a("p"),Te.textContent=gi,jl=i(),ye=a("ul"),ye.innerHTML=$i,xl=i(),p(be.$$.fragment),Hl=i(),Me=a("p"),Me.textContent=wi,Il=i(),b=a("ul"),wt=a("li"),wt.innerHTML=Ui,Nn=i(),Ut=a("li"),Ut.innerHTML=Ji,Wn=i(),Jt=a("li"),Jt.innerHTML=vi,En=i(),vt=a("li"),vt.innerHTML=Ci,Qn=i(),Ct=a("li"),Ct.innerHTML=ji,An=i(),k=a("li"),jt=a("p"),jt.innerHTML=xi,qn=i(),xt=a("p"),xt.textContent=Hi,Gn=i(),p(ke.$$.fragment),Sn=i(),Ht=a("p"),Ht.innerHTML=Ii,_l=i(),p(ge.$$.fragment),Ll=i(),$e=a("p"),$e.textContent=_i,Vl=i(),we=a("ul"),we.innerHTML=Li,Zl=i(),p(Ue.$$.fragment),Bl=i(),Je=a("p"),Je.innerHTML=Vi,Rl=i(),ve=a("p"),ve.innerHTML=Zi,Nl=i(),Ce=a("ul"),Ce.innerHTML=Bi,Wl=i(),p(je.$$.fragment),El=i(),xe=a("p"),xe.innerHTML=Ri,Ql=i(),He=a("p"),He.textContent=Ni,Al=i(),Ie=a("ul"),Ie.innerHTML=Wi,ql=i(),_e=a("p"),_e.textContent=Ei,Gl=i(),p(Le.$$.fragment),Sl=i(),Ve=a("ul"),Ve.innerHTML=Qi,Pl=i(),p(Ze.$$.fragment),Xl=i(),Be=a("ul"),Be.innerHTML=Ai,Fl=i(),p(Re.$$.fragment),Yl=i(),Ne=a("ul"),Ne.innerHTML=qi,Ol=i(),p(We.$$.fragment),zl=i(),Ee=a("ul"),Ee.innerHTML=Gi,Dl=i(),p(Qe.$$.fragment),Kl=i(),p(Ae.$$.fragment),en=i(),qe=a("p"),qe.textContent=Si,tn=i(),Ge=a("ul"),Ge.innerHTML=Pi,ln=i(),Se=a("p"),Se.innerHTML=Xi,nn=i(),p(Pe.$$.fragment),sn=i(),Xe=a("p"),Xe.innerHTML=Fi,an=i(),p(Fe.$$.fragment),on=i(),Ye=a("p"),Ye.innerHTML=Yi,rn=i(),p(Oe.$$.fragment),pn=i(),ze=a("p"),ze.innerHTML=Oi,cn=i(),De=a("p"),De.innerHTML=zi,dn=i(),p(Ke.$$.fragment),mn=i(),p(et.$$.fragment),un=i(),tt=a("p"),tt.innerHTML=Di,hn=i(),lt=a("p"),lt.innerHTML=Ki,fn=i(),p(nt.$$.fragment),Tn=i(),it=a("p"),it.textContent=es,yn=i(),p(st.$$.fragment),bn=i(),at=a("p"),at.innerHTML=ts,Mn=i(),ot=a("p"),ot.innerHTML=ls,kn=i(),p(rt.$$.fragment),gn=i(),p(pt.$$.fragment),$n=i(),ct=a("p"),ct.innerHTML=ns,wn=i(),p(dt.$$.fragment),Un=i(),mt=a("p"),mt.textContent=is,Jn=i(),ut=a("p"),ut.textContent=ss,vn=i(),p(ht.$$.fragment),Cn=i(),ft=a("p"),ft.innerHTML=as,jn=i(),p(Tt.$$.fragment),xn=i(),yt=a("p"),yt.innerHTML=os,Hn=i(),p(bt.$$.fragment),In=i(),Mt=a("p"),Mt.innerHTML=rs,_n=i(),kt=a("p"),kt.innerHTML=ps,Ln=i(),gt=a("p"),gt.innerHTML=cs,Vn=i(),p($t.$$.fragment),Zn=i(),_t=a("p"),this.h()},l(e){const t=Ts("svelte-u9bgzb",document.head);g=o(t,"META",{name:!0,content:!0}),t.forEach(l),Lt=s(e),It=o(e,"P",{}),Rn(It).forEach(l),Vt=s(e),c(U.$$.fragment,e),Zt=s(e),c(J.$$.fragment,e),Bt=s(e),c(v.$$.fragment,e),Rt=s(e),C=o(e,"P",{"data-svelte-h":!0}),r(C)!=="svelte-1i1c9ni"&&(C.innerHTML=Fn),Nt=s(e),j=o(e,"UL",{"data-svelte-h":!0}),r(j)!=="svelte-1odnsz3"&&(j.innerHTML=Yn),Wt=s(e),x=o(e,"P",{"data-svelte-h":!0}),r(x)!=="svelte-1gp9ycj"&&(x.innerHTML=On),Et=s(e),H=o(e,"UL",{"data-svelte-h":!0}),r(H)!=="svelte-ysrhph"&&(H.innerHTML=zn),Qt=s(e),I=o(e,"P",{"data-svelte-h":!0}),r(I)!=="svelte-vy7wcb"&&(I.innerHTML=Dn),At=s(e),_=o(e,"P",{"data-svelte-h":!0}),r(_)!=="svelte-o9ssdv"&&(_.innerHTML=Kn),qt=s(e),$=o(e,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),r($)!=="svelte-43d87d"&&($.innerHTML=ei),Gt=s(e),c(L.$$.fragment,e),St=s(e),c(V.$$.fragment,e),Pt=s(e),Z=o(e,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-96m8sj"&&(Z.innerHTML=ti),Xt=s(e),c(B.$$.fragment,e),Ft=s(e),R=o(e,"P",{"data-svelte-h":!0}),r(R)!=="svelte-1b4vj4e"&&(R.textContent=li),Yt=s(e),N=o(e,"OL",{"data-svelte-h":!0}),r(N)!=="svelte-3arzgs"&&(N.innerHTML=ni),Ot=s(e),W=o(e,"P",{"data-svelte-h":!0}),r(W)!=="svelte-1ihjqjm"&&(W.innerHTML=ii),zt=s(e),c(E.$$.fragment,e),Dt=s(e),Q=o(e,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-1cac215"&&(Q.innerHTML=si),Kt=s(e),c(A.$$.fragment,e),el=s(e),q=o(e,"P",{"data-svelte-h":!0}),r(q)!=="svelte-4lye9k"&&(q.innerHTML=ai),tl=s(e),G=o(e,"P",{"data-svelte-h":!0}),r(G)!=="svelte-g5i707"&&(G.textContent=oi),ll=s(e),c(S.$$.fragment,e),nl=s(e),P=o(e,"P",{"data-svelte-h":!0}),r(P)!=="svelte-cn9mkc"&&(P.innerHTML=ri),il=s(e),c(X.$$.fragment,e),sl=s(e),F=o(e,"P",{"data-svelte-h":!0}),r(F)!=="svelte-1prqyz3"&&(F.innerHTML=pi),al=s(e),Y=o(e,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-1exh4w8"&&(Y.innerHTML=ci),ol=s(e),c(O.$$.fragment,e),rl=s(e),z=o(e,"P",{"data-svelte-h":!0}),r(z)!=="svelte-1poutmy"&&(z.innerHTML=di),pl=s(e),c(D.$$.fragment,e),cl=s(e),K=o(e,"P",{"data-svelte-h":!0}),r(K)!=="svelte-s84xza"&&(K.innerHTML=mi),dl=s(e),c(ee.$$.fragment,e),ml=s(e),te=o(e,"P",{"data-svelte-h":!0}),r(te)!=="svelte-6oo725"&&(te.textContent=ui),ul=s(e),c(le.$$.fragment,e),hl=s(e),ne=o(e,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1lqdx4"&&(ne.textContent=hi),fl=s(e),ie=o(e,"UL",{"data-svelte-h":!0}),r(ie)!=="svelte-c8vtob"&&(ie.innerHTML=fi),Tl=s(e),c(se.$$.fragment,e),yl=s(e),ae=o(e,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-1hgp1cr"&&(ae.innerHTML=Ti),bl=s(e),c(oe.$$.fragment,e),Ml=s(e),re=o(e,"P",{"data-svelte-h":!0}),r(re)!=="svelte-pgruc9"&&(re.innerHTML=yi),kl=s(e),c(pe.$$.fragment,e),gl=s(e),ce=o(e,"UL",{"data-svelte-h":!0}),r(ce)!=="svelte-gz30jb"&&(ce.innerHTML=bi),$l=s(e),c(de.$$.fragment,e),wl=s(e),me=o(e,"UL",{"data-svelte-h":!0}),r(me)!=="svelte-12rq95i"&&(me.innerHTML=Mi),Ul=s(e),c(ue.$$.fragment,e),Jl=s(e),he=o(e,"UL",{"data-svelte-h":!0}),r(he)!=="svelte-1fzn2"&&(he.innerHTML=ki),vl=s(e),c(fe.$$.fragment,e),Cl=s(e),Te=o(e,"P",{"data-svelte-h":!0}),r(Te)!=="svelte-gxdqgh"&&(Te.textContent=gi),jl=s(e),ye=o(e,"UL",{"data-svelte-h":!0}),r(ye)!=="svelte-124jabx"&&(ye.innerHTML=$i),xl=s(e),c(be.$$.fragment,e),Hl=s(e),Me=o(e,"P",{"data-svelte-h":!0}),r(Me)!=="svelte-kgzfey"&&(Me.textContent=wi),Il=s(e),b=o(e,"UL",{});var M=Rn(b);wt=o(M,"LI",{"data-svelte-h":!0}),r(wt)!=="svelte-u4hke3"&&(wt.innerHTML=Ui),Nn=s(M),Ut=o(M,"LI",{"data-svelte-h":!0}),r(Ut)!=="svelte-zt3xci"&&(Ut.innerHTML=Ji),Wn=s(M),Jt=o(M,"LI",{"data-svelte-h":!0}),r(Jt)!=="svelte-wnkhvl"&&(Jt.innerHTML=vi),En=s(M),vt=o(M,"LI",{"data-svelte-h":!0}),r(vt)!=="svelte-17lju3r"&&(vt.innerHTML=Ci),Qn=s(M),Ct=o(M,"LI",{"data-svelte-h":!0}),r(Ct)!=="svelte-1r69pen"&&(Ct.innerHTML=ji),An=s(M),k=o(M,"LI",{});var w=Rn(k);jt=o(w,"P",{"data-svelte-h":!0}),r(jt)!=="svelte-120bx7y"&&(jt.innerHTML=xi),qn=s(w),xt=o(w,"P",{"data-svelte-h":!0}),r(xt)!=="svelte-1tr2sth"&&(xt.textContent=Hi),Gn=s(w),c(ke.$$.fragment,w),Sn=s(w),Ht=o(w,"P",{"data-svelte-h":!0}),r(Ht)!=="svelte-1scpe2z"&&(Ht.innerHTML=Ii),w.forEach(l),M.forEach(l),_l=s(e),c(ge.$$.fragment,e),Ll=s(e),$e=o(e,"P",{"data-svelte-h":!0}),r($e)!=="svelte-o8lm5s"&&($e.textContent=_i),Vl=s(e),we=o(e,"UL",{"data-svelte-h":!0}),r(we)!=="svelte-1xjqtde"&&(we.innerHTML=Li),Zl=s(e),c(Ue.$$.fragment,e),Bl=s(e),Je=o(e,"P",{"data-svelte-h":!0}),r(Je)!=="svelte-zn9bnz"&&(Je.innerHTML=Vi),Rl=s(e),ve=o(e,"P",{"data-svelte-h":!0}),r(ve)!=="svelte-1fs9ps3"&&(ve.innerHTML=Zi),Nl=s(e),Ce=o(e,"UL",{"data-svelte-h":!0}),r(Ce)!=="svelte-1oz6tus"&&(Ce.innerHTML=Bi),Wl=s(e),c(je.$$.fragment,e),El=s(e),xe=o(e,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-1weg0gu"&&(xe.innerHTML=Ri),Ql=s(e),He=o(e,"P",{"data-svelte-h":!0}),r(He)!=="svelte-1al5myg"&&(He.textContent=Ni),Al=s(e),Ie=o(e,"UL",{"data-svelte-h":!0}),r(Ie)!=="svelte-1fbzu1m"&&(Ie.innerHTML=Wi),ql=s(e),_e=o(e,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-1mf578x"&&(_e.textContent=Ei),Gl=s(e),c(Le.$$.fragment,e),Sl=s(e),Ve=o(e,"UL",{"data-svelte-h":!0}),r(Ve)!=="svelte-3vtlb2"&&(Ve.innerHTML=Qi),Pl=s(e),c(Ze.$$.fragment,e),Xl=s(e),Be=o(e,"UL",{"data-svelte-h":!0}),r(Be)!=="svelte-mx7mxt"&&(Be.innerHTML=Ai),Fl=s(e),c(Re.$$.fragment,e),Yl=s(e),Ne=o(e,"UL",{"data-svelte-h":!0}),r(Ne)!=="svelte-1u3m3l7"&&(Ne.innerHTML=qi),Ol=s(e),c(We.$$.fragment,e),zl=s(e),Ee=o(e,"UL",{"data-svelte-h":!0}),r(Ee)!=="svelte-10okur"&&(Ee.innerHTML=Gi),Dl=s(e),c(Qe.$$.fragment,e),Kl=s(e),c(Ae.$$.fragment,e),en=s(e),qe=o(e,"P",{"data-svelte-h":!0}),r(qe)!=="svelte-r7rot5"&&(qe.textContent=Si),tn=s(e),Ge=o(e,"UL",{"data-svelte-h":!0}),r(Ge)!=="svelte-poxr41"&&(Ge.innerHTML=Pi),ln=s(e),Se=o(e,"P",{"data-svelte-h":!0}),r(Se)!=="svelte-1ikzb58"&&(Se.innerHTML=Xi),nn=s(e),c(Pe.$$.fragment,e),sn=s(e),Xe=o(e,"P",{"data-svelte-h":!0}),r(Xe)!=="svelte-5ja9lk"&&(Xe.innerHTML=Fi),an=s(e),c(Fe.$$.fragment,e),on=s(e),Ye=o(e,"P",{"data-svelte-h":!0}),r(Ye)!=="svelte-ssih46"&&(Ye.innerHTML=Yi),rn=s(e),c(Oe.$$.fragment,e),pn=s(e),ze=o(e,"P",{"data-svelte-h":!0}),r(ze)!=="svelte-1y8rjsx"&&(ze.innerHTML=Oi),cn=s(e),De=o(e,"P",{"data-svelte-h":!0}),r(De)!=="svelte-a3yu8e"&&(De.innerHTML=zi),dn=s(e),c(Ke.$$.fragment,e),mn=s(e),c(et.$$.fragment,e),un=s(e),tt=o(e,"P",{"data-svelte-h":!0}),r(tt)!=="svelte-xosw3t"&&(tt.innerHTML=Di),hn=s(e),lt=o(e,"P",{"data-svelte-h":!0}),r(lt)!=="svelte-a5yx0v"&&(lt.innerHTML=Ki),fn=s(e),c(nt.$$.fragment,e),Tn=s(e),it=o(e,"P",{"data-svelte-h":!0}),r(it)!=="svelte-9b7ddb"&&(it.textContent=es),yn=s(e),c(st.$$.fragment,e),bn=s(e),at=o(e,"P",{"data-svelte-h":!0}),r(at)!=="svelte-4caz4s"&&(at.innerHTML=ts),Mn=s(e),ot=o(e,"P",{"data-svelte-h":!0}),r(ot)!=="svelte-hkktty"&&(ot.innerHTML=ls),kn=s(e),c(rt.$$.fragment,e),gn=s(e),c(pt.$$.fragment,e),$n=s(e),ct=o(e,"P",{"data-svelte-h":!0}),r(ct)!=="svelte-q979am"&&(ct.innerHTML=ns),wn=s(e),c(dt.$$.fragment,e),Un=s(e),mt=o(e,"P",{"data-svelte-h":!0}),r(mt)!=="svelte-1uzdod8"&&(mt.textContent=is),Jn=s(e),ut=o(e,"P",{"data-svelte-h":!0}),r(ut)!=="svelte-s01sgi"&&(ut.textContent=ss),vn=s(e),c(ht.$$.fragment,e),Cn=s(e),ft=o(e,"P",{"data-svelte-h":!0}),r(ft)!=="svelte-1ucbtrx"&&(ft.innerHTML=as),jn=s(e),c(Tt.$$.fragment,e),xn=s(e),yt=o(e,"P",{"data-svelte-h":!0}),r(yt)!=="svelte-gcopz4"&&(yt.innerHTML=os),Hn=s(e),c(bt.$$.fragment,e),In=s(e),Mt=o(e,"P",{"data-svelte-h":!0}),r(Mt)!=="svelte-11q3n4g"&&(Mt.innerHTML=rs),_n=s(e),kt=o(e,"P",{"data-svelte-h":!0}),r(kt)!=="svelte-zjr5ot"&&(kt.innerHTML=ps),Ln=s(e),gt=o(e,"P",{"data-svelte-h":!0}),r(gt)!=="svelte-rt0n0n"&&(gt.innerHTML=cs),Vn=s(e),c($t.$$.fragment,e),Zn=s(e),_t=o(e,"P",{}),Rn(_t).forEach(l),this.h()},h(){Pn(g,"name","hf:doc:metadata"),Pn(g,"content",ks),Pn($,"class","tip")},m(e,t){T(document.head,g),n(e,Lt,t),n(e,It,t),n(e,Vt,t),d(U,e,t),n(e,Zt,t),d(J,e,t),n(e,Bt,t),d(v,e,t),n(e,Rt,t),n(e,C,t),n(e,Nt,t),n(e,j,t),n(e,Wt,t),n(e,x,t),n(e,Et,t),n(e,H,t),n(e,Qt,t),n(e,I,t),n(e,At,t),n(e,_,t),n(e,qt,t),n(e,$,t),n(e,Gt,t),d(L,e,t),n(e,St,t),d(V,e,t),n(e,Pt,t),n(e,Z,t),n(e,Xt,t),d(B,e,t),n(e,Ft,t),n(e,R,t),n(e,Yt,t),n(e,N,t),n(e,Ot,t),n(e,W,t),n(e,zt,t),d(E,e,t),n(e,Dt,t),n(e,Q,t),n(e,Kt,t),d(A,e,t),n(e,el,t),n(e,q,t),n(e,tl,t),n(e,G,t),n(e,ll,t),d(S,e,t),n(e,nl,t),n(e,P,t),n(e,il,t),d(X,e,t),n(e,sl,t),n(e,F,t),n(e,al,t),n(e,Y,t),n(e,ol,t),d(O,e,t),n(e,rl,t),n(e,z,t),n(e,pl,t),d(D,e,t),n(e,cl,t),n(e,K,t),n(e,dl,t),d(ee,e,t),n(e,ml,t),n(e,te,t),n(e,ul,t),d(le,e,t),n(e,hl,t),n(e,ne,t),n(e,fl,t),n(e,ie,t),n(e,Tl,t),d(se,e,t),n(e,yl,t),n(e,ae,t),n(e,bl,t),d(oe,e,t),n(e,Ml,t),n(e,re,t),n(e,kl,t),d(pe,e,t),n(e,gl,t),n(e,ce,t),n(e,$l,t),d(de,e,t),n(e,wl,t),n(e,me,t),n(e,Ul,t),d(ue,e,t),n(e,Jl,t),n(e,he,t),n(e,vl,t),d(fe,e,t),n(e,Cl,t),n(e,Te,t),n(e,jl,t),n(e,ye,t),n(e,xl,t),d(be,e,t),n(e,Hl,t),n(e,Me,t),n(e,Il,t),n(e,b,t),T(b,wt),T(b,Nn),T(b,Ut),T(b,Wn),T(b,Jt),T(b,En),T(b,vt),T(b,Qn),T(b,Ct),T(b,An),T(b,k),T(k,jt),T(k,qn),T(k,xt),T(k,Gn),d(ke,k,null),T(k,Sn),T(k,Ht),n(e,_l,t),d(ge,e,t),n(e,Ll,t),n(e,$e,t),n(e,Vl,t),n(e,we,t),n(e,Zl,t),d(Ue,e,t),n(e,Bl,t),n(e,Je,t),n(e,Rl,t),n(e,ve,t),n(e,Nl,t),n(e,Ce,t),n(e,Wl,t),d(je,e,t),n(e,El,t),n(e,xe,t),n(e,Ql,t),n(e,He,t),n(e,Al,t),n(e,Ie,t),n(e,ql,t),n(e,_e,t),n(e,Gl,t),d(Le,e,t),n(e,Sl,t),n(e,Ve,t),n(e,Pl,t),d(Ze,e,t),n(e,Xl,t),n(e,Be,t),n(e,Fl,t),d(Re,e,t),n(e,Yl,t),n(e,Ne,t),n(e,Ol,t),d(We,e,t),n(e,zl,t),n(e,Ee,t),n(e,Dl,t),d(Qe,e,t),n(e,Kl,t),d(Ae,e,t),n(e,en,t),n(e,qe,t),n(e,tn,t),n(e,Ge,t),n(e,ln,t),n(e,Se,t),n(e,nn,t),d(Pe,e,t),n(e,sn,t),n(e,Xe,t),n(e,an,t),d(Fe,e,t),n(e,on,t),n(e,Ye,t),n(e,rn,t),d(Oe,e,t),n(e,pn,t),n(e,ze,t),n(e,cn,t),n(e,De,t),n(e,dn,t),d(Ke,e,t),n(e,mn,t),d(et,e,t),n(e,un,t),n(e,tt,t),n(e,hn,t),n(e,lt,t),n(e,fn,t),d(nt,e,t),n(e,Tn,t),n(e,it,t),n(e,yn,t),d(st,e,t),n(e,bn,t),n(e,at,t),n(e,Mn,t),n(e,ot,t),n(e,kn,t),d(rt,e,t),n(e,gn,t),d(pt,e,t),n(e,$n,t),n(e,ct,t),n(e,wn,t),d(dt,e,t),n(e,Un,t),n(e,mt,t),n(e,Jn,t),n(e,ut,t),n(e,vn,t),d(ht,e,t),n(e,Cn,t),n(e,ft,t),n(e,jn,t),d(Tt,e,t),n(e,xn,t),n(e,yt,t),n(e,Hn,t),d(bt,e,t),n(e,In,t),n(e,Mt,t),n(e,_n,t),n(e,kt,t),n(e,Ln,t),n(e,gt,t),n(e,Vn,t),d($t,e,t),n(e,Zn,t),n(e,_t,t),Bn=!0},p:ms,i(e){Bn||(m(U.$$.fragment,e),m(J.$$.fragment,e),m(v.$$.fragment,e),m(L.$$.fragment,e),m(V.$$.fragment,e),m(B.$$.fragment,e),m(E.$$.fragment,e),m(A.$$.fragment,e),m(S.$$.fragment,e),m(X.$$.fragment,e),m(O.$$.fragment,e),m(D.$$.fragment,e),m(ee.$$.fragment,e),m(le.$$.fragment,e),m(se.$$.fragment,e),m(oe.$$.fragment,e),m(pe.$$.fragment,e),m(de.$$.fragment,e),m(ue.$$.fragment,e),m(fe.$$.fragment,e),m(be.$$.fragment,e),m(ke.$$.fragment,e),m(ge.$$.fragment,e),m(Ue.$$.fragment,e),m(je.$$.fragment,e),m(Le.$$.fragment,e),m(Ze.$$.fragment,e),m(Re.$$.fragment,e),m(We.$$.fragment,e),m(Qe.$$.fragment,e),m(Ae.$$.fragment,e),m(Pe.$$.fragment,e),m(Fe.$$.fragment,e),m(Oe.$$.fragment,e),m(Ke.$$.fragment,e),m(et.$$.fragment,e),m(nt.$$.fragment,e),m(st.$$.fragment,e),m(rt.$$.fragment,e),m(pt.$$.fragment,e),m(dt.$$.fragment,e),m(ht.$$.fragment,e),m(Tt.$$.fragment,e),m(bt.$$.fragment,e),m($t.$$.fragment,e),Bn=!0)},o(e){u(U.$$.fragment,e),u(J.$$.fragment,e),u(v.$$.fragment,e),u(L.$$.fragment,e),u(V.$$.fragment,e),u(B.$$.fragment,e),u(E.$$.fragment,e),u(A.$$.fragment,e),u(S.$$.fragment,e),u(X.$$.fragment,e),u(O.$$.fragment,e),u(D.$$.fragment,e),u(ee.$$.fragment,e),u(le.$$.fragment,e),u(se.$$.fragment,e),u(oe.$$.fragment,e),u(pe.$$.fragment,e),u(de.$$.fragment,e),u(ue.$$.fragment,e),u(fe.$$.fragment,e),u(be.$$.fragment,e),u(ke.$$.fragment,e),u(ge.$$.fragment,e),u(Ue.$$.fragment,e),u(je.$$.fragment,e),u(Le.$$.fragment,e),u(Ze.$$.fragment,e),u(Re.$$.fragment,e),u(We.$$.fragment,e),u(Qe.$$.fragment,e),u(Ae.$$.fragment,e),u(Pe.$$.fragment,e),u(Fe.$$.fragment,e),u(Oe.$$.fragment,e),u(Ke.$$.fragment,e),u(et.$$.fragment,e),u(nt.$$.fragment,e),u(st.$$.fragment,e),u(rt.$$.fragment,e),u(pt.$$.fragment,e),u(dt.$$.fragment,e),u(ht.$$.fragment,e),u(Tt.$$.fragment,e),u(bt.$$.fragment,e),u($t.$$.fragment,e),Bn=!1},d(e){e&&(l(Lt),l(It),l(Vt),l(Zt),l(Bt),l(Rt),l(C),l(Nt),l(j),l(Wt),l(x),l(Et),l(H),l(Qt),l(I),l(At),l(_),l(qt),l($),l(Gt),l(St),l(Pt),l(Z),l(Xt),l(Ft),l(R),l(Yt),l(N),l(Ot),l(W),l(zt),l(Dt),l(Q),l(Kt),l(el),l(q),l(tl),l(G),l(ll),l(nl),l(P),l(il),l(sl),l(F),l(al),l(Y),l(ol),l(rl),l(z),l(pl),l(cl),l(K),l(dl),l(ml),l(te),l(ul),l(hl),l(ne),l(fl),l(ie),l(Tl),l(yl),l(ae),l(bl),l(Ml),l(re),l(kl),l(gl),l(ce),l($l),l(wl),l(me),l(Ul),l(Jl),l(he),l(vl),l(Cl),l(Te),l(jl),l(ye),l(xl),l(Hl),l(Me),l(Il),l(b),l(_l),l(Ll),l($e),l(Vl),l(we),l(Zl),l(Bl),l(Je),l(Rl),l(ve),l(Nl),l(Ce),l(Wl),l(El),l(xe),l(Ql),l(He),l(Al),l(Ie),l(ql),l(_e),l(Gl),l(Sl),l(Ve),l(Pl),l(Xl),l(Be),l(Fl),l(Yl),l(Ne),l(Ol),l(zl),l(Ee),l(Dl),l(Kl),l(en),l(qe),l(tn),l(Ge),l(ln),l(Se),l(nn),l(sn),l(Xe),l(an),l(on),l(Ye),l(rn),l(pn),l(ze),l(cn),l(De),l(dn),l(mn),l(un),l(tt),l(hn),l(lt),l(fn),l(Tn),l(it),l(yn),l(bn),l(at),l(Mn),l(ot),l(kn),l(gn),l($n),l(ct),l(wn),l(Un),l(mt),l(Jn),l(ut),l(vn),l(Cn),l(ft),l(jn),l(xn),l(yt),l(Hn),l(In),l(Mt),l(_n),l(kt),l(Ln),l(gt),l(Vn),l(Zn),l(_t)),l(g),h(U,e),h(J,e),h(v,e),h(L,e),h(V,e),h(B,e),h(E,e),h(A,e),h(S,e),h(X,e),h(O,e),h(D,e),h(ee,e),h(le,e),h(se,e),h(oe,e),h(pe,e),h(de,e),h(ue,e),h(fe,e),h(be,e),h(ke),h(ge,e),h(Ue,e),h(je,e),h(Le,e),h(Ze,e),h(Re,e),h(We,e),h(Qe,e),h(Ae,e),h(Pe,e),h(Fe,e),h(Oe,e),h(Ke,e),h(et,e),h(nt,e),h(st,e),h(rt,e),h(pt,e),h(dt,e),h(ht,e),h(Tt,e),h(bt,e),h($t,e)}}}const ks='{"title":"Write kernels","local":"write-kernels","sections":[{"title":"Introduction","local":"introduction","sections":[],"depth":2},{"title":"Setting up environment","local":"setting-up-environment","sections":[{"title":"Quick install","local":"quick-install","sections":[],"depth":3},{"title":"Cloud environment","local":"cloud-environment","sections":[],"depth":3}],"depth":2},{"title":"Starting a new kernel","local":"starting-a-new-kernel","sections":[],"depth":2},{"title":"Kernel project layout","local":"kernel-project-layout","sections":[],"depth":2},{"title":"build.toml","local":"buildtoml","sections":[{"title":"general","local":"general","sections":[],"depth":3},{"title":"general.hub","local":"generalhub","sections":[],"depth":3},{"title":"general.cuda","local":"generalcuda","sections":[],"depth":3},{"title":"Framework sections","local":"framework-sections","sections":[],"depth":3},{"title":"torch","local":"torch","sections":[],"depth":3},{"title":"tvm-ffi","local":"tvm-ffi","sections":[],"depth":3},{"title":"torch-noarch","local":"torch-noarch","sections":[],"depth":3},{"title":"kernel.<name>","local":"kernelltnamegt","sections":[{"title":"cuda","local":"cuda","sections":[],"depth":4},{"title":"rocm","local":"rocm","sections":[],"depth":4},{"title":"xpu","local":"xpu","sections":[],"depth":4}],"depth":3},{"title":"cpu","local":"cpu","sections":[],"depth":3}],"depth":2},{"title":"Torch bindings","local":"torch-bindings","sections":[{"title":"Defining bindings","local":"defining-bindings","sections":[],"depth":3}],"depth":2},{"title":"Using kernel functions from Python","local":"using-kernel-functions-from-python","sections":[],"depth":2},{"title":"Registering Torch operators","local":"registering-torch-operators","sections":[],"depth":2},{"title":"Kernel tests","local":"kernel-tests","sections":[],"depth":2},{"title":"Kernel docs","local":"kernel-docs","sections":[],"depth":2}],"depth":1}';function gs(Xn){return us(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class vs extends hs{constructor(g){super(),fs(this,g,gs,Ms,ds,{})}}export{vs as component}; | |
Xet Storage Details
- Size:
- 52.8 kB
- Xet hash:
- db6b4c1cf91224444c0c65d3d7d9031603dd9ae559411db4b05ebb3245c6d344
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.