Buckets:

rtrm's picture
download
raw
15.7 kB
import{s as _e,n as Se,o as ze}from"../chunks/scheduler.987d3921.js";import{S as Ne,i as Ve,g as o,s as a,r as s,A as Re,h as d,f as l,c as i,j as Xe,u as r,x as w,k as Ye,y as Ee,a as n,v as p,d as m,t as M,w as c}from"../chunks/index.c8b1fed4.js";import{C as h}from"../chunks/CodeBlock.18094d58.js";import{H as x,E as xe}from"../chunks/EditOnGithub.a3fde557.js";function Qe(be){let y,H,Q,K,T,L,u,Ue='Da die Modelle immer größer werden, hat sich die Parallelität als Strategie zum Trainieren größerer Modelle auf begrenzter Hardware und zur Beschleunigung der Trainingsgeschwindigkeit um mehrere Größenordnungen erwiesen. Bei Hugging Face haben wir die Bibliothek <a href="https://huggingface.co/docs/accelerate" rel="nofollow">🤗 Accelerate</a> entwickelt, um Nutzern zu helfen, ein 🤗 Transformers-Modell auf jeder Art von verteiltem Setup zu trainieren, egal ob es sich um mehrere GPUs auf einer Maschine oder mehrere GPUs auf mehreren Maschinen handelt. In diesem Tutorial lernen Sie, wie Sie Ihre native PyTorch-Trainingsschleife anpassen, um das Training in einer verteilten Umgebung zu ermöglichen.',P,J,D,j,$e="Beginnen Sie mit der Installation von 🤗 Accelerate:",q,f,O,g,Ie="Dann importieren und erstellen Sie ein <code>Accelerator</code>-Objekt. Der <code>Accelerator</code> wird automatisch Ihre Art der verteilten Einrichtung erkennen und alle notwendigen Komponenten für das Training initialisieren. Sie müssen Ihr Modell nicht explizit auf einem Gerät platzieren.",ee,b,te,U,le,$,Ce="Der nächste Schritt ist die Übergabe aller relevanten Trainingsobjekte an die Methode <code>prepare</code>. Dazu gehören Ihre Trainings- und Evaluierungs-DataLoader, ein Modell und ein Optimierer:",ne,I,ae,C,ie,B,Be="Die letzte Ergänzung besteht darin, das typische <code>loss.backward()</code> in der Trainingsschleife durch die 🤗 Accelerate-Methode <code>backward</code> zu ersetzen:",se,Z,re,k,Ze="Wie Sie im folgenden Code sehen können, müssen Sie nur vier zusätzliche Codezeilen zu Ihrer Trainingsschleife hinzufügen, um verteiltes Training zu ermöglichen!",pe,v,me,A,Me,W,ke="Sobald Sie die entsprechenden Codezeilen hinzugefügt haben, starten Sie Ihr Training in einem Skript oder einem Notebook wie Colaboratory.",ce,G,oe,X,ve="Wenn Sie Ihr Training mit einem Skript durchführen, führen Sie den folgenden Befehl aus, um eine Konfigurationsdatei zu erstellen und zu speichern:",de,Y,we,_,Ae="Dann starten Sie Ihr Training mit:",ye,S,he,z,Te,N,We="🤗 Accelerate kann auch in einem Notebook laufen, wenn Sie planen, die TPUs von Colaboratory zu verwenden. Verpacken Sie den gesamten Code, der für das Training verantwortlich ist, in eine Funktion und übergeben Sie diese an <code>notebook_launcher</code>:",ue,V,Je,R,Ge='Weitere Informationen über 🤗 Accelerate und seine umfangreichen Funktionen finden Sie in der <a href="https://huggingface.co/docs/accelerate" rel="nofollow">Dokumentation</a>.',je,E,fe,F,ge;return T=new x({props:{title:"Verteiltes Training mit 🤗 Accelerate",local:"verteiltes-training-mit--accelerate",headingTag:"h1"}}),J=new x({props:{title:"Einrichtung",local:"einrichtung",headingTag:"h2"}}),f=new h({props:{code:"cGlwJTIwaW5zdGFsbCUyMGFjY2VsZXJhdGU=",highlighted:"pip install accelerate",wrap:!1}}),b=new h({props:{code:"ZnJvbSUyMGFjY2VsZXJhdGUlMjBpbXBvcnQlMjBBY2NlbGVyYXRvciUwQSUwQWFjY2VsZXJhdG9yJTIwJTNEJTIwQWNjZWxlcmF0b3IoKQ==",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> accelerate <span class="hljs-keyword">import</span> Accelerator
<span class="hljs-meta">&gt;&gt;&gt; </span>accelerator = Accelerator()`,wrap:!1}}),U=new x({props:{title:"Vorbereiten auf die Beschleunigung",local:"vorbereiten-auf-die-beschleunigung",headingTag:"h2"}}),I=new h({props:{code:"dHJhaW5fZGF0YWxvYWRlciUyQyUyMGV2YWxfZGF0YWxvYWRlciUyQyUyMG1vZGVsJTJDJTIwb3B0aW1pemVyJTIwJTNEJTIwYWNjZWxlcmF0b3IucHJlcGFyZSglMEElMjAlMjAlMjAlMjB0cmFpbl9kYXRhbG9hZGVyJTJDJTIwZXZhbF9kYXRhbG9hZGVyJTJDJTIwbW9kZWwlMkMlMjBvcHRpbWl6ZXIlMEEp",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span>train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare(
<span class="hljs-meta">... </span> train_dataloader, eval_dataloader, model, optimizer
<span class="hljs-meta">... </span>)`,wrap:!1}}),C=new x({props:{title:"Rückwärts",local:"rückwärts",headingTag:"h2"}}),Z=new h({props:{code:"Zm9yJTIwZXBvY2glMjBpbiUyMHJhbmdlKG51bV9lcG9jaHMpJTNBJTBBJTIwJTIwJTIwJTIwZm9yJTIwYmF0Y2glMjBpbiUyMHRyYWluX2RhdGFsb2FkZXIlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvdXRwdXRzJTIwJTNEJTIwbW9kZWwoKipiYXRjaCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsb3NzJTIwJTNEJTIwb3V0cHV0cy5sb3NzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWNjZWxlcmF0b3IuYmFja3dhcmQobG9zcyklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcHRpbWl6ZXIuc3RlcCgpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbHJfc2NoZWR1bGVyLnN0ZXAoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG9wdGltaXplci56ZXJvX2dyYWQoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByb2dyZXNzX2Jhci51cGRhdGUoMSk=",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(num_epochs):
<span class="hljs-meta">... </span> <span class="hljs-keyword">for</span> batch <span class="hljs-keyword">in</span> train_dataloader:
<span class="hljs-meta">... </span> outputs = model(**batch)
<span class="hljs-meta">... </span> loss = outputs.loss
<span class="hljs-meta">... </span> accelerator.backward(loss)
<span class="hljs-meta">... </span> optimizer.step()
<span class="hljs-meta">... </span> lr_scheduler.step()
<span class="hljs-meta">... </span> optimizer.zero_grad()
<span class="hljs-meta">... </span> progress_bar.update(<span class="hljs-number">1</span>)`,wrap:!1}}),v=new h({props:{code:"JTJCJTIwZnJvbSUyMGFjY2VsZXJhdGUlMjBpbXBvcnQlMjBBY2NlbGVyYXRvciUwQSUyMCUyMGZyb20lMjB0cmFuc2Zvcm1lcnMlMjBpbXBvcnQlMjBBZGFtVyUyQyUyMEF1dG9Nb2RlbEZvclNlcXVlbmNlQ2xhc3NpZmljYXRpb24lMkMlMjBnZXRfc2NoZWR1bGVyJTBBJTBBJTJCJTIwYWNjZWxlcmF0b3IlMjAlM0QlMjBBY2NlbGVyYXRvcigpJTBBJTBBJTIwJTIwbW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JTZXF1ZW5jZUNsYXNzaWZpY2F0aW9uLmZyb21fcHJldHJhaW5lZChjaGVja3BvaW50JTJDJTIwbnVtX2xhYmVscyUzRDIpJTBBJTIwJTIwb3B0aW1pemVyJTIwJTNEJTIwQWRhbVcobW9kZWwucGFyYW1ldGVycygpJTJDJTIwbHIlM0QzZS01KSUwQSUwQS0lMjBkZXZpY2UlMjAlM0QlMjB0b3JjaC5kZXZpY2UoJTIyY3VkYSUyMiklMjBpZiUyMHRvcmNoLmN1ZGEuaXNfYXZhaWxhYmxlKCklMjBlbHNlJTIwdG9yY2guZGV2aWNlKCUyMmNwdSUyMiklMEEtJTIwbW9kZWwudG8oZGV2aWNlKSUwQSUwQSUyQiUyMHRyYWluX2RhdGFsb2FkZXIlMkMlMjBldmFsX2RhdGFsb2FkZXIlMkMlMjBtb2RlbCUyQyUyMG9wdGltaXplciUyMCUzRCUyMGFjY2VsZXJhdG9yLnByZXBhcmUoJTBBJTJCJTIwJTIwJTIwJTIwJTIwdHJhaW5fZGF0YWxvYWRlciUyQyUyMGV2YWxfZGF0YWxvYWRlciUyQyUyMG1vZGVsJTJDJTIwb3B0aW1pemVyJTBBJTJCJTIwKSUwQSUwQSUyMCUyMG51bV9lcG9jaHMlMjAlM0QlMjAzJTBBJTIwJTIwbnVtX3RyYWluaW5nX3N0ZXBzJTIwJTNEJTIwbnVtX2Vwb2NocyUyMColMjBsZW4odHJhaW5fZGF0YWxvYWRlciklMEElMjAlMjBscl9zY2hlZHVsZXIlMjAlM0QlMjBnZXRfc2NoZWR1bGVyKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMmxpbmVhciUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMG9wdGltaXplciUzRG9wdGltaXplciUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMG51bV93YXJtdXBfc3RlcHMlM0QwJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwbnVtX3RyYWluaW5nX3N0ZXBzJTNEbnVtX3RyYWluaW5nX3N0ZXBzJTBBJTIwJTIwKSUwQSUwQSUyMCUyMHByb2dyZXNzX2JhciUyMCUzRCUyMHRxZG0ocmFuZ2UobnVtX3RyYWluaW5nX3N0ZXBzKSklMEElMEElMjAlMjBtb2RlbC50cmFpbigpJTBBJTIwJTIwZm9yJTIwZXBvY2glMjBpbiUyMHJhbmdlKG51bV9lcG9jaHMpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwZm9yJTIwYmF0Y2glMjBpbiUyMHRyYWluX2RhdGFsb2FkZXIlM0ElMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYmF0Y2glMjAlM0QlMjAlN0JrJTNBJTIwdi50byhkZXZpY2UpJTIwZm9yJTIwayUyQyUyMHYlMjBpbiUyMGJhdGNoLml0ZW1zKCklN0QlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvdXRwdXRzJTIwJTNEJTIwbW9kZWwoKipiYXRjaCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsb3NzJTIwJTNEJTIwb3V0cHV0cy5sb3NzJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxvc3MuYmFja3dhcmQoKSUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGFjY2VsZXJhdG9yLmJhY2t3YXJkKGxvc3MpJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3B0aW1pemVyLnN0ZXAoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxyX3NjaGVkdWxlci5zdGVwKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcHRpbWl6ZXIuemVyb19ncmFkKCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcm9ncmVzc19iYXIudXBkYXRlKDEp",highlighted:`<span class="hljs-addition">+ from accelerate import Accelerator</span>
from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler
<span class="hljs-addition">+ accelerator = Accelerator()</span>
model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)
optimizer = AdamW(model.parameters(), lr=3e-5)
<span class="hljs-deletion">- device = torch.device(&quot;cuda&quot;) if torch.cuda.is_available() else torch.device(&quot;cpu&quot;)</span>
<span class="hljs-deletion">- model.to(device)</span>
<span class="hljs-addition">+ train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare(</span>
<span class="hljs-addition">+ train_dataloader, eval_dataloader, model, optimizer</span>
<span class="hljs-addition">+ )</span>
num_epochs = 3
num_training_steps = num_epochs * len(train_dataloader)
lr_scheduler = get_scheduler(
&quot;linear&quot;,
optimizer=optimizer,
num_warmup_steps=0,
num_training_steps=num_training_steps
)
progress_bar = tqdm(range(num_training_steps))
model.train()
for epoch in range(num_epochs):
for batch in train_dataloader:
<span class="hljs-deletion">- batch = {k: v.to(device) for k, v in batch.items()}</span>
outputs = model(**batch)
loss = outputs.loss
<span class="hljs-deletion">- loss.backward()</span>
<span class="hljs-addition">+ accelerator.backward(loss)</span>
optimizer.step()
lr_scheduler.step()
optimizer.zero_grad()
progress_bar.update(1)`,wrap:!1}}),A=new x({props:{title:"Trainieren",local:"trainieren",headingTag:"h2"}}),G=new x({props:{title:"Trainieren mit einem Skript",local:"trainieren-mit-einem-skript",headingTag:"h3"}}),Y=new h({props:{code:"YWNjZWxlcmF0ZSUyMGNvbmZpZw==",highlighted:"accelerate config",wrap:!1}}),S=new h({props:{code:"YWNjZWxlcmF0ZSUyMGxhdW5jaCUyMHRyYWluLnB5",highlighted:"accelerate launch train.py",wrap:!1}}),z=new x({props:{title:"Trainieren mit einem Notebook",local:"trainieren-mit-einem-notebook",headingTag:"h3"}}),V=new h({props:{code:"ZnJvbSUyMGFjY2VsZXJhdGUlMjBpbXBvcnQlMjBub3RlYm9va19sYXVuY2hlciUwQSUwQW5vdGVib29rX2xhdW5jaGVyKHRyYWluaW5nX2Z1bmN0aW9uKQ==",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> accelerate <span class="hljs-keyword">import</span> notebook_launcher
<span class="hljs-meta">&gt;&gt;&gt; </span>notebook_launcher(training_function)`,wrap:!1}}),E=new xe({props:{source:"https://github.com/huggingface/transformers/blob/main/docs/source/de/accelerate.md"}}),{c(){y=o("meta"),H=a(),Q=o("p"),K=a(),s(T.$$.fragment),L=a(),u=o("p"),u.innerHTML=Ue,P=a(),s(J.$$.fragment),D=a(),j=o("p"),j.textContent=$e,q=a(),s(f.$$.fragment),O=a(),g=o("p"),g.innerHTML=Ie,ee=a(),s(b.$$.fragment),te=a(),s(U.$$.fragment),le=a(),$=o("p"),$.innerHTML=Ce,ne=a(),s(I.$$.fragment),ae=a(),s(C.$$.fragment),ie=a(),B=o("p"),B.innerHTML=Be,se=a(),s(Z.$$.fragment),re=a(),k=o("p"),k.textContent=Ze,pe=a(),s(v.$$.fragment),me=a(),s(A.$$.fragment),Me=a(),W=o("p"),W.textContent=ke,ce=a(),s(G.$$.fragment),oe=a(),X=o("p"),X.textContent=ve,de=a(),s(Y.$$.fragment),we=a(),_=o("p"),_.textContent=Ae,ye=a(),s(S.$$.fragment),he=a(),s(z.$$.fragment),Te=a(),N=o("p"),N.innerHTML=We,ue=a(),s(V.$$.fragment),Je=a(),R=o("p"),R.innerHTML=Ge,je=a(),s(E.$$.fragment),fe=a(),F=o("p"),this.h()},l(e){const t=Re("svelte-u9bgzb",document.head);y=d(t,"META",{name:!0,content:!0}),t.forEach(l),H=i(e),Q=d(e,"P",{}),Xe(Q).forEach(l),K=i(e),r(T.$$.fragment,e),L=i(e),u=d(e,"P",{"data-svelte-h":!0}),w(u)!=="svelte-1hjc0yq"&&(u.innerHTML=Ue),P=i(e),r(J.$$.fragment,e),D=i(e),j=d(e,"P",{"data-svelte-h":!0}),w(j)!=="svelte-15yrwop"&&(j.textContent=$e),q=i(e),r(f.$$.fragment,e),O=i(e),g=d(e,"P",{"data-svelte-h":!0}),w(g)!=="svelte-pi5ngu"&&(g.innerHTML=Ie),ee=i(e),r(b.$$.fragment,e),te=i(e),r(U.$$.fragment,e),le=i(e),$=d(e,"P",{"data-svelte-h":!0}),w($)!=="svelte-1u11dxv"&&($.innerHTML=Ce),ne=i(e),r(I.$$.fragment,e),ae=i(e),r(C.$$.fragment,e),ie=i(e),B=d(e,"P",{"data-svelte-h":!0}),w(B)!=="svelte-18g7sy8"&&(B.innerHTML=Be),se=i(e),r(Z.$$.fragment,e),re=i(e),k=d(e,"P",{"data-svelte-h":!0}),w(k)!=="svelte-1ghqa33"&&(k.textContent=Ze),pe=i(e),r(v.$$.fragment,e),me=i(e),r(A.$$.fragment,e),Me=i(e),W=d(e,"P",{"data-svelte-h":!0}),w(W)!=="svelte-1jr6frh"&&(W.textContent=ke),ce=i(e),r(G.$$.fragment,e),oe=i(e),X=d(e,"P",{"data-svelte-h":!0}),w(X)!=="svelte-ve4x71"&&(X.textContent=ve),de=i(e),r(Y.$$.fragment,e),we=i(e),_=d(e,"P",{"data-svelte-h":!0}),w(_)!=="svelte-17ookzs"&&(_.textContent=Ae),ye=i(e),r(S.$$.fragment,e),he=i(e),r(z.$$.fragment,e),Te=i(e),N=d(e,"P",{"data-svelte-h":!0}),w(N)!=="svelte-1dq64sh"&&(N.innerHTML=We),ue=i(e),r(V.$$.fragment,e),Je=i(e),R=d(e,"P",{"data-svelte-h":!0}),w(R)!=="svelte-1t5vokc"&&(R.innerHTML=Ge),je=i(e),r(E.$$.fragment,e),fe=i(e),F=d(e,"P",{}),Xe(F).forEach(l),this.h()},h(){Ye(y,"name","hf:doc:metadata"),Ye(y,"content",Fe)},m(e,t){Ee(document.head,y),n(e,H,t),n(e,Q,t),n(e,K,t),p(T,e,t),n(e,L,t),n(e,u,t),n(e,P,t),p(J,e,t),n(e,D,t),n(e,j,t),n(e,q,t),p(f,e,t),n(e,O,t),n(e,g,t),n(e,ee,t),p(b,e,t),n(e,te,t),p(U,e,t),n(e,le,t),n(e,$,t),n(e,ne,t),p(I,e,t),n(e,ae,t),p(C,e,t),n(e,ie,t),n(e,B,t),n(e,se,t),p(Z,e,t),n(e,re,t),n(e,k,t),n(e,pe,t),p(v,e,t),n(e,me,t),p(A,e,t),n(e,Me,t),n(e,W,t),n(e,ce,t),p(G,e,t),n(e,oe,t),n(e,X,t),n(e,de,t),p(Y,e,t),n(e,we,t),n(e,_,t),n(e,ye,t),p(S,e,t),n(e,he,t),p(z,e,t),n(e,Te,t),n(e,N,t),n(e,ue,t),p(V,e,t),n(e,Je,t),n(e,R,t),n(e,je,t),p(E,e,t),n(e,fe,t),n(e,F,t),ge=!0},p:Se,i(e){ge||(m(T.$$.fragment,e),m(J.$$.fragment,e),m(f.$$.fragment,e),m(b.$$.fragment,e),m(U.$$.fragment,e),m(I.$$.fragment,e),m(C.$$.fragment,e),m(Z.$$.fragment,e),m(v.$$.fragment,e),m(A.$$.fragment,e),m(G.$$.fragment,e),m(Y.$$.fragment,e),m(S.$$.fragment,e),m(z.$$.fragment,e),m(V.$$.fragment,e),m(E.$$.fragment,e),ge=!0)},o(e){M(T.$$.fragment,e),M(J.$$.fragment,e),M(f.$$.fragment,e),M(b.$$.fragment,e),M(U.$$.fragment,e),M(I.$$.fragment,e),M(C.$$.fragment,e),M(Z.$$.fragment,e),M(v.$$.fragment,e),M(A.$$.fragment,e),M(G.$$.fragment,e),M(Y.$$.fragment,e),M(S.$$.fragment,e),M(z.$$.fragment,e),M(V.$$.fragment,e),M(E.$$.fragment,e),ge=!1},d(e){e&&(l(H),l(Q),l(K),l(L),l(u),l(P),l(D),l(j),l(q),l(O),l(g),l(ee),l(te),l(le),l($),l(ne),l(ae),l(ie),l(B),l(se),l(re),l(k),l(pe),l(me),l(Me),l(W),l(ce),l(oe),l(X),l(de),l(we),l(_),l(ye),l(he),l(Te),l(N),l(ue),l(Je),l(R),l(je),l(fe),l(F)),l(y),c(T,e),c(J,e),c(f,e),c(b,e),c(U,e),c(I,e),c(C,e),c(Z,e),c(v,e),c(A,e),c(G,e),c(Y,e),c(S,e),c(z,e),c(V,e),c(E,e)}}}const Fe='{"title":"Verteiltes Training mit 🤗 Accelerate","local":"verteiltes-training-mit--accelerate","sections":[{"title":"Einrichtung","local":"einrichtung","sections":[],"depth":2},{"title":"Vorbereiten auf die Beschleunigung","local":"vorbereiten-auf-die-beschleunigung","sections":[],"depth":2},{"title":"Rückwärts","local":"rückwärts","sections":[],"depth":2},{"title":"Trainieren","local":"trainieren","sections":[{"title":"Trainieren mit einem Skript","local":"trainieren-mit-einem-skript","sections":[],"depth":3},{"title":"Trainieren mit einem Notebook","local":"trainieren-mit-einem-notebook","sections":[],"depth":3}],"depth":2}],"depth":1}';function He(be){return ze(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class qe extends Ne{constructor(y){super(),Ve(this,y,He,Qe,_e,{})}}export{qe as component};

Xet Storage Details

Size:
15.7 kB
·
Xet hash:
5e4222a8ea1462c6c60b70b72dc19be279e26eb3986256fa5fb500ce60e66935

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.