import{s as ve,n as ke,o as _e}from"../chunks/scheduler.9bc65507.js";import{S as Ne,i as Ve,g as y,s,r as p,A as Re,h as o,f as t,c as n,j as Ge,u as M,x as w,k as Ye,y as xe,a,v as c,d as r,t as i,w as m}from"../chunks/index.707bf1b6.js";import{C as j}from"../chunks/CodeBlock.54a9f38d.js";import{H as E}from"../chunks/Heading.342b1fa6.js";function Qe(he){let J,S,F,z,T,K,d,be='モデルが大きくなるにつれて、限られたハードウェアでより大きなモデルを訓練し、訓練速度を大幅に上昇させるための方法として並列処理が浮上してきました。1台のマシンに複数のGPUがあっても、複数のマシンにまたがる複数のGPUがあっても、あらゆるタイプの分散処理セットアップ上でユーザーが簡単に 🤗 Transformers モデルを訓練できるように、 Hugging Face では <a href="https://huggingface.co/docs/accelerate" rel="nofollow">🤗 Accelerate</a> ライブラリを作成しました。このチュートリアルでは、PyTorch の訓練ループをカスタマイズして、分散処理環境での訓練を可能にする方法について学びます。',L,U,P,f,$e="はじめに 🤗 Accelerate をインストールしましょう:",q,h,D,b,Ie="そしたらインポートして <code>Accelerator</code> オブジェクトを作成しましょう。<code>Accelerator</code> は分散処理セットアップを自動的に検出し、訓練のために必要な全てのコンポーネントを初期化します。モデルをデバイスに明示的に配置する必要はありません。",O,$,ee,I,le,u,ue="次に、関連する全ての訓練オブジェクトを <code>prepare</code> メソッドに渡します。これには、訓練と評価それぞれのDataloader、モデル、optimizer が含まれます:",te,C,ae,B,se,Z,Ce="最後に訓練ループ内の <code>loss.backward()</code> を 🤗 Accelerate の <code>backward</code> メソッドで置き換えます：",ne,A,pe,g,Be="以下のコードで確認できる通り、訓練ループに4行のコードを追加するだけで分散学習が可能です！",Me,W,ce,X,re,G,Ze="関連するコードを追加したら、スクリプトまたは Colaboratory などのノートブックで訓練を開始します。",ie,Y,me,v,Ae="スクリプトから訓練をしている場合は、設定ファイルを作成・保存するために以下のコマンドを実行してください:",ye,k,oe,_,ge="そして次のようにして訓練を開始します:",we,N,Je,V,je,R,We="Colaboratory の TPU の利用をお考えの場合、🤗 Accelerate はノートブック上で実行することもできます。訓練に必要な全てのコードを関数に含め、<code>notebook_launcher</code> に渡してください:",Te,x,de,Q,Xe='🤗 Accelerate と豊富な機能についてもっと知りたい方は<a href="https://huggingface.co/docs/accelerate" rel="nofollow">ドキュメント</a>を参照してください。',Ue,H,fe;return T=new E({props:{title:"🤗 Accelerate を用いた分散学習",local:"-accelerate-を用いた分散学習",headingTag:"h1"}}),U=new E({props:{title:"セットアップ",local:"セットアップ",headingTag:"h2"}}),h=new j({props:{code:"cGlwJTIwaW5zdGFsbCUyMGFjY2VsZXJhdGU=",highlighted:"pip install accelerate",wrap:!1}}),$=new j({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}}),I=new E({props:{title:"Accelerate する準備をしましょう",local:"accelerate-する準備をしましょう",headingTag:"h2"}}),C=new j({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}}),B=new E({props:{title:"Backward",local:"backward",headingTag:"h2"}}),A=new j({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}}),W=new j({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}}),X=new E({props:{title:"訓練する",local:"訓練する",headingTag:"h2"}}),Y=new E({props:{title:"スクリプトで訓練する",local:"スクリプトで訓練する",headingTag:"h3"}}),k=new j({props:{code:"YWNjZWxlcmF0ZSUyMGNvbmZpZw==",highlighted:"accelerate config",wrap:!1}}),N=new j({props:{code:"YWNjZWxlcmF0ZSUyMGxhdW5jaCUyMHRyYWluLnB5",highlighted:"accelerate launch train.py",wrap:!1}}),V=new E({props:{title:"ノートブックで訓練する",local:"ノートブックで訓練する",headingTag:"h3"}}),x=new j({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}}),{c(){J=y("meta"),S=s(),F=y("p"),z=s(),p(T.$$.fragment),K=s(),d=y("p"),d.innerHTML=be,L=s(),p(U.$$.fragment),P=s(),f=y("p"),f.textContent=$e,q=s(),p(h.$$.fragment),D=s(),b=y("p"),b.innerHTML=Ie,O=s(),p($.$$.fragment),ee=s(),p(I.$$.fragment),le=s(),u=y("p"),u.innerHTML=ue,te=s(),p(C.$$.fragment),ae=s(),p(B.$$.fragment),se=s(),Z=y("p"),Z.innerHTML=Ce,ne=s(),p(A.$$.fragment),pe=s(),g=y("p"),g.textContent=Be,Me=s(),p(W.$$.fragment),ce=s(),p(X.$$.fragment),re=s(),G=y("p"),G.textContent=Ze,ie=s(),p(Y.$$.fragment),me=s(),v=y("p"),v.textContent=Ae,ye=s(),p(k.$$.fragment),oe=s(),_=y("p"),_.textContent=ge,we=s(),p(N.$$.fragment),Je=s(),p(V.$$.fragment),je=s(),R=y("p"),R.innerHTML=We,Te=s(),p(x.$$.fragment),de=s(),Q=y("p"),Q.innerHTML=Xe,Ue=s(),H=y("p"),this.h()},l(e){const l=Re("svelte-u9bgzb",document.head);J=o(l,"META",{name:!0,content:!0}),l.forEach(t),S=n(e),F=o(e,"P",{}),Ge(F).forEach(t),z=n(e),M(T.$$.fragment,e),K=n(e),d=o(e,"P",{"data-svelte-h":!0}),w(d)!=="svelte-192lut2"&&(d.innerHTML=be),L=n(e),M(U.$$.fragment,e),P=n(e),f=o(e,"P",{"data-svelte-h":!0}),w(f)!=="svelte-1fbhxpt"&&(f.textContent=$e),q=n(e),M(h.$$.fragment,e),D=n(e),b=o(e,"P",{"data-svelte-h":!0}),w(b)!=="svelte-1hnqfdf"&&(b.innerHTML=Ie),O=n(e),M($.$$.fragment,e),ee=n(e),M(I.$$.fragment,e),le=n(e),u=o(e,"P",{"data-svelte-h":!0}),w(u)!=="svelte-1d82el5"&&(u.innerHTML=ue),te=n(e),M(C.$$.fragment,e),ae=n(e),M(B.$$.fragment,e),se=n(e),Z=o(e,"P",{"data-svelte-h":!0}),w(Z)!=="svelte-1mop653"&&(Z.innerHTML=Ce),ne=n(e),M(A.$$.fragment,e),pe=n(e),g=o(e,"P",{"data-svelte-h":!0}),w(g)!=="svelte-16n2ctr"&&(g.textContent=Be),Me=n(e),M(W.$$.fragment,e),ce=n(e),M(X.$$.fragment,e),re=n(e),G=o(e,"P",{"data-svelte-h":!0}),w(G)!=="svelte-brvxr7"&&(G.textContent=Ze),ie=n(e),M(Y.$$.fragment,e),me=n(e),v=o(e,"P",{"data-svelte-h":!0}),w(v)!=="svelte-1qh0nhe"&&(v.textContent=Ae),ye=n(e),M(k.$$.fragment,e),oe=n(e),_=o(e,"P",{"data-svelte-h":!0}),w(_)!=="svelte-jhf118"&&(_.textContent=ge),we=n(e),M(N.$$.fragment,e),Je=n(e),M(V.$$.fragment,e),je=n(e),R=o(e,"P",{"data-svelte-h":!0}),w(R)!=="svelte-1yotz52"&&(R.innerHTML=We),Te=n(e),M(x.$$.fragment,e),de=n(e),Q=o(e,"P",{"data-svelte-h":!0}),w(Q)!=="svelte-ucruyz"&&(Q.innerHTML=Xe),Ue=n(e),H=o(e,"P",{}),Ge(H).forEach(t),this.h()},h(){Ye(J,"name","hf:doc:metadata"),Ye(J,"content",Ee)},m(e,l){xe(document.head,J),a(e,S,l),a(e,F,l),a(e,z,l),c(T,e,l),a(e,K,l),a(e,d,l),a(e,L,l),c(U,e,l),a(e,P,l),a(e,f,l),a(e,q,l),c(h,e,l),a(e,D,l),a(e,b,l),a(e,O,l),c($,e,l),a(e,ee,l),c(I,e,l),a(e,le,l),a(e,u,l),a(e,te,l),c(C,e,l),a(e,ae,l),c(B,e,l),a(e,se,l),a(e,Z,l),a(e,ne,l),c(A,e,l),a(e,pe,l),a(e,g,l),a(e,Me,l),c(W,e,l),a(e,ce,l),c(X,e,l),a(e,re,l),a(e,G,l),a(e,ie,l),c(Y,e,l),a(e,me,l),a(e,v,l),a(e,ye,l),c(k,e,l),a(e,oe,l),a(e,_,l),a(e,we,l),c(N,e,l),a(e,Je,l),c(V,e,l),a(e,je,l),a(e,R,l),a(e,Te,l),c(x,e,l),a(e,de,l),a(e,Q,l),a(e,Ue,l),a(e,H,l),fe=!0},p:ke,i(e){fe||(r(T.$$.fragment,e),r(U.$$.fragment,e),r(h.$$.fragment,e),r($.$$.fragment,e),r(I.$$.fragment,e),r(C.$$.fragment,e),r(B.$$.fragment,e),r(A.$$.fragment,e),r(W.$$.fragment,e),r(X.$$.fragment,e),r(Y.$$.fragment,e),r(k.$$.fragment,e),r(N.$$.fragment,e),r(V.$$.fragment,e),r(x.$$.fragment,e),fe=!0)},o(e){i(T.$$.fragment,e),i(U.$$.fragment,e),i(h.$$.fragment,e),i($.$$.fragment,e),i(I.$$.fragment,e),i(C.$$.fragment,e),i(B.$$.fragment,e),i(A.$$.fragment,e),i(W.$$.fragment,e),i(X.$$.fragment,e),i(Y.$$.fragment,e),i(k.$$.fragment,e),i(N.$$.fragment,e),i(V.$$.fragment,e),i(x.$$.fragment,e),fe=!1},d(e){e&&(t(S),t(F),t(z),t(K),t(d),t(L),t(P),t(f),t(q),t(D),t(b),t(O),t(ee),t(le),t(u),t(te),t(ae),t(se),t(Z),t(ne),t(pe),t(g),t(Me),t(ce),t(re),t(G),t(ie),t(me),t(v),t(ye),t(oe),t(_),t(we),t(Je),t(je),t(R),t(Te),t(de),t(Q),t(Ue),t(H)),t(J),m(T,e),m(U,e),m(h,e),m($,e),m(I,e),m(C,e),m(B,e),m(A,e),m(W,e),m(X,e),m(Y,e),m(k,e),m(N,e),m(V,e),m(x,e)}}}const Ee='{"title":"🤗 Accelerate を用いた分散学習","local":"-accelerate-を用いた分散学習","sections":[{"title":"セットアップ","local":"セットアップ","sections":[],"depth":2},{"title":"Accelerate する準備をしましょう","local":"accelerate-する準備をしましょう","sections":[],"depth":2},{"title":"Backward","local":"backward","sections":[],"depth":2},{"title":"訓練する","local":"訓練する","sections":[{"title":"スクリプトで訓練する","local":"スクリプトで訓練する","sections":[],"depth":3},{"title":"ノートブックで訓練する","local":"ノートブックで訓練する","sections":[],"depth":3}],"depth":2}],"depth":1}';function Fe(he){return _e(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Le extends Ne{constructor(J){super(),Ve(this,J,Fe,Qe,ve,{})}}export{Le as component};
