[セッションレポート] 機械学習の学習や推論に適切なインスタンスを選択するには #reinvent #CMP207

2022.12.02

せーのでございます。

このブログでは2022/11/28(現地)より行われておりますAWS最大のカンファレンス「re:Invent 2022」よりセッション

Choosing the right accelerator for training and inference

の様子をレポートいたします。

概要

Amazon EC2は、機械学習アプリケーションのための最も広範で深いインスタンスのポートフォリオを提供します。P4やG5のようなGPUベースの高性能インスタンスから、最高の価格性能のためにAWSシリコンで構築されたTrn1やInf1インスタンスまで、それぞれの機械学習ワークロードに適したインスタンスが用意されています。このセッションでは、これらのインスタンス、ベンチマーク、および各インスタンスの理想的なユースケースのガイドラインについて学びます。また、機械学習ワークロードを本番環境に導入し、スケールさせる方法をデモでご紹介します。

レポート

  • 技術的には、機械学習モデルを学習・実行するために、より効率的なGPUアクセラレータやCPUを構築することも進んでいる
  • このセッションでは、AWSが提供するGPUやアクセラレータ、CPUを紹介するとともに、機械学習のスペシャリストがこのハイブリッド要素の最適な組み合わせを選択するためのガイドラインを提供する

  • 機械学習のワークロードを3つのシナリオにわけた
  • 小さなシナリオでは、小さなデータセットやおもちゃのデータセットを使って訓練したシンプルな機械学習モデルや古典的な機械学習モデルを理解することができ、ラップトップで実行できる
  • 中間のサイズのモデルを訓練するためには、500ギガバイトのような、多くはないが中間のサイズのデータセットが必要
  • 数十億のパラメータを持つモデル。これらの巨大なモデルはデータを大量に消費し、これらのモデルを訓練するためにテラバイトからペタバイトのデータが必要
    • 最大のパフォーマンスを達成し、ワークロードのコストを削減するために、これらのオプションを検討する必要がある
    • より厳しいトレーニングを行う場合、データセットだけでなく、モデルや勾配を複数のインスタンス間で同期させるための非常に優れたネットワークが必要
    • 結局、スーパーコンピューターが必要

AWSインスタンスのラインアップ

  • チップはIntel、AMDのCPU、NVIDIAやAMDのGPU、AWSのカスタムアクセラレーターがある
  • 通常のサイズの機械学習トレーニングと推論を想定しているならCPU系
  • 言語モデルなど大規模な訓練ならNVIDIA GPU A100やB100で動く最新インスタンスを検討すべき
  • Habana LabsのGaudiチップを搭載したDL1インスタンスやAWS独自のトレーニングチップを搭載したTrn1インスタンスも
  • 複数の選択肢があるためチートシートを作った

  • 考慮するポイント
    • スループット
    • レイテンシー
    • コストが適切かどうか、コスト効率が良いか
  • 一方エンジニアチームは
    • 生産性が高いこと
    • インスタンスが使いやすいこと
  • 複数の異なるモデルで高速な実験を行うことを優先する場合は、これを参考に様々なカテゴリのインスタンスに対して配置していく
  • 柔軟性を持たせたいならエンジニアはインスタンスを勉強するのに時間を使うべき
  • モデルの構築そのものに時間を割きたいのであればCPUを使う必要がある
  • ビジネスを拡大したい、より大きな規模展開をしていきたいのであればGPUへの移行を開始する
    • 特にGシリーズはパフォーマンスが高く、幅広いモデルをサポートしている
  • 大規模に展開し、多くの推論を使用して毎日生産を実行したい場合はInferenciaがコスト的にもお得
    • SDKを拡大し、PytorchやTensorflowなどの人気のあるフレームワークに統合した

CPUでのトレーニングに向いているもの

  • 従来の機械学習モデルを使っている場合
  • Scikit-learnなどの昔ながらのフレームワークを使用し、それらがCPU用に作成されている場合
  • ベストなのは私達が開発したシリコンテクノロジー (Inferencia、Trainium)を使うこと
  • Gravitonは汎用目的でゼロから作成されたArm64のCPU
    • 正確に言えばCPU内部にいくつかのアクセラレータを持っている
    • 小さなGPUのようなもので1サイクルでベクトル計算が可能
    • bfloat16をサポートし、データサイズを削減できる。がこれはパフォーマンス上は小さな事
  • Graviton2とGraviton3はパフォーマンスが進化し、C7gはC6gのおよそ2.5倍のパフォーマンスが出る

  • CPUはCMD命令セットのようなシーケンシャルなコンピューティングに非常に向いている

  • マトリックス x マトリックス、マトリックス x ベクターのような並列の計算にはアクレラレータをつけるといい

  • 科学的なワークロードを行っていて、ハイレベルな予測が必要な場合はTrn1インスタンスが向いている

    • BF16で3.4PFLOPS, FP32で840TFLOPSの学習性能
    • インスタンスあたり最大512GBのメモリ
  • 分散型訓練に精通している人はTrn1でクラスタ化させる
    • Trn1は通信と計算でコンピューティングエンジンが2つあるので、通信しながら計算が並列で行われる
  • データセンターレベルではウルトラクラスタの概念が必要
    • ビックデータ対策でより多くのアクレラレータを追加
    • コンピュータあたり6ExaFLOPSを実現

分散型トレーニング

  • データが大きすぎて一つのアクセラレータに収まらない場合は分散型トレーニングを検討する
  • 1つのインスタンスの内部に複数のGPUやアクセラレータを備えたものは中で分散型トレーニングを行える
  • モデル自体がインスタンスに対して大きすぎる場合は複数のインスタンスをロード、または起動してからモデルをスライスして全てのインスタンスにロードできる
  • ディスク アクセラレータは全てのノードにまたがっている

  • ワーカーを複数にわける。例えばこの場合は4つのワーカーをつくり、同じモデルをコピーし、ビックデータをスライスして異なるバッチを送信する

  • ワーカーはその特定のバッチを使用してモデルをトレーニングする
  • 学習が一回りしたらクラスタワーカ全体で成分を共有し、モデルがマージされ、別のコピーが作成されて、それが他のワーカーに配布される

  • モデルがアクセラレータのメモリにフィットしない場合は「パイプライン並列処理」という新たな戦略を練る必要がある
  • モデルのレイヤーを使用してモデルをスライスする
  • レイヤー1と2をワーカー1に、レイヤー3をワーカー2に、レイヤー4をワーカー3に配置する
  • このパイプライン全体にスライスしたデータを流すとレイヤー2まで終了したデータは即座にワーカー2に渡される
  • 大きいモデルとデータセットをスライスして効率的に処理することはできるが、ワーカーが作業している間に他のワーカーの待ち時間が発生する
  • テンソル並列処理である別の戦略も検討する

  • テンソルをいくつか選択して、これらのみをロードする
  • 残りのプロセスはパイプラインの並列処理ににている
  • 多数のパラメータを抱えるモデルに最適

  • Sagemakerは有名なのでここではあまり説明しない

  • パイプラインを簡素化し、EC2を立てる手間が減る

まとめ

いかがでしたでしょうか。
実際のセッションではユースケースなどを示しながらかなり具体的な学習、運用方法を提示していました。機械学習をクラウドで、コストエフェクティブかつ高速に行いたい、という人は勉強になったかと思います。