バージョン 1.8 から、Kubernetes は デバイスプラグイン を使用して、 NVIDIA GPU、 InfiniBand、FPGA などのハードウェアアクセラレーションデバイスをサポートしています。 さらに、Kubernetes オープンソースコミュニティの GPU ソリューションは、バージョン 1.10 で廃止され、バージョン 1.11 のマスターコードから削除されます。

Alibaba Cloud Kubernetes クラスターを GPU と組み合わせて使用して、機械学習や画像処理などの高密度な計算タスクを実行することを推奨します。 この方法では、NVIDIA ドライバーや CUDA (Compute Unified Device Architecture ) を事前にインストールしなくても、ワンクリックデプロイ、エラスティックスケーリング、およびその他の機能を実装できます。

背景情報

クラスターの作成中は、Container Service により以下の操作が行われます。

  • Elastic Compute Service (ECS) インスタンスを作成し、SSH ログインに使用する公開鍵を管理ノードから他のノードに設定します。次に、CloudInit を使用して Kubernetes クラスターをインストールし設定します。
  • VPC 内のすべての ICMP ポートへのインバウンドアクセスを許可するセキュリティグループを作成します。
  • 既存の VPC を使用しない場合、新しい VPC と VSwitch を作成し、VSwitch 用 SNAT エントリも作成します。
  • VPC ルーティングルールを作成します。
  • NAT ゲートウェイと Elastic IP (EIP) を作成します。
  • Resource Access Management (RAM) ユーザーおよび AccessKey (AK) を作成します。 この RAM ユーザーは、ECS インスタンスの照会、作成、および削除権限、クラウドディスクの追加と削除権限、および Server Load Balancer (SLB) インスタンス、CloudMonitor、VPC、Log Service、および Network Attached Storage (NAS) サービスに対するすべての関連アクセス権限を持っています。 Kubernetes クラスターにより、設定に応じた SLB インスタンス、クラウドディスク、および VPC ルーティングルールの動的な作成が行われます。
  • SLB インタンスの作成し、6443 番ポートを開放します。
  • インターネット SLB インスタンスを作成し、6443、8443、および 22 番ポートを開放します。 (クラスター作成時にインターネットの SSH ログインを有効化した場合、22 番ポートが開放されます。 有効化しなかった場合、22 番ポートは開放されません。)

前提条件

Container Service、Resource Orchestration Service (ROS)、および RAM を有効化する必要があります。

Container Service コンソールROS コンソールRAM コンソール にログインし、それぞれのサービスを有効化します。

Container Service Kubernetes クラスターのデプロイは、 Alibaba Cloud ROS のアプリケーションデプロイ機能に依存します。 そのため、Kubernetes クラスターの作成前に ROS を有効化する必要があります。

制限事項

  • Kubernetes クラスターにより作成された SLB インスタンスは、従量課金の課金方法のみサポートしています。
  • Kubernetes クラスターは、 Virtual Private Cloud (VPC) のみをサポートしています。
  • デフォルトでは、それぞれのアカウントで作成できるクラウドリソース数には、指定されたクォータがあります。 クラウドリソース数がクォータを超えた場合、そのアカウントでは新たにクラスターを作成できません。 クラスターを作成するのに十分なリソース クォータが存在することを確認してください。 クォータを増やすには、チケットを起票し、サポートセンターへお問い合わせください。
    • デフォルトでは、それぞれのアカウントですべてのリージョンにおいて 5 つまでクラスターを作成でき、それぞれのクラスターには 40 ノードまで追加できます。 それより多くのクラスターまたはノードを作成するには、チケットを起票し、サポートセンターへお問い合わせください。
    • デフォルトでは、それぞれのアカウントで 100 個までセキュリティグループを作成できます。
    • デフォルトでは、それぞれのアカウントで 60 個まで従量課金 SLB インスタンスを作成できます。
    • デフォルトでは、それぞれのアカウントで 20 個まで EIP を作成できます。
  • ECS インスタンスの制限は以下のようになります。

GN5 Kubernetes クラスターの作成

  1. Container Service コンソール にログインします。
  2. Kubernetes で、左側のナビゲーションウィンドウから [クラスター] をクリックします。
  3. 右上隅の [Kubernetes クラスターの作成] をクリックします。
    [Kubernetes クラスターの作成] ページがデフォルトで表示されます。
    Worker ノードは、GPU ECS インスタンスを使用して GPU クラスターを作成するように設定されています。 その他のパラメーター設定についての情報は、「Kubernetes クラスターの作成」をご参照ください。
  4. Worker ノードを設定します。 この例では、gn5 GPU インスタンスタイプが選択され、Worker ノードを GPU 作業ノードとして設定します。
    1. Worker インスタンスの作成を選択する場合は、インスタンスのタイプと Worker ノードの数を選択する必要があります。 この例では、2 つの GPU ノードが作成されます。
    2. 既存のインスタンスを追加する場合は、クラスターを作成するリージョンと同じリージョンに、GPU クラウドサーバーを作成している必要があります。
  5. 必要な設定がすべて完了したら、[作成] をクリックし、クラスターのデプロイを開始します。
  6. クラスターの作成後、左側のナビゲーション ウィンドウで、[クラスター] > [ノード] を選択します。
  7. 作成されたいずれかのノードにマウントされた GPU デバイスを表示するには、クラスタードロップダウンリストから、作成されたクラスターを選択し、作成した Worker ノードのいずれかを選択します。次に、[操作] 列で [詳細] > [詳細] を選択します。

TensorFLow を実行する GPU 実験環境を作成する

Jupyterは、実験環境 TensorFlow のデータサイエンティストによって使用される一般的なツールです。 このドキュメントでは、Jupyter アプリケーションをデプロイする方法の例について説明します。

  1. Container Service コンソール にログインします。
  2. Kubernetes の左側のナビゲーションウィンドウで、 [アプリケーション] > [デプロイメント] を選択します。
  3. 右上隅の [テンプレートによる作成] をクリックします。
  4. 対象となるクラスターと名前空間を選択し、 [リソースタイプ] ドロップダウンリストから、カスタムテンプレートまたはサンプルテンプレートを選択します。 テンプレートを調整したら、[デプロイメント] をクリックします。

    この例では、Jupyter アプリケーションテンプレートが調整されます。 テンプレートには、デプロイとサービスが含まれています。

    ---
    # Define the tensorflow deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tf-notebook
      labels:
        app: tf-notebook
    spec:
      replicas: 1
      selector: # define how the deployment finds the pods it manages
        matchLabels:
          app: tf-notebook
      template: #Define the pod specifications.
        metadata:
          labels:
            app: tf-notebook
        spec:
          containers:
          - name: tf-notebook
            image: tensorflow/tensorflow:1.4.1-gpu-py3
            resources:
              limits:
                nvidia.com/gpu: 1                      #specify the number of NVIDIA GPUs that are called by the application
            ports:
            - containerPort: 8888
              hostPort: 8888
            env:
              - name: PASSWORD                         #specify the password used to access the Jupyter service. You can modify the password as needed.
                value: mypassw0rd
    
    # Define the tensorflow deployment
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: tf-notebook
    spec:
      ports:
      - port: 80
        targetPort: 8888
        name: jupyter
      selector:
        app: tf-notebook
      type: LoadBalancer                           #set Alibaba Cloud SLB service for the application so that its services are accessible from the Internet.

    1.9.3 より前の Kubernetes の GPU デプロイソリューションを使用する場合は、NVIDIA ドライバーが存在する次のボリュームを定義する必要があります。

    volumes:
        - hostPath:
            path: /usr/lib/nvidia-375/bin
            name: bin
        - hostPath:
            path: /usr/lib/nvidia-375
            name: lib

    1.9.3 より前の Kubernetes の GPU デプロイソリューションを使用して、クラスター内のデプロイテンプレートを調整する場合、テンプレートはクラスターに大きく依存している必要があります。 その結果、テンプレートの移植性がなくなります。 ただし、Kubernetes バージョン 1.9.3 以降では、NIVEA プラグインがドライバーに必要なライブラリリンクと実行ファイルを自動的に検出するため、これらの hostPath を指定する必要はありません。

  5. Container Service-Kubernetes の左側のナビゲーションウィンドウで、[ディスカバリとロードバランシング] > [サービス] を選択します。 次に、対象となるクラスターと名前空間を選択し、tf-notebook サービスの外部エンドポイントを表示します。
  6. ブラウザで Jupyter アプリケーションにアクセスします。 アクセスアドレスは、http://EXTERNAL-IP です。 テンプレートにパスワードセットを入力する必要があります。
  7. 次のプログラムを実行すると、この Jupyter アプリケーションが GPU を使用できることを確認でき、Tensorflow で使用できるすべてのデバイスを一覧表示できます。
    from tensorflow.python.client import device_lib
    
    def get_available_devices():
        local_device_protos = device_lib.list_local_devices()
        return [x.name for x in local_device_protos]
    
    print(get_available_devices())