2022 年 XNUMX 月に、アマゾン ウェブ サービスが追加されました Amazon CloudWatch での NVIDIA GPU メトリクスのサポートからメトリクスをプッシュできるようになります。 Amazon CloudWatch エージェント 〜へ アマゾンクラウドウォッチ コードを監視して、最適な GPU 使用率を実現します。 それ以来、この機能は、マネージド Amazon Machine Image (AMI) の多くに統合されています。 ディープラーニングAMI と AWS ParallelCluster AMI。 GPU 使用率のインスタンスレベルのメトリクスを取得するには、Packer または Amazon ImageBuilder を使用して独自のカスタム AMI をブートストラップし、それを次のようなさまざまなマネージド サービス オファリングで使用できます。 AWSバッチ, Amazon エラスティック コンテナ サービス (Amazon ECS)、または Amazon Elastic Kubernetesサービス (アマゾンEKS)。 ただし、多くのコンテナー ベースのサービス オファリングやワークロードでは、コンテナー、ポッド、または名前空間レベルで使用率メトリックを取得することが理想的です。
この投稿では、コンテナーベースの GPU メトリクスを設定する方法を詳しく説明し、EKS ポッドからこれらのメトリクスを収集する例を示します。
ソリューションの概要
コンテナベースの GPU メトリクスを実証するために、次のような EKS クラスターを作成します。 g5.2xlarge
インスタンス; ただし、これはサポートされている NVIDIA アクセラレーション インスタンス ファミリで動作します。
NVIDIA GPU オペレーターを導入して、GPU リソースと NVIDIA DCGM エクスポーター GPU メトリクスの収集を有効にします。 次に、XNUMX つのアーキテクチャを検討します。 最初の方法では、次の図に示すように、NVIDIA DCGM Exporter から CloudWatch エージェントを介してメトリクスを CloudWatch に接続します。
XNUMX 番目のアーキテクチャ (次の図を参照) は、DCGM Exporter からのメトリクスを プロメテウス、次に、を使用します グラファナ ダッシュボードを使用してそれらのメトリクスを視覚化します。
前提条件
この投稿のスタック全体の再現を簡素化するために、必要なツール (aws cli、eksctl、helm など) がすべてインストールされているコンテナを使用します。 クローンを作成するには、 GitHub からのコンテナ プロジェクト、 必要になるだろう git。 コンテナを構築して実行するには、次のものが必要です デッカー。 アーキテクチャをデプロイするには、以下が必要です AWS認証情報。 ポート転送を使用して Kubernetes サービスにアクセスできるようにするには、次のものも必要になります。 キューブクル.
これらの前提条件はローカル マシンにインストールできます。 EC2インスタンス ナイス DCVまたは AWS クラウド9。 この投稿では、 c5.2xlarge
Cloud9 インスタンスと 40GB
ローカルストレージボリューム。 Cloud9 を使用する場合は、AWS 管理の一時認証情報を無効にしてください。 Cloud9->Preferences->AWS Settings
以下のスクリーンショットに示すように。
aws-do-eks コンテナを構築して実行する
好みの環境でターミナル シェルを開き、次のコマンドを実行します。
git clone https://github.com/aws-samples/aws-do-eks
cd aws-do-eks
./build.sh
./run.sh
./exec.sh
結果は次のとおりです。
これで、以下のタスクを完了するために必要なすべてのツールを備えたシェルがコンテナ環境に作成されました。 これを「aws-do-eks シェル」と呼びます。 特に指示がない限り、このシェルで次のセクションのコマンドを実行します。
ノードグループを使用して EKS クラスターを作成する
このグループには、選択した GPU インスタンス ファミリが含まれます。 この例では、 g5.2xlarge
インスタンスタイプ。
aws-do-eks プロジェクト には、クラスター構成のコレクションが付属しています。 XNUMX 回の構成変更で、希望のクラスター構成を設定できます。
- コンテナシェルで次を実行します。
./env-config.sh
そして設定 CONF=conf/eksctl/yaml/eks-gpu-g5.yaml
- クラスター構成を確認するには、次のコマンドを実行します。
./eks-config.sh
次のクラスター マニフェストが表示されるはずです。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata: name: do-eks-yaml-g5 version: "1.25" region: us-east-1
availabilityZones: - us-east-1a - us-east-1b - us-east-1c - us-east-1d
managedNodeGroups: - name: sys instanceType: m5.xlarge desiredCapacity: 1 iam: withAddonPolicies: autoScaler: true cloudWatch: true - name: g5 instanceType: g5.2xlarge instancePrefix: g5-2xl privateNetworking: true efaEnabled: false minSize: 0 desiredCapacity: 1 maxSize: 10 volumeSize: 80 iam: withAddonPolicies: cloudWatch: true
iam: withOIDC: true
- クラスターを作成するには、コンテナーで次のコマンドを実行します。
出力は次のとおりです。
root@e5ecb162812f:/eks# ./eks-create.sh /eks/impl/eksctl/yaml /eks ./eks-create.sh Mon May 22 20:50:59 UTC 2023
Creating cluster using /eks/conf/eksctl/yaml/eks-gpu-g5.yaml ... eksctl create cluster -f /eks/conf/eksctl/yaml/eks-gpu-g5.yaml 2023-05-22 20:50:59 [ℹ] eksctl version 0.133.0
2023-05-22 20:50:59 [ℹ] using region us-east-1
2023-05-22 20:50:59 [ℹ] subnets for us-east-1a - public:192.168.0.0/19 private:192.168.128.0/19
2023-05-22 20:50:59 [ℹ] subnets for us-east-1b - public:192.168.32.0/19 private:192.168.160.0/19
2023-05-22 20:50:59 [ℹ] subnets for us-east-1c - public:192.168.64.0/19 private:192.168.192.0/19
2023-05-22 20:50:59 [ℹ] subnets for us-east-1d - public:192.168.96.0/19 private:192.168.224.0/19
2023-05-22 20:50:59 [ℹ] nodegroup "sys" will use "" [AmazonLinux2/1.25]
2023-05-22 20:50:59 [ℹ] nodegroup "g5" will use "" [AmazonLinux2/1.25]
2023-05-22 20:50:59 [ℹ] using Kubernetes version 1.25
2023-05-22 20:50:59 [ℹ] creating EKS cluster "do-eks-yaml-g5" in "us-east-1" region with managed nodes
2023-05-22 20:50:59 [ℹ] 2 nodegroups (g5, sys) were included (based on the include/exclude rules)
2023-05-22 20:50:59 [ℹ] will create a CloudFormation stack for cluster itself and 0 nodegroup stack(s)
2023-05-22 20:50:59 [ℹ] will create a CloudFormation stack for cluster itself and 2 managed nodegroup stack(s)
2023-05-22 20:50:59 [ℹ] if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=us-east-1 --cluster=do-eks-yaml-g5'
2023-05-22 20:50:59 [ℹ] Kubernetes API endpoint access will use default of {publicAccess=true, privateAccess=false} for cluster "do-eks-yaml-g5" in "us-east-1"
2023-05-22 20:50:59 [ℹ] CloudWatch logging will not be enabled for cluster "do-eks-yaml-g5" in "us-east-1"
2023-05-22 20:50:59 [ℹ] you can enable it with 'eksctl utils update-cluster-logging --enable-types={SPECIFY-YOUR-LOG-TYPES-HERE (e.g. all)} --region=us-east-1 --cluster=do-eks-yaml-g5'
2023-05-22 20:50:59 [ℹ] 2 sequential tasks: { create cluster control plane "do-eks-yaml-g5", 2 sequential sub-tasks: { 4 sequential sub-tasks: { wait for control plane to become ready, associate IAM OIDC provider, 2 sequential sub-tasks: { create IAM role for serviceaccount "kube-system/aws-node", create serviceaccount "kube-system/aws-node", }, restart daemonset "kube-system/aws-node", }, 2 parallel sub-tasks: { create managed nodegroup "sys", create managed nodegroup "g5", }, } }
2023-05-22 20:50:59 [ℹ] building cluster stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:51:00 [ℹ] deploying stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:51:30 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:52:00 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:53:01 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:54:01 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:55:01 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:56:02 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:57:02 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:58:02 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 20:59:02 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 21:00:03 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 21:01:03 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 21:02:03 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 21:03:04 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-cluster"
2023-05-22 21:05:07 [ℹ] building iamserviceaccount stack "eksctl-do-eks-yaml-g5-addon-iamserviceaccount-kube-system-aws-node"
2023-05-22 21:05:10 [ℹ] deploying stack "eksctl-do-eks-yaml-g5-addon-iamserviceaccount-kube-system-aws-node"
2023-05-22 21:05:10 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-addon-iamserviceaccount-kube-system-aws-node"
2023-05-22 21:05:40 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-addon-iamserviceaccount-kube-system-aws-node"
2023-05-22 21:05:40 [ℹ] serviceaccount "kube-system/aws-node" already exists
2023-05-22 21:05:41 [ℹ] updated serviceaccount "kube-system/aws-node"
2023-05-22 21:05:41 [ℹ] daemonset "kube-system/aws-node" restarted
2023-05-22 21:05:41 [ℹ] building managed nodegroup stack "eksctl-do-eks-yaml-g5-nodegroup-sys"
2023-05-22 21:05:41 [ℹ] building managed nodegroup stack "eksctl-do-eks-yaml-g5-nodegroup-g5"
2023-05-22 21:05:42 [ℹ] deploying stack "eksctl-do-eks-yaml-g5-nodegroup-sys"
2023-05-22 21:05:42 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-nodegroup-sys"
2023-05-22 21:05:42 [ℹ] deploying stack "eksctl-do-eks-yaml-g5-nodegroup-g5"
2023-05-22 21:05:42 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-nodegroup-g5"
2023-05-22 21:06:12 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-nodegroup-sys"
2023-05-22 21:06:12 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-nodegroup-g5"
2023-05-22 21:06:55 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-nodegroup-sys"
2023-05-22 21:07:11 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-nodegroup-g5"
2023-05-22 21:08:29 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-nodegroup-g5"
2023-05-22 21:08:45 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-nodegroup-sys"
2023-05-22 21:09:52 [ℹ] waiting for CloudFormation stack "eksctl-do-eks-yaml-g5-nodegroup-g5"
2023-05-22 21:09:53 [ℹ] waiting for the control plane to become ready
2023-05-22 21:09:53 [✔] saved kubeconfig as "/root/.kube/config"
2023-05-22 21:09:53 [ℹ] 1 task: { install Nvidia device plugin }
W0522 21:09:54.155837 1668 warnings.go:70] spec.template.metadata.annotations[scheduler.alpha.kubernetes.io/critical-pod]: non-functional in v1.16+; use the "priorityClassName" field instead
2023-05-22 21:09:54 [ℹ] created "kube-system:DaemonSet.apps/nvidia-device-plugin-daemonset"
2023-05-22 21:09:54 [ℹ] as you are using the EKS-Optimized Accelerated AMI with a GPU-enabled instance type, the Nvidia Kubernetes device plugin was automatically installed. to skip installing it, use --install-nvidia-plugin=false.
2023-05-22 21:09:54 [✔] all EKS cluster resources for "do-eks-yaml-g5" have been created
2023-05-22 21:09:54 [ℹ] nodegroup "sys" has 1 node(s)
2023-05-22 21:09:54 [ℹ] node "ip-192-168-18-137.ec2.internal" is ready
2023-05-22 21:09:54 [ℹ] waiting for at least 1 node(s) to become ready in "sys"
2023-05-22 21:09:54 [ℹ] nodegroup "sys" has 1 node(s)
2023-05-22 21:09:54 [ℹ] node "ip-192-168-18-137.ec2.internal" is ready
2023-05-22 21:09:55 [ℹ] kubectl command should work with "/root/.kube/config", try 'kubectl get nodes'
2023-05-22 21:09:55 [✔] EKS cluster "do-eks-yaml-g5" in "us-east-1" region is ready Mon May 22 21:09:55 UTC 2023
Done creating cluster using /eks/conf/eksctl/yaml/eks-gpu-g5.yaml /eks
- クラスターが正常に作成されたことを確認するには、次のコマンドを実行します。
kubectl get nodes -L node.kubernetes.io/instance-type
出力は次のようになります。
NAME STATUS ROLES AGE VERSION INSTANCE_TYPE
ip-192-168-18-137.ec2.internal Ready <none> 47m v1.25.9-eks-0a21954 m5.xlarge
ip-192-168-214-241.ec2.internal Ready <none> 46m v1.25.9-eks-0a21954 g5.2xlarge
この例では、クラスター内に 5 つの m5.2.xlarge インスタンスと XNUMX つの gXNUMXxlarge インスタンスがあります。 したがって、上の出力には XNUMX つのノードがリストされています。
クラスターの作成プロセス中に、NVIDIA デバイス プラグインがインストールされます。 クラスターの作成後にこれを削除する必要があります。 NVIDIA GPU オペレーター を代わりにお使いください。
- 以下のコマンドでプラグインを削除します
kubectl -n kube-system delete daemonset nvidia-device-plugin-daemonset
次の出力が得られます。
daemonset.apps "nvidia-device-plugin-daemonset" deleted
NVIDIA Helm リポジトリをインストールする
次のコマンドを使用して、NVIDIA Helm リポジトリをインストールします。
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update
NVIDIA GPU Operator を使用して DCGM エクスポータを展開する
DCGM エクスポータを展開するには、次の手順を実行します。
- DCGM エクスポータの GPU メトリクス構成を準備する
curl https://raw.githubusercontent.com/NVIDIA/dcgm-exporter/main/etc/dcp-metrics-included.csv > dcgm-metrics.csv
を編集するオプションがあります。 dcgm-metrics.csv
ファイル。 必要に応じてメトリクスを追加または削除できます。
- gpu-operator 名前空間と DCGM エクスポータ ConfigMap を作成する
kubectl create namespace gpu-operator && /
kubectl create configmap metrics-config -n gpu-operator --from-file=dcgm-metrics.csv
出力は次のとおりです。
namespace/gpu-operator created
configmap/metrics-config created
- GPU オペレーターを EKS クラスターに適用する
helm install --wait --generate-name -n gpu-operator --create-namespace nvidia/gpu-operator --set dcgmExporter.config.name=metrics-config --set dcgmExporter.env[0].name=DCGM_EXPORTER_COLLECTORS --set dcgmExporter.env[0].value=/etc/dcgm-exporter/dcgm-metrics.csv --set toolkit.enabled=false
出力は次のとおりです。
NAME: gpu-operator-1684795140
LAST DEPLOYED: Day Month Date HH:mm:ss YYYY
NAMESPACE: gpu-operator
STATUS: deployed
REVISION: 1
TEST SUITE: None
- DCGM エクスポーター ポッドが実行されていることを確認します。
kubectl -n gpu-operator get pods | grep dcgm
出力は次のとおりです。
nvidia-dcgm-exporter-lkmfr 1/1 Running 0 1m
ログを検査すると、 “Starting webserver”
メッセージ:
kubectl -n gpu-operator logs -f $(kubectl -n gpu-operator get pods | grep dcgm | cut -d ' ' -f 1)
出力は次のとおりです。
Defaulted container "nvidia-dcgm-exporter" out of: nvidia-dcgm-exporter, toolkit-validation (init)
time="2023-05-22T22:40:08Z" level=info msg="Starting dcgm-exporter"
time="2023-05-22T22:40:08Z" level=info msg="DCGM successfully initialized!"
time="2023-05-22T22:40:08Z" level=info msg="Collecting DCP Metrics"
time="2023-05-22T22:40:08Z" level=info msg="No configmap data specified, falling back to metric file /etc/dcgm-exporter/dcgm-metrics.csv"
time="2023-05-22T22:40:08Z" level=info msg="Initializing system entities of type: GPU"
time="2023-05-22T22:40:09Z" level=info msg="Initializing system entities of type: NvSwitch"
time="2023-05-22T22:40:09Z" level=info msg="Not collecting switch metrics: no switches to monitor"
time="2023-05-22T22:40:09Z" level=info msg="Initializing system entities of type: NvLink"
time="2023-05-22T22:40:09Z" level=info msg="Not collecting link metrics: no switches to monitor"
time="2023-05-22T22:40:09Z" level=info msg="Kubernetes metrics collection enabled!"
time="2023-05-22T22:40:09Z" level=info msg="Pipeline starting"
time="2023-05-22T22:40:09Z" level=info msg="Starting webserver"
NVIDIA DCGM Exporter は、CloudWatch エージェントによって取り込まれることができる Prometheus メトリクス エンドポイントを公開します。 エンドポイントを表示するには、次のコマンドを使用します。
kubectl -n gpu-operator get services | grep dcgm
次の出力が得られます。
nvidia-dcgm-exporter ClusterIP 10.100.183.207 <none> 9400/TCP 10m
- GPU 使用率を生成するために、 GPU書き込み バイナリ
kubectl apply -f https://raw.githubusercontent.com/aws-samples/aws-do-eks/main/Container-Root/eks/deployment/gpu-metrics/gpu-burn-deployment.yaml
出力は次のとおりです。
deployment.apps/gpu-burn created
このデプロイメントでは、単一の GPU を使用して、100 秒間 20% の使用率が続き、その後 0 秒間 20% の使用率になるという連続パターンを生成します。
- エンドポイントが動作することを確認するには、curl を使用してコンテンツを読み取る一時コンテナーを実行します。
http://nvidia-dcgm-exporter:9400/metrics
kubectl -n gpu-operator run -it --rm curl --restart='Never' --image=curlimages/curl --command -- curl http://nvidia-dcgm-exporter:9400/metrics
次の出力が得られます。
# HELP DCGM_FI_DEV_SM_CLOCK SM clock frequency (in MHz).
# TYPE DCGM_FI_DEV_SM_CLOCK gauge
DCGM_FI_DEV_SM_CLOCK{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 1455
# HELP DCGM_FI_DEV_MEM_CLOCK Memory clock frequency (in MHz).
# TYPE DCGM_FI_DEV_MEM_CLOCK gauge
DCGM_FI_DEV_MEM_CLOCK{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 6250
# HELP DCGM_FI_DEV_GPU_TEMP GPU temperature (in C).
# TYPE DCGM_FI_DEV_GPU_TEMP gauge
DCGM_FI_DEV_GPU_TEMP{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 65
# HELP DCGM_FI_DEV_POWER_USAGE Power draw (in W).
# TYPE DCGM_FI_DEV_POWER_USAGE gauge
DCGM_FI_DEV_POWER_USAGE{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 299.437000
# HELP DCGM_FI_DEV_TOTAL_ENERGY_CONSUMPTION Total energy consumption since boot (in mJ).
# TYPE DCGM_FI_DEV_TOTAL_ENERGY_CONSUMPTION counter
DCGM_FI_DEV_TOTAL_ENERGY_CONSUMPTION{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 15782796862
# HELP DCGM_FI_DEV_PCIE_REPLAY_COUNTER Total number of PCIe retries.
# TYPE DCGM_FI_DEV_PCIE_REPLAY_COUNTER counter
DCGM_FI_DEV_PCIE_REPLAY_COUNTER{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0
# HELP DCGM_FI_DEV_GPU_UTIL GPU utilization (in %).
# TYPE DCGM_FI_DEV_GPU_UTIL gauge
DCGM_FI_DEV_GPU_UTIL{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 100
# HELP DCGM_FI_DEV_MEM_COPY_UTIL Memory utilization (in %).
# TYPE DCGM_FI_DEV_MEM_COPY_UTIL gauge
DCGM_FI_DEV_MEM_COPY_UTIL{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 38
# HELP DCGM_FI_DEV_ENC_UTIL Encoder utilization (in %).
# TYPE DCGM_FI_DEV_ENC_UTIL gauge
DCGM_FI_DEV_ENC_UTIL{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0
# HELP DCGM_FI_DEV_DEC_UTIL Decoder utilization (in %).
# TYPE DCGM_FI_DEV_DEC_UTIL gauge
DCGM_FI_DEV_DEC_UTIL{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0
# HELP DCGM_FI_DEV_XID_ERRORS Value of the last XID error encountered.
# TYPE DCGM_FI_DEV_XID_ERRORS gauge
DCGM_FI_DEV_XID_ERRORS{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0
# HELP DCGM_FI_DEV_FB_FREE Framebuffer memory free (in MiB).
# TYPE DCGM_FI_DEV_FB_FREE gauge
DCGM_FI_DEV_FB_FREE{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 2230
# HELP DCGM_FI_DEV_FB_USED Framebuffer memory used (in MiB).
# TYPE DCGM_FI_DEV_FB_USED gauge
DCGM_FI_DEV_FB_USED{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 20501
# HELP DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL Total number of NVLink bandwidth counters for all lanes.
# TYPE DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL counter
DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0
# HELP DCGM_FI_DEV_VGPU_LICENSE_STATUS vGPU License status
# TYPE DCGM_FI_DEV_VGPU_LICENSE_STATUS gauge
DCGM_FI_DEV_VGPU_LICENSE_STATUS{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0
# HELP DCGM_FI_DEV_UNCORRECTABLE_REMAPPED_ROWS Number of remapped rows for uncorrectable errors
# TYPE DCGM_FI_DEV_UNCORRECTABLE_REMAPPED_ROWS counter
DCGM_FI_DEV_UNCORRECTABLE_REMAPPED_ROWS{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0
# HELP DCGM_FI_DEV_CORRECTABLE_REMAPPED_ROWS Number of remapped rows for correctable errors
# TYPE DCGM_FI_DEV_CORRECTABLE_REMAPPED_ROWS counter
DCGM_FI_DEV_CORRECTABLE_REMAPPED_ROWS{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0
# HELP DCGM_FI_DEV_ROW_REMAP_FAILURE Whether remapping of rows has failed
# TYPE DCGM_FI_DEV_ROW_REMAP_FAILURE gauge
DCGM_FI_DEV_ROW_REMAP_FAILURE{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0
# HELP DCGM_FI_PROF_GR_ENGINE_ACTIVE Ratio of time the graphics engine is active (in %).
# TYPE DCGM_FI_PROF_GR_ENGINE_ACTIVE gauge
DCGM_FI_PROF_GR_ENGINE_ACTIVE{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0.808369
# HELP DCGM_FI_PROF_PIPE_TENSOR_ACTIVE Ratio of cycles the tensor (HMMA) pipe is active (in %).
# TYPE DCGM_FI_PROF_PIPE_TENSOR_ACTIVE gauge
DCGM_FI_PROF_PIPE_TENSOR_ACTIVE{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0.000000
# HELP DCGM_FI_PROF_DRAM_ACTIVE Ratio of cycles the device memory interface is active sending or receiving data (in %).
# TYPE DCGM_FI_PROF_DRAM_ACTIVE gauge
DCGM_FI_PROF_DRAM_ACTIVE{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 0.315787
# HELP DCGM_FI_PROF_PCIE_TX_BYTES The rate of data transmitted over the PCIe bus - including both protocol headers and data payloads - in bytes per second.
# TYPE DCGM_FI_PROF_PCIE_TX_BYTES gauge
DCGM_FI_PROF_PCIE_TX_BYTES{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 3985328
# HELP DCGM_FI_PROF_PCIE_RX_BYTES The rate of data received over the PCIe bus - including both protocol headers and data payloads - in bytes per second.
# TYPE DCGM_FI_PROF_PCIE_RX_BYTES gauge
DCGM_FI_PROF_PCIE_RX_BYTES{gpu="0",UUID="GPU-ff76466b-22fc-f7a9-abe2-ce3ac453b8b3",device="nvidia0",modelName="NVIDIA A10G",Hostname="nvidia-dcgm-exporter-48cwd",DCGM_FI_DRIVER_VERSION="470.182.03",container="main",namespace="kube-system",pod="gpu-burn-c68d8c774-ltg9s"} 21715174
pod "curl" deleted
CloudWatch エージェントの構成とデプロイ
CloudWatch エージェントを設定してデプロイするには、次の手順を実行します。
- YAML ファイルをダウンロードして編集します
curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/k8s/1.3.15/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
ファイルには、 cwagent configmap
フォルダーとその下に prometheus configmap
。 この投稿では両方を編集します。
- 編集
prometheus-eks.yaml
file
Video Cloud Studioで prometheus-eks.yaml
ファイルをお気に入りのエディターで置き換えてください cwagentconfig.json
次の内容のセクション:
apiVersion: v1
data: # cwagent json config cwagentconfig.json: | { "logs": { "metrics_collected": { "prometheus": { "prometheus_config_path": "/etc/prometheusconfig/prometheus.yaml", "emf_processor": { "metric_declaration": [ { "source_labels": ["Service"], "label_matcher": ".*dcgm.*", "dimensions": [["Service","Namespace","ClusterName","job","pod"]], "metric_selectors": [ "^DCGM_FI_DEV_GPU_UTIL$", "^DCGM_FI_DEV_DEC_UTIL$", "^DCGM_FI_DEV_ENC_UTIL$", "^DCGM_FI_DEV_MEM_CLOCK$", "^DCGM_FI_DEV_MEM_COPY_UTIL$", "^DCGM_FI_DEV_POWER_USAGE$", "^DCGM_FI_DEV_ROW_REMAP_FAILURE$", "^DCGM_FI_DEV_SM_CLOCK$", "^DCGM_FI_DEV_XID_ERRORS$", "^DCGM_FI_PROF_DRAM_ACTIVE$", "^DCGM_FI_PROF_GR_ENGINE_ACTIVE$", "^DCGM_FI_PROF_PCIE_RX_BYTES$", "^DCGM_FI_PROF_PCIE_TX_BYTES$", "^DCGM_FI_PROF_PIPE_TENSOR_ACTIVE$" ] } ] } } }, "force_flush_interval": 5 } }
-
prometheus
config セクションに、DCGM エクスポータの次のジョブ定義を追加します。
- job_name: 'kubernetes-pod-dcgm-exporter' sample_limit: 10000 metrics_path: /api/v1/metrics/prometheus kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_container_name] action: keep regex: '^DCGM.*$' - source_labels: [__address__] action: replace regex: ([^:]+)(?::d+)? replacement: ${1}:9400 target_label: __address__ - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: Namespace - source_labels: [__meta_kubernetes_pod] action: replace target_label: pod - action: replace source_labels: - __meta_kubernetes_pod_container_name target_label: container_name - action: replace source_labels: - __meta_kubernetes_pod_controller_name target_label: pod_controller_name - action: replace source_labels: - __meta_kubernetes_pod_controller_kind target_label: pod_controller_kind - action: replace source_labels: - __meta_kubernetes_pod_phase target_label: pod_phase - action: replace source_labels: - __meta_kubernetes_pod_node_name target_label: NodeName
- ファイルを保存して適用します。
cwagent-dcgm
クラスターの構成
kubectl apply -f ./prometheus-eks.yaml
次の出力が得られます。
namespace/amazon-cloudwatch created
configmap/prometheus-cwagentconfig created
configmap/prometheus-config created
serviceaccount/cwagent-prometheus created
clusterrole.rbac.authorization.k8s.io/cwagent-prometheus-role created
clusterrolebinding.rbac.authorization.k8s.io/cwagent-prometheus-role-binding created
deployment.apps/cwagent-prometheus created
- CloudWatch エージェント ポッドが実行されていることを確認する
kubectl -n amazon-cloudwatch get pods
次の出力が得られます。
NAME READY STATUS RESTARTS AGE
cwagent-prometheus-7dfd69cc46-s4cx7 1/1 Running 0 15m
CloudWatchコンソールでメトリクスを視覚化する
CloudWatch でメトリクスを視覚化するには、次の手順を実行します。
- CloudWatchコンソールの、 メトリック ナビゲーション ペインで、 すべての指標
- カスタム名前空間 セクションで、新しいエントリを選択します ContainerInsights/プロメテウス
詳細については ContainerInsights/プロメテウス 名前空間、参照 追加の Prometheus ソースをスクレイピングし、それらのメトリクスをインポートする.
- メトリクス名までドリルダウンして選択します
DCGM_FI_DEV_GPU_UTIL
- ソフトウェア設定ページで、下図のように グラフ化されたメトリック タブ、設定 周期 〜へ 5 seconds
- 更新間隔を 10 秒に設定します
DCGM エクスポータから収集されたメトリクスが表示され、 gpu-burn
パターンは 20 秒ごとにオンとオフになります。
ソフトウェア設定ページで、下図のように ブラウズ タブでは、各メトリックのポッド名を含むデータを確認できます。
EKS API メタデータは DCGM メトリクス データと結合されており、その結果、提供されるポッドベースの GPU メトリクスが得られます。
これで、CloudWatch エージェント経由で DCGM メトリクスを CloudWatch にエクスポートする最初のアプローチは終了です。
次のセクションでは、DCGM メトリクスを Prometheus にエクスポートする XNUMX 番目のアーキテクチャを構成し、それを Grafana で視覚化します。
Prometheus と Grafana を使用して DCGM からの GPU メトリクスを視覚化する
次の手順を完了します。
- Prometheus コミュニティ ヘルム チャートを追加する
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
このチャートは Prometheus と Grafana の両方をデプロイしています。 インストール コマンドを実行する前に、チャートにいくつかの編集を加える必要があります。
- チャートの構成値を次のファイルに保存します。
/tmp
helm inspect values prometheus-community/kube-prometheus-stack > /tmp/kube-prometheus-stack.values
- char設定ファイルを編集する
保存したファイルを編集します (/tmp/kube-prometheus-stack.values
) 設定名を検索して値を設定することで、次のオプションを設定します。
prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
- 次の ConfigMap を
additionalScrapeConfigs
additionalScrapeConfigs:
- job_name: gpu-metrics scrape_interval: 1s metrics_path: /metrics scheme: http kubernetes_sd_configs: - role: endpoints namespaces: names: - gpu-operator relabel_configs: - source_labels: [__meta_kubernetes_pod_node_name] action: replace target_label: kubernetes_node
- 更新された値を使用して Prometheus スタックをデプロイする
helm install prometheus-community/kube-prometheus-stack
--create-namespace --namespace prometheus
--generate-name
--values /tmp/kube-prometheus-stack.values
次の出力が得られます。
NAME: kube-prometheus-stack-1684965548
LAST DEPLOYED: Wed May 24 21:59:14 2023
NAMESPACE: prometheus
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running: kubectl --namespace prometheus get pods -l "release=kube-prometheus-stack-1684965548" Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
- Prometheus ポッドが実行されていることを確認する
kubectl get pods -n prometheus
次の出力が得られます。
NAME READY STATUS RESTARTS AGE
alertmanager-kube-prometheus-stack-1684-alertmanager-0 2/2 Running 0 6m55s
kube-prometheus-stack-1684-operator-6c87649878-j7v55 1/1 Running 0 6m58s
kube-prometheus-stack-1684965548-grafana-dcd7b4c96-bzm8p 3/3 Running 0 6m58s
kube-prometheus-stack-1684965548-kube-state-metrics-7d856dptlj5 1/1 Running 0 6m58s
kube-prometheus-stack-1684965548-prometheus-node-exporter-2fbl5 1/1 Running 0 6m58s
kube-prometheus-stack-1684965548-prometheus-node-exporter-m7zmv 1/1 Running 0 6m58s
prometheus-kube-prometheus-stack-1684-prometheus-0 2/2 Running 0 6m55s
Prometheus および Grafana ポッドは、 Running
でのみ停止させることができます。
次に、DCGM メトリクスが Prometheus に流れ込んでいることを検証します。
- Prometheus UI のポートフォワード
EKS で実行されている Prometheus UI をクラスターの外部からのリクエストに公開するには、さまざまな方法があります。 我々は使用するだろう kubectl port-forwarding
。 これまでは、内部でコマンドを実行してきました。 aws-do-eks
容器。 クラスター内で実行されている Prometheus サービスにアクセスするには、ホストからトンネルを作成します。 ここで、 aws-do-eks
コンテナーを実行するには、コンテナーの外部、ホスト上の新しいターミナル シェルで次のコマンドを実行します。 これを「ホスト シェル」と呼びます。
kubectl -n prometheus port-forward svc/$(kubectl -n prometheus get svc | grep prometheus | grep -v alertmanager | grep -v operator | grep -v grafana | grep -v metrics | grep -v exporter | grep -v operated | cut -d ' ' -f 1) 8080:9090 &
ポート転送プロセスの実行中は、以下で説明するようにホストから Prometheus UI にアクセスできます。
- Prometheus UIを開く
- Cloud9 を使用している場合は、次の場所に移動してください。
Preview->Preview Running Application
Cloud9 IDE 内のタブで Prometheus UI を開き、 タブの右上隅にある アイコンをクリックすると、新しいウィンドウが開きます。
- ローカルホスト上にいる場合、またはリモートデスクトップ経由で EC2 インスタンスに接続している場合は、ブラウザを開いて URL にアクセスします。
http://localhost:8080
.
- 入力します
DCGM
Prometheus に流れ込む DCGM メトリクスを確認するには
- 選択
DCGM_FI_DEV_GPU_UTIL
、選択する 実行するに移動し、 グラフ タブをクリックして、予想される GPU 使用率パターンを確認します
- Prometheus のポート転送プロセスを停止します。
ホスト シェルで次のコマンド ラインを実行します。
kill -9 $(ps -aef | grep port-forward | grep -v grep | grep prometheus | awk '{print $2}')
これで、Grafana ダッシュボードを介して DCGM メトリクスを視覚化できるようになりました。
- Grafana UI にログインするためのパスワードを取得します。
kubectl -n prometheus get secret $(kubectl -n prometheus get secrets | grep grafana | cut -d ' ' -f 1) -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
- Grafana サービスのポートフォワード
ホスト シェルで次のコマンド ラインを実行します。
kubectl port-forward -n prometheus svc/$(kubectl -n prometheus get svc | grep grafana | cut -d ' ' -f 1) 8080:80 &
- Grafana UI にログインします。
前に Prometheus UI にアクセスしたのと同じ方法で、Grafana UI ログイン画面にアクセスします。 Cloud9 を使用する場合は、選択します Preview->Preview Running Application
をクリックすると、新しいウィンドウが表示されます。 ローカルホストまたはリモートデスクトップで EC2 インスタンスを使用している場合は、URL にアクセスしてください http://localhost:8080
。 ユーザー名 admin と前に取得したパスワードを使用してログインします。
- ナビゲーションペインで、 ダッシュボード
- 選択する 新作 および インポート
で説明されているデフォルトの DCGM Grafana ダッシュボードをインポートします。 NVIDIA DCGM エクスポーター ダッシュボード.
- 現場で
import via grafana.com
、 入る 12239
選択して 負荷
- 選択する プロメテウス データソースとして
- 選択する インポート
次のスクリーンショットにあるようなダッシュボードが表示されます。
これらのメトリクスがポッドベースであることを示すために、 GPU使用率 このダッシュボードのペイン。
- ペインとオプション メニュー (XNUMX つの点) を選択します
- 拡大する オプション セクションを編集して、 伝説 フィールド
- そこの値を次のように置き換えます
Pod {{pod}}
、を選択します Save
凡例には次のことが表示されます。 gpu-burn
表示された GPU 使用率に関連付けられたポッド名。
- Grafana UI サービスのポート転送を停止する
ホスト シェルで次を実行します。
kill -9 $(ps -aef | grep port-forward | grep -v grep | grep prometheus | awk '{print $2}')
この投稿では、EKS クラスターにデプロイされたオープンソースの Prometheus と Grafana の使用をデモしました。 必要に応じて、このデプロイメントを次のように置き換えることができます。 プロメテウス向け Amazon マネージド サービス および AmazonマネージドGrafana.
クリーンアップ
作成したリソースをクリーンアップするには、次のスクリプトを aws-do-eks
コンテナシェル:
まとめ
この投稿では、NVIDIA DCGM Exporter を利用して GPU メトリクスを収集し、CloudWatch または Prometheus と Grafana で視覚化しました。 ここで紹介するアーキテクチャを使用して、独自の AWS 環境で NVIDIA DCGM による GPU 使用率のモニタリングを有効にすることをお勧めします。
その他のリソース
著者について
アムル・ラガブ は、AWS の EC2 Accelerated Computing の元プリンシパル ソリューション アーキテクトです。 彼は、顧客が計算ワークロードを大規模に実行できるよう支援することに専念しています。 余暇には、旅行したり、テクノロジーを日常生活に組み込む新しい方法を見つけることが好きです。
アレックス・イアンクルスキ AWS のセルフマネージド機械学習のプリンシパル ソリューション アーキテクトです。 彼はフルスタックのソフトウェアおよびインフラストラクチャ エンジニアであり、深く実践的な作業を行うことを好みます。 彼の役割では、コンテナを利用した AWS サービスでの ML および AI ワークロードのコンテナ化とオーケストレーションで顧客を支援することに重点を置いています。 彼はオープンソースの作者でもあります。 フレームワークを行う そして、世界最大の課題を解決しながらイノベーションのペースを加速するためにコンテナ テクノロジーを適用することが大好きな Docker のキャプテンです。 過去 10 年間、Alex は AI と ML の民主化、気候変動との闘い、旅行の安全性、医療の改善、エネルギーのスマート化に取り組んできました。
渡辺啓太 アマゾン ウェブ サービスのフレームワーク ML ソリューションのシニア ソリューション アーキテクトで、業界最高のクラウド ベースのセルフマネージド機械学習ソリューションの開発を支援しています。 彼の経歴は機械学習の研究開発です。 AWS に入社する前、Keita は e コマース業界で働いていました。 ケイタは博士号を取得しています。 東京大学理学部卒業。