クラウドネイティブAIスイートがインストールされているクラスターをデプロイした後、クラスターリソースを割り当て、リソース使用量を複数の次元で表示できます。 これにより、クラスターリソースの使用率を最適化できます。 このトピックでは、クラウドネイティブAIスイートで実行できる基本的なO&M操作について説明します。 たとえば、クラウドネイティブAIスイートのインストール、リソースダッシュボードの表示、ユーザーとクォータの管理などができます。
背景情報
クラウドネイティブAIスイートがインストールされているクラスターをデプロイした後、クラスターリソースを割り当て、リソース使用量を複数の次元で表示できます。 これにより、クラスターリソースの使用率を最適化できます。
クラスターが複数のユーザーによって使用されている場合、ユーザーがリソースを求めて競合する場合に備えて、各ユーザーに一定量のリソースを割り当てる必要があります。 従来の方法では、Kubernetesリソースクォータを使用して、各ユーザーに固定量のリソースを割り当てます。 ただし、リソース使用率はユーザーグループによって異なります。 クラスターリソースの全体的な使用率を向上させるために、クラスターリソースをユーザーに割り当てた後にユーザーがリソースを共有できるようにすることができます。
次の図は、企業の組織構造を示しています。 ビジネス要件に基づいて、さまざまなレベルでエラスティッククォータを設定できます。 図中の各リーフノードは、ユーザグループに対応する。 権限とクォータを個別に管理するには、ユーザーグループ内のユーザーを1つ以上の名前空間に追加し、ユーザーに異なるロールを割り当てることができます。 これにより、リソースをユーザーグループ間で共有し、同じユーザーグループ内のユーザーを分離できます。
前提条件
Container Service for Kubernetes (ACK) Proクラスターが作成されました。 クラスターを作成するときに、コンポーネント設定ウィザードページでモニタリングエージェントとSimple Log Serviceが有効になっていることを確認します。 詳細については、「ACK Proクラスターの作成」をご参照ください。
クラスターのKubernetesバージョンが1.18以降です。
タスク
このトピックでは、次のタスクを完了する方法について説明します。
クラウドネイティブAIスイートをインストールします。
リソースダッシュボードを表示します。
ユーザーグループのリソースクォータを設定します。
ユーザーとグループを管理します。
各ユーザーの最小量のリソースが使い果たされた後、アイドルリソースを使用してより多くのワークロードを送信します。
各ユーザーのリソースの最大量を設定します。
各ユーザーのリソースの最小量を設定します。
ステップ1: クラウドネイティブAIスイートのインストール
クラウドネイティブAIスイートは、タスク弾力性、データアクセラレーション、AIタスクスケジューリング、AIタスクライフサイクル管理、AIダッシュボード、AI開発者コンソールのコンポーネントで構成されています。 ビジネス要件に基づいてコンポーネントをインストールできます。
クラウドネイティブAIスイートのデプロイ
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[クラウドネイティブAI Suite] ページで、[デプロイ] をクリックします。 表示されるページで、インストールするコンポーネントを選択します。
ページの下部にある [クラウドネイティブAIスイートのデプロイ] をクリックします。 システムは、環境と選択されたコンポーネントの依存関係をチェックします。 環境と依存関係がチェックに合格した後、システムは選択したコンポーネントをデプロイします。
コンポーネントのインストール後、コンポーネントリストに次の情報を表示できます。
クラスターにインストールされているコンポーネントの名前とバージョンを表示できます。 コンポーネントをデプロイまたはアンインストールできます。
コンポーネントが更新可能な場合は、コンポーネントを更新できます。
ack-ai-dashboardとack-ai-dev-consoleをインストールした後、Cloud-native AI Suiteページの左上隅にAIダッシュボードとAI開発者コンソールへのハイパーリンクが表示されます。 ハイパーリンクをクリックすると、対応するコンポーネントにアクセスできます。
インストールが完了すると、クラウドネイティブAI Suiteページの左上隅にAIダッシュボードとAI開発者コンソールへのハイパーリンクが表示されます。 ハイパーリンクをクリックすると、対応するコンポーネントにアクセスできます。
AIダッシュボードのインストールと設定
Cloud-native AI Suiteページの [インタラクションモード] セクションで、[コンソール] を選択します。 次の図に示すように、[メモ] ダイアログボックスが表示されます。
RAMワーカーロールに権限を付与するカスタムポリシーを作成します。
カスタムポリシーを作成します。
RAM コンソールにログインします。 左側のナビゲーションウィンドウで、[権限]> [ポリシー] を選択します。
[ポリシー] ページで [ポリシーの作成] をクリックします。
[JSON] タブをクリックします。
[アクション]
フィールドに次の内容を追加し、[次へ] をクリックしてポリシー情報を編集します。"log:GetProject", "log:GetLogStore", "log:GetConfig", "log:GetMachineGroup", "log:GetAppliedMachineGroups", "log:GetAppliedConfigs", "log:GetIndex", "log:GetSavedSearch", "log:GetDashboard", "log:GetJob", "ecs:DescribeInstances", "ecs:DescribeSpotPriceHistory", "ecs:DescribePrice", "eci:DescribeContainerGroups", "eci:DescribeContainerGroupPrice", "log:GetLogStoreLogs", "ims:CreateApplication", "ims:UpdateApplication", "ims:GetApplication", "ims:ListApplications", "ims:DeleteApplication", "ims:CreateAppSecret", "ims:GetAppSecret", "ims:ListAppSecretIds", "ims:ListUsers"
[Name] パラメーターを
k8sWorkerRolePolicy-{ClusterID}
形式で指定し、[OK] をクリックします。
クラスターのRAMワーカーロールに権限を付与します。
RAM コンソールにログインします。 左側のナビゲーションウィンドウで、[アイデンティティ]> [ロール] を選択します。
Kubernetes WorkerRole-{ClusterID}
形式のRAMワーカーロールを検索ボックスに入力します。 管理するロールを見つけて、[操作] 列の [権限の付与] をクリックします。[ポリシーの選択] セクションで、[カスタムポリシー] をクリックします。
k8sWorkerRolePolicy-{ClusterID}
形式で作成したカスタムポリシーの名前を検索ボックスに入力し、ポリシーを選択します。[OK] をクリックします。
[メモ] ダイアログボックスに戻り、[権限付与チェック] をクリックします。 承認が成功すると、承認済みが表示され、[OK] ボタンが使用可能になります。 次に、ステップ3を実行します。
Console Data Storageパラメーターを設定します。
この例では、プリインストールMySQLが選択されています。 本番環境でApsaraDB RDSを選択できます。 詳細については、「AIダッシュボードとAI開発者コンソールのインストールと設定」をご参照ください。
クリッククラウドネイティブAIスイートのデプロイ.
AIダッシュボードのステータスが準備完了に変更されると、AIダッシュボードは使用可能になります。
(オプション) データセットの作成
アルゴリズム開発者の要件に基づいて、データセットを作成および高速化できます。 次のセクションでは、AIダッシュボードまたはCLIを使用してデータセットを作成する方法について説明します。
fashion-mnistデータセット
kubectlを使用して、クラスターノードにObject Storage Service (OSS) タイプの永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。
次のサンプルYAMLテンプレートに基づいて名前空間demo-nsを作成します。
kubectl create ns demo-ns
fashion-mnist.yamlという名前のYAMLファイルを作成します。
apiVersion: v1
kind: PersistentVolume
metadata:
name: fashion-demo-pv
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 10Gi
csi:
driver: ossplugin.csi.alibabacloud.com
volumeAttributes:
bucket: fashion-mnist
otherOpts: "-o max_stat_cache_size=0 -o allow_other"
url: oss-cn-beijing.aliyuncs.com
akId: "AKID"
akSecret: "AKSECRET"
volumeHandle: fashion-demo-pv
persistentVolumeReclaimPolicy: Retain
storageClassName: oss
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fashion-demo-pvc
namespace: demo-ns
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
selector:
matchLabels:
alicloud-pvname: fashion-demo-pv
storageClassName: oss
volumeMode: Filesystem
volumeName: fashion-demo-pv
パラメーター | 説明 |
名前: fashion-demo-pv | PV の名前。 PVは、ファッション-デモ-PVCという名前のpvcに対応しています。 |
ストレージ: 10Gi | PVの容量は10 GiBです。 |
バケツ: ファッション-mnist | OSS バケットの名前。 |
url: oss-cn-beijing.aliyuncs.com | OSSバケットのエンドポイント。 この例では、中国 (北京) リージョンのOSSエンドポイントが使用されています。 |
akId: "AKID" akSecret: "AKSECRET" | OSSバケットへのアクセスに使用されるAccessKey IDとAccessKeyシークレット。 |
名前空間: demo-ns | 名前空間の名前。 |
PVとPVCを作成する:
kubectl create -f fashion-mnist.yaml
PVとPVCのステータスを確認します。
次のコマンドを実行して、PVのステータスを照会します。
kubectl get pv fashion-demo-pv -ndemo-ns
期待される出力:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE fashion-demo-pv 10Gi RWX Retain Bound demo-ns/fashion-demo-pvc oss 8h
次のコマンドを実行して、PVCのステータスを照会します。
kubectl get pvc fashion-demo-pvc -ndemo-ns
期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fashion-demo-pvc Bound fashion-demo-pv 10Gi RWX oss 8h
データセットの高速化
AIダッシュボードでデータセットを高速化できます。 次の例は、demo-ns名前空間でfashion-demo-pvcという名前のデータセットを高速化する方法を示しています。
- 管理者としてAccess AI Dashboardをします。
- AIダッシュボードの左側のナビゲーションウィンドウで、 を選択します。
On theデータセットリストページ、データセットを見つけて、加速[演算子] 列に表示されます。
次の図は、高速化されたデータセットを示しています。
手順2: リソースダッシュボードの表示
AI Dashboardが提供するリソースダッシュボードで、クラスターリソースの使用状況を複数のディメンションで表示できます。 これにより、リソース割り当ての最適化とリソース使用率の向上に役立ちます。
クラスターダッシュボード
AIダッシュボードにログインすると、デフォルトでクラスターダッシュボードにリダイレクトされます。 クラスターダッシュボードで次のメトリクスを表示できます。
GPUクラスターの概要: クラスター内のGPUアクセラレーションノードの総数、割り当てられたGPUアクセラレーションノードの数、および正常でないGPUアクセラレーションノードの数を表示します。
Total GPU Nodes: クラスター内のGPUアクセラレーションノードの総数を表示します。
異常なGPUノード: クラスター内の異常なGPUアクセラレーションノードの数を表示します。
GPUメモリ (使用 /合計): クラスターで使用されているGPUメモリの合計に対する比率を表示します。
GPUメモリ (割り当て済み /合計): クラスターによって割り当てられたGPUメモリの合計に対する比率を表示します。
GPU使用率: クラスターの平均GPU使用率を表示します。
GPU (割り当て済み /合計): GPUの総数に対するクラスターによって割り当てられたGPUの数の比率を表示します。
[クラスターのトレーニングジョブの概要]: [実行中] 、[保留中] 、[成功] 、[失敗] の状態にあるトレーニングジョブの数を表示します。
ノードダッシュボード
[クラスター] ページで、右上隅の [ノード] をクリックして、ノードダッシュボードに移動します。 ノードダッシュボードで次のメトリックを表示できます。
GPUノードの詳細: クラスターノードに関する情報をテーブルに表示します。 各ノードの名前、各ノードのIPアドレス、各ノードの役割、各ノードのGPUモード (排他的または共有) 、各ノードが提供するGPUの数、各ノードが提供するGPUメモリの合計量、各ノードに割り当てられたGPUの数、各ノードに割り当てられたGPUメモリの量、各ノードで使用されるGPUメモリの量、および各ノードの平均GPU使用率。
GPUデューティサイクル: 各ノードの各GPUの使用率を表示します。
GPUメモリ使用量: 各ノードの各GPUのメモリ使用量を表示します。
GPUメモリ使用率: 各ノードのGPUごとのメモリ使用率を表示します。
[ノードごとに割り当てられたGPU]: 各ノードに割り当てられたGPUの数を表示します。
ノードあたりのGPU数: 各ノードのGPUの総数を表示します。
ノードあたりのGPUメモリの合計: 各ノードのGPUメモリの合計量を表示します。
Training job dashboard
[ノード] ページで、右上隅の [トレーニングジョブ] をクリックして、トレーニングジョブダッシュボードに移動します。 トレーニングジョブダッシュボードでは、次のメトリックを表示できます。
トレーニングジョブ: 各トレーニングジョブに関する情報をテーブルに表示します。 各トレーニングジョブの名前空間、各トレーニングジョブの名前、各トレーニングジョブのタイプ、各トレーニングジョブのステータス、各トレーニングジョブの期間、各トレーニングジョブによって要求されるGPUの数、各トレーニングジョブによって要求されるGPUメモリの量、各トレーニングジョブによって使用されるGPUメモリの量、と各トレーニングジョブの平均GPU使用率。
ジョブインスタンス使用済みGPUメモリ: 各ジョブインスタンスで使用されるGPUメモリの量を表示します。
ジョブインスタンス使用済みGPUメモリの割合: 各ジョブインスタンスで使用されているGPUメモリの割合を表示します。
ジョブインスタンスのGPUデューティサイクル: 各ジョブインスタンスのGPU使用率を表示します。
リソース割り当てダッシュボード
[トレーニングジョブ] ページで、右上隅の [クォータ] をクリックして、リソースクォータダッシュボードに移動します。 リソースクォータダッシュボードでは、クォータ (cpu) 、クォータ (メモリ) 、クォータ (nvidia.com/gpu) 、クォータ (aliyun.com/gpu-mem) 、クォータ (aliyun.com/gpu) のメトリックを表示できます。 各メトリックは、リソースクォータに関する情報をテーブルに表示します。 次の情報が表示されます。
Elastic Quota Name: クォータグループの名前を表示します。
名前空間: リソースが属する名前空間を表示します。
リソース名: リソースの種類を表示します。
Max Quota: 指定された名前空間で使用できるリソースの最大量を表示します。
最小クォータ: クラスターに十分なリソースがない場合に、指定された名前空間で使用できるリソースの最小量を表示します。
使用済みクォータ: 指定された名前空間で使用されているリソースの量を表示します。
ステップ3: ユーザーとクォータの管理
クラウドネイティブAIスイートでは、ユーザー、ユーザーグループ、クォータツリー、クォータノード、Kubernetes名前空間のリソースオブジェクトを使用して、ユーザーとリソースのクォータを管理できます。 次の図に、これらのリソースオブジェクト間の関係を示します。
クォータツリーを使用すると、階層的なリソースクォータを設定できます。 クォータツリーは、容量スケジューリングプラグインによって使用されます。 クラスターリソースの全体的な使用率を最適化するために、クォータツリーを使用してリソースをユーザーに割り当てた後、ユーザーがリソースを共有できるようにすることができます。
Kubernetesの各ユーザーはサービスアカウントを所有しています。 サービスアカウントは、ジョブを送信してコンソールにログオンするための資格情報として使用できます。 権限は、ユーザーの役割に基づいてユーザーに付与されます。 たとえば、管理者ロールはAIダッシュボードにログインし、クラスターでメンテナンス操作を実行できます。 研究者ロールは、ジョブの送信、クラスターリソースの使用、AI開発者コンソールへのログインを行うことができます。 管理者ロールには、研究者ロールが持つすべての権限があります。
ユーザーグループは、リソース割り当ての最小単位です。 各ユーザーグループは、クォータツリーのリーフノードに対応します。 ユーザーは、ユーザーグループに関連付けられたリソースを使用する前に、ユーザーグループに関連付けられている必要があります。
次のセクションでは、クォータツリーを使用して階層的なリソースクォータを設定する方法と、ユーザーグループを使用してリソースをユーザーに割り当てる方法について説明します。 次のセクションでは、単純なジョブを送信してCPUリソースを共有および再利用する方法についても説明します。
クォータノードの追加とリソースクォータの設定
各リソースのMinパラメーターとMaxパラメーターを指定することで、リソースクォータを設定できます。 Minパラメーターは、使用できるリソースの最小量を指定します。 Maxパラメーターは、使用できるリソースの最大量を指定します。 名前空間をクォータツリーのリーフノードに関連付けると、ルートノードとリーフノードの間のノードに設定された制限が名前空間に適用されます。
利用可能な名前空間がない場合は、まず名前空間を作成する必要があります。 名前空間が使用可能な場合は、選択した名前空間に実行中状態のポッドが含まれていないことを確認する必要があります。
kubectl create ns namespace1 kubectl create ns namespace2 kubectl create ns namespace3 kubectl create ns namespace4
クォータノードを作成し、名前空間に関連付けます。
ユーザーとユーザーグループの作成
ユーザーは1つ以上のユーザーグループに所属できます。 ユーザーグループには、1人以上のユーザーを含めることができます。 ユーザーごとにユーザーグループを関連付けるか、ユーザーグループごとにユーザーを関連付けることができます。 クォータツリーとユーザーグループを使用して、プロジェクトに基づいてリソースを割り当て、権限を付与できます。
ユーザーを作成します。 詳細については、「新しく作成したユーザーのkubeconfigファイルとログオントークンの生成」をご参照ください。
ユーザーグループを作成します。 詳細については、「ユーザーグループの追加」をご参照ください。
容量スケジューリングの例
次のセクションでは、CPUコアを要求するポッドを作成して、容量スケジューリングを使用してリソースを共有および再利用する方法について説明します。 各クォータノードは、最小量のCPUリソースと最大量のCPUリソースで構成されています。 以下のセクションで、手順を説明します。
ルートノードのCPUリソースの最小量とCPUリソースの最大量の両方を40に設定します。 これにより、クォータツリーに40個のCPUコアが使用可能になります。
root.aおよびroot.bのCPUリソースの最小量を20に、CPUリソースの最大量を40に設定します。
root.a.1, root.a.2, root.b.1, root.b.2のCPUリソースの最小値を10, CPUリソースの最大値を20に設定する。
5つのポッド (5ポッドx 5コア /ポッド=25コア) を実行するタスクをnamespace1に送信します。 root.a.1のCPUリソースの最大量は20に設定されています。 したがって、4つのポッド (4ポッドx 5コア /ポッド=20コア) を通常どおり実行できます。
5つのポッド (5ポッドx 5コア /ポッド=25コア) を実行するタスクをnamespace2に送信します。 root.a.2のCPUリソースの最大量は20に設定されています。 したがって、4つのポッド (4ポッドx 5コア /ポッド=20コア) を通常どおり実行できます。
5つのポッド (5ポッドx 5コア /ポッド=25コア) を実行するタスクをnamespace3に送信します。 root.b.1のCPUリソースの最小量は10に設定されています。 したがって、2つのポッド (2ポッドx 5コア /ポッド=10コア) を通常どおり実行できます。 スケジューラは、各タスクの優先度、可用性、および作成時間を考慮し、root.aからCPUリソースを再要求します。 スケジューラは、root.a.1から1つのCPUコアを、root.a.2から1つのCPUコアを回収します。 その結果、3つのポッド (3ポッドx 5コア /ポッド=15コア) がnamespace1とnamespace2で別々に実行されます。
5つのポッド (5ポッドx 5コア /ポッド=25コア) を実行するタスクをnamespace4に送信します。 root.b.2のCPUリソースの最小量は10に設定されています。 したがって、2つのポッド (2ポッドx 5コア /ポッド=10コア) を通常どおり実行できます。
次の操作を実行します。
名前空間とクォータツリーを作成します。
次のコマンドを実行して、4つの名前空間を作成します。
次のコマンドを実行してnamespace1を作成します。
kubectl create ns namespace1 kubectl create ns namespace2 kubectl create ns namespace3 kubectl create ns namespace4
次の図に基づいてクォータツリーを作成します。
次のYAMLテンプレートを使用してnamespace1にデプロイを作成します。 Deploymentは5つのポッドをプロビジョニングし、各ポッドは5つのCPUコアを要求します。
エラスティッククォータを設定しない場合、CPUリソースの最小量が10に設定されているため、ユーザーは10個のCPUコアしか使用できません。つまり、2つのポッドが作成されます。 エラスティッククォータを設定した後:
クラスターで40個のCPUコアが使用可能な場合、4つのポッドが作成されます (4ポッドx 5コア /ポッド=20コア) 。
リソースの最大量 (cpu.max=20) に達したため、最後のポッドはPending状態になります。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx1 namespace: namespace1 labels: app: nginx1 spec: replicas: 5 selector: matchLabels: app: nginx1 template: metadata: name: nginx1 labels: app: nginx1 spec: containers: - name: nginx1 image: nginx resources: limits: cpu: 5 requests: cpu: 5
次のYAMLテンプレートを使用して、namespace2に別のデプロイを作成します。 Deploymentは5つのポッドをプロビジョニングし、各ポッドは5つのCPUコアを要求します。
エラスティッククォータを設定しない場合、CPUリソースの最小量が10に設定されているため、ユーザーは10個のCPUコアしか使用できません。つまり、2つのポッドが作成されます。 エラスティッククォータを設定した後:
クラスターで20個のCPUコア (namespace1では40コア-20コア) を使用できる場合、4つのポッド (4ポッドx 5コア /ポッド=20コア) が作成されます。
リソースの最大量 (cpu.max=20) に達したため、最後のポッドはPending状態になります。
上記の2つのデプロイメントを作成した後、namespace1とnamespace2のポッドは40個のCPUコアを使用しました。これはルートノードのCPUコアの最大数です。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx2 namespace: namespace2 labels: app: nginx2 spec: replicas: 5 selector: matchLabels: app: nginx2 template: metadata: name: nginx2 labels: app: nginx2 spec: containers: - name: nginx2 image: nginx resources: limits: cpu: 5 requests: cpu: 5
次のYAMLテンプレートを使用して、namespace3に3つ目のデプロイを作成します。 このデプロイメントは5つのポッドを提供し、各ポッドは5つのCPUコアを要求します。
クラスターにアイドルリソースがありません。 スケジューラは、root.b.1のCPUリソースの最小量を保証するために、root.aから10個のCPUコアを再要求します。
スケジューラは、一時的に使用された10個のCPUコアを再要求する前に、root.aのワークロードの優先度、可用性、作成時間などの他の要因も考慮します。 したがって、nginx3のポッドが再利用された10個のCPUコアに基づいてスケジュールされた後、2つのポッドは実行中状態になり、他の3つは保留状態になります。
10個のCPUコアがroot.aから再利用されると、namespace1とnamespace2の両方に、実行中状態の2つのポッドと、Pending状態の3つのポッドが含まれます。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx3 namespace: namespace3 labels: app: nginx3 spec: replicas: 5 selector: matchLabels: app: nginx3 template: metadata: name: nginx3 labels: app: nginx3 spec: containers: - name: nginx3 image: nginx resources: limits: cpu: 5 requests: cpu: 5
次のYAMLテンプレートを使用してnamespace4で4つのデプロイを作成します。 このデプロイメントは5つのポッドを提供し、各ポッドは5つのCPUコアを要求します。
スケジューラは、各タスクの優先度、可用性、および作成時間を考慮し、root.aからCPUリソースを再要求します。
スケジューラは、root.a.1から1つのCPUコアを、root.a.2から1つのCPUコアを回収します。 このシナリオでは、2つのポッド (2ポッドx 5 CPUコア /ポッド=10 CPUコア) がnamespace1で実行されています。 2つのポッド (2ポッドx 5 CPUコア /ポッド=10 CPUコア) がnamespace2で実行されています。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx4 namespace: namespace4 labels: app: nginx4 spec: replicas: 5 selector: matchLabels: app: nginx4 template: metadata: name: nginx4 labels: app: nginx4 spec: containers: - name: nginx4 image: nginx resources: limits: cpu: 5 requests: cpu: 5
結果は、リソース割り当てにおける容量スケジューリングの利点を示しています。