KubernetesのElasticDeep Learning Training Tool-Elastic Training Operator

はじめに: リソースコストと弾力性のある拡張という点でのクラウドコンピューティングの自然な利点により、ますます多くの顧客がクラウド上にAIシステムを構築することをいとわず、コンテナーとKubernetesに代表されるクラウドネイティブテクノロジーがリリースする最短のパスになっています。クラウドの価値クラウド上にKubernetesをベースにしたAIプラットフォームを構築する傾向になっています。

頭のpicture.png

著者| Xu Zhou(Xiao Yuan)
出典| AlibabaCloudネイティブパブリックNo.

バックグラウンド

リソースコストと弾力性のある拡張という点でのクラウドコンピューティングの自然な利点により、ますます多くの顧客がクラウド上にAIシステムを構築することをいとわず、コンテナやKubernetesに代表されるクラウドネイティブテクノロジーが、クラウド。KubernetesをベースにしたAIプラットフォームを構築する傾向になっています。

より複雑なモデルトレーニングや大量のデータに直面した場合、1台のマシンの計算能力が計算能力の要件を満たすことができないことがよくあります。AliのAiACCやコミュニティのhorovod などの分散トレーニングフレームワークを使用すること で、単一マシンのトレーニングタスクを拡張して、わずか数行のコード変更で分散トレーニングタスクをサポートできます。Kubernetesでは、kubeflowコミュニティのtf-operatorがTensorflow PSモードをサポートするか、mpi-operatorがhorovodのmpiallreduceモードをサポートするのが一般的です。

現状

Kubernetesとクラウドコンピューティングは俊敏性とスケーラビリティを提供します。cluster-AutoScalerやその他のコンポーネントを使用してトレーニングタスクの弾力的な戦略を設定し、Kubernetesの弾力性のある機能を使用してオンデマンドを作成してGPU機器のアイドリングを減らすことができます。

ただし、このスケーリングモードは、トレーニングなどのオフラインタスクにはまだ少し不十分です。

  • フォールトトレランスはサポートされていません。機器の理由で一部のワーカーが失敗した場合は、タスク全体を停止して再起動する必要があります。
  • トレーニングタスクは一般に時間がかかり、多くの計算能力を消費し、タスクには柔軟性がありません。リソースが不足している場合、タスクが終了しない限り、リソースを他のビジネスにオンデマンドで解放することはできません。
  • トレーニングタスクには時間がかかり、ワーカーの動的構成をサポートしておらず、プリエンプティブインスタンスを安全に使用してクラウドの費用対効果を最大化することはできません。

トレーニングタスクに柔軟性を与える方法は、コストパフォーマンスを向上させるための重要な方法です。最近、horovodなどの分散フレームワークは、Elastic Training、つまりElasticTraining機能を徐々にサポートしています。つまり、トレーニングタスクは、実行プロセス中にトレーニングワーカーを動的に拡大または縮小することができ、トレーニングタスクの中断を引き起こすことはありません。コードに少量の変更と適応を加える必要がある場合は、https//horovod.readthedocs.io/en/stable/elastic_include.htmlを参照してください

Elasticトレーニングの実装原理に興味がある場合は、このElastic Horovod設計ドキュメントを読むことができ ます。この記事では、詳細については説明しません。

1.png

mpi-operatorでは、トレーニングに参加するワーカーは静的リソースとして設計および保守されます。柔軟なトレーニングモードをサポートした後、タスクに柔軟性を追加し、次のような運用および保守レイヤーに課題をもたらします。

  • horovodが提供するhorovordrunを入口として使用する必要があります。horovodでは、ランチャーはsshを使用してワーカーにログインし、ランチャーとワーカーの間のログイントンネルを開く必要があります。
  • 弾力性の計算を担当するElasticDriverモジュールは、discover_hostスクリプトを指定して最新のワーカートポロジ情報を取得し、それによってワーカーインスタンスを開始または停止します。ワーカーが変更されたら、最初にdiscover_hostスクリプトの戻り値を更新します。
  • プリエンプションや価格計算などのシナリオでは、ワーカーの縮小を指定する必要がある場合があります。K8のネイティブオーケストレーションプリミティブデプロイメントでは、statefulsetは指定された縮小シナリオを満たすことができません。

解決

上記の問題に対応するため、トレーニングタスクを記述するTrainingJob CRD、拡張および縮小操作を記述するScaleOutおよびScaleIn CRDを提供するet-operatorを設計および開発し、それらを組み合わせることでトレーニングタスクをより柔軟にしました。このプログラムをオープンソースにし、需要、交換、苦情を募るすべての人を歓迎します。

オープンソースソリューションのアドレス:https//github.com/AliyunContainerService/et-operator

設計

TrainingJobControllerには主に次の機能があります。

  • TrainingJobの作成/削除ライフサイクルとサブリソース管理を維持します。
  • 拡大および縮小操作を実行します。
  • フォールトトレランス。ワーカーが追い出されると、新しいワーカーが作成され、トレーニングに追加されます。

1.リソースの作成

TrainingJobサブリソースは、次の順序で作成されます。

  • sshを通過してシークレットを作成するために必要なキーペアを作成します。
  • サービスとポッドを含むワーカーを作成し、秘密公開鍵をマウントします。
  • Discover_hostスクリプトとhostfileファイルを含むconfigmapを作成します。
  • ランチャーを作成し、configmapをマウントします。ホストファイルは将来トポロジ関係で変更されるため、ホストファイルはconfigmapからinitcontainerのみを介して別のディレクトリにコピーされます。

TrainingJob関連のリソース:

2.png

TrainingJob CRの構成は、LanucherとWorkerに分かれています。タスクミラーリングを指定し、Launcherで実行を開始します。デフォルトでは、et-operatorはワーカー分布に基づいてhostfileファイルとdiscover_hostスクリプトを生成します。discover_hostスクリプトは、Launcherの/etc/edl/discover_hosts.shファイルのエントリスクリプトItにマウントされます。 horovodrunの実行中に--host-discovery-scriptパラメーターで指定されます。ワーカー設定でワーカーのイメージとGPUの使用量を指定し、maxReplicas / minReplicasを使用してワーカーレプリカの数の許容範囲を指定します。

apiVersion: kai.alibabacloud.com/v1alpha1
kind: TrainingJob
metadata:
  name: elastic-training
  namespace: default
spec:
  cleanPodPolicy: Running
  etReplicaSpecs:
    launcher:
      replicas: 1
      template:
        spec:
          containers:
          - command:
            - sh
            - -c
            - horovodrun -np 2 --min-np 1 --max-np 9 --host-discovery-script
              /etc/edl/discover_hosts.sh python /examples/elastic/tensorflow2_mnist_elastic.py
            image: registry.cn-huhehaote.aliyuncs.com/lumo/horovod:master-tf2.1.0-torch1.4.0-mxnet-py3.6-gpu
            imagePullPolicy: Always
            name: mnist-elastic
    worker:
      maxReplicas: 9
      minReplicas: 1
      replicas: 2
      template:
        spec:
          containers:
          - image: registry.cn-huhehaote.aliyuncs.com/lumo/horovod:master-tf2.1.0-torch1.4.0-mxnet-py3.6-gpu
            imagePullPolicy: Always
            name: mnist-elastic
            resources:
              limits:
                nvidia.com/gpu: "1"
              requests:
                nvidia.com/gpu: "1"
status:
  currentWorkers:
  - elastic-training-worker-0
  - elastic-training-worker-1
  - elastic-training-worker-2
  - elastic-training-worker-3
  phase: Succeeded
  replicaStatuses:
    Launcher:
      active: 1
      succeeded: 1
    Worker:
      active: 4

3.png

2.労働者の拡大/削減

TrainingJobに加えて、et-operatorはScaleOutとScaleInの両方のCRDをサポートし、トレーニングタスクの拡張および縮小操作を提供します。

ScaleOut CRが発行されると、ScaleOutControllerがReconcileをトリガーします。ここでの作業は非常に簡単です。ScaleOutCRのSelectorフィールドに従って、Scalerに対応するTrainingJobを見つけて、CRのOwnerReferencesに設定します。

例としてScaleOut操作を取り上げます。

- apiVersion: kai.alibabacloud.com/v1alpha1
  kind: ScaleOut
  metadata:
    creationTimestamp: "2020-11-04T13:54:26Z
    name: scaleout-ptfnk
    namespace: default
    ownerReferences:
    - apiVersion: kai.alibabacloud.com/v1alpha1
      blockOwnerDeletion: true
      controller: true
      kind: TrainingJob
      name: elastic-training // 指向扩容对象TrainingJob
      uid: 075b9c4a-22f9-40ce-83c7-656b329a2b9e
  spec:
  selector:
    name: elastic-training
  toAdd:
    count: 2

TrainingJobControllerは、TrainingJobに属するScaleOut CRが更新されることを監視し、TrainingJobの調整をトリガーし、TrainingJobの下のOwnerReferenceが指すScaleInとScaleOutをトラバースしてフィルター処理し、作成時間と作成時間に従って実行される拡張または縮小を決定します。ステータス時間。

apiVersion: kai.alibabacloud.com/v1alpha1
kind: TrainingJob
metadata:
  name: elastic-training
  namespace: default
spec: 
  // ...... Launcher and Worker spec
status:
  currentScaler: ScaleIn:default/scaleout-ptfnk
  phase: Scaling
  currentWorkers:
  - elastic-training-worker-0
  - elastic-training-worker-1

ScaleOutミッションCR:

4.png

ScaleInミッションCR:

5.png

詳細な作業プロセス:

6.png

実行

1.ET-Operatorをインストールします

mkdir -p $(go env GOPATH)/src/github.com/aliyunContainerService
cd $(go env GOPATH)/src/github.com/aliyunContainerService
git clone https://http://github.com/aliyunContainerService/et-operator
cd et-operator
kubectl create -f deploy/all_in_one.yaml 

crdのインストールを確認します。

# kubectl get crd
NAME                                    CREATED AT
scaleins.kai.alibabacloud.com           2020-11-11T11:16:13Z
scaleouts.kai.alibabacloud.com          2020-11-11T11:16:13Z
trainingjobs.kai.alibabacloud.com       2020-11-11T11:16:13Z

デフォルトでkube-aiにインストールされているコントローラーの実行ステータスを確認します。

# kubectl -n kube-ai get po
NAME                                         READY   STATUS              RESTARTS   AGE
et-operator-controller-manager-7877968489-c5kv4   0/2     ContainerCreating   0          5s

2.TrainingJobを実行します

準備した例を実行します。

kubectl apply -f examples/training_job.yaml

実行ステータスを確認します。

# kubectl get trainingjob
NAME                          PHASE     AGE
elastic-training              Running   77s

# kubectl get po
NAME                                      READY   STATUS             RESTARTS   AGE
elastic-training-launcher                 1/1     Running            0          7s
elastic-training-worker-0                 1/1     Running            0          10s
elastic-training-worker-1                 1/1     Running            0          9s

3.トレーニングタスクの削減ワーカー

スケーリングを実行する場合、ScaleInCRのspec.toDelete.countまたはspec.toDelete.podNamesフィールドを使用してスケーリングされたワーカーを指定できます。

カウントによる収縮の数を構成してから、インデックスを介して高から低への収縮ワーカーを計算します。

apiVersion: kai.alibabacloud.com/v1alpha1
kind: ScaleIn
metadata:
  name: scalein-workers
spec:
  selector:
    name: elastic-training
  toDelete:
    count: 1

特定のワーカーを縮小する場合は、podNamesを構成できます。

apiVersion: kai.alibabacloud.com/v1alpha1
kind: ScaleIn
metadata:
  name: scalein-workers
spec:
  selector:
    name: elastic-training
  toDelete:
    podNames:
    - elastic-training-worker-1

スケーリングの例を実行し、スケーリング1ワーカーの数を指定します。

kubectl create -f examples/scale_in_count.yaml

縮小およびトレーニングタスクの実行ステータスを検出します。

# kubectl get scalein
NAME                                     PHASE            AGE
scalein-sample-t8jxd                     ScaleSucceeded   11s

# kubectl get po
NAME                                      READY   STATUS             RESTARTS   AGE
elastic-training-launcher                 1/1     Running            0          47s
elastic-training-worker-0                 1/1     Running            0          50s

4.拡張トレーニングタスク

ScaleOut CRで、spec.toAdd.countフィールドを使用して展開するワーカーの数を指定します。

apiVersion: kai.alibabacloud.com/v1alpha1
  kind: ScaleOut
  metadata:
    name: elastic-training-scaleout-9dtmw
    namespace: default
  spec:
    selector:
      name: elastic-training
    timeout: 300
    toAdd:
      count: 2

実行例:

kubectl create -f examples/scale_out.yaml

縮小およびトレーニングタスクの実行ステータスを検出します。

kubectl get scaleout
NAME                                     PHASE            AGE
elastic-training-scaleout-9dtmw          ScaleSucceeded   30s
kubectl get po
NAME                                      READY   STATUS             RESTARTS   AGE
elastic-training-launcher                 1/1     Running            0          2m5s
elastic-training-worker-0                 1/1     Running            0          2m8s
elastic-training-worker-1                 1/1     Running            0          40s
elastic-training-worker-2                 1/1     Running            0          40s

総括する

ET-Operatorは、トレーニングとスケーリングのCRDとコントローラーのセットを提供し、Kubernetesで柔軟な分散トレーニングを簡単に実行し、分散トレーニングタスクの分散をサポートし、分散フレームワークの統合を通じて、プロセス中にトレーニングタスクで実行できるようにします。計算に関与するワーカーは動的に拡大および縮小されます。プリエンプティブインスタンスと組み合わせてトレーニングタスクを柔軟にすることで、クラウドのリソースの弾力性と費用効果の高い利点をより有効に活用できます。

元のリンク

この記事はAlibabaCloudのオリジナルのコンテンツであり、許可なく複製することはできません。

おすすめ

転載: blog.csdn.net/xxscj/article/details/113862334