Buckets:
| import{s as Ys,n as zs,o as Os}from"../chunks/scheduler.f3b1e791.js";import{S as Ds,i as Ks,e as a,s,c as p,h as ei,a as o,d as l,b as i,f as Fs,g as c,j as r,k as Zn,l as ti,m as n,n as d,t as m,o as u,p as h}from"../chunks/index.023a9934.js";import{C as li,H as f,E as ni}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.76705b3b.js";import{C as T}from"../chunks/CodeBlock.368f51b1.js";function si(Vn){let y,Jt,$t,Ct,M,vt,k,jt,w,xt,g,Rn=`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:`,It,$,Bn=`<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>`,_t,U,Nn=`<code>kernel-builder</code> is a set of tools that can build conforming kernels. It | |
| takes care of:`,Ht,J,Wn=`<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>`,Lt,C,En=`<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.`,Zt,v,Qn=`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.`,Vt,b,An=`<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>`,Rt,j,Bt,x,Nt,I,qn=`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:`,Wt,_,Et,H,Sn="This will:",Qt,L,Gn=`<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>`,At,Z,Xn="To update <code>kernel-builder</code> later:",qt,V,St,R,Pn=`For a step-by-step breakdown of what the script does, see | |
| <a href="nix">Using the kernel builder with Nix</a>.`,Gt,B,Xt,N,Fn=`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.`,Pt,W,Yn=`If you use a different provider, the Terraform bridges should be | |
| similar and straightforward to modify.`,Ft,E,Yt,Q,zn=`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:`,zt,A,Ot,q,On=`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.`,Dt,S,Dn=`By default, the <code>init</code> subcommand creates a CUDA kernel. You can specify | |
| another backend with the <code>--backends</code> option:`,Kt,G,el,X,Kn=`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>:`,tl,P,ll,F,es=`Finally, if you want to create a kernel for all supported backends, you | |
| can use <code>--backends all</code>.`,nl,Y,sl,z,ts="Kernel projects follow this general directory layout:",il,O,al,D,ls="In this example we can find:",ol,K,ns=`<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>`,rl,ee,pl,te,ss=`<code>build.toml</code> tells <code>kernel-builder</code> what to build and how. It looks as | |
| follows for the <code>mykernel</code> kernel:`,cl,le,dl,ne,is="The following sections enumerate all supported options for <code>build.toml</code>.",ml,se,ul,ie,as=`<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>`,hl,ae,fl,oe,os=`<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>`,Tl,re,yl,pe,rs=`<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>`,bl,ce,Ml,de,ps=`The framework section specifies framework-specific settings. The name of | |
| the section depends on the framework that is used. The currently supported | |
| frameworks are:`,kl,me,cs="<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>",wl,ue,gl,he,ds=`This framework section is used for AOT-compiled Torch kernels, and has the | |
| following options:`,$l,fe,ms=`<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> <li><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>.</li> <li><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>.</li> <li><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.</li>`,Ul,Te,Jl,ye,us="This framework section is used for AOT-compiled TVM-FFI kernels.",Cl,be,hs=`<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>`,vl,Me,jl,ke,fs=`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).`,xl,we,Ts=`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.`,Il,ge,ys=`<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>`,_l,$e,Hl,Ue,bs=`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.`,Ll,Je,Ms="The following options can be set for a kernel:",Zl,Ce,ks=`<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>`,Vl,ve,ws=`Besides these shared options, the following backend-specific options | |
| are available:`,Rl,je,Bl,xe,gs=`<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>`,Nl,Ie,Wl,_e,$s=`<li><code>rocm-archs</code>: a list of ROCm architectures that the kernel should be | |
| compiled for.</li>`,El,He,Ql,Le,Us=`<li><code>sycl-flags</code>: a list of additional flags to be passed to the SYCL | |
| compiler.</li>`,Al,Ze,ql,Ve,Js=`<li><code>cxx-flags</code>: a list of additional flags to be passed to the C++ | |
| compiler.</li>`,Sl,Re,Gl,Be,Xl,Ne,Cs="Torch bindings are defined in C++, kernels commonly use two files:",Pl,We,vs="<li><code>torch_binding.h</code> containing function declarations.</li> <li><code>torch_binding.cpp</code> registering the functions as Torch ops.</li>",Fl,Ee,js=`For instance, the <code>mykernel</code> kernel discussed above has the following | |
| declaration in <code>torch_binding.h</code>:`,Yl,Qe,zl,Ae,xs="This function is then registered as a Torch op in <code>torch_binding.cpp</code>:",Ol,qe,Dl,Se,Is=`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.`,Kl,Ge,en,Xe,_s=`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>.`,tn,Pe,Hs=`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:`,ln,Fe,nn,Ye,sn,ze,Ls=`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.`,an,Oe,Zs=`You can use the <code>add_op_namespace_prefix</code> to prefix an op name with the | |
| correct prefix. So for instance, replace`,on,De,rn,Ke,Vs="by",pn,et,cn,tt,Rs="As mentioned in the above, the <code>_ops</code> module is generated by kernel-builder.",dn,lt,Bs=`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:`,mn,nt,un,st,hn,it,fn,at,Ns=`Kernel tests are stored in the <code>tests</code> directory. Tests must not use direct | |
| imports, but instead use <code>get_kernel</code> to test the kernel as it will be used. | |
| For example:`,Tn,ot,yn,rt,Ws=`Development shells (<code>kernel-builder devshell</code>/<code>kernel-builder testshell</code>) | |
| will set the <code>LOCAL_KERNELS</code> variable to ensure that the kernel will be | |
| loaded from the development environment.`,bn,pt,Mn,ct,Es=`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:`,kn,dt,wn,mt,Qs=`We recommend that you to pick tests that together would catch most error | |
| cases while running within 60 seconds.`,gn,ut,As="You can run the tests (e.g. in CI) using:",$n,ht,Un,ft,qs=`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,Cn,yt,Ss=`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>.`,vn,bt,jn,Mt,Gs=`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.`,xn,kt,Xs=`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.`,In,wt,Ps=`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.`,_n,gt,Hn,Ut,Ln;return M=new li({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),k=new f({props:{title:"Write kernels",local:"write-kernels",headingTag:"h1"}}),w=new f({props:{title:"Introduction",local:"introduction",headingTag:"h2"}}),j=new f({props:{title:"Setting up environment",local:"setting-up-environment",headingTag:"h2"}}),x=new f({props:{title:"Quick install",local:"quick-install",headingTag:"h3"}}),_=new T({props:{code:"Y3VybCUyMC1mc1NMJTIwaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGaHVnZ2luZ2ZhY2UlMkZrZXJuZWxzJTJGbWFpbiUyRmluc3RhbGwuc2glMjAlN0MlMjBiYXNo",highlighted:"curl -fsSL https://raw.githubusercontent.com/huggingface/kernels/main/install.sh | bash",lang:"bash",wrap:!1}}),V=new T({props:{code:"bml4JTIwcHJvZmlsZSUyMHVwZ3JhZGUlMjAtLWFsbA==",highlighted:"nix profile upgrade --all",lang:"bash",wrap:!1}}),B=new f({props:{title:"Cloud environment",local:"cloud-environment",headingTag:"h3"}}),E=new f({props:{title:"Starting a new kernel",local:"starting-a-new-kernel",headingTag:"h2"}}),A=new T({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}}),G=new T({props:{code:"JTI0JTIwa2VybmVsLWJ1aWxkZXIlMjBpbml0JTIwLS1uYW1lJTIwbXlvcmclMkZteWtlcm5lbCUyMC0tYmFja2VuZHMlMjB4cHU=",highlighted:"$ kernel-builder init --name myorg/mykernel --backends xpu",lang:"bash",wrap:!1}}),P=new T({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}}),Y=new f({props:{title:"Kernel project layout",local:"kernel-project-layout",headingTag:"h2"}}),O=new T({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}}),ee=new f({props:{title:"build.toml",local:"buildtoml",headingTag:"h2"}}),le=new T({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}}),se=new f({props:{title:"general",local:"general",headingTag:"h3"}}),ae=new f({props:{title:"general.hub",local:"generalhub",headingTag:"h3"}}),re=new f({props:{title:"general.cuda",local:"generalcuda",headingTag:"h3"}}),ce=new f({props:{title:"Framework sections",local:"framework-sections",headingTag:"h3"}}),ue=new f({props:{title:"torch",local:"torch",headingTag:"h3"}}),Te=new f({props:{title:"tvm-ffi",local:"tvm-ffi",headingTag:"h3"}}),Me=new f({props:{title:"torch-noarch",local:"torch-noarch",headingTag:"h3"}}),$e=new f({props:{title:"kernel.<name>",local:"kernelltnamegt",headingTag:"h3"}}),je=new f({props:{title:"cuda",local:"cuda",headingTag:"h4"}}),Ie=new f({props:{title:"rocm",local:"rocm",headingTag:"h4"}}),He=new f({props:{title:"xpu",local:"xpu",headingTag:"h4"}}),Ze=new f({props:{title:"cpu",local:"cpu",headingTag:"h3"}}),Re=new f({props:{title:"Torch bindings",local:"torch-bindings",headingTag:"h2"}}),Be=new f({props:{title:"Defining bindings",local:"defining-bindings",headingTag:"h3"}}),Qe=new T({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}}),qe=new T({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}}),Ge=new f({props:{title:"Using kernel functions from Python",local:"using-kernel-functions-from-python",headingTag:"h2"}}),Fe=new T({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}}),Ye=new f({props:{title:"Registering Torch operators",local:"registering-torch-operators",headingTag:"h2"}}),De=new T({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}}),et=new T({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}}),nt=new T({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}}),st=new f({props:{title:"Kernel tests",local:"kernel-tests",headingTag:"h2"}}),it=new f({props:{title:"Use get_kernel in tests",local:"use-getkernel-in-tests",headingTag:"h3"}}),ot=new T({props:{code:"aW1wb3J0JTIwa2VybmVscyUwQWltcG9ydCUyMHRvcmNoJTBBaW1wb3J0JTIwdG9yY2gubm4uZnVuY3Rpb25hbCUyMGFzJTIwRiUwQSUwQXJlbHUlMjAlM0QlMjBrZXJuZWxzLmdldF9rZXJuZWwoJTIya2VybmVscy1jb21tdW5pdHklMkZyZWx1JTIyJTJDJTIwdmVyc2lvbiUzRDEpJTBBJTBBZGVmJTIwdGVzdF9yZWx1KCklM0ElMEElMjAlMjAlMjAlMjB4JTIwJTNEJTIwdG9yY2gucmFuZG4oMTAyNCUyQyUyMDEwMjQlMkMlMjBkdHlwZSUzRHRvcmNoLmZsb2F0MzIlMkMlMjBkZXZpY2UlM0R0b3JjaC5kZXZpY2UoJTIyY3VkYSUyMikpJTBBJTIwJTIwJTIwJTIweSUyMCUzRCUyMHJlbHUucmVsdSh4JTJDJTIwdG9yY2guZW1wdHlfbGlrZSh4KSklMEElMjAlMjAlMjAlMjB5X3JlZiUyMCUzRCUyMEYucmVsdSh4KSUwQSUyMCUyMCUyMCUyMHRvcmNoLnRlc3RpbmcuYXNzZXJ0X2Nsb3NlKHlfcmVmJTJDJTIweSk=",highlighted:`<span class="hljs-keyword">import</span> kernels | |
| <span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">import</span> torch.nn.functional <span class="hljs-keyword">as</span> F | |
| relu = kernels.get_kernel(<span class="hljs-string">"kernels-community/relu"</span>, version=<span class="hljs-number">1</span>) | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">test_relu</span>(): | |
| x = torch.randn(<span class="hljs-number">1024</span>, <span class="hljs-number">1024</span>, dtype=torch.float32, device=torch.device(<span class="hljs-string">"cuda"</span>)) | |
| y = relu.relu(x, torch.empty_like(x)) | |
| y_ref = F.relu(x) | |
| torch.testing.assert_close(y_ref, y)`,lang:"python",wrap:!1}}),pt=new f({props:{title:"Mark CI tests",local:"mark-ci-tests",headingTag:"h3"}}),dt=new T({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 T({props:{code:"JTI0JTIwbml4JTIwcnVuJTIwLiUyM2NpLXRlc3Q=",highlighted:'$ nix run .<span class="hljs-comment">#ci-test</span>',lang:"bash",wrap:!1}}),Tt=new T({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"}}),gt=new ni({props:{source:"https://github.com/huggingface/kernels/blob/main/docs/source/builder/writing-kernels.md"}}),{c(){y=a("meta"),Jt=s(),$t=a("p"),Ct=s(),p(M.$$.fragment),vt=s(),p(k.$$.fragment),jt=s(),p(w.$$.fragment),xt=s(),g=a("p"),g.innerHTML=Rn,It=s(),$=a("ul"),$.innerHTML=Bn,_t=s(),U=a("p"),U.innerHTML=Nn,Ht=s(),J=a("ul"),J.innerHTML=Wn,Lt=s(),C=a("p"),C.innerHTML=En,Zt=s(),v=a("p"),v.innerHTML=Qn,Vt=s(),b=a("blockquote"),b.innerHTML=An,Rt=s(),p(j.$$.fragment),Bt=s(),p(x.$$.fragment),Nt=s(),I=a("p"),I.innerHTML=qn,Wt=s(),p(_.$$.fragment),Et=s(),H=a("p"),H.textContent=Sn,Qt=s(),L=a("ol"),L.innerHTML=Gn,At=s(),Z=a("p"),Z.innerHTML=Xn,qt=s(),p(V.$$.fragment),St=s(),R=a("p"),R.innerHTML=Pn,Gt=s(),p(B.$$.fragment),Xt=s(),N=a("p"),N.innerHTML=Fn,Pt=s(),W=a("p"),W.textContent=Yn,Ft=s(),p(E.$$.fragment),Yt=s(),Q=a("p"),Q.innerHTML=zn,zt=s(),p(A.$$.fragment),Ot=s(),q=a("p"),q.innerHTML=On,Dt=s(),S=a("p"),S.innerHTML=Dn,Kt=s(),p(G.$$.fragment),el=s(),X=a("p"),X.innerHTML=Kn,tl=s(),p(P.$$.fragment),ll=s(),F=a("p"),F.innerHTML=es,nl=s(),p(Y.$$.fragment),sl=s(),z=a("p"),z.textContent=ts,il=s(),p(O.$$.fragment),al=s(),D=a("p"),D.textContent=ls,ol=s(),K=a("ul"),K.innerHTML=ns,rl=s(),p(ee.$$.fragment),pl=s(),te=a("p"),te.innerHTML=ss,cl=s(),p(le.$$.fragment),dl=s(),ne=a("p"),ne.innerHTML=is,ml=s(),p(se.$$.fragment),ul=s(),ie=a("ul"),ie.innerHTML=as,hl=s(),p(ae.$$.fragment),fl=s(),oe=a("ul"),oe.innerHTML=os,Tl=s(),p(re.$$.fragment),yl=s(),pe=a("ul"),pe.innerHTML=rs,bl=s(),p(ce.$$.fragment),Ml=s(),de=a("p"),de.textContent=ps,kl=s(),me=a("ul"),me.innerHTML=cs,wl=s(),p(ue.$$.fragment),gl=s(),he=a("p"),he.textContent=ds,$l=s(),fe=a("ul"),fe.innerHTML=ms,Ul=s(),p(Te.$$.fragment),Jl=s(),ye=a("p"),ye.textContent=us,Cl=s(),be=a("ul"),be.innerHTML=hs,vl=s(),p(Me.$$.fragment),jl=s(),ke=a("p"),ke.innerHTML=fs,xl=s(),we=a("p"),we.innerHTML=Ts,Il=s(),ge=a("ul"),ge.innerHTML=ys,_l=s(),p($e.$$.fragment),Hl=s(),Ue=a("p"),Ue.innerHTML=bs,Ll=s(),Je=a("p"),Je.textContent=Ms,Zl=s(),Ce=a("ul"),Ce.innerHTML=ks,Vl=s(),ve=a("p"),ve.textContent=ws,Rl=s(),p(je.$$.fragment),Bl=s(),xe=a("ul"),xe.innerHTML=gs,Nl=s(),p(Ie.$$.fragment),Wl=s(),_e=a("ul"),_e.innerHTML=$s,El=s(),p(He.$$.fragment),Ql=s(),Le=a("ul"),Le.innerHTML=Us,Al=s(),p(Ze.$$.fragment),ql=s(),Ve=a("ul"),Ve.innerHTML=Js,Sl=s(),p(Re.$$.fragment),Gl=s(),p(Be.$$.fragment),Xl=s(),Ne=a("p"),Ne.textContent=Cs,Pl=s(),We=a("ul"),We.innerHTML=vs,Fl=s(),Ee=a("p"),Ee.innerHTML=js,Yl=s(),p(Qe.$$.fragment),zl=s(),Ae=a("p"),Ae.innerHTML=xs,Ol=s(),p(qe.$$.fragment),Dl=s(),Se=a("p"),Se.innerHTML=Is,Kl=s(),p(Ge.$$.fragment),en=s(),Xe=a("p"),Xe.innerHTML=_s,tn=s(),Pe=a("p"),Pe.innerHTML=Hs,ln=s(),p(Fe.$$.fragment),nn=s(),p(Ye.$$.fragment),sn=s(),ze=a("p"),ze.innerHTML=Ls,an=s(),Oe=a("p"),Oe.innerHTML=Zs,on=s(),p(De.$$.fragment),rn=s(),Ke=a("p"),Ke.textContent=Vs,pn=s(),p(et.$$.fragment),cn=s(),tt=a("p"),tt.innerHTML=Rs,dn=s(),lt=a("p"),lt.innerHTML=Bs,mn=s(),p(nt.$$.fragment),un=s(),p(st.$$.fragment),hn=s(),p(it.$$.fragment),fn=s(),at=a("p"),at.innerHTML=Ns,Tn=s(),p(ot.$$.fragment),yn=s(),rt=a("p"),rt.innerHTML=Ws,bn=s(),p(pt.$$.fragment),Mn=s(),ct=a("p"),ct.innerHTML=Es,kn=s(),p(dt.$$.fragment),wn=s(),mt=a("p"),mt.textContent=Qs,gn=s(),ut=a("p"),ut.textContent=As,$n=s(),p(ht.$$.fragment),Un=s(),ft=a("p"),ft.innerHTML=qs,Jn=s(),p(Tt.$$.fragment),Cn=s(),yt=a("p"),yt.innerHTML=Ss,vn=s(),p(bt.$$.fragment),jn=s(),Mt=a("p"),Mt.innerHTML=Gs,xn=s(),kt=a("p"),kt.innerHTML=Xs,In=s(),wt=a("p"),wt.innerHTML=Ps,_n=s(),p(gt.$$.fragment),Hn=s(),Ut=a("p"),this.h()},l(e){const t=ei("svelte-u9bgzb",document.head);y=o(t,"META",{name:!0,content:!0}),t.forEach(l),Jt=i(e),$t=o(e,"P",{}),Fs($t).forEach(l),Ct=i(e),c(M.$$.fragment,e),vt=i(e),c(k.$$.fragment,e),jt=i(e),c(w.$$.fragment,e),xt=i(e),g=o(e,"P",{"data-svelte-h":!0}),r(g)!=="svelte-1i1c9ni"&&(g.innerHTML=Rn),It=i(e),$=o(e,"UL",{"data-svelte-h":!0}),r($)!=="svelte-1odnsz3"&&($.innerHTML=Bn),_t=i(e),U=o(e,"P",{"data-svelte-h":!0}),r(U)!=="svelte-1gp9ycj"&&(U.innerHTML=Nn),Ht=i(e),J=o(e,"UL",{"data-svelte-h":!0}),r(J)!=="svelte-ysrhph"&&(J.innerHTML=Wn),Lt=i(e),C=o(e,"P",{"data-svelte-h":!0}),r(C)!=="svelte-vy7wcb"&&(C.innerHTML=En),Zt=i(e),v=o(e,"P",{"data-svelte-h":!0}),r(v)!=="svelte-o9ssdv"&&(v.innerHTML=Qn),Vt=i(e),b=o(e,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),r(b)!=="svelte-43d87d"&&(b.innerHTML=An),Rt=i(e),c(j.$$.fragment,e),Bt=i(e),c(x.$$.fragment,e),Nt=i(e),I=o(e,"P",{"data-svelte-h":!0}),r(I)!=="svelte-96m8sj"&&(I.innerHTML=qn),Wt=i(e),c(_.$$.fragment,e),Et=i(e),H=o(e,"P",{"data-svelte-h":!0}),r(H)!=="svelte-1b4vj4e"&&(H.textContent=Sn),Qt=i(e),L=o(e,"OL",{"data-svelte-h":!0}),r(L)!=="svelte-3arzgs"&&(L.innerHTML=Gn),At=i(e),Z=o(e,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-1ihjqjm"&&(Z.innerHTML=Xn),qt=i(e),c(V.$$.fragment,e),St=i(e),R=o(e,"P",{"data-svelte-h":!0}),r(R)!=="svelte-1cac215"&&(R.innerHTML=Pn),Gt=i(e),c(B.$$.fragment,e),Xt=i(e),N=o(e,"P",{"data-svelte-h":!0}),r(N)!=="svelte-4lye9k"&&(N.innerHTML=Fn),Pt=i(e),W=o(e,"P",{"data-svelte-h":!0}),r(W)!=="svelte-g5i707"&&(W.textContent=Yn),Ft=i(e),c(E.$$.fragment,e),Yt=i(e),Q=o(e,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-cn9mkc"&&(Q.innerHTML=zn),zt=i(e),c(A.$$.fragment,e),Ot=i(e),q=o(e,"P",{"data-svelte-h":!0}),r(q)!=="svelte-1prqyz3"&&(q.innerHTML=On),Dt=i(e),S=o(e,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1exh4w8"&&(S.innerHTML=Dn),Kt=i(e),c(G.$$.fragment,e),el=i(e),X=o(e,"P",{"data-svelte-h":!0}),r(X)!=="svelte-1poutmy"&&(X.innerHTML=Kn),tl=i(e),c(P.$$.fragment,e),ll=i(e),F=o(e,"P",{"data-svelte-h":!0}),r(F)!=="svelte-s84xza"&&(F.innerHTML=es),nl=i(e),c(Y.$$.fragment,e),sl=i(e),z=o(e,"P",{"data-svelte-h":!0}),r(z)!=="svelte-6oo725"&&(z.textContent=ts),il=i(e),c(O.$$.fragment,e),al=i(e),D=o(e,"P",{"data-svelte-h":!0}),r(D)!=="svelte-1lqdx4"&&(D.textContent=ls),ol=i(e),K=o(e,"UL",{"data-svelte-h":!0}),r(K)!=="svelte-c8vtob"&&(K.innerHTML=ns),rl=i(e),c(ee.$$.fragment,e),pl=i(e),te=o(e,"P",{"data-svelte-h":!0}),r(te)!=="svelte-1hgp1cr"&&(te.innerHTML=ss),cl=i(e),c(le.$$.fragment,e),dl=i(e),ne=o(e,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-pgruc9"&&(ne.innerHTML=is),ml=i(e),c(se.$$.fragment,e),ul=i(e),ie=o(e,"UL",{"data-svelte-h":!0}),r(ie)!=="svelte-gz30jb"&&(ie.innerHTML=as),hl=i(e),c(ae.$$.fragment,e),fl=i(e),oe=o(e,"UL",{"data-svelte-h":!0}),r(oe)!=="svelte-12rq95i"&&(oe.innerHTML=os),Tl=i(e),c(re.$$.fragment,e),yl=i(e),pe=o(e,"UL",{"data-svelte-h":!0}),r(pe)!=="svelte-1fzn2"&&(pe.innerHTML=rs),bl=i(e),c(ce.$$.fragment,e),Ml=i(e),de=o(e,"P",{"data-svelte-h":!0}),r(de)!=="svelte-gxdqgh"&&(de.textContent=ps),kl=i(e),me=o(e,"UL",{"data-svelte-h":!0}),r(me)!=="svelte-124jabx"&&(me.innerHTML=cs),wl=i(e),c(ue.$$.fragment,e),gl=i(e),he=o(e,"P",{"data-svelte-h":!0}),r(he)!=="svelte-kgzfey"&&(he.textContent=ds),$l=i(e),fe=o(e,"UL",{"data-svelte-h":!0}),r(fe)!=="svelte-7mmcol"&&(fe.innerHTML=ms),Ul=i(e),c(Te.$$.fragment,e),Jl=i(e),ye=o(e,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-o8lm5s"&&(ye.textContent=us),Cl=i(e),be=o(e,"UL",{"data-svelte-h":!0}),r(be)!=="svelte-1xjqtde"&&(be.innerHTML=hs),vl=i(e),c(Me.$$.fragment,e),jl=i(e),ke=o(e,"P",{"data-svelte-h":!0}),r(ke)!=="svelte-zn9bnz"&&(ke.innerHTML=fs),xl=i(e),we=o(e,"P",{"data-svelte-h":!0}),r(we)!=="svelte-1fs9ps3"&&(we.innerHTML=Ts),Il=i(e),ge=o(e,"UL",{"data-svelte-h":!0}),r(ge)!=="svelte-1oz6tus"&&(ge.innerHTML=ys),_l=i(e),c($e.$$.fragment,e),Hl=i(e),Ue=o(e,"P",{"data-svelte-h":!0}),r(Ue)!=="svelte-1weg0gu"&&(Ue.innerHTML=bs),Ll=i(e),Je=o(e,"P",{"data-svelte-h":!0}),r(Je)!=="svelte-1al5myg"&&(Je.textContent=Ms),Zl=i(e),Ce=o(e,"UL",{"data-svelte-h":!0}),r(Ce)!=="svelte-1fbzu1m"&&(Ce.innerHTML=ks),Vl=i(e),ve=o(e,"P",{"data-svelte-h":!0}),r(ve)!=="svelte-1mf578x"&&(ve.textContent=ws),Rl=i(e),c(je.$$.fragment,e),Bl=i(e),xe=o(e,"UL",{"data-svelte-h":!0}),r(xe)!=="svelte-3vtlb2"&&(xe.innerHTML=gs),Nl=i(e),c(Ie.$$.fragment,e),Wl=i(e),_e=o(e,"UL",{"data-svelte-h":!0}),r(_e)!=="svelte-mx7mxt"&&(_e.innerHTML=$s),El=i(e),c(He.$$.fragment,e),Ql=i(e),Le=o(e,"UL",{"data-svelte-h":!0}),r(Le)!=="svelte-1u3m3l7"&&(Le.innerHTML=Us),Al=i(e),c(Ze.$$.fragment,e),ql=i(e),Ve=o(e,"UL",{"data-svelte-h":!0}),r(Ve)!=="svelte-10okur"&&(Ve.innerHTML=Js),Sl=i(e),c(Re.$$.fragment,e),Gl=i(e),c(Be.$$.fragment,e),Xl=i(e),Ne=o(e,"P",{"data-svelte-h":!0}),r(Ne)!=="svelte-r7rot5"&&(Ne.textContent=Cs),Pl=i(e),We=o(e,"UL",{"data-svelte-h":!0}),r(We)!=="svelte-poxr41"&&(We.innerHTML=vs),Fl=i(e),Ee=o(e,"P",{"data-svelte-h":!0}),r(Ee)!=="svelte-1ikzb58"&&(Ee.innerHTML=js),Yl=i(e),c(Qe.$$.fragment,e),zl=i(e),Ae=o(e,"P",{"data-svelte-h":!0}),r(Ae)!=="svelte-5ja9lk"&&(Ae.innerHTML=xs),Ol=i(e),c(qe.$$.fragment,e),Dl=i(e),Se=o(e,"P",{"data-svelte-h":!0}),r(Se)!=="svelte-ssih46"&&(Se.innerHTML=Is),Kl=i(e),c(Ge.$$.fragment,e),en=i(e),Xe=o(e,"P",{"data-svelte-h":!0}),r(Xe)!=="svelte-1y8rjsx"&&(Xe.innerHTML=_s),tn=i(e),Pe=o(e,"P",{"data-svelte-h":!0}),r(Pe)!=="svelte-a3yu8e"&&(Pe.innerHTML=Hs),ln=i(e),c(Fe.$$.fragment,e),nn=i(e),c(Ye.$$.fragment,e),sn=i(e),ze=o(e,"P",{"data-svelte-h":!0}),r(ze)!=="svelte-xosw3t"&&(ze.innerHTML=Ls),an=i(e),Oe=o(e,"P",{"data-svelte-h":!0}),r(Oe)!=="svelte-a5yx0v"&&(Oe.innerHTML=Zs),on=i(e),c(De.$$.fragment,e),rn=i(e),Ke=o(e,"P",{"data-svelte-h":!0}),r(Ke)!=="svelte-9b7ddb"&&(Ke.textContent=Vs),pn=i(e),c(et.$$.fragment,e),cn=i(e),tt=o(e,"P",{"data-svelte-h":!0}),r(tt)!=="svelte-4caz4s"&&(tt.innerHTML=Rs),dn=i(e),lt=o(e,"P",{"data-svelte-h":!0}),r(lt)!=="svelte-hkktty"&&(lt.innerHTML=Bs),mn=i(e),c(nt.$$.fragment,e),un=i(e),c(st.$$.fragment,e),hn=i(e),c(it.$$.fragment,e),fn=i(e),at=o(e,"P",{"data-svelte-h":!0}),r(at)!=="svelte-1ssa1lv"&&(at.innerHTML=Ns),Tn=i(e),c(ot.$$.fragment,e),yn=i(e),rt=o(e,"P",{"data-svelte-h":!0}),r(rt)!=="svelte-1ykkqzk"&&(rt.innerHTML=Ws),bn=i(e),c(pt.$$.fragment,e),Mn=i(e),ct=o(e,"P",{"data-svelte-h":!0}),r(ct)!=="svelte-1crats4"&&(ct.innerHTML=Es),kn=i(e),c(dt.$$.fragment,e),wn=i(e),mt=o(e,"P",{"data-svelte-h":!0}),r(mt)!=="svelte-1uzdod8"&&(mt.textContent=Qs),gn=i(e),ut=o(e,"P",{"data-svelte-h":!0}),r(ut)!=="svelte-s01sgi"&&(ut.textContent=As),$n=i(e),c(ht.$$.fragment,e),Un=i(e),ft=o(e,"P",{"data-svelte-h":!0}),r(ft)!=="svelte-1ucbtrx"&&(ft.innerHTML=qs),Jn=i(e),c(Tt.$$.fragment,e),Cn=i(e),yt=o(e,"P",{"data-svelte-h":!0}),r(yt)!=="svelte-gcopz4"&&(yt.innerHTML=Ss),vn=i(e),c(bt.$$.fragment,e),jn=i(e),Mt=o(e,"P",{"data-svelte-h":!0}),r(Mt)!=="svelte-11q3n4g"&&(Mt.innerHTML=Gs),xn=i(e),kt=o(e,"P",{"data-svelte-h":!0}),r(kt)!=="svelte-zjr5ot"&&(kt.innerHTML=Xs),In=i(e),wt=o(e,"P",{"data-svelte-h":!0}),r(wt)!=="svelte-rt0n0n"&&(wt.innerHTML=Ps),_n=i(e),c(gt.$$.fragment,e),Hn=i(e),Ut=o(e,"P",{}),Fs(Ut).forEach(l),this.h()},h(){Zn(y,"name","hf:doc:metadata"),Zn(y,"content",ii),Zn(b,"class","tip")},m(e,t){ti(document.head,y),n(e,Jt,t),n(e,$t,t),n(e,Ct,t),d(M,e,t),n(e,vt,t),d(k,e,t),n(e,jt,t),d(w,e,t),n(e,xt,t),n(e,g,t),n(e,It,t),n(e,$,t),n(e,_t,t),n(e,U,t),n(e,Ht,t),n(e,J,t),n(e,Lt,t),n(e,C,t),n(e,Zt,t),n(e,v,t),n(e,Vt,t),n(e,b,t),n(e,Rt,t),d(j,e,t),n(e,Bt,t),d(x,e,t),n(e,Nt,t),n(e,I,t),n(e,Wt,t),d(_,e,t),n(e,Et,t),n(e,H,t),n(e,Qt,t),n(e,L,t),n(e,At,t),n(e,Z,t),n(e,qt,t),d(V,e,t),n(e,St,t),n(e,R,t),n(e,Gt,t),d(B,e,t),n(e,Xt,t),n(e,N,t),n(e,Pt,t),n(e,W,t),n(e,Ft,t),d(E,e,t),n(e,Yt,t),n(e,Q,t),n(e,zt,t),d(A,e,t),n(e,Ot,t),n(e,q,t),n(e,Dt,t),n(e,S,t),n(e,Kt,t),d(G,e,t),n(e,el,t),n(e,X,t),n(e,tl,t),d(P,e,t),n(e,ll,t),n(e,F,t),n(e,nl,t),d(Y,e,t),n(e,sl,t),n(e,z,t),n(e,il,t),d(O,e,t),n(e,al,t),n(e,D,t),n(e,ol,t),n(e,K,t),n(e,rl,t),d(ee,e,t),n(e,pl,t),n(e,te,t),n(e,cl,t),d(le,e,t),n(e,dl,t),n(e,ne,t),n(e,ml,t),d(se,e,t),n(e,ul,t),n(e,ie,t),n(e,hl,t),d(ae,e,t),n(e,fl,t),n(e,oe,t),n(e,Tl,t),d(re,e,t),n(e,yl,t),n(e,pe,t),n(e,bl,t),d(ce,e,t),n(e,Ml,t),n(e,de,t),n(e,kl,t),n(e,me,t),n(e,wl,t),d(ue,e,t),n(e,gl,t),n(e,he,t),n(e,$l,t),n(e,fe,t),n(e,Ul,t),d(Te,e,t),n(e,Jl,t),n(e,ye,t),n(e,Cl,t),n(e,be,t),n(e,vl,t),d(Me,e,t),n(e,jl,t),n(e,ke,t),n(e,xl,t),n(e,we,t),n(e,Il,t),n(e,ge,t),n(e,_l,t),d($e,e,t),n(e,Hl,t),n(e,Ue,t),n(e,Ll,t),n(e,Je,t),n(e,Zl,t),n(e,Ce,t),n(e,Vl,t),n(e,ve,t),n(e,Rl,t),d(je,e,t),n(e,Bl,t),n(e,xe,t),n(e,Nl,t),d(Ie,e,t),n(e,Wl,t),n(e,_e,t),n(e,El,t),d(He,e,t),n(e,Ql,t),n(e,Le,t),n(e,Al,t),d(Ze,e,t),n(e,ql,t),n(e,Ve,t),n(e,Sl,t),d(Re,e,t),n(e,Gl,t),d(Be,e,t),n(e,Xl,t),n(e,Ne,t),n(e,Pl,t),n(e,We,t),n(e,Fl,t),n(e,Ee,t),n(e,Yl,t),d(Qe,e,t),n(e,zl,t),n(e,Ae,t),n(e,Ol,t),d(qe,e,t),n(e,Dl,t),n(e,Se,t),n(e,Kl,t),d(Ge,e,t),n(e,en,t),n(e,Xe,t),n(e,tn,t),n(e,Pe,t),n(e,ln,t),d(Fe,e,t),n(e,nn,t),d(Ye,e,t),n(e,sn,t),n(e,ze,t),n(e,an,t),n(e,Oe,t),n(e,on,t),d(De,e,t),n(e,rn,t),n(e,Ke,t),n(e,pn,t),d(et,e,t),n(e,cn,t),n(e,tt,t),n(e,dn,t),n(e,lt,t),n(e,mn,t),d(nt,e,t),n(e,un,t),d(st,e,t),n(e,hn,t),d(it,e,t),n(e,fn,t),n(e,at,t),n(e,Tn,t),d(ot,e,t),n(e,yn,t),n(e,rt,t),n(e,bn,t),d(pt,e,t),n(e,Mn,t),n(e,ct,t),n(e,kn,t),d(dt,e,t),n(e,wn,t),n(e,mt,t),n(e,gn,t),n(e,ut,t),n(e,$n,t),d(ht,e,t),n(e,Un,t),n(e,ft,t),n(e,Jn,t),d(Tt,e,t),n(e,Cn,t),n(e,yt,t),n(e,vn,t),d(bt,e,t),n(e,jn,t),n(e,Mt,t),n(e,xn,t),n(e,kt,t),n(e,In,t),n(e,wt,t),n(e,_n,t),d(gt,e,t),n(e,Hn,t),n(e,Ut,t),Ln=!0},p:zs,i(e){Ln||(m(M.$$.fragment,e),m(k.$$.fragment,e),m(w.$$.fragment,e),m(j.$$.fragment,e),m(x.$$.fragment,e),m(_.$$.fragment,e),m(V.$$.fragment,e),m(B.$$.fragment,e),m(E.$$.fragment,e),m(A.$$.fragment,e),m(G.$$.fragment,e),m(P.$$.fragment,e),m(Y.$$.fragment,e),m(O.$$.fragment,e),m(ee.$$.fragment,e),m(le.$$.fragment,e),m(se.$$.fragment,e),m(ae.$$.fragment,e),m(re.$$.fragment,e),m(ce.$$.fragment,e),m(ue.$$.fragment,e),m(Te.$$.fragment,e),m(Me.$$.fragment,e),m($e.$$.fragment,e),m(je.$$.fragment,e),m(Ie.$$.fragment,e),m(He.$$.fragment,e),m(Ze.$$.fragment,e),m(Re.$$.fragment,e),m(Be.$$.fragment,e),m(Qe.$$.fragment,e),m(qe.$$.fragment,e),m(Ge.$$.fragment,e),m(Fe.$$.fragment,e),m(Ye.$$.fragment,e),m(De.$$.fragment,e),m(et.$$.fragment,e),m(nt.$$.fragment,e),m(st.$$.fragment,e),m(it.$$.fragment,e),m(ot.$$.fragment,e),m(pt.$$.fragment,e),m(dt.$$.fragment,e),m(ht.$$.fragment,e),m(Tt.$$.fragment,e),m(bt.$$.fragment,e),m(gt.$$.fragment,e),Ln=!0)},o(e){u(M.$$.fragment,e),u(k.$$.fragment,e),u(w.$$.fragment,e),u(j.$$.fragment,e),u(x.$$.fragment,e),u(_.$$.fragment,e),u(V.$$.fragment,e),u(B.$$.fragment,e),u(E.$$.fragment,e),u(A.$$.fragment,e),u(G.$$.fragment,e),u(P.$$.fragment,e),u(Y.$$.fragment,e),u(O.$$.fragment,e),u(ee.$$.fragment,e),u(le.$$.fragment,e),u(se.$$.fragment,e),u(ae.$$.fragment,e),u(re.$$.fragment,e),u(ce.$$.fragment,e),u(ue.$$.fragment,e),u(Te.$$.fragment,e),u(Me.$$.fragment,e),u($e.$$.fragment,e),u(je.$$.fragment,e),u(Ie.$$.fragment,e),u(He.$$.fragment,e),u(Ze.$$.fragment,e),u(Re.$$.fragment,e),u(Be.$$.fragment,e),u(Qe.$$.fragment,e),u(qe.$$.fragment,e),u(Ge.$$.fragment,e),u(Fe.$$.fragment,e),u(Ye.$$.fragment,e),u(De.$$.fragment,e),u(et.$$.fragment,e),u(nt.$$.fragment,e),u(st.$$.fragment,e),u(it.$$.fragment,e),u(ot.$$.fragment,e),u(pt.$$.fragment,e),u(dt.$$.fragment,e),u(ht.$$.fragment,e),u(Tt.$$.fragment,e),u(bt.$$.fragment,e),u(gt.$$.fragment,e),Ln=!1},d(e){e&&(l(Jt),l($t),l(Ct),l(vt),l(jt),l(xt),l(g),l(It),l($),l(_t),l(U),l(Ht),l(J),l(Lt),l(C),l(Zt),l(v),l(Vt),l(b),l(Rt),l(Bt),l(Nt),l(I),l(Wt),l(Et),l(H),l(Qt),l(L),l(At),l(Z),l(qt),l(St),l(R),l(Gt),l(Xt),l(N),l(Pt),l(W),l(Ft),l(Yt),l(Q),l(zt),l(Ot),l(q),l(Dt),l(S),l(Kt),l(el),l(X),l(tl),l(ll),l(F),l(nl),l(sl),l(z),l(il),l(al),l(D),l(ol),l(K),l(rl),l(pl),l(te),l(cl),l(dl),l(ne),l(ml),l(ul),l(ie),l(hl),l(fl),l(oe),l(Tl),l(yl),l(pe),l(bl),l(Ml),l(de),l(kl),l(me),l(wl),l(gl),l(he),l($l),l(fe),l(Ul),l(Jl),l(ye),l(Cl),l(be),l(vl),l(jl),l(ke),l(xl),l(we),l(Il),l(ge),l(_l),l(Hl),l(Ue),l(Ll),l(Je),l(Zl),l(Ce),l(Vl),l(ve),l(Rl),l(Bl),l(xe),l(Nl),l(Wl),l(_e),l(El),l(Ql),l(Le),l(Al),l(ql),l(Ve),l(Sl),l(Gl),l(Xl),l(Ne),l(Pl),l(We),l(Fl),l(Ee),l(Yl),l(zl),l(Ae),l(Ol),l(Dl),l(Se),l(Kl),l(en),l(Xe),l(tn),l(Pe),l(ln),l(nn),l(sn),l(ze),l(an),l(Oe),l(on),l(rn),l(Ke),l(pn),l(cn),l(tt),l(dn),l(lt),l(mn),l(un),l(hn),l(fn),l(at),l(Tn),l(yn),l(rt),l(bn),l(Mn),l(ct),l(kn),l(wn),l(mt),l(gn),l(ut),l($n),l(Un),l(ft),l(Jn),l(Cn),l(yt),l(vn),l(jn),l(Mt),l(xn),l(kt),l(In),l(wt),l(_n),l(Hn),l(Ut)),l(y),h(M,e),h(k,e),h(w,e),h(j,e),h(x,e),h(_,e),h(V,e),h(B,e),h(E,e),h(A,e),h(G,e),h(P,e),h(Y,e),h(O,e),h(ee,e),h(le,e),h(se,e),h(ae,e),h(re,e),h(ce,e),h(ue,e),h(Te,e),h(Me,e),h($e,e),h(je,e),h(Ie,e),h(He,e),h(Ze,e),h(Re,e),h(Be,e),h(Qe,e),h(qe,e),h(Ge,e),h(Fe,e),h(Ye,e),h(De,e),h(et,e),h(nt,e),h(st,e),h(it,e),h(ot,e),h(pt,e),h(dt,e),h(ht,e),h(Tt,e),h(bt,e),h(gt,e)}}}const ii='{"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":[{"title":"Use get_kernel in tests","local":"use-getkernel-in-tests","sections":[],"depth":3},{"title":"Mark CI tests","local":"mark-ci-tests","sections":[],"depth":3}],"depth":2},{"title":"Kernel docs","local":"kernel-docs","sections":[],"depth":2}],"depth":1}';function ai(Vn){return Os(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class di extends Ds{constructor(y){super(),Ks(this,y,ai,si,Ys,{})}}export{di as component}; | |
Xet Storage Details
- Size:
- 53.6 kB
- Xet hash:
- b052b90501a66ce19a62dd57520c4126b4f8d53e9bb85ba7ba03b73463b91113
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.