import{S as Dl,i as xl,s as Hl,e as l,k as c,w as h,t as r,M as Yl,c as o,d as a,m as d,a as n,x as v,h as p,b as u,G as t,g as s,y as w,L as Fl,q as y,o as b,B as T,v as ql}from"../chunks/vendor-hf-doc-builder.js";import{I as oa}from"../chunks/IconCopyLink-hf-doc-builder.js";import{C as na}from"../chunks/CodeBlock-hf-doc-builder.js";function Ol(Ri){let C,sa,I,_,Ne,$,pt,Ge,ct,ra,j,dt,X,ut,mt,pa,oe,ft,ca,P,N,ke,Z,Mt,Ae,Ut,da,ne,ht,ua,E,G,Be,L,vt,Ve,wt,ma,se,yt,fa,Q,Se,bt,Tt,Ma,re,Ct,Ua,pe,It,ha,ce,Pt,va,de,Et,wa,ue,Jt,ya,me,zt,ba,W,Re,_t,jt,Ta,fe,Nt,Ca,Me,Gt,Ia,Ue,kt,Pa,J,k,$e,g,At,Xe,Bt,Ea,he,Vt,Ja,D,za,ve,St,_a,x,ja,we,Rt,Na,H,Ga,ye,$t,ka,Y,Aa,U,Xt,Ze,Zt,Lt,Le,Qt,Wt,Ba,be,gt,Va,Te,Dt,Sa,z,A,Qe,F,xt,We,Ht,Ra,q,O,Yt,Ft,$a,B,qt,K,Ot,Kt,Xa,Ce,ge,ei,Za,f,ai,De,ti,ii,xe,li,oi,He,ni,si,La,Ie,ri,Qa,Pe,pi,Wa,V,Ye,ee,Fe,ci,di,Ee,ui,mi,ae,te,qe,fi,Mi,Je,Ui,hi,ie,Oe,vi,wi,ze,yi,ga,S,bi,Ke,Ti,Ci,Da,_e,Ii,xa,le,Ha,m,Pi,ea,Ei,Ji,aa,zi,_i,ta,ji,Ni,ia,Gi,ki,la,Ai,Ya;return $=new oa({}),Z=new oa({}),L=new oa({}),g=new oa({}),D=new na({props:{code:"bnZpZGlhLXNtaSUyMHRvcG8lMjAtbQ==",highlighted:'<span class="hljs-symbol">nvidia</span>-<span class="hljs-keyword">smi</span> topo -m'}}),x=new na({props:{code:"JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwR1BVMCUyMCUyMCUyMCUyMEdQVTElMjAlMjAlMjAlMjBDUFUlMjBBZmZpbml0eSUyMCUyMCUyMCUyME5VTUElMjBBZmZpbml0eSUwQUdQVTAlMjAlMjAlMjAlMjAlMjBYJTIwJTIwJTIwJTIwJTIwJTIwTlYyJTIwJTIwJTIwJTIwJTIwMC0yMyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyME4lMkZBJTBBR1BVMSUyMCUyMCUyMCUyME5WMiUyMCUyMCUyMCUyMCUyMCUyMFglMjAlMjAlMjAlMjAlMjAlMjAwLTIzJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTiUyRkE=",highlighted:`        <span class="hljs-attribute">GPU0</span>    GPU1    CPU Affinity    NUMA Affinity
<span class="hljs-attribute">GPU0</span>     X      NV2     <span class="hljs-number">0</span>-<span class="hljs-number">23</span>            N/A
<span class="hljs-attribute">GPU1</span>    NV2      X      <span class="hljs-number">0</span>-<span class="hljs-number">23</span>            N/A`}}),H=new na({props:{code:"JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwR1BVMCUyMCUyMCUyMCUyMEdQVTElMjAlMjAlMjAlMjBDUFUlMjBBZmZpbml0eSUyMCUyMCUyMCUyME5VTUElMjBBZmZpbml0eSUwQUdQVTAlMjAlMjAlMjAlMjAlMjBYJTIwJTIwJTIwJTIwJTIwJTIwUEhCJTIwJTIwJTIwJTIwJTIwMC0xMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyME4lMkZBJTBBR1BVMSUyMCUyMCUyMCUyMFBIQiUyMCUyMCUyMCUyMCUyMCUyMFglMjAlMjAlMjAlMjAlMjAlMjAwLTExJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTiUyRkE=",highlighted:`        <span class="hljs-attribute">GPU0</span>    GPU1    CPU Affinity    NUMA Affinity
<span class="hljs-attribute">GPU0</span>     X      PHB     <span class="hljs-number">0</span>-<span class="hljs-number">11</span>            N/A
<span class="hljs-attribute">GPU1</span>    PHB      X      <span class="hljs-number">0</span>-<span class="hljs-number">11</span>            N/A`}}),Y=new na({props:{code:"JTIwJTIwWCUyMCUyMCUyMCUyMCUzRCUyMFNlbGYlMEElMjAlMjBTWVMlMjAlMjAlM0QlMjBDb25uZWN0aW9uJTIwdHJhdmVyc2luZyUyMFBDSWUlMjBhcyUyMHdlbGwlMjBhcyUyMHRoZSUyMFNNUCUyMGludGVyY29ubmVjdCUyMGJldHdlZW4lMjBOVU1BJTIwbm9kZXMlMjAoZS5nLiUyQyUyMFFQSSUyRlVQSSklMEElMjAlMjBOT0RFJTIwJTNEJTIwQ29ubmVjdGlvbiUyMHRyYXZlcnNpbmclMjBQQ0llJTIwYXMlMjB3ZWxsJTIwYXMlMjB0aGUlMjBpbnRlcmNvbm5lY3QlMjBiZXR3ZWVuJTIwUENJZSUyMEhvc3QlMjBCcmlkZ2VzJTIwd2l0aGluJTIwYSUyME5VTUElMjBub2RlJTBBJTIwJTIwUEhCJTIwJTIwJTNEJTIwQ29ubmVjdGlvbiUyMHRyYXZlcnNpbmclMjBQQ0llJTIwYXMlMjB3ZWxsJTIwYXMlMjBhJTIwUENJZSUyMEhvc3QlMjBCcmlkZ2UlMjAodHlwaWNhbGx5JTIwdGhlJTIwQ1BVKSUwQSUyMCUyMFBYQiUyMCUyMCUzRCUyMENvbm5lY3Rpb24lMjB0cmF2ZXJzaW5nJTIwbXVsdGlwbGUlMjBQQ0llJTIwYnJpZGdlcyUyMCh3aXRob3V0JTIwdHJhdmVyc2luZyUyMHRoZSUyMFBDSWUlMjBIb3N0JTIwQnJpZGdlKSUwQSUyMCUyMFBJWCUyMCUyMCUzRCUyMENvbm5lY3Rpb24lMjB0cmF2ZXJzaW5nJTIwYXQlMjBtb3N0JTIwYSUyMHNpbmdsZSUyMFBDSWUlMjBicmlkZ2UlMEElMjAlMjBOViUyMyUyMCUyMCUzRCUyMENvbm5lY3Rpb24lMjB0cmF2ZXJzaW5nJTIwYSUyMGJvbmRlZCUyMHNldCUyMG9mJTIwJTIzJTIwTlZMaW5rcw==",highlighted:`  X    = Self
  SYS  = Connection traversing PCIe <span class="hljs-keyword">as</span> well <span class="hljs-keyword">as</span> <span class="hljs-keyword">the</span> SMP interconnect between NUMA nodes (e.g., QPI/UPI)
  NODE = Connection traversing PCIe <span class="hljs-keyword">as</span> well <span class="hljs-keyword">as</span> <span class="hljs-keyword">the</span> interconnect between PCIe Host Bridges <span class="hljs-keyword">within</span> <span class="hljs-keyword">a</span> NUMA node
  PHB  = Connection traversing PCIe <span class="hljs-keyword">as</span> well <span class="hljs-keyword">as</span> <span class="hljs-keyword">a</span> PCIe Host Bridge (typically <span class="hljs-keyword">the</span> CPU)
  PXB  = Connection traversing multiple PCIe bridges (<span class="hljs-keyword">without</span> traversing <span class="hljs-keyword">the</span> PCIe Host Bridge)
  PIX  = Connection traversing <span class="hljs-keyword">at</span> most <span class="hljs-keyword">a</span> single PCIe bridge
  NV<span class="hljs-comment">#  = Connection traversing a bonded set of # NVLinks</span>`}}),F=new oa({}),le=new na({props:{code:"JTIzJTIwRERQJTIwdyUyRiUyME5WTGluayUwQSUwQXJtJTIwLXIlMjAlMkZ0bXAlMkZ0ZXN0LWNsbSUzQiUyMENVREFfVklTSUJMRV9ERVZJQ0VTJTNEMCUyQzElMjBweXRob24lMjAtbSUyMHRvcmNoLmRpc3RyaWJ1dGVkLmxhdW5jaCUyMCU1QyUwQS0tbnByb2NfcGVyX25vZGUlMjAyJTIwZXhhbXBsZXMlMkZweXRvcmNoJTJGbGFuZ3VhZ2UtbW9kZWxpbmclMkZydW5fY2xtLnB5JTIwLS1tb2RlbF9uYW1lX29yX3BhdGglMjBncHQyJTIwJTVDJTBBLS1kYXRhc2V0X25hbWUlMjB3aWtpdGV4dCUyMC0tZGF0YXNldF9jb25maWdfbmFtZSUyMHdpa2l0ZXh0LTItcmF3LXYxJTIwLS1kb190cmFpbiUyMCU1QyUwQS0tb3V0cHV0X2RpciUyMCUyRnRtcCUyRnRlc3QtY2xtJTIwLS1wZXJfZGV2aWNlX3RyYWluX2JhdGNoX3NpemUlMjA0JTIwLS1tYXhfc3RlcHMlMjAyMDAlMEElMEElN0IndHJhaW5fcnVudGltZSclM0ElMjAxMDEuOTAwMyUyQyUyMCd0cmFpbl9zYW1wbGVzX3Blcl9zZWNvbmQnJTNBJTIwMS45NjMlMkMlMjAnZXBvY2gnJTNBJTIwMC42OSU3RCUwQSUwQSUyMyUyMEREUCUyMHclMkZvJTIwTlZMaW5rJTBBJTBBcm0lMjAtciUyMCUyRnRtcCUyRnRlc3QtY2xtJTNCJTIwQ1VEQV9WSVNJQkxFX0RFVklDRVMlM0QwJTJDMSUyME5DQ0xfUDJQX0RJU0FCTEUlM0QxJTIwcHl0aG9uJTIwLW0lMjB0b3JjaC5kaXN0cmlidXRlZC5sYXVuY2glMjAlNUMlMEEtLW5wcm9jX3Blcl9ub2RlJTIwMiUyMGV4YW1wbGVzJTJGcHl0b3JjaCUyRmxhbmd1YWdlLW1vZGVsaW5nJTJGcnVuX2NsbS5weSUyMC0tbW9kZWxfbmFtZV9vcl9wYXRoJTIwZ3B0MiUyMCU1QyUwQS0tZGF0YXNldF9uYW1lJTIwd2lraXRleHQlMjAtLWRhdGFzZXRfY29uZmlnX25hbWUlMjB3aWtpdGV4dC0yLXJhdy12MSUyMC0tZG9fdHJhaW4lMEEtLW91dHB1dF9kaXIlMjAlMkZ0bXAlMkZ0ZXN0LWNsbSUyMC0tcGVyX2RldmljZV90cmFpbl9iYXRjaF9zaXplJTIwNCUyMC0tbWF4X3N0ZXBzJTIwMjAwJTBBJTBBJTdCJ3RyYWluX3J1bnRpbWUnJTNBJTIwMTMxLjQzNjclMkMlMjAndHJhaW5fc2FtcGxlc19wZXJfc2Vjb25kJyUzQSUyMDEuNTIyJTJDJTIwJ2Vwb2NoJyUzQSUyMDAuNjklN0Q=",highlighted:`<span class="hljs-comment"># DDP w/ NVLink</span>

<span class="hljs-built_in">rm</span> -r /tmp/test-clm; CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch \\
--nproc_per_node 2 examples/pytorch/language-modeling/run_clm.py --model_name_or_path gpt2 \\
--dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 --do_train \\
--output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{<span class="hljs-string">&#x27;train_runtime&#x27;</span>: 101.9003, <span class="hljs-string">&#x27;train_samples_per_second&#x27;</span>: 1.963, <span class="hljs-string">&#x27;epoch&#x27;</span>: 0.69}

<span class="hljs-comment"># DDP w/o NVLink</span>

<span class="hljs-built_in">rm</span> -r /tmp/test-clm; CUDA_VISIBLE_DEVICES=0,1 NCCL_P2P_DISABLE=1 python -m torch.distributed.launch \\
--nproc_per_node 2 examples/pytorch/language-modeling/run_clm.py --model_name_or_path gpt2 \\
--dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 --do_train
--output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{<span class="hljs-string">&#x27;train_runtime&#x27;</span>: 131.4367, <span class="hljs-string">&#x27;train_samples_per_second&#x27;</span>: 1.522, <span class="hljs-string">&#x27;epoch&#x27;</span>: 0.69}`}}),{c(){C=l("meta"),sa=c(),I=l("h1"),_=l("a"),Ne=l("span"),h($.$$.fragment),pt=c(),Ge=l("span"),ct=r("Hardware ottimizzato per l'addestramento"),ra=c(),j=l("p"),dt=r("L\u2019hardware utilizzato per eseguire l\u2019addestramento del modello e l\u2019inferenza pu\xF2 avere un grande effetto sulle prestazioni. Per un analisi approfondita delle GPUs, assicurati di dare un\u2019occhiata all\u2019eccellente "),X=l("a"),ut=r("blog post"),mt=r(" di Tim Dettmer."),pa=c(),oe=l("p"),ft=r("Diamo un\u2019occhiata ad alcuni consigli pratici per la configurazione della GPU."),ca=c(),P=l("h2"),N=l("a"),ke=l("span"),h(Z.$$.fragment),Mt=c(),Ae=l("span"),Ut=r("GPU"),da=r(`

Quando si addestrano modelli pi\xF9 grandi ci sono essenzialmente tre opzioni:
- GPUs piu' grandi
- Piu' GPUs
- Piu' CPU e piu' NVMe (scaricato da [DeepSpeed-Infinity](main_classes/deepspeed#nvme-support))
`),ne=l("p"),ht=r("Iniziamo dal caso in cui ci sia una singola GPU."),ua=c(),E=l("h3"),G=l("a"),Be=l("span"),h(L.$$.fragment),vt=c(),Ve=l("span"),wt=r("Potenza e Raffreddamento"),ma=c(),se=l("p"),yt=r("Se hai acquistato una costosa GPU di fascia alta, assicurati di darle la potenza corretta e un raffreddamento sufficiente."),fa=c(),Q=l("p"),Se=l("strong"),bt=r("Potenza"),Tt=r(":"),Ma=c(),re=l("p"),Ct=r("Alcune schede GPU consumer di fascia alta hanno 2 e talvolta 3 prese di alimentazione PCI-E a 8 pin. Assicurati di avere tanti cavi PCI-E a 8 pin indipendenti da 12 V collegati alla scheda quante sono le prese. Non utilizzare le 2 fessure a un\u2019estremit\xE0 dello stesso cavo (noto anche come cavo a spirale). Cio\xE8 se hai 2 prese sulla GPU, vuoi 2 cavi PCI-E a 8 pin che vanno dall\u2019alimentatore alla scheda e non uno che abbia 2 connettori PCI-E a 8 pin alla fine! In caso contrario, non otterrai tutte le prestazioni ufficiali."),Ua=c(),pe=l("p"),It=r("Ciascun cavo di alimentazione PCI-E a 8 pin deve essere collegato a una guida da 12 V sul lato dell\u2019alimentatore e pu\xF2 fornire fino a 150 W di potenza."),ha=c(),ce=l("p"),Pt=r("Alcune altre schede possono utilizzare connettori PCI-E a 12 pin e questi possono fornire fino a 500-600 W di potenza."),va=c(),de=l("p"),Et=r("Le schede di fascia bassa possono utilizzare connettori a 6 pin, che forniscono fino a 75 W di potenza."),wa=c(),ue=l("p"),Jt=r("Inoltre vuoi un alimentatore (PSU) di fascia alta che abbia una tensione stabile. Alcuni PSU di qualit\xE0 inferiore potrebbero non fornire alla scheda la tensione stabile di cui ha bisogno per funzionare al massimo."),ya=c(),me=l("p"),zt=r("E ovviamente l\u2019alimentatore deve avere abbastanza Watt inutilizzati per alimentare la scheda."),ba=c(),W=l("p"),Re=l("strong"),_t=r("Raffreddamento"),jt=r(":"),Ta=c(),fe=l("p"),Nt=r("Quando una GPU si surriscalda, inizier\xE0 a rallentare e non fornir\xE0 le prestazioni mssimali e potrebbe persino spegnersi se diventasse troppo calda."),Ca=c(),Me=l("p"),Gt=r("\xC8 difficile dire l\u2019esatta temperatura migliore a cui aspirare quando una GPU \xE8 molto caricata, ma probabilmente qualsiasi cosa al di sotto di +80\xB0C va bene, ma pi\xF9 bassa \xE8 meglio - forse 70-75\xB0C \xE8 un intervallo eccellente in cui trovarsi. \xC8 probabile che il rallentamento inizi a circa 84-90\xB0C. Ma oltre alla limitazione delle prestazioni, una temperatura molto elevata prolungata \xE8 probabile che riduca la durata di una GPU."),Ia=c(),Ue=l("p"),kt=r("Diamo quindi un\u2019occhiata a uno degli aspetti pi\xF9 importanti quando si hanno pi\xF9 GPU: la connettivit\xE0."),Pa=c(),J=l("h3"),k=l("a"),$e=l("span"),h(g.$$.fragment),At=c(),Xe=l("span"),Bt=r("Connettivit\xE0 multi-GPU"),Ea=c(),he=l("p"),Vt=r("Se utilizzi pi\xF9 GPU, il modo in cui le schede sono interconnesse pu\xF2 avere un enorme impatto sul tempo totale di allenamento. Se le GPU si trovano sullo stesso nodo fisico, puoi eseguire:"),Ja=c(),h(D.$$.fragment),za=c(),ve=l("p"),St=r("e ti dir\xE0 come sono interconnesse le GPU. Su una macchina con doppia GPU e collegata a NVLink, molto probabilmente vedrai qualcosa del tipo:"),_a=c(),h(x.$$.fragment),ja=c(),we=l("p"),Rt=r("su una macchina diversa senza NVLink potremmo vedere:"),Na=c(),h(H.$$.fragment),Ga=c(),ye=l("p"),$t=r("Il rapporto include questa legenda:"),ka=c(),h(Y.$$.fragment),Aa=c(),U=l("p"),Xt=r("Quindi il primo rapporto "),Ze=l("code"),Zt=r("NV2"),Lt=r(" ci dice che le GPU sono interconnesse con 2 NVLinks e nel secondo report "),Le=l("code"),Qt=r("PHB"),Wt=r(" abbiamo una tipica configurazione PCIe+Bridge a livello di consumatore."),Ba=c(),be=l("p"),gt=r("Controlla che tipo di connettivit\xE0 hai sulla tua configurazione. Alcuni di questi renderanno la comunicazione tra le carte pi\xF9 veloce (es. NVLink), altri pi\xF9 lenta (es. PHB)."),Va=c(),Te=l("p"),Dt=r("A seconda del tipo di soluzione di scalabilit\xE0 utilizzata, la velocit\xE0 di connettivit\xE0 potrebbe avere un impatto maggiore o minore. Se le GPU devono sincronizzarsi raramente, come in DDP, l\u2019impatto di una connessione pi\xF9 lenta sar\xE0 meno significativo. Se le GPU devono scambiarsi messaggi spesso, come in ZeRO-DP, una connettivit\xE0 pi\xF9 veloce diventa estremamente importante per ottenere un addestramento pi\xF9 veloce."),Sa=c(),z=l("h4"),A=l("a"),Qe=l("span"),h(F.$$.fragment),xt=c(),We=l("span"),Ht=r("NVlink"),Ra=c(),q=l("p"),O=l("a"),Yt=r("NVLink"),Ft=r(" \xE8 un collegamento di comunicazione a corto raggio multilinea seriale basato su cavo sviluppato da Nvidia."),$a=c(),B=l("p"),qt=r("Ogni nuova generazione fornisce una larghezza di banda pi\xF9 veloce, ad es. ecco una citazione da "),K=l("a"),Ot=r("Nvidia Ampere GA102 GPU Architecture"),Kt=r(":"),Xa=c(),Ce=l("blockquote"),ge=l("p"),ei=r(`Third-Generation NVLink\xAE
GA102 GPUs utilize NVIDIA\u2019s third-generation NVLink interface, which includes four x4 links,
with each link providing 14.0625 GB/sec bandwidth in each direction between two GPUs. Four
links provide 56.25 GB/sec bandwidth in each direction, and 112.5 GB/sec total bandwidth
between two GPUs. Two RTX 3090 GPUs can be connected together for SLI using NVLink.
(Note that 3-Way and 4-Way SLI configurations are not supported.)`),Za=c(),f=l("p"),ai=r("Quindi pi\xF9 "),De=l("code"),ti=r("X"),ii=r(" si ottiene nel rapporto di "),xe=l("code"),li=r("NVX"),oi=r(" nell\u2019output di "),He=l("code"),ni=r("nvidia-smi topo -m"),si=r(", meglio \xE8. La generazione dipender\xE0 dall\u2019architettura della tua GPU."),La=c(),Ie=l("p"),ri=r("Confrontiamo l\u2019esecuzione di un training del modello di linguaggio gpt2 su un piccolo campione di wikitext"),Qa=c(),Pe=l("p"),pi=r("I risultati sono:"),Wa=c(),V=l("table"),Ye=l("thead"),ee=l("tr"),Fe=l("th"),ci=r("NVlink"),di=c(),Ee=l("th"),ui=r("Time"),mi=c(),ae=l("tbody"),te=l("tr"),qe=l("td"),fi=r("Y"),Mi=c(),Je=l("td"),Ui=r("101s"),hi=c(),ie=l("tr"),Oe=l("td"),vi=r("N"),wi=c(),ze=l("td"),yi=r("131s"),ga=c(),S=l("p"),bi=r("Puoi vedere che NVLink completa l\u2019addestramento circa il 23% pi\xF9 velocemente. Nel secondo benchmark utilizziamo "),Ke=l("code"),Ti=r("NCCL_P2P_DISABLE=1"),Ci=r(" per dire alle GPU di non utilizzare NVLink."),Da=c(),_e=l("p"),Ii=r("Ecco il codice benchmark completo e gli output:"),xa=c(),h(le.$$.fragment),Ha=c(),m=l("p"),Pi=r("Hardware: 2x TITAN RTX 24GB each + NVlink with 2 NVLinks ("),ea=l("code"),Ei=r("NV2"),Ji=r(" in "),aa=l("code"),zi=r("nvidia-smi topo -m"),_i=r(`)
Software: `),ta=l("code"),ji=r("pytorch-1.8-to-be"),Ni=r(" + "),ia=l("code"),Gi=r("cuda-11.0"),ki=r(" / "),la=l("code"),Ai=r("transformers==4.3.0.dev0"),this.h()},l(e){const i=Yl('[data-svelte="svelte-1phssyn"]',document.head);C=o(i,"META",{name:!0,content:!0}),i.forEach(a),sa=d(e),I=o(e,"H1",{class:!0});var Fa=n(I);_=o(Fa,"A",{id:!0,class:!0,href:!0});var $i=n(_);Ne=o($i,"SPAN",{});var Xi=n(Ne);v($.$$.fragment,Xi),Xi.forEach(a),$i.forEach(a),pt=d(Fa),Ge=o(Fa,"SPAN",{});var Zi=n(Ge);ct=p(Zi,"Hardware ottimizzato per l'addestramento"),Zi.forEach(a),Fa.forEach(a),ra=d(e),j=o(e,"P",{});var qa=n(j);dt=p(qa,"L\u2019hardware utilizzato per eseguire l\u2019addestramento del modello e l\u2019inferenza pu\xF2 avere un grande effetto sulle prestazioni. Per un analisi approfondita delle GPUs, assicurati di dare un\u2019occhiata all\u2019eccellente "),X=o(qa,"A",{href:!0,rel:!0});var Li=n(X);ut=p(Li,"blog post"),Li.forEach(a),mt=p(qa," di Tim Dettmer."),qa.forEach(a),pa=d(e),oe=o(e,"P",{});var Qi=n(oe);ft=p(Qi,"Diamo un\u2019occhiata ad alcuni consigli pratici per la configurazione della GPU."),Qi.forEach(a),ca=d(e),P=o(e,"H2",{class:!0});var Oa=n(P);N=o(Oa,"A",{id:!0,class:!0,href:!0});var Wi=n(N);ke=o(Wi,"SPAN",{});var gi=n(ke);v(Z.$$.fragment,gi),gi.forEach(a),Wi.forEach(a),Mt=d(Oa),Ae=o(Oa,"SPAN",{});var Di=n(Ae);Ut=p(Di,"GPU"),Di.forEach(a),Oa.forEach(a),da=p(e,`

Quando si addestrano modelli pi\xF9 grandi ci sono essenzialmente tre opzioni:
- GPUs piu' grandi
- Piu' GPUs
- Piu' CPU e piu' NVMe (scaricato da [DeepSpeed-Infinity](main_classes/deepspeed#nvme-support))
`),ne=o(e,"P",{});var xi=n(ne);ht=p(xi,"Iniziamo dal caso in cui ci sia una singola GPU."),xi.forEach(a),ua=d(e),E=o(e,"H3",{class:!0});var Ka=n(E);G=o(Ka,"A",{id:!0,class:!0,href:!0});var Hi=n(G);Be=o(Hi,"SPAN",{});var Yi=n(Be);v(L.$$.fragment,Yi),Yi.forEach(a),Hi.forEach(a),vt=d(Ka),Ve=o(Ka,"SPAN",{});var Fi=n(Ve);wt=p(Fi,"Potenza e Raffreddamento"),Fi.forEach(a),Ka.forEach(a),ma=d(e),se=o(e,"P",{});var qi=n(se);yt=p(qi,"Se hai acquistato una costosa GPU di fascia alta, assicurati di darle la potenza corretta e un raffreddamento sufficiente."),qi.forEach(a),fa=d(e),Q=o(e,"P",{});var Bi=n(Q);Se=o(Bi,"STRONG",{});var Oi=n(Se);bt=p(Oi,"Potenza"),Oi.forEach(a),Tt=p(Bi,":"),Bi.forEach(a),Ma=d(e),re=o(e,"P",{});var Ki=n(re);Ct=p(Ki,"Alcune schede GPU consumer di fascia alta hanno 2 e talvolta 3 prese di alimentazione PCI-E a 8 pin. Assicurati di avere tanti cavi PCI-E a 8 pin indipendenti da 12 V collegati alla scheda quante sono le prese. Non utilizzare le 2 fessure a un\u2019estremit\xE0 dello stesso cavo (noto anche come cavo a spirale). Cio\xE8 se hai 2 prese sulla GPU, vuoi 2 cavi PCI-E a 8 pin che vanno dall\u2019alimentatore alla scheda e non uno che abbia 2 connettori PCI-E a 8 pin alla fine! In caso contrario, non otterrai tutte le prestazioni ufficiali."),Ki.forEach(a),Ua=d(e),pe=o(e,"P",{});var el=n(pe);It=p(el,"Ciascun cavo di alimentazione PCI-E a 8 pin deve essere collegato a una guida da 12 V sul lato dell\u2019alimentatore e pu\xF2 fornire fino a 150 W di potenza."),el.forEach(a),ha=d(e),ce=o(e,"P",{});var al=n(ce);Pt=p(al,"Alcune altre schede possono utilizzare connettori PCI-E a 12 pin e questi possono fornire fino a 500-600 W di potenza."),al.forEach(a),va=d(e),de=o(e,"P",{});var tl=n(de);Et=p(tl,"Le schede di fascia bassa possono utilizzare connettori a 6 pin, che forniscono fino a 75 W di potenza."),tl.forEach(a),wa=d(e),ue=o(e,"P",{});var il=n(ue);Jt=p(il,"Inoltre vuoi un alimentatore (PSU) di fascia alta che abbia una tensione stabile. Alcuni PSU di qualit\xE0 inferiore potrebbero non fornire alla scheda la tensione stabile di cui ha bisogno per funzionare al massimo."),il.forEach(a),ya=d(e),me=o(e,"P",{});var ll=n(me);zt=p(ll,"E ovviamente l\u2019alimentatore deve avere abbastanza Watt inutilizzati per alimentare la scheda."),ll.forEach(a),ba=d(e),W=o(e,"P",{});var Vi=n(W);Re=o(Vi,"STRONG",{});var ol=n(Re);_t=p(ol,"Raffreddamento"),ol.forEach(a),jt=p(Vi,":"),Vi.forEach(a),Ta=d(e),fe=o(e,"P",{});var nl=n(fe);Nt=p(nl,"Quando una GPU si surriscalda, inizier\xE0 a rallentare e non fornir\xE0 le prestazioni mssimali e potrebbe persino spegnersi se diventasse troppo calda."),nl.forEach(a),Ca=d(e),Me=o(e,"P",{});var sl=n(Me);Gt=p(sl,"\xC8 difficile dire l\u2019esatta temperatura migliore a cui aspirare quando una GPU \xE8 molto caricata, ma probabilmente qualsiasi cosa al di sotto di +80\xB0C va bene, ma pi\xF9 bassa \xE8 meglio - forse 70-75\xB0C \xE8 un intervallo eccellente in cui trovarsi. \xC8 probabile che il rallentamento inizi a circa 84-90\xB0C. Ma oltre alla limitazione delle prestazioni, una temperatura molto elevata prolungata \xE8 probabile che riduca la durata di una GPU."),sl.forEach(a),Ia=d(e),Ue=o(e,"P",{});var rl=n(Ue);kt=p(rl,"Diamo quindi un\u2019occhiata a uno degli aspetti pi\xF9 importanti quando si hanno pi\xF9 GPU: la connettivit\xE0."),rl.forEach(a),Pa=d(e),J=o(e,"H3",{class:!0});var et=n(J);k=o(et,"A",{id:!0,class:!0,href:!0});var pl=n(k);$e=o(pl,"SPAN",{});var cl=n($e);v(g.$$.fragment,cl),cl.forEach(a),pl.forEach(a),At=d(et),Xe=o(et,"SPAN",{});var dl=n(Xe);Bt=p(dl,"Connettivit\xE0 multi-GPU"),dl.forEach(a),et.forEach(a),Ea=d(e),he=o(e,"P",{});var ul=n(he);Vt=p(ul,"Se utilizzi pi\xF9 GPU, il modo in cui le schede sono interconnesse pu\xF2 avere un enorme impatto sul tempo totale di allenamento. Se le GPU si trovano sullo stesso nodo fisico, puoi eseguire:"),ul.forEach(a),Ja=d(e),v(D.$$.fragment,e),za=d(e),ve=o(e,"P",{});var ml=n(ve);St=p(ml,"e ti dir\xE0 come sono interconnesse le GPU. Su una macchina con doppia GPU e collegata a NVLink, molto probabilmente vedrai qualcosa del tipo:"),ml.forEach(a),_a=d(e),v(x.$$.fragment,e),ja=d(e),we=o(e,"P",{});var fl=n(we);Rt=p(fl,"su una macchina diversa senza NVLink potremmo vedere:"),fl.forEach(a),Na=d(e),v(H.$$.fragment,e),Ga=d(e),ye=o(e,"P",{});var Ml=n(ye);$t=p(Ml,"Il rapporto include questa legenda:"),Ml.forEach(a),ka=d(e),v(Y.$$.fragment,e),Aa=d(e),U=o(e,"P",{});var je=n(U);Xt=p(je,"Quindi il primo rapporto "),Ze=o(je,"CODE",{});var Ul=n(Ze);Zt=p(Ul,"NV2"),Ul.forEach(a),Lt=p(je," ci dice che le GPU sono interconnesse con 2 NVLinks e nel secondo report "),Le=o(je,"CODE",{});var hl=n(Le);Qt=p(hl,"PHB"),hl.forEach(a),Wt=p(je," abbiamo una tipica configurazione PCIe+Bridge a livello di consumatore."),je.forEach(a),Ba=d(e),be=o(e,"P",{});var vl=n(be);gt=p(vl,"Controlla che tipo di connettivit\xE0 hai sulla tua configurazione. Alcuni di questi renderanno la comunicazione tra le carte pi\xF9 veloce (es. NVLink), altri pi\xF9 lenta (es. PHB)."),vl.forEach(a),Va=d(e),Te=o(e,"P",{});var wl=n(Te);Dt=p(wl,"A seconda del tipo di soluzione di scalabilit\xE0 utilizzata, la velocit\xE0 di connettivit\xE0 potrebbe avere un impatto maggiore o minore. Se le GPU devono sincronizzarsi raramente, come in DDP, l\u2019impatto di una connessione pi\xF9 lenta sar\xE0 meno significativo. Se le GPU devono scambiarsi messaggi spesso, come in ZeRO-DP, una connettivit\xE0 pi\xF9 veloce diventa estremamente importante per ottenere un addestramento pi\xF9 veloce."),wl.forEach(a),Sa=d(e),z=o(e,"H4",{class:!0});var at=n(z);A=o(at,"A",{id:!0,class:!0,href:!0});var yl=n(A);Qe=o(yl,"SPAN",{});var bl=n(Qe);v(F.$$.fragment,bl),bl.forEach(a),yl.forEach(a),xt=d(at),We=o(at,"SPAN",{});var Tl=n(We);Ht=p(Tl,"NVlink"),Tl.forEach(a),at.forEach(a),Ra=d(e),q=o(e,"P",{});var Si=n(q);O=o(Si,"A",{href:!0,rel:!0});var Cl=n(O);Yt=p(Cl,"NVLink"),Cl.forEach(a),Ft=p(Si," \xE8 un collegamento di comunicazione a corto raggio multilinea seriale basato su cavo sviluppato da Nvidia."),Si.forEach(a),$a=d(e),B=o(e,"P",{});var tt=n(B);qt=p(tt,"Ogni nuova generazione fornisce una larghezza di banda pi\xF9 veloce, ad es. ecco una citazione da "),K=o(tt,"A",{href:!0,rel:!0});var Il=n(K);Ot=p(Il,"Nvidia Ampere GA102 GPU Architecture"),Il.forEach(a),Kt=p(tt,":"),tt.forEach(a),Xa=d(e),Ce=o(e,"BLOCKQUOTE",{});var Pl=n(Ce);ge=o(Pl,"P",{});var El=n(ge);ei=p(El,`Third-Generation NVLink\xAE
GA102 GPUs utilize NVIDIA\u2019s third-generation NVLink interface, which includes four x4 links,
with each link providing 14.0625 GB/sec bandwidth in each direction between two GPUs. Four
links provide 56.25 GB/sec bandwidth in each direction, and 112.5 GB/sec total bandwidth
between two GPUs. Two RTX 3090 GPUs can be connected together for SLI using NVLink.
(Note that 3-Way and 4-Way SLI configurations are not supported.)`),El.forEach(a),Pl.forEach(a),Za=d(e),f=o(e,"P",{});var R=n(f);ai=p(R,"Quindi pi\xF9 "),De=o(R,"CODE",{});var Jl=n(De);ti=p(Jl,"X"),Jl.forEach(a),ii=p(R," si ottiene nel rapporto di "),xe=o(R,"CODE",{});var zl=n(xe);li=p(zl,"NVX"),zl.forEach(a),oi=p(R," nell\u2019output di "),He=o(R,"CODE",{});var _l=n(He);ni=p(_l,"nvidia-smi topo -m"),_l.forEach(a),si=p(R,", meglio \xE8. La generazione dipender\xE0 dall\u2019architettura della tua GPU."),R.forEach(a),La=d(e),Ie=o(e,"P",{});var jl=n(Ie);ri=p(jl,"Confrontiamo l\u2019esecuzione di un training del modello di linguaggio gpt2 su un piccolo campione di wikitext"),jl.forEach(a),Qa=d(e),Pe=o(e,"P",{});var Nl=n(Pe);pi=p(Nl,"I risultati sono:"),Nl.forEach(a),Wa=d(e),V=o(e,"TABLE",{});var it=n(V);Ye=o(it,"THEAD",{});var Gl=n(Ye);ee=o(Gl,"TR",{});var lt=n(ee);Fe=o(lt,"TH",{});var kl=n(Fe);ci=p(kl,"NVlink"),kl.forEach(a),di=d(lt),Ee=o(lt,"TH",{align:!0});var Al=n(Ee);ui=p(Al,"Time"),Al.forEach(a),lt.forEach(a),Gl.forEach(a),mi=d(it),ae=o(it,"TBODY",{});var ot=n(ae);te=o(ot,"TR",{});var nt=n(te);qe=o(nt,"TD",{});var Bl=n(qe);fi=p(Bl,"Y"),Bl.forEach(a),Mi=d(nt),Je=o(nt,"TD",{align:!0});var Vl=n(Je);Ui=p(Vl,"101s"),Vl.forEach(a),nt.forEach(a),hi=d(ot),ie=o(ot,"TR",{});var st=n(ie);Oe=o(st,"TD",{});var Sl=n(Oe);vi=p(Sl,"N"),Sl.forEach(a),wi=d(st),ze=o(st,"TD",{align:!0});var Rl=n(ze);yi=p(Rl,"131s"),Rl.forEach(a),st.forEach(a),ot.forEach(a),it.forEach(a),ga=d(e),S=o(e,"P",{});var rt=n(S);bi=p(rt,"Puoi vedere che NVLink completa l\u2019addestramento circa il 23% pi\xF9 velocemente. Nel secondo benchmark utilizziamo "),Ke=o(rt,"CODE",{});var $l=n(Ke);Ti=p($l,"NCCL_P2P_DISABLE=1"),$l.forEach(a),Ci=p(rt," per dire alle GPU di non utilizzare NVLink."),rt.forEach(a),Da=d(e),_e=o(e,"P",{});var Xl=n(_e);Ii=p(Xl,"Ecco il codice benchmark completo e gli output:"),Xl.forEach(a),xa=d(e),v(le.$$.fragment,e),Ha=d(e),m=o(e,"P",{});var M=n(m);Pi=p(M,"Hardware: 2x TITAN RTX 24GB each + NVlink with 2 NVLinks ("),ea=o(M,"CODE",{});var Zl=n(ea);Ei=p(Zl,"NV2"),Zl.forEach(a),Ji=p(M," in "),aa=o(M,"CODE",{});var Ll=n(aa);zi=p(Ll,"nvidia-smi topo -m"),Ll.forEach(a),_i=p(M,`)
Software: `),ta=o(M,"CODE",{});var Ql=n(ta);ji=p(Ql,"pytorch-1.8-to-be"),Ql.forEach(a),Ni=p(M," + "),ia=o(M,"CODE",{});var Wl=n(ia);Gi=p(Wl,"cuda-11.0"),Wl.forEach(a),ki=p(M," / "),la=o(M,"CODE",{});var gl=n(la);Ai=p(gl,"transformers==4.3.0.dev0"),gl.forEach(a),M.forEach(a),this.h()},h(){u(C,"name","hf:doc:metadata"),u(C,"content",JSON.stringify(Kl)),u(_,"id","hardware-ottimizzato-per-laddestramento"),u(_,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),u(_,"href","#hardware-ottimizzato-per-laddestramento"),u(I,"class","relative group"),u(X,"href","https://timdettmers.com/2020/09/07/which-gpu-for-deep-learning/"),u(X,"rel","nofollow"),u(N,"id","gpu"),u(N,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),u(N,"href","#gpu"),u(P,"class","relative group"),u(G,"id","potenza-e-raffreddamento"),u(G,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),u(G,"href","#potenza-e-raffreddamento"),u(E,"class","relative group"),u(k,"id","connettivit-multigpu"),u(k,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),u(k,"href","#connettivit-multigpu"),u(J,"class","relative group"),u(A,"id","nvlink"),u(A,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),u(A,"href","#nvlink"),u(z,"class","relative group"),u(O,"href","https://en.wikipedia.org/wiki/NVLink"),u(O,"rel","nofollow"),u(K,"href","https://www.nvidia.com/content/dam/en-zz/Solutions/geforce/ampere/pdf/NVIDIA-ampere-GA102-GPU-Architecture-Whitepaper-V1.pdf"),u(K,"rel","nofollow"),u(Ee,"align","right"),u(Je,"align","right"),u(ze,"align","right")},m(e,i){t(document.head,C),s(e,sa,i),s(e,I,i),t(I,_),t(_,Ne),w($,Ne,null),t(I,pt),t(I,Ge),t(Ge,ct),s(e,ra,i),s(e,j,i),t(j,dt),t(j,X),t(X,ut),t(j,mt),s(e,pa,i),s(e,oe,i),t(oe,ft),s(e,ca,i),s(e,P,i),t(P,N),t(N,ke),w(Z,ke,null),t(P,Mt),t(P,Ae),t(Ae,Ut),s(e,da,i),s(e,ne,i),t(ne,ht),s(e,ua,i),s(e,E,i),t(E,G),t(G,Be),w(L,Be,null),t(E,vt),t(E,Ve),t(Ve,wt),s(e,ma,i),s(e,se,i),t(se,yt),s(e,fa,i),s(e,Q,i),t(Q,Se),t(Se,bt),t(Q,Tt),s(e,Ma,i),s(e,re,i),t(re,Ct),s(e,Ua,i),s(e,pe,i),t(pe,It),s(e,ha,i),s(e,ce,i),t(ce,Pt),s(e,va,i),s(e,de,i),t(de,Et),s(e,wa,i),s(e,ue,i),t(ue,Jt),s(e,ya,i),s(e,me,i),t(me,zt),s(e,ba,i),s(e,W,i),t(W,Re),t(Re,_t),t(W,jt),s(e,Ta,i),s(e,fe,i),t(fe,Nt),s(e,Ca,i),s(e,Me,i),t(Me,Gt),s(e,Ia,i),s(e,Ue,i),t(Ue,kt),s(e,Pa,i),s(e,J,i),t(J,k),t(k,$e),w(g,$e,null),t(J,At),t(J,Xe),t(Xe,Bt),s(e,Ea,i),s(e,he,i),t(he,Vt),s(e,Ja,i),w(D,e,i),s(e,za,i),s(e,ve,i),t(ve,St),s(e,_a,i),w(x,e,i),s(e,ja,i),s(e,we,i),t(we,Rt),s(e,Na,i),w(H,e,i),s(e,Ga,i),s(e,ye,i),t(ye,$t),s(e,ka,i),w(Y,e,i),s(e,Aa,i),s(e,U,i),t(U,Xt),t(U,Ze),t(Ze,Zt),t(U,Lt),t(U,Le),t(Le,Qt),t(U,Wt),s(e,Ba,i),s(e,be,i),t(be,gt),s(e,Va,i),s(e,Te,i),t(Te,Dt),s(e,Sa,i),s(e,z,i),t(z,A),t(A,Qe),w(F,Qe,null),t(z,xt),t(z,We),t(We,Ht),s(e,Ra,i),s(e,q,i),t(q,O),t(O,Yt),t(q,Ft),s(e,$a,i),s(e,B,i),t(B,qt),t(B,K),t(K,Ot),t(B,Kt),s(e,Xa,i),s(e,Ce,i),t(Ce,ge),t(ge,ei),s(e,Za,i),s(e,f,i),t(f,ai),t(f,De),t(De,ti),t(f,ii),t(f,xe),t(xe,li),t(f,oi),t(f,He),t(He,ni),t(f,si),s(e,La,i),s(e,Ie,i),t(Ie,ri),s(e,Qa,i),s(e,Pe,i),t(Pe,pi),s(e,Wa,i),s(e,V,i),t(V,Ye),t(Ye,ee),t(ee,Fe),t(Fe,ci),t(ee,di),t(ee,Ee),t(Ee,ui),t(V,mi),t(V,ae),t(ae,te),t(te,qe),t(qe,fi),t(te,Mi),t(te,Je),t(Je,Ui),t(ae,hi),t(ae,ie),t(ie,Oe),t(Oe,vi),t(ie,wi),t(ie,ze),t(ze,yi),s(e,ga,i),s(e,S,i),t(S,bi),t(S,Ke),t(Ke,Ti),t(S,Ci),s(e,Da,i),s(e,_e,i),t(_e,Ii),s(e,xa,i),w(le,e,i),s(e,Ha,i),s(e,m,i),t(m,Pi),t(m,ea),t(ea,Ei),t(m,Ji),t(m,aa),t(aa,zi),t(m,_i),t(m,ta),t(ta,ji),t(m,Ni),t(m,ia),t(ia,Gi),t(m,ki),t(m,la),t(la,Ai),Ya=!0},p:Fl,i(e){Ya||(y($.$$.fragment,e),y(Z.$$.fragment,e),y(L.$$.fragment,e),y(g.$$.fragment,e),y(D.$$.fragment,e),y(x.$$.fragment,e),y(H.$$.fragment,e),y(Y.$$.fragment,e),y(F.$$.fragment,e),y(le.$$.fragment,e),Ya=!0)},o(e){b($.$$.fragment,e),b(Z.$$.fragment,e),b(L.$$.fragment,e),b(g.$$.fragment,e),b(D.$$.fragment,e),b(x.$$.fragment,e),b(H.$$.fragment,e),b(Y.$$.fragment,e),b(F.$$.fragment,e),b(le.$$.fragment,e),Ya=!1},d(e){a(C),e&&a(sa),e&&a(I),T($),e&&a(ra),e&&a(j),e&&a(pa),e&&a(oe),e&&a(ca),e&&a(P),T(Z),e&&a(da),e&&a(ne),e&&a(ua),e&&a(E),T(L),e&&a(ma),e&&a(se),e&&a(fa),e&&a(Q),e&&a(Ma),e&&a(re),e&&a(Ua),e&&a(pe),e&&a(ha),e&&a(ce),e&&a(va),e&&a(de),e&&a(wa),e&&a(ue),e&&a(ya),e&&a(me),e&&a(ba),e&&a(W),e&&a(Ta),e&&a(fe),e&&a(Ca),e&&a(Me),e&&a(Ia),e&&a(Ue),e&&a(Pa),e&&a(J),T(g),e&&a(Ea),e&&a(he),e&&a(Ja),T(D,e),e&&a(za),e&&a(ve),e&&a(_a),T(x,e),e&&a(ja),e&&a(we),e&&a(Na),T(H,e),e&&a(Ga),e&&a(ye),e&&a(ka),T(Y,e),e&&a(Aa),e&&a(U),e&&a(Ba),e&&a(be),e&&a(Va),e&&a(Te),e&&a(Sa),e&&a(z),T(F),e&&a(Ra),e&&a(q),e&&a($a),e&&a(B),e&&a(Xa),e&&a(Ce),e&&a(Za),e&&a(f),e&&a(La),e&&a(Ie),e&&a(Qa),e&&a(Pe),e&&a(Wa),e&&a(V),e&&a(ga),e&&a(S),e&&a(Da),e&&a(_e),e&&a(xa),T(le,e),e&&a(Ha),e&&a(m)}}}const Kl={local:"hardware-ottimizzato-per-laddestramento",sections:[{local:"gpu",sections:[{local:"potenza-e-raffreddamento",title:"Potenza e Raffreddamento"},{local:"connettivit-multigpu",sections:[{local:"nvlink",title:"NVlink"}],title:"Connettivit\xE0 multi-GPU"}],title:"GPU"}],title:"Hardware ottimizzato per l'addestramento"};function eo(Ri){return ql(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class lo extends Dl{constructor(C){super();xl(this,C,eo,Ol,Hl,{})}}export{lo as default,Kl as metadata};
