Buckets:

HuggingFaceDocBuilder's picture
download
raw
16.3 kB
import{s as Qe,n as Ye,o as Ee}from"../chunks/scheduler.7b731bd4.js";import{S as Fe,i as Ve,e as d,s as a,c as i,h as xe,a as u,d as s,b as n,f as Ne,g as r,j as f,k as je,l as He,m as l,n as m,t as p,o,p as c}from"../chunks/index.cc268345.js";import{C as Le,H as b,E as Se}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.f0d99f98.js";import{C as H}from"../chunks/CodeBlock.169a125f.js";function Ae(Ce){let y,A,L,P,w,D,T,q,J,_e="TRL is designed with modularity in mind so that users are able to efficiently customize the training loop for their needs. Below are examples on how you can apply and test different techniques.",K,M,Re='<p>Although these examples use the <a href="/docs/trl/pr_5607/en/bema_for_reference_model#trl.DPOTrainer">DPOTrainer</a>, these customization methods apply to most (if not all) trainers in TRL.</p>',O,h,ee,U,Ze='By default, the <a href="/docs/trl/pr_5607/en/bema_for_reference_model#trl.DPOTrainer">DPOTrainer</a> creates a <code>torch.optim.AdamW</code> optimizer. You can create and define a different optimizer and pass it to <a href="/docs/trl/pr_5607/en/bema_for_reference_model#trl.DPOTrainer">DPOTrainer</a> as follows:',te,g,se,$,le,j,We="You can also add learning rate schedulers by passing both optimizer and scheduler:",ae,C,ne,_,ie,R,Xe="Since <code>trl</code> supports all keyword arguments when loading a model from <code>transformers</code> using <code>from_pretrained</code>, you can also leverage <code>load_in_8bit</code> from <code>transformers</code> for more memory efficient fine-tuning.",re,Z,Be='Read more about 8-bit model loading in <code>transformers</code> <a href="https://huggingface.co/docs/transformers/en/peft" rel="nofollow">Load in 8bit or 4bit</a>.',me,W,pe,X,oe,B,ze="You can customize the training loop by adding callbacks for logging, monitoring, or early stopping. Callbacks allow you to execute custom code at specific points during training.",ce,z,de,I,ue,k,Ie="You can define custom evaluation metrics to track during training. This is useful for monitoring model performance on specific tasks.",fe,v,ye,G,Me,N,ke="Mixed precision training can significantly speed up training and reduce memory usage. You can enable it by setting <code>bf16=True</code> or <code>fp16=True</code> in the training config.",be,Q,we,Y,ve="Note: Use <code>bf16=True</code> for Ampere GPUs (A100, RTX 30xx) or newer, and <code>fp16=True</code> for older GPUs.",Te,E,Je,F,Ge="When training with limited GPU memory, gradient accumulation allows you to simulate larger batch sizes by accumulating gradients over multiple steps before updating weights.",he,V,Ue,x,ge,S,$e;return w=new Le({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),T=new b({props:{title:"Training customization",local:"training-customization",headingTag:"h1"}}),h=new b({props:{title:"Use different optimizers and schedulers",local:"use-different-optimizers-and-schedulers",headingTag:"h2"}}),g=new H({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwbG9hZF9kYXRhc2V0JTBBZnJvbSUyMHRvcmNoJTIwaW1wb3J0JTIwb3B0aW0lMEFmcm9tJTIwdHJhbnNmb3JtZXJzJTIwaW1wb3J0JTIwQXV0b01vZGVsRm9yQ2F1c2FsTE0lMEFmcm9tJTIwdHJsJTIwaW1wb3J0JTIwRFBPVHJhaW5lciUwQSUwQWRhdGFzZXQlMjAlM0QlMjBsb2FkX2RhdGFzZXQoJTIydHJsLWxpYiUyRnVsdHJhZmVlZGJhY2tfYmluYXJpemVkJTIyJTJDJTIwc3BsaXQlM0QlMjJ0cmFpbiUyMiklMEFtb2RlbCUyMCUzRCUyMEF1dG9Nb2RlbEZvckNhdXNhbExNLmZyb21fcHJldHJhaW5lZCglMjJRd2VuJTJGUXdlbjIuNS0wLjVCLUluc3RydWN0JTIyKSUwQW9wdGltaXplciUyMCUzRCUyMG9wdGltLlNHRChtb2RlbC5wYXJhbWV0ZXJzKCklMkMlMjBsciUzRDFlLTYpJTBBJTBBdHJhaW5lciUyMCUzRCUyMERQT1RyYWluZXIoJTBBJTIwJTIwJTIwJTIwbW9kZWwlM0Rtb2RlbCUyQyUwQSUyMCUyMCUyMCUyMHRyYWluX2RhdGFzZXQlM0RkYXRhc2V0JTJDJTBBJTIwJTIwJTIwJTIwb3B0aW1pemVycyUzRChvcHRpbWl6ZXIlMkMlMjBOb25lKSUyQyUwQSklMEF0cmFpbmVyLnRyYWluKCk=",highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset
<span class="hljs-keyword">from</span> torch <span class="hljs-keyword">import</span> optim
<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoModelForCausalLM
<span class="hljs-keyword">from</span> trl <span class="hljs-keyword">import</span> DPOTrainer
dataset = load_dataset(<span class="hljs-string">&quot;trl-lib/ultrafeedback_binarized&quot;</span>, split=<span class="hljs-string">&quot;train&quot;</span>)
model = AutoModelForCausalLM.from_pretrained(<span class="hljs-string">&quot;Qwen/Qwen2.5-0.5B-Instruct&quot;</span>)
optimizer = optim.SGD(model.parameters(), lr=<span class="hljs-number">1e-6</span>)
trainer = DPOTrainer(
model=model,
train_dataset=dataset,
optimizers=(optimizer, <span class="hljs-literal">None</span>),
)
trainer.train()`,wrap:!1}}),$=new b({props:{title:"Add a learning rate scheduler",local:"add-a-learning-rate-scheduler",headingTag:"h3"}}),C=new H({props:{code:"ZnJvbSUyMHRvcmNoJTIwaW1wb3J0JTIwb3B0aW0lMEElMEFvcHRpbWl6ZXIlMjAlM0QlMjBvcHRpbS5BZGFtVyhtb2RlbC5wYXJhbWV0ZXJzKCklMkMlMjBsciUzRDFlLTYpJTBBbHJfc2NoZWR1bGVyJTIwJTNEJTIwb3B0aW0ubHJfc2NoZWR1bGVyLlN0ZXBMUihvcHRpbWl6ZXIlMkMlMjBzdGVwX3NpemUlM0QzMCUyQyUyMGdhbW1hJTNEMC4xKSUwQSUwQXRyYWluZXIlMjAlM0QlMjBEUE9UcmFpbmVyKC4uLiUyQyUyMG9wdGltaXplcnMlM0Qob3B0aW1pemVyJTJDJTIwbHJfc2NoZWR1bGVyKSk=",highlighted:`<span class="hljs-keyword">from</span> torch <span class="hljs-keyword">import</span> optim
optimizer = optim.AdamW(model.parameters(), lr=<span class="hljs-number">1e-6</span>)
lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=<span class="hljs-number">30</span>, gamma=<span class="hljs-number">0.1</span>)
trainer = DPOTrainer(..., optimizers=(optimizer, lr_scheduler))`,wrap:!1}}),_=new b({props:{title:"Pass 8-bit reference models",local:"pass-8-bit-reference-models",headingTag:"h2"}}),W=new H({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Nb2RlbEZvckNhdXNhbExNJTJDJTIwQml0c0FuZEJ5dGVzQ29uZmlnJTBBJTBBcXVhbnRpemF0aW9uX2NvbmZpZyUyMCUzRCUyMEJpdHNBbmRCeXRlc0NvbmZpZyhsb2FkX2luXzhiaXQlM0RUcnVlKSUwQXJlZl9tb2RlbCUyMCUzRCUyMEF1dG9Nb2RlbEZvckNhdXNhbExNLmZyb21fcHJldHJhaW5lZCglMjJRd2VuJTJGUXdlbjIuNS0wLjVCLUluc3RydWN0JTIyJTJDJTIwcXVhbnRpemF0aW9uX2NvbmZpZyUzRHF1YW50aXphdGlvbl9jb25maWcpJTBBJTBBdHJhaW5lciUyMCUzRCUyMERQT1RyYWluZXIoLi4uJTJDJTIwcmVmX21vZGVsJTNEcmVmX21vZGVsKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoModelForCausalLM, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_8bit=<span class="hljs-literal">True</span>)
ref_model = AutoModelForCausalLM.from_pretrained(<span class="hljs-string">&quot;Qwen/Qwen2.5-0.5B-Instruct&quot;</span>, quantization_config=quantization_config)
trainer = DPOTrainer(..., ref_model=ref_model)`,wrap:!1}}),X=new b({props:{title:"Add custom callbacks",local:"add-custom-callbacks",headingTag:"h2"}}),z=new H({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMFRyYWluZXJDYWxsYmFjayUwQSUwQSUwQWNsYXNzJTIwQ3VzdG9tTG9nZ2luZ0NhbGxiYWNrKFRyYWluZXJDYWxsYmFjayklM0ElMEElMjAlMjAlMjAlMjBkZWYlMjBvbl9sb2coc2VsZiUyQyUyMGFyZ3MlMkMlMjBzdGF0ZSUyQyUyMGNvbnRyb2wlMkMlMjBsb2dzJTNETm9uZSUyQyUyMCoqa3dhcmdzKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwbG9ncyUyMGlzJTIwbm90JTIwTm9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50KGYlMjJTdGVwJTIwJTdCc3RhdGUuZ2xvYmFsX3N0ZXAlN0QlM0ElMjAlN0Jsb2dzJTdEJTIyKSUwQSUwQSUwQXRyYWluZXIlMjAlM0QlMjBEUE9UcmFpbmVyKC4uLiUyQyUyMGNhbGxiYWNrcyUzRCU1QkN1c3RvbUxvZ2dpbmdDYWxsYmFjaygpJTVEKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> TrainerCallback
<span class="hljs-keyword">class</span> <span class="hljs-title class_">CustomLoggingCallback</span>(<span class="hljs-title class_ inherited__">TrainerCallback</span>):
<span class="hljs-keyword">def</span> <span class="hljs-title function_">on_log</span>(<span class="hljs-params">self, args, state, control, logs=<span class="hljs-literal">None</span>, **kwargs</span>):
<span class="hljs-keyword">if</span> logs <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> <span class="hljs-literal">None</span>:
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Step <span class="hljs-subst">{state.global_step}</span>: <span class="hljs-subst">{logs}</span>&quot;</span>)
trainer = DPOTrainer(..., callbacks=[CustomLoggingCallback()])`,wrap:!1}}),I=new b({props:{title:"Add custom evaluation metrics",local:"add-custom-evaluation-metrics",headingTag:"h2"}}),v=new H({props:{code:"ZGVmJTIwY29tcHV0ZV9tZXRyaWNzKGV2YWxfcHJlZHMpJTNBJTBBJTIwJTIwJTIwJTIwbG9naXRzJTJDJTIwbGFiZWxzJTIwJTNEJTIwZXZhbF9wcmVkcyUwQSUyMCUyMCUyMCUyMCUyMyUyMEFkZCUyMHlvdXIlMjBtZXRyaWMlMjBjb21wdXRhdGlvbiUyMGhlcmUlMEElMjAlMjAlMjAlMjByZXR1cm4lMjAlN0IlMjJjdXN0b21fbWV0cmljJTIyJTNBJTIwMC4wJTdEJTBBJTBBJTBBdHJhaW5pbmdfYXJncyUyMCUzRCUyMERQT0NvbmZpZyguLi4lMkMlMjBldmFsX3N0cmF0ZWd5JTNEJTIyc3RlcHMlMjIlMkMlMjBldmFsX3N0ZXBzJTNEMTAwKSUwQSUwQXRyYWluZXIlMjAlM0QlMjBEUE9UcmFpbmVyKC4uLiUyQyUyMGV2YWxfZGF0YXNldCUzRGV2YWxfZGF0YXNldCUyQyUyMGNvbXB1dGVfbWV0cmljcyUzRGNvbXB1dGVfbWV0cmljcyk=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">compute_metrics</span>(<span class="hljs-params">eval_preds</span>):
logits, labels = eval_preds
<span class="hljs-comment"># Add your metric computation here</span>
<span class="hljs-keyword">return</span> {<span class="hljs-string">&quot;custom_metric&quot;</span>: <span class="hljs-number">0.0</span>}
training_args = DPOConfig(..., eval_strategy=<span class="hljs-string">&quot;steps&quot;</span>, eval_steps=<span class="hljs-number">100</span>)
trainer = DPOTrainer(..., eval_dataset=eval_dataset, compute_metrics=compute_metrics)`,wrap:!1}}),G=new b({props:{title:"Use mixed precision training",local:"use-mixed-precision-training",headingTag:"h2"}}),Q=new H({props:{code:"JTIzJTIwVXNlJTIwYmZsb2F0MTYlMjBwcmVjaXNpb24lMjAocmVjb21tZW5kZWQlMjBmb3IlMjBtb2Rlcm4lMjBHUFVzKSUwQXRyYWluaW5nX2FyZ3MlMjAlM0QlMjBEUE9Db25maWcoLi4uJTJDJTIwYmYxNiUzRFRydWUp",highlighted:`<span class="hljs-comment"># Use bfloat16 precision (recommended for modern GPUs)</span>
training_args = DPOConfig(..., bf16=<span class="hljs-literal">True</span>)`,wrap:!1}}),E=new b({props:{title:"Use gradient accumulation",local:"use-gradient-accumulation",headingTag:"h2"}}),V=new H({props:{code:"JTIzJTIwU2ltdWxhdGUlMjBhJTIwYmF0Y2glMjBzaXplJTIwb2YlMjAzMiUyMHdpdGglMjBwZXJfZGV2aWNlX3RyYWluX2JhdGNoX3NpemUlM0Q0JTIwYW5kJTIwZ3JhZGllbnRfYWNjdW11bGF0aW9uX3N0ZXBzJTNEOCUwQXRyYWluaW5nX2FyZ3MlMjAlM0QlMjBEUE9Db25maWcoJTBBJTIwJTIwJTIwJTIwLi4uJTJDJTBBJTIwJTIwJTIwJTIwcGVyX2RldmljZV90cmFpbl9iYXRjaF9zaXplJTNENCUyQyUwQSUyMCUyMCUyMCUyMGdyYWRpZW50X2FjY3VtdWxhdGlvbl9zdGVwcyUzRDglMkMlMEEp",highlighted:`<span class="hljs-comment"># Simulate a batch size of 32 with per_device_train_batch_size=4 and gradient_accumulation_steps=8</span>
training_args = DPOConfig(
...,
per_device_train_batch_size=<span class="hljs-number">4</span>,
gradient_accumulation_steps=<span class="hljs-number">8</span>,
)`,wrap:!1}}),x=new Se({props:{source:"https://github.com/huggingface/trl/blob/main/docs/source/customization.md"}}),{c(){y=d("meta"),A=a(),L=d("p"),P=a(),i(w.$$.fragment),D=a(),i(T.$$.fragment),q=a(),J=d("p"),J.textContent=_e,K=a(),M=d("blockquote"),M.innerHTML=Re,O=a(),i(h.$$.fragment),ee=a(),U=d("p"),U.innerHTML=Ze,te=a(),i(g.$$.fragment),se=a(),i($.$$.fragment),le=a(),j=d("p"),j.textContent=We,ae=a(),i(C.$$.fragment),ne=a(),i(_.$$.fragment),ie=a(),R=d("p"),R.innerHTML=Xe,re=a(),Z=d("p"),Z.innerHTML=Be,me=a(),i(W.$$.fragment),pe=a(),i(X.$$.fragment),oe=a(),B=d("p"),B.textContent=ze,ce=a(),i(z.$$.fragment),de=a(),i(I.$$.fragment),ue=a(),k=d("p"),k.textContent=Ie,fe=a(),i(v.$$.fragment),ye=a(),i(G.$$.fragment),Me=a(),N=d("p"),N.innerHTML=ke,be=a(),i(Q.$$.fragment),we=a(),Y=d("p"),Y.innerHTML=ve,Te=a(),i(E.$$.fragment),Je=a(),F=d("p"),F.textContent=Ge,he=a(),i(V.$$.fragment),Ue=a(),i(x.$$.fragment),ge=a(),S=d("p"),this.h()},l(e){const t=xe("svelte-u9bgzb",document.head);y=u(t,"META",{name:!0,content:!0}),t.forEach(s),A=n(e),L=u(e,"P",{}),Ne(L).forEach(s),P=n(e),r(w.$$.fragment,e),D=n(e),r(T.$$.fragment,e),q=n(e),J=u(e,"P",{"data-svelte-h":!0}),f(J)!=="svelte-1jw5t2n"&&(J.textContent=_e),K=n(e),M=u(e,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),f(M)!=="svelte-1bw3vhs"&&(M.innerHTML=Re),O=n(e),r(h.$$.fragment,e),ee=n(e),U=u(e,"P",{"data-svelte-h":!0}),f(U)!=="svelte-1wc1wdw"&&(U.innerHTML=Ze),te=n(e),r(g.$$.fragment,e),se=n(e),r($.$$.fragment,e),le=n(e),j=u(e,"P",{"data-svelte-h":!0}),f(j)!=="svelte-1c15b3j"&&(j.textContent=We),ae=n(e),r(C.$$.fragment,e),ne=n(e),r(_.$$.fragment,e),ie=n(e),R=u(e,"P",{"data-svelte-h":!0}),f(R)!=="svelte-orby5n"&&(R.innerHTML=Xe),re=n(e),Z=u(e,"P",{"data-svelte-h":!0}),f(Z)!=="svelte-12as3v8"&&(Z.innerHTML=Be),me=n(e),r(W.$$.fragment,e),pe=n(e),r(X.$$.fragment,e),oe=n(e),B=u(e,"P",{"data-svelte-h":!0}),f(B)!=="svelte-9too8a"&&(B.textContent=ze),ce=n(e),r(z.$$.fragment,e),de=n(e),r(I.$$.fragment,e),ue=n(e),k=u(e,"P",{"data-svelte-h":!0}),f(k)!=="svelte-1rnw49w"&&(k.textContent=Ie),fe=n(e),r(v.$$.fragment,e),ye=n(e),r(G.$$.fragment,e),Me=n(e),N=u(e,"P",{"data-svelte-h":!0}),f(N)!=="svelte-1ekvipn"&&(N.innerHTML=ke),be=n(e),r(Q.$$.fragment,e),we=n(e),Y=u(e,"P",{"data-svelte-h":!0}),f(Y)!=="svelte-158tcwi"&&(Y.innerHTML=ve),Te=n(e),r(E.$$.fragment,e),Je=n(e),F=u(e,"P",{"data-svelte-h":!0}),f(F)!=="svelte-1om9a2t"&&(F.textContent=Ge),he=n(e),r(V.$$.fragment,e),Ue=n(e),r(x.$$.fragment,e),ge=n(e),S=u(e,"P",{}),Ne(S).forEach(s),this.h()},h(){je(y,"name","hf:doc:metadata"),je(y,"content",Pe),je(M,"class","note")},m(e,t){He(document.head,y),l(e,A,t),l(e,L,t),l(e,P,t),m(w,e,t),l(e,D,t),m(T,e,t),l(e,q,t),l(e,J,t),l(e,K,t),l(e,M,t),l(e,O,t),m(h,e,t),l(e,ee,t),l(e,U,t),l(e,te,t),m(g,e,t),l(e,se,t),m($,e,t),l(e,le,t),l(e,j,t),l(e,ae,t),m(C,e,t),l(e,ne,t),m(_,e,t),l(e,ie,t),l(e,R,t),l(e,re,t),l(e,Z,t),l(e,me,t),m(W,e,t),l(e,pe,t),m(X,e,t),l(e,oe,t),l(e,B,t),l(e,ce,t),m(z,e,t),l(e,de,t),m(I,e,t),l(e,ue,t),l(e,k,t),l(e,fe,t),m(v,e,t),l(e,ye,t),m(G,e,t),l(e,Me,t),l(e,N,t),l(e,be,t),m(Q,e,t),l(e,we,t),l(e,Y,t),l(e,Te,t),m(E,e,t),l(e,Je,t),l(e,F,t),l(e,he,t),m(V,e,t),l(e,Ue,t),m(x,e,t),l(e,ge,t),l(e,S,t),$e=!0},p:Ye,i(e){$e||(p(w.$$.fragment,e),p(T.$$.fragment,e),p(h.$$.fragment,e),p(g.$$.fragment,e),p($.$$.fragment,e),p(C.$$.fragment,e),p(_.$$.fragment,e),p(W.$$.fragment,e),p(X.$$.fragment,e),p(z.$$.fragment,e),p(I.$$.fragment,e),p(v.$$.fragment,e),p(G.$$.fragment,e),p(Q.$$.fragment,e),p(E.$$.fragment,e),p(V.$$.fragment,e),p(x.$$.fragment,e),$e=!0)},o(e){o(w.$$.fragment,e),o(T.$$.fragment,e),o(h.$$.fragment,e),o(g.$$.fragment,e),o($.$$.fragment,e),o(C.$$.fragment,e),o(_.$$.fragment,e),o(W.$$.fragment,e),o(X.$$.fragment,e),o(z.$$.fragment,e),o(I.$$.fragment,e),o(v.$$.fragment,e),o(G.$$.fragment,e),o(Q.$$.fragment,e),o(E.$$.fragment,e),o(V.$$.fragment,e),o(x.$$.fragment,e),$e=!1},d(e){e&&(s(A),s(L),s(P),s(D),s(q),s(J),s(K),s(M),s(O),s(ee),s(U),s(te),s(se),s(le),s(j),s(ae),s(ne),s(ie),s(R),s(re),s(Z),s(me),s(pe),s(oe),s(B),s(ce),s(de),s(ue),s(k),s(fe),s(ye),s(Me),s(N),s(be),s(we),s(Y),s(Te),s(Je),s(F),s(he),s(Ue),s(ge),s(S)),s(y),c(w,e),c(T,e),c(h,e),c(g,e),c($,e),c(C,e),c(_,e),c(W,e),c(X,e),c(z,e),c(I,e),c(v,e),c(G,e),c(Q,e),c(E,e),c(V,e),c(x,e)}}}const Pe='{"title":"Training customization","local":"training-customization","sections":[{"title":"Use different optimizers and schedulers","local":"use-different-optimizers-and-schedulers","sections":[{"title":"Add a learning rate scheduler","local":"add-a-learning-rate-scheduler","sections":[],"depth":3}],"depth":2},{"title":"Pass 8-bit reference models","local":"pass-8-bit-reference-models","sections":[],"depth":2},{"title":"Add custom callbacks","local":"add-custom-callbacks","sections":[],"depth":2},{"title":"Add custom evaluation metrics","local":"add-custom-evaluation-metrics","sections":[],"depth":2},{"title":"Use mixed precision training","local":"use-mixed-precision-training","sections":[],"depth":2},{"title":"Use gradient accumulation","local":"use-gradient-accumulation","sections":[],"depth":2}],"depth":1}';function De(Ce){return Ee(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class tt extends Fe{constructor(y){super(),Ve(this,y,De,Ae,Qe,{})}}export{tt as component};

Xet Storage Details

Size:
16.3 kB
·
Xet hash:
97954ff6a1f4b7a0a5d2c216f5d1ba2fc494b48d7f340e98b7bd4de520220001

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