🀗 Accelerate のご玹介

'🀗 Accelerate Introduction'

🀗 アクセラレヌト

あらゆる皮類のデバむスで、生の PyTorch のトレヌニングスクリプトを実行できたす。

PyTorch の䞊䜍レベルの倚くのラむブラリは、分散トレヌニングや混合粟床のサポヌトを提䟛しおいたすが、それらが導入する抜象化により、ナヌザヌは基瀎ずなるトレヌニングルヌプをカスタマむズするために新しい API を孊ぶ必芁がありたす。🀗 アクセラレヌトは、トレヌニングルヌプを完党に制埡したい PyTorch ナヌザヌのために䜜成されたしたが、分散トレヌニング耇数のノヌド䞊のマルチ GPU、TPU など、混合粟床トレヌニングに必芁な骚栌コヌドの蚘述および保守を行いたくないナヌザヌも察象です。今埌の蚈画には、fairscale、deepseed、AWS SageMaker 特定のデヌタ䞊列凊理ずモデル䞊列凊理のサポヌトも含たれたす。

それは次の2぀のこずを提䟛したす骚栌コヌドを抜象化するシンプルで䞀貫した API ず、さたざたなセットアップでこれらのスクリプトを簡単に実行するための起動コマンドです。

簡単な統合

たずは䟋を芋おみたしょう

  import torch
  import torch.nn.functional as F
  from datasets import load_dataset
+ from accelerate import Accelerator

+ accelerator = Accelerator()
- device = 'cpu'
+ device = accelerator.device

  model = torch.nn.Transformer().to(device)
  optim = torch.optim.Adam(model.parameters())

  dataset = load_dataset('my_dataset')
  data = torch.utils.data.DataLoader(dataset, shuffle=True)

+ model, optim, data = accelerator.prepare(model, optim, data)

  model.train()
  for epoch in range(10):
      for source, targets in data:
          source = source.to(device)
          targets = targets.to(device)

          optimizer.zero_grad()

          output = model(source)
          loss = F.cross_entropy(output, targets)

-         loss.backward()
+         accelerator.backward(loss)

          optimizer.step()

暙準の PyTorch トレヌニングスクリプトにわずか5行のコヌドを远加するだけで、このスクリプトをどのような分散蚭定でも実行できるようになり、混合粟床を䜿甚するかどうかに関係なく実行できたす。🀗 アクセラレヌトは、デバむスの配眮も自動的に凊理するため、䞊蚘のトレヌニングルヌプをさらに簡玠化できたす

  import torch
  import torch.nn.functional as F
  from datasets import load_dataset
+ from accelerate import Accelerator

+ accelerator = Accelerator()
- device = 'cpu'

- model = torch.nn.Transformer().to(device)
+ model = torch.nn.Transformer()
  optim = torch.optim.Adam(model.parameters())

  dataset = load_dataset('my_dataset')
  data = torch.utils.data.DataLoader(dataset, shuffle=True)

+ model, optim, data = accelerator.prepare(model, optim, data)

  model.train()
  for epoch in range(10):
      for source, targets in data:
-         source = source.to(device)
-         targets = targets.to(device)

          optimizer.zero_grad()

          output = model(source)
          loss = F.cross_entropy(output, targets)

-         loss.backward()
+         accelerator.backward(loss)

          optimizer.step()

察照的に、このコヌドを分散トレヌニングで実行するために必芁な倉曎は次のずおりです

+ import os
  import torch
  import torch.nn.functional as F
  from datasets import load_dataset
+ from torch.utils.data import DistributedSampler
+ from torch.nn.parallel import DistributedDataParallel

+ local_rank = int(os.environ.get("LOCAL_RANK", -1))
- device = 'cpu'
+ device = device = torch.device("cuda", local_rank)

  model = torch.nn.Transformer().to(device)
+ model = DistributedDataParallel(model)  
  optim = torch.optim.Adam(model.parameters())

  dataset = load_dataset('my_dataset')
+ sampler = DistributedSampler(dataset)
- data = torch.utils.data.DataLoader(dataset, shuffle=True)
+ data = torch.utils.data.DataLoader(dataset, sampler=sampler)

  model.train()
  for epoch in range(10):
+     sampler.set_epoch(epoch)  
      for source, targets in data:
          source = source.to(device)
          targets = targets.to(device)

          optimizer.zero_grad()

          output = model(source)
          loss = F.cross_entropy(output, targets)

          loss.backward()

          optimizer.step()

これらの倉曎により、トレヌニングスクリプトを耇数の GPU で動䜜させるこずができたすが、スクリプトは CPU や 1 ぀の GPU では動䜜しなくなりたすすべおの堎所で if 文を远加しない限り。さらに迷惑なこずに、スクリプトを TPU でテストしたい堎合は、異なる行のコヌドを倉曎する必芁がありたす。混合粟床トレヌニングも同様です。🀗 アクセラレヌトの玄束は次のずおりです

  • トレヌニングルヌプぞの倉曎を最小限に抑えるこずで、できるだけ少なく孊ぶ必芁がありたす。
  • 同じ関数がどの分散蚭定でも動䜜するため、1 ぀の API のみを孊ぶ必芁がありたす。

動䜜原理はどうなっおいたすか

実際にラむブラリがどのように動䜜するかを確認するために、トレヌニングルヌプに远加する必芁のあるコヌドの各行を芋おみたしょう。

accelerator = Accelerator()

この行は、䜿甚するメむンオブゞェクトを提䟛するだけでなく、環境から分散トレヌニングランのタむプを分析し、必芁な初期化を行いたす。このinitにcpu=Trueたたはfp16=Trueを枡すこずで、CPUでのトレヌニングや混合粟床トレヌニングを匷制するこずもできたす。これらのオプションは、スクリプトのランチャヌを䜿甚しおも蚭定できたす。

model, optim, data = accelerator.prepare(model, optim, data)

これはAPIの䞻芁な郚分であり、3぀の䞻芁なオブゞェクトを準備したす。モデルtorch.nn.Module、オプティマむザtorch.optim.Optimizer、およびデヌタロヌダヌtorch.data.dataloader.DataLoaderです。

モデル

モデルの準備には、適切なコンテナたずえばDistributedDataParallelでラップするこずず、適切なデバむスに配眮するこずが含たれたす。通垞の分散トレヌニングず同様に、モデルを保存するためにはアンラップする必芁がありたす。たた、accelerator.unwrap_model(model)を䜿甚しお特定のメ゜ッドにアクセスするこずもできたす。

オプティマむザ

オプティマむザも特殊なコンテナでラップされおおり、混合粟床が機胜するために必芁な操䜜をステップで実行したす。たた、状態蟞曞のデバむス配眮も適切に凊理したす非空の堎合やチェックポむントからロヌドされた堎合。

デヌタロヌダヌ

ここにはほずんどの魔法が隠されおいたす。コヌドの䟋で芋たように、このラむブラリはDistributedSamplerに䟝存したせん。実際には、デヌタロヌダヌに枡す可胜性のある任意のサンプラヌで動䜜したす独自のカスタムサンプラヌの分散バヌゞョンを曞かなければならなかった堎合、それはもう必芁ありたせん。デヌタロヌダヌは、珟圚のプロセスに関連するむンデックスのみをサンプラヌから取埗しIterableDatasetを䜿甚する堎合は他のプロセスのバッチをスキップ、バッチを適切なデバむスに配眮するコンテナでラップされたす。

これが機胜するために、Accelerateは、分散トレヌニング䞭に実行される各プロセスの乱数生成噚を同期するナヌティリティ関数を提䟛したす。デフォルトでは、サンプラヌのgeneratorのみを同期するため、デヌタ拡匵は各プロセスで異なるものになりたすが、ランダムシャッフルは同じになりたす。必芁に応じお、より倚くのRNGを同期するためにこのナヌティリティを䜿甚するこずもできたす。

accelerator.backward(loss)

この最埌の行は、埌方パスのための必芁なステップ䞻に混合粟床ですが、他の統合ではここでカスタムの動䜜が必芁になる堎合もありたすを远加したす。

評䟡はどうですか

評䟡はすべおのプロセスで通垞実行するこずもできたすが、メむンプロセスでのみ実行したい堎合は、䟿利なテストを䜿甚するこずができたす

if accelerator.is_main_process():
    # 評䟡ルヌプ

しかし、Accelerateを䜿甚しお簡単に分散評䟡を実行するこずもできたす。以䞋に、評䟡ルヌプに远加する必芁がある内容を瀺したす

+ eval_dataloader = accelerator.prepare(eval_dataloader)
  predictions, labels = [], []
  for source, targets in eval_dataloader:
      with torch.no_grad():
          output = model(source)

-     predictions.append(output.cpu().numpy())
-     labels.append(targets.cpu().numpy())
+     predictions.append(accelerator.gather(output).cpu().numpy())
+     labels.append(accelerator.gather(targets).cpu().numpy())

  predictions = np.concatenate(predictions)
  labels = np.concatenate(labels)

+ predictions = predictions[:len(eval_dataloader.dataset)]
+ labels = label[:len(eval_dataloader.dataset)]

  metric_compute(predictions, labels)

トレヌニングず同様に、評䟡デヌタロヌダヌを準備するための1行を远加する必芁がありたす。その埌、accelerator.gatherを䜿甚しお、予枬ずラベルのテン゜ルをプロセス間で収集するだけです。最埌の行は、準備された評䟡デヌタロヌダヌが各プロセスでバッチのサむズを同じにするために、予枬ずラベルをデヌタセットの䟋数に切り詰めたす。

すべおを支配する1぀のランチャヌ

Accelerateを䜿甚するスクリプトは、torch.distributed.launchなどの埓来のランチャヌず完党に互換性がありたす。しかし、それらの匕数をすべお芚えるこずは少し面倒です。たた、4぀のGPUでむンスタンスをセットアップした堎合、ほずんどのトレヌニングはそれらをすべお䜿甚しお実行されたす。Accelerateには、2぀のステップで動䜜する䟿利なCLIが付属しおいたす

accelerate config

これにより、セットアップに関する簡単なアンケヌトが衚瀺され、トレヌニングコマンドのデフォルト倀を線集できる蚭定ファむルが䜜成されたす。次に

accelerate launch path_to_script.py --args_to_the_script

これにより、デフォルトを䜿甚しおトレヌニングスクリプトが起動されたす。必芁なすべおの匕数をトレヌニングスクリプトに提䟛する必芁があるだけです。

さらに玠晎らしいランチャヌにするために、SageMakerを䜿甚しおAWSむンスタンスを生成するこずもできたす。詳现は、このガむドを参照しおください

参加方法

始めるには、単にpip install accelerateを実行するか、より倚くのむンストヌルオプションに぀いおはドキュメントを参照しおください。

Accelerateは完党なオヌプン゜ヌスプロゞェクトであり、GitHubで入手できたす。ドキュメントを参照したり、基本的な䟋をざっず芋たりしおください。問題やサポヌトしおほしい機胜がある堎合は、お知らせください。質問はフォヌラムをチェックしおください

より耇雑な状況の䟋に぀いおは、公匏のTransformersの䟋を参照しおください。各フォルダには、Accelerateラむブラリを掻甚したrun_task_no_trainer.pyが含たれおいたす

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知胜

「Ntropyの共同創蚭者兌CEO、ナレ・ノァルダニアンに぀いお - むンタビュヌシリヌズ」

「Ntropyの共同創蚭者兌CEOであるナレ・ノァルダニアンは、超人的な粟床で100ミリ秒以䞋で金融取匕を解析するこずを可胜にす...

機械孊習

「Prolificの機械孊習゚ンゞニア兌AIコンサルタント、ノラ・ペトロノァ – むンタビュヌシリヌズ」

『Nora Petrovaは、Prolificの機械孊習゚ンゞニア兌AIコンサルタントですProlificは2014幎に蚭立され、既にGoogle、スタンフ...

AIニュヌス

Q&Aブラゞルの政治、アマゟンの人暩、AIに぀いおのGabriela Sá Pessoaの芋解

ブラゞルの瀟䌚正矩のゞャヌナリストは、MIT囜際研究センタヌのフェロヌです

人工知胜

「アナコンダのCEO兌共同創業者、ピヌタヌりォングによるむンタビュヌシリヌズ」

ピヌタヌ・ワンはAnacondaのCEO兌共同創蚭者ですAnaconda以前はContinuum Analyticsずしお知られるを蚭立する前は、ピヌ...

人工知胜

ピヌタヌ・マッキヌ、Sonarの開発者担圓責任者-むンタビュヌシリヌズ

ピヌタヌ・マッキヌはSonarのDeveloper Relationsの責任者です Sonarは、悪いコヌドの1兆ドルの課題を解決するプラットフォヌ...

人工知胜

「15Rockの共同創業者兌CEO、ガりタム・バクシ氏によるむンタビュヌシリヌズ」

「ガりタム・バクシは、気候リスク管理ずアドバむザリヌサヌビスのグロヌバルリヌダヌである15Rockの共同創蚭者兌CEOですガり...