DUICUO

ByteDance は、分散トレーニング スケジューリング フレームワーク Primus を正式にオープンソース化しました。

機械学習の発展に伴い、モデルとそのトレーニングに必要なデータ量は増加しており、分散トレーニングがますます一般的になっています。アルゴリズムエンジニアは通常、これらの分散フレームワークの基盤となるファイルストレージとスケジューリングシステムを深く理解することで、バッチモデルのトレーニングを迅速に開始し、リソースを最大限に活用する必要があります。

現在、TonY、TensorFlowOnSpark、KubeflowのTraining Operatorsなど、業界には類似のフレームワークが数多く存在します。しかし、これらのフレームワークには、固定の機械学習フレームワーク(Tensorflow、PyTorch)と組み合わせる際にPSやWorkerといったロールを指定する必要がある、フォールトトレランスと柔軟なスケジューリングのサポートが不十分、異種スケジューリングのサポートが不足、スケジューリングのセマンティクスが比較的単純、ファイル読み取りのサポートが不足といった問題があります。

Primus は、アルゴリズム エンジニアをこのような重い低レベルの詳細作業から解放し、アルゴリズム自体にさらに集中できるようにするという問題を解決します

バイトダンスの1日あたり100万コアの運用の実践

ByteDance による継続的な実践を通じて洗練され改善された Primus は、ビジネス ニーズをサポートする次の機能を備えています。

  1. 自社開発のトレーニング フレームワーク: 業界のオープンソースである Tensorflow と PyTorch に加えて、ByteDance は機械学習のシナリオを詳細に調査し、ユーザーのニーズを満たす複数のトレーニング フレームワークを開発しました。
  2. 基盤となるリソーススケジューリングシステムとしてYARNとKubernetesを採用しています。現在、YARNからKubernetesへの移行を進めています。このプロセスでは、ユーザーを基盤となるスケジューリングシステムから保護し、一貫したエクスペリエンスを提供する必要があります。
  3. 混合リソースの大規模な適用: 混合リソースは性質が不安定であるため、トレーニングのフォールト トレランスと安定性に対する要件が高くなります。
  4. 複雑なスケジューリングとオーケストレーションのセマンティクスをサポート: クラスター リソースの使用率を最大化するには、適切なコンテナを適切な場所に配置し、同時実行性とコンテナ サイズを動的に調整できる必要があります。
  5. 複雑なデータ ソースとデータ スケジューリング要件をサポート: HDFS や Kafka などのバッチおよびストリーミング データ ソース、Text、PB、Parquet などのデータ タイプなど、複数のデータ ソースとデータ タイプの混合トレーニングをサポートします。

現在、Primusストリーミングおよびバッチトレーニングフレームワークは、Douyin、Toutiao、TikTok、広告など、ByteDanceのほとんどの事業をサポートしており、毎日数百万のジョブコアがPrimus上で実行されています。従来のHadoopストリーミングベースのフレームワークと比較して、トレーニングパフォーマンスは3倍向上し、1回のトレーニングセッションのデータ総量はテラバイトからペタバイトに増加し、トレーニング準備時間は数十分から数秒に短縮されました。

Primus、分散トレーニングスケジューリングフレームワーク

Primus は、機械学習トレーニング フレームワーク (Tensorflow や PyTorch など) のライフサイクルとデータ分散を管理し、トレーニング フレームワークがより優れた分散機能を実現できるように支援する、汎用の分散トレーニング スケジューリング フレームワークです。

アーキテクチャの紹介

プリムス全体のアーキテクチャ

Primus のライフサイクル全体は、コミット フェーズと実行フェーズの 2 つのフェーズに分かれています。

  1. 提出フェーズ

ユーザーは、タスク全体のトレーニング リソース、データ入力、フォールト トレランス戦略を記述する必要があります。

  • トレーニング リソースには、必要なロール (PS、ワーカーなど) と、CPU、メモリ、実行スクリプト、環境変数などの各ロールに必要なリソースが含まれます。
  • データ入力では、データをトレーナーに提供する方法を記述します。
  • フォールト トレランス戦略は、エラーが発生したときに Primus が実行する必要があるアクションを記述します。

Primus クライアントは、ユーザーの設定に従って Primus アプリケーション マスター (以下、AM と呼びます) を YARN または Kubernetes クラスターに送信し、Primus ジョブ クラスターの動作を管理します。

  1. 実行フェーズ

ジョブがクラスターに送信されると、AMはユーザーの設定に応じてリソースマネージャーに複数のExecutorを要求し、対応するロールを起動します。これらのロールのヘルスステータスを継続的に監視し、異常なステータスが検出された場合、AMはユーザーの設定に応じて適切なアクションを実行し、トレーニングが正常に実行されるようにします。

  1. データの読み取り

Primusはトレーナーへのデータ出力の読み取りをサポートしており、データの負荷分散と継続的なデータステータス記録により、ロングテール問題の発生を軽減します。また、トレーナーに問題が発生した場合、稼働中のトレーナーに切り替えてトレーニングを継続することもできます。Advanced Manager(AM)はトレーニング対象のデータをスキャンし、タスクに分割します。タスクはExecutorに分散されます。AMはExecutorと通信してタスクのステータスを記録します。

機能紹介

  1. 複数のトレーニング フレームワークをサポートします: Tensorflow、PyTorch、Monolith など。
  2. 複数のスケジューラがサポートされています:YARN、Kubernetes など。
  3. マルチロールのサポート: PS-Chief-CPU、Worker-GPU、Worker-Evaluator など、複数のロール間のアフィニティやアンチアフィニティなどの特別なスケジューリング戦略をサポートします。
  4. 複数のオーケストレーション戦略: 同時起動、順次起動、およびロールベースの順次起動をサポートします (例: 最初に PS を起動し、次に Worker を起動します)。
  5. フォールト トレランス: ワーカーに障害が発生すると、新しいワーカーが自動的に起動します。PS に障害が発生すると、プロセス全体が失敗します。
  6. 動的スケジューリング: たとえば、ワーカーの数を動的に増加または減少することをサポートします。
  7. 複数のデータ ソース データ タイプをサポートします: HDFS、Kafka など。
  8. データの負荷分散と状態の保持: ワーカーに障害が発生した場合にタスクを回収して再配布するなど、ワーカーの負荷に基づいてタスクを動的に割り当てます。
  9. マルチスレッドによる高速データ読み取り:HDFS と Kafka のマルチスレッド読み取りとトレーナーへの出力をサポートし、単一のトレーナーのスループットが向上します。

展開状況

Primus は、1 日あたり数万件のトレーニング タスクと 450 万のコア リソースを使用した大規模なディープラーニング トレーニングのために、Toutiao 推奨、Douyin 動画推奨、Pangolin 広告、Qianchuan グラフィック広告、Douyin 検索など、ByteDance 社内の「推奨」、「広告」、「検索」シナリオをサポートしています。

今後の計画

  1. オープンソースのPrimusの機能は、今後段階的に追加される予定です。詳細はこちら:https://mp.weixin.qq.com/s/uGBy-WpdjTMUy-7MQAZiww
  2. Primusは現在、ByteDanceの社内トレーニングフレームワークと広範囲に統合されています。TensorflowとPyTorchはPrimusの基本機能を利用できます。将来的には、TensorflowとPyTorchをPrimus APIに対応させ、より深い統合を実現し、オープンソースのトレーニングフレームワークを強化していきます。

Primus は現在 GitHub でオープンソース化されており、誰でも開発に参加できます。

プロジェクトアドレス: https://github.com/bytedance/primus