Buckets:
| import{s as Ks,o as qs,n as rl}from"../chunks/scheduler.b9285784.js";import{S as Os,i as ea,e as M,s as a,c as o,h as la,a as i,d as t,b as n,f as Ps,g as c,j as r,k as Ds,l as ta,m as s,n as m,t as y,o as w,p as J}from"../chunks/index.26bc89a1.js";import{T as Ml}from"../chunks/Tip.e4eba3d6.js";import{C as sa,H as il,E as aa}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.fae74550.js";import{C as h}from"../chunks/CodeBlock.4108d4bd.js";function na(d){let p,U='This tutorial is also available as a Jupyter Notebook <a href="https://github.com/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_cv_example.ipynb" rel="nofollow">here</a>';return{c(){p=M("p"),p.innerHTML=U},l(T){p=i(T,"P",{"data-svelte-h":!0}),r(p)!=="svelte-1tjynav"&&(p.innerHTML=U)},m(T,j){s(T,p,j)},p:rl,d(T){T&&t(p)}}}function pa(d){let p,U="CUDA and XPU can’t be initialized more than once on a multi-device system. It’s fine to debug in the notebook and have calls to CUDA/XPU, but in order to finally train a full cleanup and restart will need to be performed.";return{c(){p=M("p"),p.textContent=U},l(T){p=i(T,"P",{"data-svelte-h":!0}),r(p)!=="svelte-kppmtb"&&(p.textContent=U)},m(T,j){s(T,p,j)},p:rl,d(T){T&&t(p)}}}function Ma(d){let p,U="The code has been split up to allow for explanations on each section. A full version that can be copy and pasted will be available at the end";return{c(){p=M("p"),p.textContent=U},l(T){p=i(T,"P",{"data-svelte-h":!0}),r(p)!=="svelte-1eykicx"&&(p.textContent=U)},m(T,j){s(T,p,j)},p:rl,d(T){T&&t(p)}}}function ia(d){let p,U=`If training on the TPU, your training loop should take in the model as a parameter and it should be instantiated | |
| outside of the training loop function. See the <a href="../concept_guides/training_tpu">TPU best practices</a> | |
| to learn why`;return{c(){p=M("p"),p.innerHTML=U},l(T){p=i(T,"P",{"data-svelte-h":!0}),r(p)!=="svelte-1aol2se"&&(p.innerHTML=U)},m(T,j){s(T,p,j)},p:rl,d(T){T&&t(p)}}}function ra(d){let p,U="You build the model here so that the seed also controls the new weight initialization";return{c(){p=M("p"),p.textContent=U},l(T){p=i(T,"P",{"data-svelte-h":!0}),r(p)!=="svelte-j432sg"&&(p.textContent=U)},m(T,j){s(T,p,j)},p:rl,d(T){T&&t(p)}}}function oa(d){let p,U="There is no specific order to remember, you just need to unpack the objects in the same order you gave them to the prepare method.";return{c(){p=M("p"),p.textContent=U},l(T){p=i(T,"P",{"data-svelte-h":!0}),r(p)!=="svelte-1y658j6"&&(p.textContent=U)},m(T,j){s(T,p,j)},p:rl,d(T){T&&t(p)}}}function ca(d){let p,U="Notice how the <code>node_rank</code> has changed";return{c(){p=M("p"),p.innerHTML=U},l(T){p=i(T,"P",{"data-svelte-h":!0}),r(p)!=="svelte-1dj1i7x"&&(p.innerHTML=U)},m(T,j){s(T,p,j)},p:rl,d(T){T&&t(p)}}}function ma(d){let p,U,T,j,g,cl,G,ml,_,qt=`This tutorial teaches you how to fine-tune a computer vision model with 🤗 Accelerate from a Jupyter Notebook on a distributed system. | |
| You will also learn how to set up a few requirements needed for ensuring your environment is configured properly, your data has been prepared properly, and finally how to launch training.`,yl,u,wl,k,Jl,W,Ot="Before any training can be performed, an Accelerate config file must exist in the system. Usually this can be done by running the following in a terminal and answering the prompts:",Tl,B,hl,v,es='However, if general defaults are fine and you are <em>not</em> running on a TPU, Accelerate has a utility to quickly write your device configuration into a config file via <a href="/docs/accelerate/pr_4076/en/package_reference/utilities#accelerate.commands.config.default.write_basic_config">utils.write_basic_config()</a>.',Ul,X,ls="The following code will restart Jupyter after writing the configuration, as CUDA runtime or XPU runtime was called to perform this.",jl,b,dl,Y,ul,N,bl,A,ts="Next you should prepare your dataset. As mentioned earlier, great care should be taken when preparing the <code>DataLoaders</code> and model to make sure that <strong>nothing</strong> is put on <em>any</em> GPU.",Il,R,ss="If you do, it is recommended to put that specific code into a function and call that from within the notebook launcher interface, which will be shown later.",fl,V,as='Make sure the dataset is downloaded based on the directions <a href="https://github.com/huggingface/accelerate/tree/main/examples#simple-vision-example" rel="nofollow">here</a>',Cl,x,$l,F,ns="First you need to create a function to extract the class name based on a filename:",Zl,Q,gl,z,Gl,E,ps="In the case here, the label is <code>beagle</code>. Using regex you can extract the label from the filename:",_l,S,kl,H,Wl,L,Ms="And you can see it properly returned the right name for our file:",Bl,P,vl,D,is="Next a <code>Dataset</code> class should be made to handle grabbing the image and the label:",Xl,K,Yl,q,rs=`Now to build the dataset. Outside the training function you can find and declare all the filenames and labels and use them as references inside the | |
| launched function:`,Nl,O,Al,ee,os="Next gather all the labels:",Rl,le,Vl,te,cs=`Next, you should make a <code>get_dataloaders</code> function that will return your built dataloaders for you. As mentioned earlier, if data is automatically | |
| sent to the GPU or a TPU device when building your <code>DataLoaders</code>, they must be built using this method.`,xl,se,Fl,ae,ms="Finally, you should import the scheduler to be used later:",Ql,ne,zl,pe,El,Me,ys='Now you can build the training loop. <a href="/docs/accelerate/pr_4076/en/package_reference/launchers#accelerate.notebook_launcher">notebook_launcher()</a> works by passing in a function to call that will be ran across the distributed system.',Sl,ie,ws="Here is a basic training loop for the animal classification problem:",Hl,I,Ll,re,Pl,oe,Js='First you should set the seed and create an <a href="/docs/accelerate/pr_4076/en/package_reference/accelerator#accelerate.Accelerator">Accelerator</a> object as early in the training loop as possible.',Dl,f,Kl,ce,Ts="Next you should build your dataloaders and create your model:",ql,me,Ol,C,et,ye,hs=`As you are performing transfer learning in this example, the encoder of the model starts out frozen so the head of the model can be | |
| trained only initially:`,lt,we,tt,Je,Us="Normalizing the batches of images will make training a little faster:",st,Te,at,he,js="To make these constants available on the active device, you should set it to the Accelerator’s device:",nt,Ue,pt,je,ds="Next instantiate the rest of the PyTorch classes used for training:",Mt,de,it,ue,us='Before passing everything to <a href="/docs/accelerate/pr_4076/en/package_reference/accelerator#accelerate.Accelerator.prepare">prepare()</a>.',rt,$,ot,be,ct,Ie,bs="Now train the model:",mt,fe,yt,Ce,Is=`The evaluation loop will look slightly different compared to the training loop. The number of elements passed as well as the overall | |
| total accuracy of each batch will be added to two constants:`,wt,$e,Jt,Ze,fs="Next you have the rest of your standard PyTorch loop:",Tt,ge,ht,Ge,Cs="Before finally the last major difference.",Ut,_e,$s=`When performing distributed evaluation, the predictions and labels need to be passed through | |
| <a href="/docs/accelerate/pr_4076/en/package_reference/accelerator#accelerate.Accelerator.gather">gather()</a> so that all of the data is available on the current device and a properly calculated metric can be achieved:`,jt,ke,dt,We,Zs='Now you just need to calculate the actual metric for this problem, and you can print it on the main process using <a href="/docs/accelerate/pr_4076/en/package_reference/accelerator#accelerate.Accelerator.print">print()</a>:',ut,Be,bt,ve,gs="A full version of this training loop is available below:",It,Xe,ft,Ye,Ct,Ne,Gs='All that’s left is to use the <a href="/docs/accelerate/pr_4076/en/package_reference/launchers#accelerate.notebook_launcher">notebook_launcher()</a>.',$t,Ae,_s='You pass in the function, the arguments (as a tuple), and the number of processes to train on. (See the <a href="../package_reference/launchers">documentation</a> for more information)',Zt,Re,gt,Ve,Gt,xe,ks="In the case of running on multiple nodes, you need to set up a Jupyter session at each node and run the launching cell at the same time.",_t,Fe,Ws="For an environment containing 2 nodes (computers) with 8 GPUs each and the main computer with an IP address of “172.31.43.8”, it would look like so:",kt,Qe,Wt,ze,Bs="And in the second Jupyter session on the other machine:",Bt,Z,vt,Ee,Xt,Se,vs="In the case of running on the TPU, it would look like so:",Yt,He,Nt,Le,Xs="To launch the training process with elasticity, enabling fault tolerance, you can use the <code>elastic_launch</code> feature provided by PyTorch. This requires setting additional parameters such as <code>rdzv_backend</code> and <code>max_restarts</code>. Here is an example of how to use <code>notebook_launcher</code> with elastic capabilities:",At,Pe,Rt,De,Ys="As it’s running it will print the progress as well as state how many devices you ran on. This tutorial was ran with two GPUs:",Vt,Ke,xt,qe,Ns="And that’s it!",Ft,Oe,As='Please note that <a href="/docs/accelerate/pr_4076/en/package_reference/launchers#accelerate.notebook_launcher">notebook_launcher()</a> ignores the Accelerate config file, to launch based on the config use:',Qt,el,zt,ll,Et,tl,Rs=`A common issue when running the <code>notebook_launcher</code> is receiving a CUDA/XPU has already been initialized issue. This usually stems | |
| from an import or prior code in the notebook that makes a call to the PyTorch <code>torch.cuda</code> or <code>torch.xpu</code> sublibrary. To help narrow down what went wrong, | |
| you can launch the <code>notebook_launcher</code> with <code>ACCELERATE_DEBUG_MODE=yes</code> in your environment and an additional check | |
| will be made when spawning that a regular process can be created and utilize CUDA/XPU without issue. (Your CUDA/XPU code can still be ran afterwards).`,St,sl,Ht,al,Vs="This notebook showed how to perform distributed training from inside of a Jupyter Notebook. Some key notes to remember:",Lt,nl,xs='<li>Make sure to save any code that use CUDA/XPU (or CUDA/XPU imports) for the function passed to <a href="/docs/accelerate/pr_4076/en/package_reference/launchers#accelerate.notebook_launcher">notebook_launcher()</a></li> <li>Set the <code>num_processes</code> to be the number of devices used for training (such as number of GPUs, XPUs, CPUs, TPUs, etc)</li> <li>If using the TPU, declare your model outside the training loop function</li>',Pt,pl,Dt,ol,Kt;return g=new sa({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),G=new il({props:{title:"Launching distributed training from Jupyter Notebooks",local:"launching-distributed-training-from-jupyter-notebooks",headingTag:"h1"}}),u=new Ml({props:{$$slots:{default:[na]},$$scope:{ctx:d}}}),k=new il({props:{title:"Configuring the Environment",local:"configuring-the-environment",headingTag:"h2"}}),B=new h({props:{code:"YWNjZWxlcmF0ZSUyMGNvbmZpZw==",highlighted:"accelerate config",lang:"bash",wrap:!1}}),b=new Ml({props:{warning:!0,$$slots:{default:[pa]},$$scope:{ctx:d}}}),Y=new h({props:{code:"aW1wb3J0JTIwb3MlMEFmcm9tJTIwYWNjZWxlcmF0ZS51dGlscyUyMGltcG9ydCUyMHdyaXRlX2Jhc2ljX2NvbmZpZyUwQSUwQXdyaXRlX2Jhc2ljX2NvbmZpZygpJTIwJTIwJTIzJTIwV3JpdGUlMjBhJTIwY29uZmlnJTIwZmlsZSUwQW9zLl9leGl0KDAwKSUyMCUyMCUyMyUyMFJlc3RhcnQlMjB0aGUlMjBub3RlYm9vaw==",highlighted:`<span class="hljs-keyword">import</span> os | |
| <span class="hljs-keyword">from</span> accelerate.utils <span class="hljs-keyword">import</span> write_basic_config | |
| write_basic_config() <span class="hljs-comment"># Write a config file</span> | |
| os._exit(<span class="hljs-number">00</span>) <span class="hljs-comment"># Restart the notebook</span>`,lang:"python",wrap:!1}}),N=new il({props:{title:"Preparing the Dataset and Model",local:"preparing-the-dataset-and-model",headingTag:"h2"}}),x=new h({props:{code:"aW1wb3J0JTIwb3MlMkMlMjByZSUyQyUyMHRvcmNoJTJDJTIwUElMJTBBaW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBZnJvbSUyMHRvcmNoLm9wdGltLmxyX3NjaGVkdWxlciUyMGltcG9ydCUyME9uZUN5Y2xlTFIlMEFmcm9tJTIwdG9yY2gudXRpbHMuZGF0YSUyMGltcG9ydCUyMERhdGFMb2FkZXIlMkMlMjBEYXRhc2V0JTBBZnJvbSUyMHRvcmNodmlzaW9uLnRyYW5zZm9ybXMlMjBpbXBvcnQlMjBDb21wb3NlJTJDJTIwUmFuZG9tUmVzaXplZENyb3AlMkMlMjBSZXNpemUlMkMlMjBUb1RlbnNvciUwQSUwQWZyb20lMjBhY2NlbGVyYXRlJTIwaW1wb3J0JTIwQWNjZWxlcmF0b3IlMEFmcm9tJTIwYWNjZWxlcmF0ZS51dGlscyUyMGltcG9ydCUyMHNldF9zZWVkJTBBZnJvbSUyMHRpbW0lMjBpbXBvcnQlMjBjcmVhdGVfbW9kZWw=",highlighted:`<span class="hljs-keyword">import</span> os, re, torch, PIL | |
| <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">from</span> torch.optim.lr_scheduler <span class="hljs-keyword">import</span> OneCycleLR | |
| <span class="hljs-keyword">from</span> torch.utils.data <span class="hljs-keyword">import</span> DataLoader, Dataset | |
| <span class="hljs-keyword">from</span> torchvision.transforms <span class="hljs-keyword">import</span> Compose, RandomResizedCrop, Resize, ToTensor | |
| <span class="hljs-keyword">from</span> accelerate <span class="hljs-keyword">import</span> Accelerator | |
| <span class="hljs-keyword">from</span> accelerate.utils <span class="hljs-keyword">import</span> set_seed | |
| <span class="hljs-keyword">from</span> timm <span class="hljs-keyword">import</span> create_model`,lang:"python",wrap:!1}}),Q=new h({props:{code:"aW1wb3J0JTIwb3MlMEElMEFkYXRhX2RpciUyMCUzRCUyMCUyMi4uJTJGLi4lMkZpbWFnZXMlMjIlMEFmbmFtZXMlMjAlM0QlMjBvcy5saXN0ZGlyKGRhdGFfZGlyKSUwQWZuYW1lJTIwJTNEJTIwZm5hbWVzJTVCMCU1RCUwQXByaW50KGZuYW1lKQ==",highlighted:`<span class="hljs-keyword">import</span> os | |
| data_dir = <span class="hljs-string">"../../images"</span> | |
| fnames = os.listdir(data_dir) | |
| fname = fnames[<span class="hljs-number">0</span>] | |
| <span class="hljs-built_in">print</span>(fname)`,lang:"python",wrap:!1}}),z=new h({props:{code:"YmVhZ2xlXzMyLmpwZw==",highlighted:"beagle_32.jpg",lang:"python",wrap:!1}}),S=new h({props:{code:"aW1wb3J0JTIwcmUlMEElMEElMEFkZWYlMjBleHRyYWN0X2xhYmVsKGZuYW1lKSUzQSUwQSUyMCUyMCUyMCUyMHN0ZW0lMjAlM0QlMjBmbmFtZS5zcGxpdChvcy5wYXRoLnNlcCklNUItMSU1RCUwQSUyMCUyMCUyMCUyMHJldHVybiUyMHJlLnNlYXJjaChyJTIyJTVFKC4qKV8lNUNkJTJCJTVDLmpwZyUyNCUyMiUyQyUyMHN0ZW0pLmdyb3VwcygpJTVCMCU1RA==",highlighted:`<span class="hljs-keyword">import</span> re | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">extract_label</span>(<span class="hljs-params">fname</span>): | |
| stem = fname.split(os.path.sep)[-<span class="hljs-number">1</span>] | |
| <span class="hljs-keyword">return</span> re.search(<span class="hljs-string">r"^(.*)_\\d+\\.jpg$"</span>, stem).groups()[<span class="hljs-number">0</span>]`,lang:"python",wrap:!1}}),H=new h({props:{code:"ZXh0cmFjdF9sYWJlbChmbmFtZSk=",highlighted:"extract_label(fname)",lang:"python",wrap:!1}}),P=new h({props:{code:"JTIyYmVhZ2xlJTIy",highlighted:'<span class="hljs-string">"beagle"</span>',lang:"python",wrap:!1}}),K=new h({props:{code:"Y2xhc3MlMjBQZXRzRGF0YXNldChEYXRhc2V0KSUzQSUwQSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYlMkMlMjBmaWxlX25hbWVzJTJDJTIwaW1hZ2VfdHJhbnNmb3JtJTNETm9uZSUyQyUyMGxhYmVsX3RvX2lkJTNETm9uZSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmZpbGVfbmFtZXMlMjAlM0QlMjBmaWxlX25hbWVzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5pbWFnZV90cmFuc2Zvcm0lMjAlM0QlMjBpbWFnZV90cmFuc2Zvcm0lMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLmxhYmVsX3RvX2lkJTIwJTNEJTIwbGFiZWxfdG9faWQlMEElMEElMjAlMjAlMjAlMjBkZWYlMjBfX2xlbl9fKHNlbGYpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwbGVuKHNlbGYuZmlsZV9uYW1lcyklMEElMEElMjAlMjAlMjAlMjBkZWYlMjBfX2dldGl0ZW1fXyhzZWxmJTJDJTIwaWR4KSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZuYW1lJTIwJTNEJTIwc2VsZi5maWxlX25hbWVzJTVCaWR4JTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmF3X2ltYWdlJTIwJTNEJTIwUElMLkltYWdlLm9wZW4oZm5hbWUpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaW1hZ2UlMjAlM0QlMjByYXdfaW1hZ2UuY29udmVydCglMjJSR0IlMjIpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBzZWxmLmltYWdlX3RyYW5zZm9ybSUyMGlzJTIwbm90JTIwTm9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGltYWdlJTIwJTNEJTIwc2VsZi5pbWFnZV90cmFuc2Zvcm0oaW1hZ2UpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGFiZWwlMjAlM0QlMjBleHRyYWN0X2xhYmVsKGZuYW1lKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwc2VsZi5sYWJlbF90b19pZCUyMGlzJTIwbm90JTIwTm9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxhYmVsJTIwJTNEJTIwc2VsZi5sYWJlbF90b19pZCU1QmxhYmVsJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwJTdCJTIyaW1hZ2UlMjIlM0ElMjBpbWFnZSUyQyUyMCUyMmxhYmVsJTIyJTNBJTIwbGFiZWwlN0Q=",highlighted:`<span class="hljs-keyword">class</span> <span class="hljs-title class_">PetsDataset</span>(<span class="hljs-title class_ inherited__">Dataset</span>): | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, file_names, image_transform=<span class="hljs-literal">None</span>, label_to_id=<span class="hljs-literal">None</span></span>): | |
| self.file_names = file_names | |
| self.image_transform = image_transform | |
| self.label_to_id = label_to_id | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__len__</span>(<span class="hljs-params">self</span>): | |
| <span class="hljs-keyword">return</span> <span class="hljs-built_in">len</span>(self.file_names) | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__getitem__</span>(<span class="hljs-params">self, idx</span>): | |
| fname = self.file_names[idx] | |
| raw_image = PIL.Image.<span class="hljs-built_in">open</span>(fname) | |
| image = raw_image.convert(<span class="hljs-string">"RGB"</span>) | |
| <span class="hljs-keyword">if</span> self.image_transform <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> <span class="hljs-literal">None</span>: | |
| image = self.image_transform(image) | |
| label = extract_label(fname) | |
| <span class="hljs-keyword">if</span> self.label_to_id <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> <span class="hljs-literal">None</span>: | |
| label = self.label_to_id[label] | |
| <span class="hljs-keyword">return</span> {<span class="hljs-string">"image"</span>: image, <span class="hljs-string">"label"</span>: label}`,lang:"python",wrap:!1}}),O=new h({props:{code:"Zm5hbWVzJTIwJTNEJTIwJTVCb3MucGF0aC5qb2luKCUyMi4uJTJGLi4lMkZpbWFnZXMlMjIlMkMlMjBmbmFtZSklMjBmb3IlMjBmbmFtZSUyMGluJTIwZm5hbWVzJTIwaWYlMjBmbmFtZS5lbmRzd2l0aCglMjIuanBnJTIyKSU1RA==",highlighted:'fnames = [os.path.join(<span class="hljs-string">"../../images"</span>, fname) <span class="hljs-keyword">for</span> fname <span class="hljs-keyword">in</span> fnames <span class="hljs-keyword">if</span> fname.endswith(<span class="hljs-string">".jpg"</span>)]',lang:"python",wrap:!1}}),le=new h({props:{code:"YWxsX2xhYmVscyUyMCUzRCUyMCU1QmV4dHJhY3RfbGFiZWwoZm5hbWUpJTIwZm9yJTIwZm5hbWUlMjBpbiUyMGZuYW1lcyU1RCUwQWlkX3RvX2xhYmVsJTIwJTNEJTIwbGlzdChzZXQoYWxsX2xhYmVscykpJTBBaWRfdG9fbGFiZWwuc29ydCgpJTBBbGFiZWxfdG9faWQlMjAlM0QlMjAlN0JsYmwlM0ElMjBpJTIwZm9yJTIwaSUyQyUyMGxibCUyMGluJTIwZW51bWVyYXRlKGlkX3RvX2xhYmVsKSU3RA==",highlighted:`all_labels = [extract_label(fname) <span class="hljs-keyword">for</span> fname <span class="hljs-keyword">in</span> fnames] | |
| id_to_label = <span class="hljs-built_in">list</span>(<span class="hljs-built_in">set</span>(all_labels)) | |
| id_to_label.sort() | |
| label_to_id = {lbl: i <span class="hljs-keyword">for</span> i, lbl <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(id_to_label)}`,lang:"python",wrap:!1}}),se=new h({props:{code:"ZGVmJTIwZ2V0X2RhdGFsb2FkZXJzKGJhdGNoX3NpemUlM0ElMjBpbnQlMjAlM0QlMjA2NCklM0ElMEElMjAlMjAlMjAlMjAlMjJCdWlsZHMlMjBhJTIwc2V0JTIwb2YlMjBkYXRhbG9hZGVycyUyMHdpdGglMjBhJTIwYmF0Y2hfc2l6ZSUyMiUwQSUyMCUyMCUyMCUyMHJhbmRvbV9wZXJtJTIwJTNEJTIwbnAucmFuZG9tLnBlcm11dGF0aW9uKGxlbihmbmFtZXMpKSUwQSUyMCUyMCUyMCUyMGN1dCUyMCUzRCUyMGludCgwLjglMjAqJTIwbGVuKGZuYW1lcykpJTBBJTIwJTIwJTIwJTIwdHJhaW5fc3BsaXQlMjAlM0QlMjByYW5kb21fcGVybSU1QiUzQWN1dCU1RCUwQSUyMCUyMCUyMCUyMGV2YWxfc3BsaXQlMjAlM0QlMjByYW5kb21fcGVybSU1QmN1dCUzQSU1RCUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMEZvciUyMHRyYWluaW5nJTIwYSUyMHNpbXBsZSUyMFJhbmRvbVJlc2l6ZWRDcm9wJTIwd2lsbCUyMGJlJTIwdXNlZCUwQSUyMCUyMCUyMCUyMHRyYWluX3RmbSUyMCUzRCUyMENvbXBvc2UoJTVCUmFuZG9tUmVzaXplZENyb3AoKDIyNCUyQyUyMDIyNCklMkMlMjBzY2FsZSUzRCgwLjUlMkMlMjAxLjApKSUyQyUyMFRvVGVuc29yKCklNUQpJTBBJTIwJTIwJTIwJTIwdHJhaW5fZGF0YXNldCUyMCUzRCUyMFBldHNEYXRhc2V0KCU1QmZuYW1lcyU1QmklNUQlMjBmb3IlMjBpJTIwaW4lMjB0cmFpbl9zcGxpdCU1RCUyQyUyMGltYWdlX3RyYW5zZm9ybSUzRHRyYWluX3RmbSUyQyUyMGxhYmVsX3RvX2lkJTNEbGFiZWxfdG9faWQpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwRm9yJTIwZXZhbHVhdGlvbiUyMGElMjBkZXRlcm1pbmlzdGljJTIwUmVzaXplJTIwd2lsbCUyMGJlJTIwdXNlZCUwQSUyMCUyMCUyMCUyMGV2YWxfdGZtJTIwJTNEJTIwQ29tcG9zZSglNUJSZXNpemUoKDIyNCUyQyUyMDIyNCkpJTJDJTIwVG9UZW5zb3IoKSU1RCklMEElMjAlMjAlMjAlMjBldmFsX2RhdGFzZXQlMjAlM0QlMjBQZXRzRGF0YXNldCglNUJmbmFtZXMlNUJpJTVEJTIwZm9yJTIwaSUyMGluJTIwZXZhbF9zcGxpdCU1RCUyQyUyMGltYWdlX3RyYW5zZm9ybSUzRGV2YWxfdGZtJTJDJTIwbGFiZWxfdG9faWQlM0RsYWJlbF90b19pZCklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBJbnN0YW50aWF0ZSUyMGRhdGFsb2FkZXJzJTBBJTIwJTIwJTIwJTIwdHJhaW5fZGF0YWxvYWRlciUyMCUzRCUyMERhdGFMb2FkZXIodHJhaW5fZGF0YXNldCUyQyUyMHNodWZmbGUlM0RUcnVlJTJDJTIwYmF0Y2hfc2l6ZSUzRGJhdGNoX3NpemUlMkMlMjBudW1fd29ya2VycyUzRDQpJTBBJTIwJTIwJTIwJTIwZXZhbF9kYXRhbG9hZGVyJTIwJTNEJTIwRGF0YUxvYWRlcihldmFsX2RhdGFzZXQlMkMlMjBzaHVmZmxlJTNERmFsc2UlMkMlMjBiYXRjaF9zaXplJTNEYmF0Y2hfc2l6ZSUyMColMjAyJTJDJTIwbnVtX3dvcmtlcnMlM0Q0KSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMHRyYWluX2RhdGFsb2FkZXIlMkMlMjBldmFsX2RhdGFsb2FkZXI=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_dataloaders</span>(<span class="hljs-params">batch_size: <span class="hljs-built_in">int</span> = <span class="hljs-number">64</span></span>): | |
| <span class="hljs-string">"Builds a set of dataloaders with a batch_size"</span> | |
| random_perm = np.random.permutation(<span class="hljs-built_in">len</span>(fnames)) | |
| cut = <span class="hljs-built_in">int</span>(<span class="hljs-number">0.8</span> * <span class="hljs-built_in">len</span>(fnames)) | |
| train_split = random_perm[:cut] | |
| eval_split = random_perm[cut:] | |
| <span class="hljs-comment"># For training a simple RandomResizedCrop will be used</span> | |
| train_tfm = Compose([RandomResizedCrop((<span class="hljs-number">224</span>, <span class="hljs-number">224</span>), scale=(<span class="hljs-number">0.5</span>, <span class="hljs-number">1.0</span>)), ToTensor()]) | |
| train_dataset = PetsDataset([fnames[i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> train_split], image_transform=train_tfm, label_to_id=label_to_id) | |
| <span class="hljs-comment"># For evaluation a deterministic Resize will be used</span> | |
| eval_tfm = Compose([Resize((<span class="hljs-number">224</span>, <span class="hljs-number">224</span>)), ToTensor()]) | |
| eval_dataset = PetsDataset([fnames[i] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> eval_split], image_transform=eval_tfm, label_to_id=label_to_id) | |
| <span class="hljs-comment"># Instantiate dataloaders</span> | |
| train_dataloader = DataLoader(train_dataset, shuffle=<span class="hljs-literal">True</span>, batch_size=batch_size, num_workers=<span class="hljs-number">4</span>) | |
| eval_dataloader = DataLoader(eval_dataset, shuffle=<span class="hljs-literal">False</span>, batch_size=batch_size * <span class="hljs-number">2</span>, num_workers=<span class="hljs-number">4</span>) | |
| <span class="hljs-keyword">return</span> train_dataloader, eval_dataloader`,lang:"python",wrap:!1}}),ne=new h({props:{code:"ZnJvbSUyMHRvcmNoLm9wdGltLmxyX3NjaGVkdWxlciUyMGltcG9ydCUyMENvc2luZUFubmVhbGluZ0xS",highlighted:'<span class="hljs-keyword">from</span> torch.optim.lr_scheduler <span class="hljs-keyword">import</span> CosineAnnealingLR',lang:"python",wrap:!1}}),pe=new il({props:{title:"Writing the Training Function",local:"writing-the-training-function",headingTag:"h2"}}),I=new Ml({props:{$$slots:{default:[Ma]},$$scope:{ctx:d}}}),re=new h({props:{code:"ZGVmJTIwdHJhaW5pbmdfbG9vcChtaXhlZF9wcmVjaXNpb24lM0QlMjJmcDE2JTIyJTJDJTIwc2VlZCUzQSUyMGludCUyMCUzRCUyMDQyJTJDJTIwYmF0Y2hfc2l6ZSUzQSUyMGludCUyMCUzRCUyMDY0KSUzQSUwQSUyMCUyMCUyMCUyMHNldF9zZWVkKHNlZWQpJTBBJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3IlMjAlM0QlMjBBY2NlbGVyYXRvcihtaXhlZF9wcmVjaXNpb24lM0RtaXhlZF9wcmVjaXNpb24p",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">training_loop</span>(<span class="hljs-params">mixed_precision=<span class="hljs-string">"fp16"</span>, seed: <span class="hljs-built_in">int</span> = <span class="hljs-number">42</span>, batch_size: <span class="hljs-built_in">int</span> = <span class="hljs-number">64</span></span>): | |
| set_seed(seed) | |
| accelerator = Accelerator(mixed_precision=mixed_precision)`,lang:"python",wrap:!1}}),f=new Ml({props:{warning:!0,$$slots:{default:[ia]},$$scope:{ctx:d}}}),me=new h({props:{code:"JTIwJTIwJTIwJTIwdHJhaW5fZGF0YWxvYWRlciUyQyUyMGV2YWxfZGF0YWxvYWRlciUyMCUzRCUyMGdldF9kYXRhbG9hZGVycyhiYXRjaF9zaXplKSUwQSUyMCUyMCUyMCUyMG1vZGVsJTIwJTNEJTIwY3JlYXRlX21vZGVsKCUyMnJlc25ldDUwZCUyMiUyQyUyMHByZXRyYWluZWQlM0RUcnVlJTJDJTIwbnVtX2NsYXNzZXMlM0RsZW4obGFiZWxfdG9faWQpKQ==",highlighted:` train_dataloader, eval_dataloader = get_dataloaders(batch_size) | |
| model = create_model(<span class="hljs-string">"resnet50d"</span>, pretrained=<span class="hljs-literal">True</span>, num_classes=<span class="hljs-built_in">len</span>(label_to_id))`,lang:"python",wrap:!1}}),C=new Ml({props:{$$slots:{default:[ra]},$$scope:{ctx:d}}}),we=new h({props:{code:"JTIwJTIwJTIwJTIwZm9yJTIwcGFyYW0lMjBpbiUyMG1vZGVsLnBhcmFtZXRlcnMoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhcmFtLnJlcXVpcmVzX2dyYWQlMjAlM0QlMjBGYWxzZSUwQSUyMCUyMCUyMCUyMGZvciUyMHBhcmFtJTIwaW4lMjBtb2RlbC5nZXRfY2xhc3NpZmllcigpLnBhcmFtZXRlcnMoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhcmFtLnJlcXVpcmVzX2dyYWQlMjAlM0QlMjBUcnVl",highlighted:` <span class="hljs-keyword">for</span> param <span class="hljs-keyword">in</span> model.parameters(): | |
| param.requires_grad = <span class="hljs-literal">False</span> | |
| <span class="hljs-keyword">for</span> param <span class="hljs-keyword">in</span> model.get_classifier().parameters(): | |
| param.requires_grad = <span class="hljs-literal">True</span>`,lang:"python",wrap:!1}}),Te=new h({props:{code:"JTIwJTIwJTIwJTIwbWVhbiUyMCUzRCUyMHRvcmNoLnRlbnNvcihtb2RlbC5kZWZhdWx0X2NmZyU1QiUyMm1lYW4lMjIlNUQpJTVCTm9uZSUyQyUyMCUzQSUyQyUyME5vbmUlMkMlMjBOb25lJTVEJTBBJTIwJTIwJTIwJTIwc3RkJTIwJTNEJTIwdG9yY2gudGVuc29yKG1vZGVsLmRlZmF1bHRfY2ZnJTVCJTIyc3RkJTIyJTVEKSU1Qk5vbmUlMkMlMjAlM0ElMkMlMjBOb25lJTJDJTIwTm9uZSU1RA==",highlighted:` mean = torch.tensor(model.default_cfg[<span class="hljs-string">"mean"</span>])[<span class="hljs-literal">None</span>, :, <span class="hljs-literal">None</span>, <span class="hljs-literal">None</span>] | |
| std = torch.tensor(model.default_cfg[<span class="hljs-string">"std"</span>])[<span class="hljs-literal">None</span>, :, <span class="hljs-literal">None</span>, <span class="hljs-literal">None</span>]`,lang:"python",wrap:!1}}),Ue=new h({props:{code:"JTIwJTIwJTIwJTIwbWVhbiUyMCUzRCUyMG1lYW4udG8oYWNjZWxlcmF0b3IuZGV2aWNlKSUwQSUyMCUyMCUyMCUyMHN0ZCUyMCUzRCUyMHN0ZC50byhhY2NlbGVyYXRvci5kZXZpY2Up",highlighted:` mean = mean.to(accelerator.device) | |
| std = std.to(accelerator.device)`,lang:"python",wrap:!1}}),de=new h({props:{code:"JTIwJTIwJTIwJTIwb3B0aW1pemVyJTIwJTNEJTIwdG9yY2gub3B0aW0uQWRhbShwYXJhbXMlM0Rtb2RlbC5wYXJhbWV0ZXJzKCklMkMlMjBsciUzRDNlLTIlMjAlMkYlMjAyNSklMEElMjAlMjAlMjAlMjBscl9zY2hlZHVsZXIlMjAlM0QlMjBPbmVDeWNsZUxSKG9wdGltaXplciUzRG9wdGltaXplciUyQyUyMG1heF9sciUzRDNlLTIlMkMlMjBlcG9jaHMlM0Q1JTJDJTIwc3RlcHNfcGVyX2Vwb2NoJTNEbGVuKHRyYWluX2RhdGFsb2FkZXIpKQ==",highlighted:` optimizer = torch.optim.Adam(params=model.parameters(), lr=<span class="hljs-number">3e-2</span> / <span class="hljs-number">25</span>) | |
| lr_scheduler = OneCycleLR(optimizer=optimizer, max_lr=<span class="hljs-number">3e-2</span>, epochs=<span class="hljs-number">5</span>, steps_per_epoch=<span class="hljs-built_in">len</span>(train_dataloader))`,lang:"python",wrap:!1}}),$=new Ml({props:{$$slots:{default:[oa]},$$scope:{ctx:d}}}),be=new h({props:{code:"JTIwJTIwJTIwJTIwbW9kZWwlMkMlMjBvcHRpbWl6ZXIlMkMlMjB0cmFpbl9kYXRhbG9hZGVyJTJDJTIwZXZhbF9kYXRhbG9hZGVyJTJDJTIwbHJfc2NoZWR1bGVyJTIwJTNEJTIwYWNjZWxlcmF0b3IucHJlcGFyZSglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtb2RlbCUyQyUyMG9wdGltaXplciUyQyUyMHRyYWluX2RhdGFsb2FkZXIlMkMlMjBldmFsX2RhdGFsb2FkZXIlMkMlMjBscl9zY2hlZHVsZXIlMEElMjAlMjAlMjAlMjAp",highlighted:` model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( | |
| model, optimizer, train_dataloader, eval_dataloader, lr_scheduler | |
| )`,lang:"python",wrap:!1}}),fe=new h({props:{code:"JTIwJTIwJTIwJTIwZm9yJTIwZXBvY2glMjBpbiUyMHJhbmdlKDUpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbW9kZWwudHJhaW4oKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMGJhdGNoJTIwaW4lMjB0cmFpbl9kYXRhbG9hZGVyJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaW5wdXRzJTIwJTNEJTIwKGJhdGNoJTVCJTIyaW1hZ2UlMjIlNUQlMjAtJTIwbWVhbiklMjAlMkYlMjBzdGQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvdXRwdXRzJTIwJTNEJTIwbW9kZWwoaW5wdXRzKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxvc3MlMjAlM0QlMjB0b3JjaC5ubi5mdW5jdGlvbmFsLmNyb3NzX2VudHJvcHkob3V0cHV0cyUyQyUyMGJhdGNoJTVCJTIybGFiZWwlMjIlNUQpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3IuYmFja3dhcmQobG9zcyklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcHRpbWl6ZXIuc3RlcCgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbHJfc2NoZWR1bGVyLnN0ZXAoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG9wdGltaXplci56ZXJvX2dyYWQoKQ==",highlighted:` <span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">5</span>): | |
| model.train() | |
| <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> train_dataloader: | |
| inputs = (batch[<span class="hljs-string">"image"</span>] - mean) / std | |
| outputs = model(inputs) | |
| loss = torch.nn.functional.cross_entropy(outputs, batch[<span class="hljs-string">"label"</span>]) | |
| accelerator.backward(loss) | |
| optimizer.step() | |
| lr_scheduler.step() | |
| optimizer.zero_grad()`,lang:"python",wrap:!1}}),$e=new h({props:{code:"JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbW9kZWwuZXZhbCgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjdXJhdGUlMjAlM0QlMjAwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX2VsZW1zJTIwJTNEJTIwMA==",highlighted:` model.<span class="hljs-built_in">eval</span>() | |
| accurate = <span class="hljs-number">0</span> | |
| num_elems = <span class="hljs-number">0</span>`,lang:"python",wrap:!1}}),ge=new h({props:{code:"JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZm9yJTIwYmF0Y2glMjBpbiUyMGV2YWxfZGF0YWxvYWRlciUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlucHV0cyUyMCUzRCUyMChiYXRjaCU1QiUyMmltYWdlJTIyJTVEJTIwLSUyMG1lYW4pJTIwJTJGJTIwc3RkJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2l0aCUyMHRvcmNoLm5vX2dyYWQoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG91dHB1dHMlMjAlM0QlMjBtb2RlbChpbnB1dHMpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJlZGljdGlvbnMlMjAlM0QlMjBvdXRwdXRzLmFyZ21heChkaW0lM0QtMSk=",highlighted:` <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> eval_dataloader: | |
| inputs = (batch[<span class="hljs-string">"image"</span>] - mean) / std | |
| <span class="hljs-keyword">with</span> torch.no_grad(): | |
| outputs = model(inputs) | |
| predictions = outputs.argmax(dim=-<span class="hljs-number">1</span>)`,lang:"python",wrap:!1}}),ke=new h({props:{code:"JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjdXJhdGVfcHJlZHMlMjAlM0QlMjBhY2NlbGVyYXRvci5nYXRoZXIocHJlZGljdGlvbnMpJTIwJTNEJTNEJTIwYWNjZWxlcmF0b3IuZ2F0aGVyKGJhdGNoJTVCJTIybGFiZWwlMjIlNUQpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX2VsZW1zJTIwJTJCJTNEJTIwYWNjdXJhdGVfcHJlZHMuc2hhcGUlNUIwJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjdXJhdGUlMjAlMkIlM0QlMjBhY2N1cmF0ZV9wcmVkcy5sb25nKCkuc3VtKCk=",highlighted:` accurate_preds = accelerator.gather(predictions) == accelerator.gather(batch[<span class="hljs-string">"label"</span>]) | |
| num_elems += accurate_preds.shape[<span class="hljs-number">0</span>] | |
| accurate += accurate_preds.long().<span class="hljs-built_in">sum</span>()`,lang:"python",wrap:!1}}),Be=new h({props:{code:"JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZXZhbF9tZXRyaWMlMjAlM0QlMjBhY2N1cmF0ZS5pdGVtKCklMjAlMkYlMjBudW1fZWxlbXMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY2NlbGVyYXRvci5wcmludChmJTIyZXBvY2glMjAlN0JlcG9jaCU3RCUzQSUyMCU3QjEwMCUyMColMjBldmFsX21ldHJpYyUzQS4yZiU3RCUyMik=",highlighted:` eval_metric = accurate.item() / num_elems | |
| accelerator.<span class="hljs-built_in">print</span>(<span class="hljs-string">f"epoch <span class="hljs-subst">{epoch}</span>: <span class="hljs-subst">{<span class="hljs-number">100</span> * eval_metric:<span class="hljs-number">.2</span>f}</span>"</span>)`,lang:"python",wrap:!1}}),Xe=new h({props:{code:"ZGVmJTIwdHJhaW5pbmdfbG9vcChtaXhlZF9wcmVjaXNpb24lM0QlMjJmcDE2JTIyJTJDJTIwc2VlZCUzQSUyMGludCUyMCUzRCUyMDQyJTJDJTIwYmF0Y2hfc2l6ZSUzQSUyMGludCUyMCUzRCUyMDY0KSUzQSUwQSUyMCUyMCUyMCUyMHNldF9zZWVkKHNlZWQpJTBBJTIwJTIwJTIwJTIwJTIzJTIwSW5pdGlhbGl6ZSUyMGFjY2VsZXJhdG9yJTBBJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3IlMjAlM0QlMjBBY2NlbGVyYXRvcihtaXhlZF9wcmVjaXNpb24lM0RtaXhlZF9wcmVjaXNpb24pJTBBJTIwJTIwJTIwJTIwJTIzJTIwQnVpbGQlMjBkYXRhbG9hZGVycyUwQSUyMCUyMCUyMCUyMHRyYWluX2RhdGFsb2FkZXIlMkMlMjBldmFsX2RhdGFsb2FkZXIlMjAlM0QlMjBnZXRfZGF0YWxvYWRlcnMoYmF0Y2hfc2l6ZSklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBJbnN0YW50aWF0ZSUyMHRoZSUyMG1vZGVsJTIwKHlvdSUyMGJ1aWxkJTIwdGhlJTIwbW9kZWwlMjBoZXJlJTIwc28lMjB0aGF0JTIwdGhlJTIwc2VlZCUyMGFsc28lMjBjb250cm9scyUyMG5ldyUyMHdlaWdodCUyMGluaXRpYWxpemF0aW9ucyklMEElMjAlMjAlMjAlMjBtb2RlbCUyMCUzRCUyMGNyZWF0ZV9tb2RlbCglMjJyZXNuZXQ1MGQlMjIlMkMlMjBwcmV0cmFpbmVkJTNEVHJ1ZSUyQyUyMG51bV9jbGFzc2VzJTNEbGVuKGxhYmVsX3RvX2lkKSklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBGcmVlemUlMjB0aGUlMjBiYXNlJTIwbW9kZWwlMEElMjAlMjAlMjAlMjBmb3IlMjBwYXJhbSUyMGluJTIwbW9kZWwucGFyYW1ldGVycygpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcGFyYW0ucmVxdWlyZXNfZ3JhZCUyMCUzRCUyMEZhbHNlJTBBJTIwJTIwJTIwJTIwZm9yJTIwcGFyYW0lMjBpbiUyMG1vZGVsLmdldF9jbGFzc2lmaWVyKCkucGFyYW1ldGVycygpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcGFyYW0ucmVxdWlyZXNfZ3JhZCUyMCUzRCUyMFRydWUlMEElMEElMjAlMjAlMjAlMjAlMjMlMjBZb3UlMjBjYW4lMjBub3JtYWxpemUlMjB0aGUlMjBiYXRjaGVzJTIwb2YlMjBpbWFnZXMlMjB0byUyMGJlJTIwYSUyMGJpdCUyMGZhc3RlciUwQSUyMCUyMCUyMCUyMG1lYW4lMjAlM0QlMjB0b3JjaC50ZW5zb3IobW9kZWwuZGVmYXVsdF9jZmclNUIlMjJtZWFuJTIyJTVEKSU1Qk5vbmUlMkMlMjAlM0ElMkMlMjBOb25lJTJDJTIwTm9uZSU1RCUwQSUyMCUyMCUyMCUyMHN0ZCUyMCUzRCUyMHRvcmNoLnRlbnNvcihtb2RlbC5kZWZhdWx0X2NmZyU1QiUyMnN0ZCUyMiU1RCklNUJOb25lJTJDJTIwJTNBJTJDJTIwTm9uZSUyQyUyME5vbmUlNUQlMEElMEElMjAlMjAlMjAlMjAlMjMlMjBUbyUyMG1ha2UlMjB0aGVzZSUyMGNvbnN0YW50cyUyMGF2YWlsYWJsZSUyMG9uJTIwdGhlJTIwYWN0aXZlJTIwZGV2aWNlJTJDJTIwc2V0JTIwaXQlMjB0byUyMHRoZSUyMGFjY2VsZXJhdG9yJTIwZGV2aWNlJTBBJTIwJTIwJTIwJTIwbWVhbiUyMCUzRCUyMG1lYW4udG8oYWNjZWxlcmF0b3IuZGV2aWNlKSUwQSUyMCUyMCUyMCUyMHN0ZCUyMCUzRCUyMHN0ZC50byhhY2NlbGVyYXRvci5kZXZpY2UpJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwSW5zdGFudGlhdGUlMjB0aGUlMjBvcHRpbWl6ZXIlMEElMjAlMjAlMjAlMjBvcHRpbWl6ZXIlMjAlM0QlMjB0b3JjaC5vcHRpbS5BZGFtKHBhcmFtcyUzRG1vZGVsLnBhcmFtZXRlcnMoKSUyQyUyMGxyJTNEM2UtMiUyMCUyRiUyMDI1KSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMEluc3RhbnRpYXRlJTIwdGhlJTIwbGVhcm5pbmclMjByYXRlJTIwc2NoZWR1bGVyJTBBJTIwJTIwJTIwJTIwbHJfc2NoZWR1bGVyJTIwJTNEJTIwT25lQ3ljbGVMUihvcHRpbWl6ZXIlM0RvcHRpbWl6ZXIlMkMlMjBtYXhfbHIlM0QzZS0yJTJDJTIwZXBvY2hzJTNENSUyQyUyMHN0ZXBzX3Blcl9lcG9jaCUzRGxlbih0cmFpbl9kYXRhbG9hZGVyKSklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBQcmVwYXJlJTIwZXZlcnl0aGluZyUwQSUyMCUyMCUyMCUyMCUyMyUyMFRoZXJlJTIwaXMlMjBubyUyMHNwZWNpZmljJTIwb3JkZXIlMjB0byUyMHJlbWVtYmVyJTJDJTIweW91JTIwanVzdCUyMG5lZWQlMjB0byUyMHVucGFjayUyMHRoZSUyMG9iamVjdHMlMjBpbiUyMHRoZSUyMHNhbWUlMjBvcmRlciUyMHlvdSUyMGdhdmUlMjB0aGVtJTIwdG8lMjB0aGUlMEElMjAlMjAlMjAlMjAlMjMlMjBwcmVwYXJlJTIwbWV0aG9kLiUwQSUyMCUyMCUyMCUyMG1vZGVsJTJDJTIwb3B0aW1pemVyJTJDJTIwdHJhaW5fZGF0YWxvYWRlciUyQyUyMGV2YWxfZGF0YWxvYWRlciUyQyUyMGxyX3NjaGVkdWxlciUyMCUzRCUyMGFjY2VsZXJhdG9yLnByZXBhcmUoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbW9kZWwlMkMlMjBvcHRpbWl6ZXIlMkMlMjB0cmFpbl9kYXRhbG9hZGVyJTJDJTIwZXZhbF9kYXRhbG9hZGVyJTJDJTIwbHJfc2NoZWR1bGVyJTBBJTIwJTIwJTIwJTIwKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyME5vdyUyMHlvdSUyMHRyYWluJTIwdGhlJTIwbW9kZWwlMEElMjAlMjAlMjAlMjBmb3IlMjBlcG9jaCUyMGluJTIwcmFuZ2UoNSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBtb2RlbC50cmFpbigpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZm9yJTIwYmF0Y2glMjBpbiUyMHRyYWluX2RhdGFsb2FkZXIlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpbnB1dHMlMjAlM0QlMjAoYmF0Y2glNUIlMjJpbWFnZSUyMiU1RCUyMC0lMjBtZWFuKSUyMCUyRiUyMHN0ZCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG91dHB1dHMlMjAlM0QlMjBtb2RlbChpbnB1dHMpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbG9zcyUyMCUzRCUyMHRvcmNoLm5uLmZ1bmN0aW9uYWwuY3Jvc3NfZW50cm9weShvdXRwdXRzJTJDJTIwYmF0Y2glNUIlMjJsYWJlbCUyMiU1RCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY2NlbGVyYXRvci5iYWNrd2FyZChsb3NzKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG9wdGltaXplci5zdGVwKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBscl9zY2hlZHVsZXIuc3RlcCgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3B0aW1pemVyLnplcm9fZ3JhZCgpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbW9kZWwuZXZhbCgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjdXJhdGUlMjAlM0QlMjAwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX2VsZW1zJTIwJTNEJTIwMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMGJhdGNoJTIwaW4lMjBldmFsX2RhdGFsb2FkZXIlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpbnB1dHMlMjAlM0QlMjAoYmF0Y2glNUIlMjJpbWFnZSUyMiU1RCUyMC0lMjBtZWFuKSUyMCUyRiUyMHN0ZCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHdpdGglMjB0b3JjaC5ub19ncmFkKCklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvdXRwdXRzJTIwJTNEJTIwbW9kZWwoaW5wdXRzKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByZWRpY3Rpb25zJTIwJTNEJTIwb3V0cHV0cy5hcmdtYXgoZGltJTNELTEpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjdXJhdGVfcHJlZHMlMjAlM0QlMjBhY2NlbGVyYXRvci5nYXRoZXIocHJlZGljdGlvbnMpJTIwJTNEJTNEJTIwYWNjZWxlcmF0b3IuZ2F0aGVyKGJhdGNoJTVCJTIybGFiZWwlMjIlNUQpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbnVtX2VsZW1zJTIwJTJCJTNEJTIwYWNjdXJhdGVfcHJlZHMuc2hhcGUlNUIwJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjdXJhdGUlMjAlMkIlM0QlMjBhY2N1cmF0ZV9wcmVkcy5sb25nKCkuc3VtKCklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBldmFsX21ldHJpYyUyMCUzRCUyMGFjY3VyYXRlLml0ZW0oKSUyMCUyRiUyMG51bV9lbGVtcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFVzZSUyMGFjY2VsZXJhdG9yLnByaW50JTIwdG8lMjBwcmludCUyMG9ubHklMjBvbiUyMHRoZSUyMG1haW4lMjBwcm9jZXNzLiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGFjY2VsZXJhdG9yLnByaW50KGYlMjJlcG9jaCUyMCU3QmVwb2NoJTdEJTNBJTIwJTdCMTAwJTIwKiUyMGV2YWxfbWV0cmljJTNBLjJmJTdEJTIyKQ==",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">training_loop</span>(<span class="hljs-params">mixed_precision=<span class="hljs-string">"fp16"</span>, seed: <span class="hljs-built_in">int</span> = <span class="hljs-number">42</span>, batch_size: <span class="hljs-built_in">int</span> = <span class="hljs-number">64</span></span>): | |
| set_seed(seed) | |
| <span class="hljs-comment"># Initialize accelerator</span> | |
| accelerator = Accelerator(mixed_precision=mixed_precision) | |
| <span class="hljs-comment"># Build dataloaders</span> | |
| train_dataloader, eval_dataloader = get_dataloaders(batch_size) | |
| <span class="hljs-comment"># Instantiate the model (you build the model here so that the seed also controls new weight initializations)</span> | |
| model = create_model(<span class="hljs-string">"resnet50d"</span>, pretrained=<span class="hljs-literal">True</span>, num_classes=<span class="hljs-built_in">len</span>(label_to_id)) | |
| <span class="hljs-comment"># Freeze the base model</span> | |
| <span class="hljs-keyword">for</span> param <span class="hljs-keyword">in</span> model.parameters(): | |
| param.requires_grad = <span class="hljs-literal">False</span> | |
| <span class="hljs-keyword">for</span> param <span class="hljs-keyword">in</span> model.get_classifier().parameters(): | |
| param.requires_grad = <span class="hljs-literal">True</span> | |
| <span class="hljs-comment"># You can normalize the batches of images to be a bit faster</span> | |
| mean = torch.tensor(model.default_cfg[<span class="hljs-string">"mean"</span>])[<span class="hljs-literal">None</span>, :, <span class="hljs-literal">None</span>, <span class="hljs-literal">None</span>] | |
| std = torch.tensor(model.default_cfg[<span class="hljs-string">"std"</span>])[<span class="hljs-literal">None</span>, :, <span class="hljs-literal">None</span>, <span class="hljs-literal">None</span>] | |
| <span class="hljs-comment"># To make these constants available on the active device, set it to the accelerator device</span> | |
| mean = mean.to(accelerator.device) | |
| std = std.to(accelerator.device) | |
| <span class="hljs-comment"># Instantiate the optimizer</span> | |
| optimizer = torch.optim.Adam(params=model.parameters(), lr=<span class="hljs-number">3e-2</span> / <span class="hljs-number">25</span>) | |
| <span class="hljs-comment"># Instantiate the learning rate scheduler</span> | |
| lr_scheduler = OneCycleLR(optimizer=optimizer, max_lr=<span class="hljs-number">3e-2</span>, epochs=<span class="hljs-number">5</span>, steps_per_epoch=<span class="hljs-built_in">len</span>(train_dataloader)) | |
| <span class="hljs-comment"># Prepare everything</span> | |
| <span class="hljs-comment"># There is no specific order to remember, you just need to unpack the objects in the same order you gave them to the</span> | |
| <span class="hljs-comment"># prepare method.</span> | |
| model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( | |
| model, optimizer, train_dataloader, eval_dataloader, lr_scheduler | |
| ) | |
| <span class="hljs-comment"># Now you train the model</span> | |
| <span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">5</span>): | |
| model.train() | |
| <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> train_dataloader: | |
| inputs = (batch[<span class="hljs-string">"image"</span>] - mean) / std | |
| outputs = model(inputs) | |
| loss = torch.nn.functional.cross_entropy(outputs, batch[<span class="hljs-string">"label"</span>]) | |
| accelerator.backward(loss) | |
| optimizer.step() | |
| lr_scheduler.step() | |
| optimizer.zero_grad() | |
| model.<span class="hljs-built_in">eval</span>() | |
| accurate = <span class="hljs-number">0</span> | |
| num_elems = <span class="hljs-number">0</span> | |
| <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> eval_dataloader: | |
| inputs = (batch[<span class="hljs-string">"image"</span>] - mean) / std | |
| <span class="hljs-keyword">with</span> torch.no_grad(): | |
| outputs = model(inputs) | |
| predictions = outputs.argmax(dim=-<span class="hljs-number">1</span>) | |
| accurate_preds = accelerator.gather(predictions) == accelerator.gather(batch[<span class="hljs-string">"label"</span>]) | |
| num_elems += accurate_preds.shape[<span class="hljs-number">0</span>] | |
| accurate += accurate_preds.long().<span class="hljs-built_in">sum</span>() | |
| eval_metric = accurate.item() / num_elems | |
| <span class="hljs-comment"># Use accelerator.print to print only on the main process.</span> | |
| accelerator.<span class="hljs-built_in">print</span>(<span class="hljs-string">f"epoch <span class="hljs-subst">{epoch}</span>: <span class="hljs-subst">{<span class="hljs-number">100</span> * eval_metric:<span class="hljs-number">.2</span>f}</span>"</span>)`,lang:"python",wrap:!1}}),Ye=new il({props:{title:"Using the notebook_launcher",local:"using-the-notebooklauncher",headingTag:"h2"}}),Re=new h({props:{code:"ZnJvbSUyMGFjY2VsZXJhdGUlMjBpbXBvcnQlMjBub3RlYm9va19sYXVuY2hlcg==",highlighted:'<span class="hljs-keyword">from</span> accelerate <span class="hljs-keyword">import</span> notebook_launcher',lang:"python",wrap:!1}}),Ve=new h({props:{code:"YXJncyUyMCUzRCUyMCglMjJmcDE2JTIyJTJDJTIwNDIlMkMlMjA2NCklMEFub3RlYm9va19sYXVuY2hlcih0cmFpbmluZ19sb29wJTJDJTIwYXJncyUyQyUyMG51bV9wcm9jZXNzZXMlM0QyKQ==",highlighted:`args = (<span class="hljs-string">"fp16"</span>, <span class="hljs-number">42</span>, <span class="hljs-number">64</span>) | |
| notebook_launcher(training_loop, args, num_processes=<span class="hljs-number">2</span>)`,lang:"python",wrap:!1}}),Qe=new h({props:{code:"bm90ZWJvb2tfbGF1bmNoZXIodHJhaW5pbmdfbG9vcCUyQyUyMGFyZ3MlMkMlMjBtYXN0ZXJfYWRkciUzRCUyMjE3Mi4zMS40My44JTIyJTJDJTIwbm9kZV9yYW5rJTNEMCUyQyUyMG51bV9ub2RlcyUzRDIlMkMlMjBudW1fcHJvY2Vzc2VzJTNEOCk=",highlighted:'notebook_launcher(training_loop, args, master_addr=<span class="hljs-string">"172.31.43.8"</span>, node_rank=<span class="hljs-number">0</span>, num_nodes=<span class="hljs-number">2</span>, num_processes=<span class="hljs-number">8</span>)',lang:"python",wrap:!1}}),Z=new Ml({props:{$$slots:{default:[ca]},$$scope:{ctx:d}}}),Ee=new h({props:{code:"bm90ZWJvb2tfbGF1bmNoZXIodHJhaW5pbmdfbG9vcCUyQyUyMGFyZ3MlMkMlMjBtYXN0ZXJfYWRkciUzRCUyMjE3Mi4zMS40My44JTIyJTJDJTIwbm9kZV9yYW5rJTNEMSUyQyUyMG51bV9ub2RlcyUzRDIlMkMlMjBudW1fcHJvY2Vzc2VzJTNEOCk=",highlighted:'notebook_launcher(training_loop, args, master_addr=<span class="hljs-string">"172.31.43.8"</span>, node_rank=<span class="hljs-number">1</span>, num_nodes=<span class="hljs-number">2</span>, num_processes=<span class="hljs-number">8</span>)',lang:"python",wrap:!1}}),He=new h({props:{code:"bW9kZWwlMjAlM0QlMjBjcmVhdGVfbW9kZWwoJTIycmVzbmV0NTBkJTIyJTJDJTIwcHJldHJhaW5lZCUzRFRydWUlMkMlMjBudW1fY2xhc3NlcyUzRGxlbihsYWJlbF90b19pZCkpJTBBJTBBYXJncyUyMCUzRCUyMChtb2RlbCUyQyUyMCUyMmZwMTYlMjIlMkMlMjA0MiUyQyUyMDY0KSUwQW5vdGVib29rX2xhdW5jaGVyKHRyYWluaW5nX2xvb3AlMkMlMjBhcmdzJTJDJTIwbnVtX3Byb2Nlc3NlcyUzRDgp",highlighted:`model = create_model(<span class="hljs-string">"resnet50d"</span>, pretrained=<span class="hljs-literal">True</span>, num_classes=<span class="hljs-built_in">len</span>(label_to_id)) | |
| args = (model, <span class="hljs-string">"fp16"</span>, <span class="hljs-number">42</span>, <span class="hljs-number">64</span>) | |
| notebook_launcher(training_loop, args, num_processes=<span class="hljs-number">8</span>)`,lang:"python",wrap:!1}}),Pe=new h({props:{code:"bm90ZWJvb2tfbGF1bmNoZXIoJTBBJTIwJTIwJTIwJTIwdHJhaW5pbmdfbG9vcCUyQyUwQSUyMCUyMCUyMCUyMGFyZ3MlMkMlMEElMjAlMjAlMjAlMjBudW1fcHJvY2Vzc2VzJTNEMiUyQyUwQSUyMCUyMCUyMCUyMG1heF9yZXN0YXJ0cyUzRDMlMEEp",highlighted:`notebook_launcher( | |
| training_loop, | |
| args, | |
| num_processes=<span class="hljs-number">2</span>, | |
| max_restarts=<span class="hljs-number">3</span> | |
| )`,lang:"python",wrap:!1}}),Ke=new h({props:{code:"TGF1bmNoaW5nJTIwdHJhaW5pbmclMjBvbiUyMDIlMjBHUFVzLiUwQWVwb2NoJTIwMCUzQSUyMDg4LjEyJTBBZXBvY2glMjAxJTNBJTIwOTEuNzMlMEFlcG9jaCUyMDIlM0ElMjA5Mi41OCUwQWVwb2NoJTIwMyUzQSUyMDkzLjkwJTBBZXBvY2glMjA0JTNBJTIwOTQuNzE=",highlighted:`Launching training on <span class="hljs-number">2</span> GPUs. | |
| epoch <span class="hljs-number">0</span>: <span class="hljs-number">88.12</span> | |
| epoch <span class="hljs-number">1</span>: <span class="hljs-number">91.73</span> | |
| epoch <span class="hljs-number">2</span>: <span class="hljs-number">92.58</span> | |
| epoch <span class="hljs-number">3</span>: <span class="hljs-number">93.90</span> | |
| epoch <span class="hljs-number">4</span>: <span class="hljs-number">94.71</span>`,lang:"python",wrap:!1}}),el=new h({props:{code:"YWNjZWxlcmF0ZSUyMGxhdW5jaA==",highlighted:"accelerate launch",lang:"bash",wrap:!1}}),ll=new il({props:{title:"Debugging",local:"debugging",headingTag:"h2"}}),sl=new il({props:{title:"Conclusion",local:"conclusion",headingTag:"h2"}}),pl=new aa({props:{source:"https://github.com/huggingface/accelerate/blob/main/docs/source/basic_tutorials/notebook.md"}}),{c(){p=M("meta"),U=a(),T=M("p"),j=a(),o(g.$$.fragment),cl=a(),o(G.$$.fragment),ml=a(),_=M("p"),_.textContent=qt,yl=a(),o(u.$$.fragment),wl=a(),o(k.$$.fragment),Jl=a(),W=M("p"),W.textContent=Ot,Tl=a(),o(B.$$.fragment),hl=a(),v=M("p"),v.innerHTML=es,Ul=a(),X=M("p"),X.textContent=ls,jl=a(),o(b.$$.fragment),dl=a(),o(Y.$$.fragment),ul=a(),o(N.$$.fragment),bl=a(),A=M("p"),A.innerHTML=ts,Il=a(),R=M("p"),R.textContent=ss,fl=a(),V=M("p"),V.innerHTML=as,Cl=a(),o(x.$$.fragment),$l=a(),F=M("p"),F.textContent=ns,Zl=a(),o(Q.$$.fragment),gl=a(),o(z.$$.fragment),Gl=a(),E=M("p"),E.innerHTML=ps,_l=a(),o(S.$$.fragment),kl=a(),o(H.$$.fragment),Wl=a(),L=M("p"),L.textContent=Ms,Bl=a(),o(P.$$.fragment),vl=a(),D=M("p"),D.innerHTML=is,Xl=a(),o(K.$$.fragment),Yl=a(),q=M("p"),q.textContent=rs,Nl=a(),o(O.$$.fragment),Al=a(),ee=M("p"),ee.textContent=os,Rl=a(),o(le.$$.fragment),Vl=a(),te=M("p"),te.innerHTML=cs,xl=a(),o(se.$$.fragment),Fl=a(),ae=M("p"),ae.textContent=ms,Ql=a(),o(ne.$$.fragment),zl=a(),o(pe.$$.fragment),El=a(),Me=M("p"),Me.innerHTML=ys,Sl=a(),ie=M("p"),ie.textContent=ws,Hl=a(),o(I.$$.fragment),Ll=a(),o(re.$$.fragment),Pl=a(),oe=M("p"),oe.innerHTML=Js,Dl=a(),o(f.$$.fragment),Kl=a(),ce=M("p"),ce.textContent=Ts,ql=a(),o(me.$$.fragment),Ol=a(),o(C.$$.fragment),et=a(),ye=M("p"),ye.textContent=hs,lt=a(),o(we.$$.fragment),tt=a(),Je=M("p"),Je.textContent=Us,st=a(),o(Te.$$.fragment),at=a(),he=M("p"),he.textContent=js,nt=a(),o(Ue.$$.fragment),pt=a(),je=M("p"),je.textContent=ds,Mt=a(),o(de.$$.fragment),it=a(),ue=M("p"),ue.innerHTML=us,rt=a(),o($.$$.fragment),ot=a(),o(be.$$.fragment),ct=a(),Ie=M("p"),Ie.textContent=bs,mt=a(),o(fe.$$.fragment),yt=a(),Ce=M("p"),Ce.textContent=Is,wt=a(),o($e.$$.fragment),Jt=a(),Ze=M("p"),Ze.textContent=fs,Tt=a(),o(ge.$$.fragment),ht=a(),Ge=M("p"),Ge.textContent=Cs,Ut=a(),_e=M("p"),_e.innerHTML=$s,jt=a(),o(ke.$$.fragment),dt=a(),We=M("p"),We.innerHTML=Zs,ut=a(),o(Be.$$.fragment),bt=a(),ve=M("p"),ve.textContent=gs,It=a(),o(Xe.$$.fragment),ft=a(),o(Ye.$$.fragment),Ct=a(),Ne=M("p"),Ne.innerHTML=Gs,$t=a(),Ae=M("p"),Ae.innerHTML=_s,Zt=a(),o(Re.$$.fragment),gt=a(),o(Ve.$$.fragment),Gt=a(),xe=M("p"),xe.textContent=ks,_t=a(),Fe=M("p"),Fe.textContent=Ws,kt=a(),o(Qe.$$.fragment),Wt=a(),ze=M("p"),ze.textContent=Bs,Bt=a(),o(Z.$$.fragment),vt=a(),o(Ee.$$.fragment),Xt=a(),Se=M("p"),Se.textContent=vs,Yt=a(),o(He.$$.fragment),Nt=a(),Le=M("p"),Le.innerHTML=Xs,At=a(),o(Pe.$$.fragment),Rt=a(),De=M("p"),De.textContent=Ys,Vt=a(),o(Ke.$$.fragment),xt=a(),qe=M("p"),qe.textContent=Ns,Ft=a(),Oe=M("p"),Oe.innerHTML=As,Qt=a(),o(el.$$.fragment),zt=a(),o(ll.$$.fragment),Et=a(),tl=M("p"),tl.innerHTML=Rs,St=a(),o(sl.$$.fragment),Ht=a(),al=M("p"),al.textContent=Vs,Lt=a(),nl=M("ul"),nl.innerHTML=xs,Pt=a(),o(pl.$$.fragment),Dt=a(),ol=M("p"),this.h()},l(e){const l=la("svelte-u9bgzb",document.head);p=i(l,"META",{name:!0,content:!0}),l.forEach(t),U=n(e),T=i(e,"P",{}),Ps(T).forEach(t),j=n(e),c(g.$$.fragment,e),cl=n(e),c(G.$$.fragment,e),ml=n(e),_=i(e,"P",{"data-svelte-h":!0}),r(_)!=="svelte-1j74re8"&&(_.textContent=qt),yl=n(e),c(u.$$.fragment,e),wl=n(e),c(k.$$.fragment,e),Jl=n(e),W=i(e,"P",{"data-svelte-h":!0}),r(W)!=="svelte-1wr7aay"&&(W.textContent=Ot),Tl=n(e),c(B.$$.fragment,e),hl=n(e),v=i(e,"P",{"data-svelte-h":!0}),r(v)!=="svelte-xpaj0u"&&(v.innerHTML=es),Ul=n(e),X=i(e,"P",{"data-svelte-h":!0}),r(X)!=="svelte-1gywp69"&&(X.textContent=ls),jl=n(e),c(b.$$.fragment,e),dl=n(e),c(Y.$$.fragment,e),ul=n(e),c(N.$$.fragment,e),bl=n(e),A=i(e,"P",{"data-svelte-h":!0}),r(A)!=="svelte-1mtlp3l"&&(A.innerHTML=ts),Il=n(e),R=i(e,"P",{"data-svelte-h":!0}),r(R)!=="svelte-1gkh70d"&&(R.textContent=ss),fl=n(e),V=i(e,"P",{"data-svelte-h":!0}),r(V)!=="svelte-myu7hv"&&(V.innerHTML=as),Cl=n(e),c(x.$$.fragment,e),$l=n(e),F=i(e,"P",{"data-svelte-h":!0}),r(F)!=="svelte-h07c4l"&&(F.textContent=ns),Zl=n(e),c(Q.$$.fragment,e),gl=n(e),c(z.$$.fragment,e),Gl=n(e),E=i(e,"P",{"data-svelte-h":!0}),r(E)!=="svelte-60ulbw"&&(E.innerHTML=ps),_l=n(e),c(S.$$.fragment,e),kl=n(e),c(H.$$.fragment,e),Wl=n(e),L=i(e,"P",{"data-svelte-h":!0}),r(L)!=="svelte-1kzkru5"&&(L.textContent=Ms),Bl=n(e),c(P.$$.fragment,e),vl=n(e),D=i(e,"P",{"data-svelte-h":!0}),r(D)!=="svelte-eeriqt"&&(D.innerHTML=is),Xl=n(e),c(K.$$.fragment,e),Yl=n(e),q=i(e,"P",{"data-svelte-h":!0}),r(q)!=="svelte-1erq0yi"&&(q.textContent=rs),Nl=n(e),c(O.$$.fragment,e),Al=n(e),ee=i(e,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-17fsfbj"&&(ee.textContent=os),Rl=n(e),c(le.$$.fragment,e),Vl=n(e),te=i(e,"P",{"data-svelte-h":!0}),r(te)!=="svelte-1wyd1v3"&&(te.innerHTML=cs),xl=n(e),c(se.$$.fragment,e),Fl=n(e),ae=i(e,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-s9102n"&&(ae.textContent=ms),Ql=n(e),c(ne.$$.fragment,e),zl=n(e),c(pe.$$.fragment,e),El=n(e),Me=i(e,"P",{"data-svelte-h":!0}),r(Me)!=="svelte-1277496"&&(Me.innerHTML=ys),Sl=n(e),ie=i(e,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-oa85ci"&&(ie.textContent=ws),Hl=n(e),c(I.$$.fragment,e),Ll=n(e),c(re.$$.fragment,e),Pl=n(e),oe=i(e,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-88zwaq"&&(oe.innerHTML=Js),Dl=n(e),c(f.$$.fragment,e),Kl=n(e),ce=i(e,"P",{"data-svelte-h":!0}),r(ce)!=="svelte-1ojop43"&&(ce.textContent=Ts),ql=n(e),c(me.$$.fragment,e),Ol=n(e),c(C.$$.fragment,e),et=n(e),ye=i(e,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-2qfnag"&&(ye.textContent=hs),lt=n(e),c(we.$$.fragment,e),tt=n(e),Je=i(e,"P",{"data-svelte-h":!0}),r(Je)!=="svelte-16kq69y"&&(Je.textContent=Us),st=n(e),c(Te.$$.fragment,e),at=n(e),he=i(e,"P",{"data-svelte-h":!0}),r(he)!=="svelte-1x7hf7y"&&(he.textContent=js),nt=n(e),c(Ue.$$.fragment,e),pt=n(e),je=i(e,"P",{"data-svelte-h":!0}),r(je)!=="svelte-1drdkyl"&&(je.textContent=ds),Mt=n(e),c(de.$$.fragment,e),it=n(e),ue=i(e,"P",{"data-svelte-h":!0}),r(ue)!=="svelte-1lmnrl9"&&(ue.innerHTML=us),rt=n(e),c($.$$.fragment,e),ot=n(e),c(be.$$.fragment,e),ct=n(e),Ie=i(e,"P",{"data-svelte-h":!0}),r(Ie)!=="svelte-8iqamy"&&(Ie.textContent=bs),mt=n(e),c(fe.$$.fragment,e),yt=n(e),Ce=i(e,"P",{"data-svelte-h":!0}),r(Ce)!=="svelte-uq3liu"&&(Ce.textContent=Is),wt=n(e),c($e.$$.fragment,e),Jt=n(e),Ze=i(e,"P",{"data-svelte-h":!0}),r(Ze)!=="svelte-1vssgg7"&&(Ze.textContent=fs),Tt=n(e),c(ge.$$.fragment,e),ht=n(e),Ge=i(e,"P",{"data-svelte-h":!0}),r(Ge)!=="svelte-o67l3v"&&(Ge.textContent=Cs),Ut=n(e),_e=i(e,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-u2uotg"&&(_e.innerHTML=$s),jt=n(e),c(ke.$$.fragment,e),dt=n(e),We=i(e,"P",{"data-svelte-h":!0}),r(We)!=="svelte-1ssvwp0"&&(We.innerHTML=Zs),ut=n(e),c(Be.$$.fragment,e),bt=n(e),ve=i(e,"P",{"data-svelte-h":!0}),r(ve)!=="svelte-1kobhd"&&(ve.textContent=gs),It=n(e),c(Xe.$$.fragment,e),ft=n(e),c(Ye.$$.fragment,e),Ct=n(e),Ne=i(e,"P",{"data-svelte-h":!0}),r(Ne)!=="svelte-fxrvqm"&&(Ne.innerHTML=Gs),$t=n(e),Ae=i(e,"P",{"data-svelte-h":!0}),r(Ae)!=="svelte-7o5jv1"&&(Ae.innerHTML=_s),Zt=n(e),c(Re.$$.fragment,e),gt=n(e),c(Ve.$$.fragment,e),Gt=n(e),xe=i(e,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-rkokvk"&&(xe.textContent=ks),_t=n(e),Fe=i(e,"P",{"data-svelte-h":!0}),r(Fe)!=="svelte-192rw96"&&(Fe.textContent=Ws),kt=n(e),c(Qe.$$.fragment,e),Wt=n(e),ze=i(e,"P",{"data-svelte-h":!0}),r(ze)!=="svelte-3ig3ul"&&(ze.textContent=Bs),Bt=n(e),c(Z.$$.fragment,e),vt=n(e),c(Ee.$$.fragment,e),Xt=n(e),Se=i(e,"P",{"data-svelte-h":!0}),r(Se)!=="svelte-10flsnd"&&(Se.textContent=vs),Yt=n(e),c(He.$$.fragment,e),Nt=n(e),Le=i(e,"P",{"data-svelte-h":!0}),r(Le)!=="svelte-lkd19f"&&(Le.innerHTML=Xs),At=n(e),c(Pe.$$.fragment,e),Rt=n(e),De=i(e,"P",{"data-svelte-h":!0}),r(De)!=="svelte-svq1hp"&&(De.textContent=Ys),Vt=n(e),c(Ke.$$.fragment,e),xt=n(e),qe=i(e,"P",{"data-svelte-h":!0}),r(qe)!=="svelte-9wooxy"&&(qe.textContent=Ns),Ft=n(e),Oe=i(e,"P",{"data-svelte-h":!0}),r(Oe)!=="svelte-327xki"&&(Oe.innerHTML=As),Qt=n(e),c(el.$$.fragment,e),zt=n(e),c(ll.$$.fragment,e),Et=n(e),tl=i(e,"P",{"data-svelte-h":!0}),r(tl)!=="svelte-g8b06q"&&(tl.innerHTML=Rs),St=n(e),c(sl.$$.fragment,e),Ht=n(e),al=i(e,"P",{"data-svelte-h":!0}),r(al)!=="svelte-ixf1ne"&&(al.textContent=Vs),Lt=n(e),nl=i(e,"UL",{"data-svelte-h":!0}),r(nl)!=="svelte-1o2nr71"&&(nl.innerHTML=xs),Pt=n(e),c(pl.$$.fragment,e),Dt=n(e),ol=i(e,"P",{}),Ps(ol).forEach(t),this.h()},h(){Ds(p,"name","hf:doc:metadata"),Ds(p,"content",ya)},m(e,l){ta(document.head,p),s(e,U,l),s(e,T,l),s(e,j,l),m(g,e,l),s(e,cl,l),m(G,e,l),s(e,ml,l),s(e,_,l),s(e,yl,l),m(u,e,l),s(e,wl,l),m(k,e,l),s(e,Jl,l),s(e,W,l),s(e,Tl,l),m(B,e,l),s(e,hl,l),s(e,v,l),s(e,Ul,l),s(e,X,l),s(e,jl,l),m(b,e,l),s(e,dl,l),m(Y,e,l),s(e,ul,l),m(N,e,l),s(e,bl,l),s(e,A,l),s(e,Il,l),s(e,R,l),s(e,fl,l),s(e,V,l),s(e,Cl,l),m(x,e,l),s(e,$l,l),s(e,F,l),s(e,Zl,l),m(Q,e,l),s(e,gl,l),m(z,e,l),s(e,Gl,l),s(e,E,l),s(e,_l,l),m(S,e,l),s(e,kl,l),m(H,e,l),s(e,Wl,l),s(e,L,l),s(e,Bl,l),m(P,e,l),s(e,vl,l),s(e,D,l),s(e,Xl,l),m(K,e,l),s(e,Yl,l),s(e,q,l),s(e,Nl,l),m(O,e,l),s(e,Al,l),s(e,ee,l),s(e,Rl,l),m(le,e,l),s(e,Vl,l),s(e,te,l),s(e,xl,l),m(se,e,l),s(e,Fl,l),s(e,ae,l),s(e,Ql,l),m(ne,e,l),s(e,zl,l),m(pe,e,l),s(e,El,l),s(e,Me,l),s(e,Sl,l),s(e,ie,l),s(e,Hl,l),m(I,e,l),s(e,Ll,l),m(re,e,l),s(e,Pl,l),s(e,oe,l),s(e,Dl,l),m(f,e,l),s(e,Kl,l),s(e,ce,l),s(e,ql,l),m(me,e,l),s(e,Ol,l),m(C,e,l),s(e,et,l),s(e,ye,l),s(e,lt,l),m(we,e,l),s(e,tt,l),s(e,Je,l),s(e,st,l),m(Te,e,l),s(e,at,l),s(e,he,l),s(e,nt,l),m(Ue,e,l),s(e,pt,l),s(e,je,l),s(e,Mt,l),m(de,e,l),s(e,it,l),s(e,ue,l),s(e,rt,l),m($,e,l),s(e,ot,l),m(be,e,l),s(e,ct,l),s(e,Ie,l),s(e,mt,l),m(fe,e,l),s(e,yt,l),s(e,Ce,l),s(e,wt,l),m($e,e,l),s(e,Jt,l),s(e,Ze,l),s(e,Tt,l),m(ge,e,l),s(e,ht,l),s(e,Ge,l),s(e,Ut,l),s(e,_e,l),s(e,jt,l),m(ke,e,l),s(e,dt,l),s(e,We,l),s(e,ut,l),m(Be,e,l),s(e,bt,l),s(e,ve,l),s(e,It,l),m(Xe,e,l),s(e,ft,l),m(Ye,e,l),s(e,Ct,l),s(e,Ne,l),s(e,$t,l),s(e,Ae,l),s(e,Zt,l),m(Re,e,l),s(e,gt,l),m(Ve,e,l),s(e,Gt,l),s(e,xe,l),s(e,_t,l),s(e,Fe,l),s(e,kt,l),m(Qe,e,l),s(e,Wt,l),s(e,ze,l),s(e,Bt,l),m(Z,e,l),s(e,vt,l),m(Ee,e,l),s(e,Xt,l),s(e,Se,l),s(e,Yt,l),m(He,e,l),s(e,Nt,l),s(e,Le,l),s(e,At,l),m(Pe,e,l),s(e,Rt,l),s(e,De,l),s(e,Vt,l),m(Ke,e,l),s(e,xt,l),s(e,qe,l),s(e,Ft,l),s(e,Oe,l),s(e,Qt,l),m(el,e,l),s(e,zt,l),m(ll,e,l),s(e,Et,l),s(e,tl,l),s(e,St,l),m(sl,e,l),s(e,Ht,l),s(e,al,l),s(e,Lt,l),s(e,nl,l),s(e,Pt,l),m(pl,e,l),s(e,Dt,l),s(e,ol,l),Kt=!0},p(e,[l]){const Fs={};l&2&&(Fs.$$scope={dirty:l,ctx:e}),u.$set(Fs);const Qs={};l&2&&(Qs.$$scope={dirty:l,ctx:e}),b.$set(Qs);const zs={};l&2&&(zs.$$scope={dirty:l,ctx:e}),I.$set(zs);const Es={};l&2&&(Es.$$scope={dirty:l,ctx:e}),f.$set(Es);const Ss={};l&2&&(Ss.$$scope={dirty:l,ctx:e}),C.$set(Ss);const Hs={};l&2&&(Hs.$$scope={dirty:l,ctx:e}),$.$set(Hs);const Ls={};l&2&&(Ls.$$scope={dirty:l,ctx:e}),Z.$set(Ls)},i(e){Kt||(y(g.$$.fragment,e),y(G.$$.fragment,e),y(u.$$.fragment,e),y(k.$$.fragment,e),y(B.$$.fragment,e),y(b.$$.fragment,e),y(Y.$$.fragment,e),y(N.$$.fragment,e),y(x.$$.fragment,e),y(Q.$$.fragment,e),y(z.$$.fragment,e),y(S.$$.fragment,e),y(H.$$.fragment,e),y(P.$$.fragment,e),y(K.$$.fragment,e),y(O.$$.fragment,e),y(le.$$.fragment,e),y(se.$$.fragment,e),y(ne.$$.fragment,e),y(pe.$$.fragment,e),y(I.$$.fragment,e),y(re.$$.fragment,e),y(f.$$.fragment,e),y(me.$$.fragment,e),y(C.$$.fragment,e),y(we.$$.fragment,e),y(Te.$$.fragment,e),y(Ue.$$.fragment,e),y(de.$$.fragment,e),y($.$$.fragment,e),y(be.$$.fragment,e),y(fe.$$.fragment,e),y($e.$$.fragment,e),y(ge.$$.fragment,e),y(ke.$$.fragment,e),y(Be.$$.fragment,e),y(Xe.$$.fragment,e),y(Ye.$$.fragment,e),y(Re.$$.fragment,e),y(Ve.$$.fragment,e),y(Qe.$$.fragment,e),y(Z.$$.fragment,e),y(Ee.$$.fragment,e),y(He.$$.fragment,e),y(Pe.$$.fragment,e),y(Ke.$$.fragment,e),y(el.$$.fragment,e),y(ll.$$.fragment,e),y(sl.$$.fragment,e),y(pl.$$.fragment,e),Kt=!0)},o(e){w(g.$$.fragment,e),w(G.$$.fragment,e),w(u.$$.fragment,e),w(k.$$.fragment,e),w(B.$$.fragment,e),w(b.$$.fragment,e),w(Y.$$.fragment,e),w(N.$$.fragment,e),w(x.$$.fragment,e),w(Q.$$.fragment,e),w(z.$$.fragment,e),w(S.$$.fragment,e),w(H.$$.fragment,e),w(P.$$.fragment,e),w(K.$$.fragment,e),w(O.$$.fragment,e),w(le.$$.fragment,e),w(se.$$.fragment,e),w(ne.$$.fragment,e),w(pe.$$.fragment,e),w(I.$$.fragment,e),w(re.$$.fragment,e),w(f.$$.fragment,e),w(me.$$.fragment,e),w(C.$$.fragment,e),w(we.$$.fragment,e),w(Te.$$.fragment,e),w(Ue.$$.fragment,e),w(de.$$.fragment,e),w($.$$.fragment,e),w(be.$$.fragment,e),w(fe.$$.fragment,e),w($e.$$.fragment,e),w(ge.$$.fragment,e),w(ke.$$.fragment,e),w(Be.$$.fragment,e),w(Xe.$$.fragment,e),w(Ye.$$.fragment,e),w(Re.$$.fragment,e),w(Ve.$$.fragment,e),w(Qe.$$.fragment,e),w(Z.$$.fragment,e),w(Ee.$$.fragment,e),w(He.$$.fragment,e),w(Pe.$$.fragment,e),w(Ke.$$.fragment,e),w(el.$$.fragment,e),w(ll.$$.fragment,e),w(sl.$$.fragment,e),w(pl.$$.fragment,e),Kt=!1},d(e){e&&(t(U),t(T),t(j),t(cl),t(ml),t(_),t(yl),t(wl),t(Jl),t(W),t(Tl),t(hl),t(v),t(Ul),t(X),t(jl),t(dl),t(ul),t(bl),t(A),t(Il),t(R),t(fl),t(V),t(Cl),t($l),t(F),t(Zl),t(gl),t(Gl),t(E),t(_l),t(kl),t(Wl),t(L),t(Bl),t(vl),t(D),t(Xl),t(Yl),t(q),t(Nl),t(Al),t(ee),t(Rl),t(Vl),t(te),t(xl),t(Fl),t(ae),t(Ql),t(zl),t(El),t(Me),t(Sl),t(ie),t(Hl),t(Ll),t(Pl),t(oe),t(Dl),t(Kl),t(ce),t(ql),t(Ol),t(et),t(ye),t(lt),t(tt),t(Je),t(st),t(at),t(he),t(nt),t(pt),t(je),t(Mt),t(it),t(ue),t(rt),t(ot),t(ct),t(Ie),t(mt),t(yt),t(Ce),t(wt),t(Jt),t(Ze),t(Tt),t(ht),t(Ge),t(Ut),t(_e),t(jt),t(dt),t(We),t(ut),t(bt),t(ve),t(It),t(ft),t(Ct),t(Ne),t($t),t(Ae),t(Zt),t(gt),t(Gt),t(xe),t(_t),t(Fe),t(kt),t(Wt),t(ze),t(Bt),t(vt),t(Xt),t(Se),t(Yt),t(Nt),t(Le),t(At),t(Rt),t(De),t(Vt),t(xt),t(qe),t(Ft),t(Oe),t(Qt),t(zt),t(Et),t(tl),t(St),t(Ht),t(al),t(Lt),t(nl),t(Pt),t(Dt),t(ol)),t(p),J(g,e),J(G,e),J(u,e),J(k,e),J(B,e),J(b,e),J(Y,e),J(N,e),J(x,e),J(Q,e),J(z,e),J(S,e),J(H,e),J(P,e),J(K,e),J(O,e),J(le,e),J(se,e),J(ne,e),J(pe,e),J(I,e),J(re,e),J(f,e),J(me,e),J(C,e),J(we,e),J(Te,e),J(Ue,e),J(de,e),J($,e),J(be,e),J(fe,e),J($e,e),J(ge,e),J(ke,e),J(Be,e),J(Xe,e),J(Ye,e),J(Re,e),J(Ve,e),J(Qe,e),J(Z,e),J(Ee,e),J(He,e),J(Pe,e),J(Ke,e),J(el,e),J(ll,e),J(sl,e),J(pl,e)}}}const ya='{"title":"Launching distributed training from Jupyter Notebooks","local":"launching-distributed-training-from-jupyter-notebooks","sections":[{"title":"Configuring the Environment","local":"configuring-the-environment","sections":[],"depth":2},{"title":"Preparing the Dataset and Model","local":"preparing-the-dataset-and-model","sections":[],"depth":2},{"title":"Writing the Training Function","local":"writing-the-training-function","sections":[],"depth":2},{"title":"Using the notebook_launcher","local":"using-the-notebooklauncher","sections":[],"depth":2},{"title":"Debugging","local":"debugging","sections":[],"depth":2},{"title":"Conclusion","local":"conclusion","sections":[],"depth":2}],"depth":1}';function wa(d){return qs(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class da extends Os{constructor(p){super(),ea(this,p,wa,ma,Ks,{})}}export{da as component}; | |
Xet Storage Details
- Size:
- 63.1 kB
- Xet hash:
- 69321a4e38bf4e99a310cb7cc6cea56af5b12a12dd2ecad8e3c08aa92dac49e4
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.