ในเดือนกุมภาพันธ์ 2022 Amazon Web Services ได้เพิ่ม รองรับการวัด NVIDIA GPU ใน Amazon CloudWatchทำให้สามารถพุชเมตริกจาก ตัวแทน Amazon CloudWatch ไปยัง อเมซอน คลาวด์วอตช์ และตรวจสอบโค้ดของคุณเพื่อการใช้งาน GPU อย่างเหมาะสมที่สุด ตั้งแต่นั้นเป็นต้นมา คุณสมบัตินี้ได้ถูกรวมเข้ากับ Amazon Machine Images (AMI) ที่ได้รับการจัดการหลายรายการของเรา เช่น การเรียนรู้อย่างลึกซึ้ง AMI และ AWS ParallelCluster AMI. หากต้องการรับตัววัดระดับอินสแตนซ์ของการใช้งาน GPU คุณสามารถใช้ Packer หรือ Amazon ImageBuilder เพื่อบูต AMI ที่คุณกำหนดเอง และใช้ในข้อเสนอบริการที่มีการจัดการต่างๆ เช่น ชุด AWS, บริการ Amazon Elastic Container (อเมซอน อีซีเอส) หรือ บริการ Amazon Elastic Kubernetes (อเมซอน อีเคเอส). อย่างไรก็ตาม สำหรับข้อเสนอบริการและปริมาณงานแบบอิงคอนเทนเนอร์จำนวนมาก การเก็บเมตริกการใช้งานในระดับคอนเทนเนอร์ พ็อด หรือเนมสเปซถือเป็นวิธีที่ดีที่สุด
โพสต์นี้ให้รายละเอียดวิธีตั้งค่าตัววัด GPU ตามคอนเทนเนอร์ และให้ตัวอย่างการรวบรวมตัววัดเหล่านี้จากพ็อด EKS
ภาพรวมโซลูชัน
เพื่อสาธิตตัววัด GPU ตามคอนเทนเนอร์ เราสร้างคลัสเตอร์ EKS ด้วย g5.2xlarge
ตัวอย่าง; อย่างไรก็ตาม สิ่งนี้จะใช้ได้กับกลุ่มอินสแตนซ์เร่งความเร็วของ NVIDIA ที่รองรับ
เราปรับใช้ตัวดำเนินการ NVIDIA GPU เพื่อเปิดใช้งานการใช้ทรัพยากร GPU และ ผู้ส่งออก NVIDIA DCGM เพื่อเปิดใช้การรวบรวมเมตริก GPU จากนั้นเราจะสำรวจสถาปัตยกรรมสองแห่ง รายการแรกเชื่อมต่อตัววัดจาก NVIDIA DCGM Exporter ไปยัง CloudWatch ผ่านเอเจนต์ CloudWatch ดังที่แสดงในแผนภาพต่อไปนี้
สถาปัตยกรรมที่สอง (ดูแผนภาพต่อไปนี้) เชื่อมต่อหน่วยวัดจาก DCGM Exporter ไปยัง โพรจากนั้นเราใช้ a กราฟาน่า แดชบอร์ดเพื่อแสดงภาพตัวชี้วัดเหล่านั้น
เบื้องต้น
เพื่อให้การจำลองสแต็กทั้งหมดจากโพสต์นี้ง่ายขึ้น เราใช้คอนเทนเนอร์ที่มีเครื่องมือที่จำเป็นทั้งหมด (aws cli, eksctl, helm ฯลฯ) ติดตั้งไว้แล้ว เพื่อทำการโคลนนิ่ง. โครงการคอนเทนเนอร์จาก GitHub, คุณจะต้องการ คอมไพล์. คุณจะต้องมีเพื่อสร้างและใช้งานคอนเทนเนอร์ นักเทียบท่า. ในการปรับใช้สถาปัตยกรรม คุณจะต้องมี ข้อมูลรับรอง AWS. หากต้องการเปิดใช้งานการเข้าถึงบริการ Kubernetes โดยใช้การส่งต่อพอร์ต คุณจะต้องมี Kubectl.
ข้อกำหนดเบื้องต้นเหล่านี้สามารถติดตั้งบนเครื่องท้องถิ่นของคุณได้ EC2 อินสแตนซ์ กับ DCV ที่ดี,หรือ AWS Cloud9. ในโพสต์นี้เราจะใช้ a 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 shell" คุณจะเรียกใช้คำสั่งในส่วนต่อไปนี้ในเชลล์นี้ เว้นแต่จะได้รับคำแนะนำเป็นอย่างอื่นโดยเฉพาะ
สร้างคลัสเตอร์ EKS ด้วยกลุ่มโหนด
กลุ่มนี้ประกอบด้วยกลุ่มอินสแตนซ์ GPU ที่คุณเลือก ในตัวอย่างนี้ เราใช้ g5.2xlarge
ประเภทอินสแตนซ์
พื้นที่ โครงการ aws-do-eks มาพร้อมกับชุดการกำหนดค่าคลัสเตอร์ คุณสามารถตั้งค่าการกำหนดค่าคลัสเตอร์ที่ต้องการได้ด้วยการเปลี่ยนแปลงการกำหนดค่าเพียงครั้งเดียว
- ในเชลล์คอนเทนเนอร์ ให้รัน
./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
ในตัวอย่างนี้ เรามีหนึ่งอินสแตนซ์ m5.xlarge และหนึ่งอินสแตนซ์ g5.2xlarge ในคลัสเตอร์ของเรา ดังนั้นเราจึงเห็นสองโหนดที่แสดงอยู่ในผลลัพธ์ก่อนหน้า
ในระหว่างกระบวนการสร้างคลัสเตอร์ ปลั๊กอินอุปกรณ์ NVIDIA จะได้รับการติดตั้ง คุณจะต้องลบออกหลังจากการสร้างคลัสเตอร์เนื่องจากเราจะใช้ ตัวดำเนินการ NVIDIA GPU แทน.
- ลบปลั๊กอินด้วยคำสั่งต่อไปนี้
kubectl -n kube-system delete daemonset nvidia-device-plugin-daemonset
เราได้รับผลลัพธ์ต่อไปนี้:
daemonset.apps "nvidia-device-plugin-daemonset" deleted
ติดตั้ง repo NVIDIA Helm
ติดตั้ง repo NVIDIA Helm ด้วยคำสั่งต่อไปนี้:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update
ปรับใช้ผู้ส่งออก DCGM ด้วย NVIDIA GPU Operator
หากต้องการปรับใช้ DCGM ผู้ส่งออก ให้ทำตามขั้นตอนต่อไปนี้:
- เตรียมการกำหนดค่าเมตริก GPU ของผู้ส่งออก DCGM
curl https://raw.githubusercontent.com/NVIDIA/dcgm-exporter/main/etc/dcp-metrics-included.csv > dcgm-metrics.csv
คุณมีตัวเลือกในการแก้ไข dcgm-metrics.csv
ไฟล์. คุณสามารถเพิ่มหรือลบเมตริกได้ตามต้องการ
- สร้างเนมสเปซตัวดำเนินการ gpu และ ConfigMap ผู้ส่งออก DCGM
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 เปิดเผยตำแหน่งข้อมูลตัววัด Prometheus ซึ่งเอเจนต์ CloudWatch สามารถนำเข้าได้ หากต้องการดูจุดสิ้นสุด ให้ใช้คำสั่งต่อไปนี้:
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
ไฟล์
เปิด 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 } }
- ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร
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 ภายใต้ ตัวชี้วัด ในบานหน้าต่างนำทาง ให้เลือก ตัวชี้วัดทั้งหมด
- ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร เนมสเปซที่กำหนดเอง ส่วน ให้เลือกรายการใหม่สำหรับ ContainerInsights/โพรมีธีอุส
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ ContainerInsights/โพรมีธีอุส เนมสเปซ โปรดดูที่ คัดลอกแหล่งที่มาของ Prometheus เพิ่มเติมและนำเข้าตัวชี้วัดเหล่านั้น.
- เจาะลึกไปที่ชื่อเมตริกแล้วเลือก
DCGM_FI_DEV_GPU_UTIL
- เกี่ยวกับ เมตริกแบบกราฟ แท็บ set ระยะเวลา ไปยัง วินาที 5
- ตั้งค่าช่วงรีเฟรชเป็น 10 วินาที
คุณจะเห็นตัวชี้วัดที่รวบรวมจากผู้ส่งออก DCGM ที่แสดงภาพ gpu-burn
เปิดและปิดรูปแบบทุกๆ 20 วินาที
เกี่ยวกับ หมวดหมู่สินค้า คุณสามารถดูข้อมูล รวมถึงชื่อพ็อดสำหรับแต่ละเมตริกได้
ข้อมูลเมตา EKS API ได้รับการรวมเข้ากับข้อมูลตัววัด DCGM ซึ่งส่งผลให้ได้ตัววัด GPU ตามพ็อดที่ให้มา
นี่เป็นการสรุปแนวทางแรกในการส่งออกตัววัด DCGM ไปยัง CloudWatch ผ่านตัวแทน CloudWatch
ในส่วนถัดไป เรากำหนดค่าสถาปัตยกรรมที่สอง ซึ่งจะส่งออกตัววัด DCGM ไปยัง Prometheus และเราจะแสดงภาพด้วย Grafana
ใช้ Prometheus และ Grafana เพื่อแสดงภาพตัววัด GPU จาก DCGM
ทำตามขั้นตอนต่อไปนี้:
- เพิ่มแผนภูมิหางเสือชุมชน 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
- แก้ไขไฟล์การกำหนดค่าถ่าน
แก้ไขไฟล์ที่บันทึกไว้ (/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
มีหลายวิธีในการเปิดเผย Prometheus UI ที่ทำงานอยู่ใน EKS กับคำขอที่มาจากนอกคลัสเตอร์ เราจะใช้ 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 จากโฮสต์ตามที่อธิบายไว้ด้านล่าง
- เปิด UI ของ Prometheus
- หากคุณใช้ Cloud9 โปรดไปที่
Preview->Preview Running Application
เพื่อเปิด Prometheus UI ในแท็บภายใน Cloud9 IDE จากนั้นคลิกปุ่ม ที่มุมขวาบนของแท็บเพื่อเด้งออกมาในหน้าต่างใหม่
- หากคุณอยู่บนโฮสต์ในพื้นที่ของคุณหรือเชื่อมต่อกับอินสแตนซ์ EC2 ผ่านเดสก์ท็อประยะไกล ให้เปิดเบราว์เซอร์แล้วไปที่ URL
http://localhost:8080
.
- เข้าสู่
DCGM
เพื่อดูตัววัด DCGM ที่ไหลเข้าสู่ Prometheus
- เลือก
DCGM_FI_DEV_GPU_UTIL
เลือก ดำเนินงานแล้วนำทางไปยัง กราฟ เพื่อดูรูปแบบการใช้งาน GPU ที่คาดหวัง
- หยุดกระบวนการส่งต่อพอร์ต Prometheus
รันบรรทัดคำสั่งต่อไปนี้ในโฮสต์เชลล์ของคุณ:
kill -9 $(ps -aef | grep port-forward | grep -v grep | grep prometheus | awk '{print $2}')
ตอนนี้เราสามารถแสดงภาพตัววัด DCGM ผ่านทาง Grafana Dashboard ได้
- รับรหัสผ่านเพื่อเข้าสู่ระบบ 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
เข้าถึงหน้าจอเข้าสู่ระบบ Grafana UI เช่นเดียวกับที่คุณเข้าถึง Prometheus UI ก่อนหน้านี้ หากใช้ Cloud9 ให้เลือก Preview->Preview Running Application
แล้วเด้งออกมาในหน้าต่างใหม่ หากใช้โฮสต์ในพื้นที่ของคุณหรืออินสแตนซ์ EC2 พร้อม URL การเยี่ยมชมเดสก์ท็อประยะไกล http://localhost:8080
. เข้าสู่ระบบด้วยชื่อผู้ใช้ ผู้ดูแลระบบ และรหัสผ่านที่คุณดึงมาก่อนหน้านี้
- ในบานหน้าต่างนำทาง เลือก แผงควบคุม
- Choose ใหม่ และ นำเข้า
เราจะนำเข้าแดชบอร์ด DCGM Grafana เริ่มต้นตามที่อธิบายไว้ใน แดชบอร์ดผู้ส่งออก NVIDIA DCGM.
- ในสนาม
import via grafana.com
ป้อน 12239
และเลือก โหลด
- Choose โพร เป็นแหล่งข้อมูล
- Choose นำเข้า
คุณจะเห็นแดชบอร์ดคล้ายกับในภาพหน้าจอต่อไปนี้
เพื่อแสดงให้เห็นว่าตัวชี้วัดเหล่านี้อิงตามพ็อด เราจะแก้ไข การใช้งาน GPU บานหน้าต่างในแดชบอร์ดนี้
- เลือกบานหน้าต่างและเมนูตัวเลือก (สามจุด)
- ขยาย Options ส่วนและแก้ไข ตำนาน สนาม
- แทนที่ค่าตรงนั้นด้วย
Pod {{pod}}
แล้วเลือก ลด
ตำนานตอนนี้แสดงให้เห็น gpu-burn
ชื่อพ็อดที่เกี่ยวข้องกับการใช้งาน GPU ที่แสดง
- หยุดการส่งต่อพอร์ตบริการ Grafana UI
รันสิ่งต่อไปนี้ในเชลล์โฮสต์ของคุณ:
kill -9 $(ps -aef | grep port-forward | grep -v grep | grep prometheus | awk '{print $2}')
ในโพสต์นี้ เราได้สาธิตการใช้ Prometheus และ Grafana แบบโอเพ่นซอร์สที่ปรับใช้กับคลัสเตอร์ EKS หากต้องการ คุณสามารถทดแทนการใช้งานนี้ได้ บริการจัดการของ Amazon สำหรับ Prometheus และ อเมซอน Managed Grafana.
ทำความสะอาด
หากต้องการล้างทรัพยากรที่คุณสร้างขึ้น ให้เรียกใช้สคริปต์ต่อไปนี้จาก aws-do-eks
เปลือกภาชนะ:
สรุป
ในโพสต์นี้ เราใช้ NVIDIA DCGM Exporter เพื่อรวบรวมตัววัด GPU และแสดงภาพด้วย CloudWatch หรือ Prometheus และ Grafana เราขอเชิญคุณให้ใช้สถาปัตยกรรมที่แสดงไว้ที่นี่เพื่อเปิดใช้งานการตรวจสอบการใช้งาน GPU ด้วย NVIDIA DCGM ในสภาพแวดล้อม AWS ของคุณเอง
แหล่งข้อมูลเพิ่มเติม
เกี่ยวกับผู้แต่ง
อมร รากาบ เป็นอดีต Principal Solutions Architect, EC2 Accelerated Computing ที่ AWS เขาทุ่มเทในการช่วยเหลือลูกค้าในการรันปริมาณงานด้านการคำนวณในวงกว้าง ในเวลาว่าง เขาชอบการเดินทางและค้นหาวิธีใหม่ๆ ในการบูรณาการเทคโนโลยีเข้ากับชีวิตประจำวัน
อเล็กซ์ เอียนคูลสกี้ เป็นสถาปนิกโซลูชันหลัก การเรียนรู้ของเครื่องแบบจัดการด้วยตนเองที่ AWS เขาเป็นวิศวกรซอฟต์แวร์และโครงสร้างพื้นฐานแบบฟูลสแตกที่ชอบทำงานเชิงลึกและลงมือปฏิบัติจริง ในบทบาทของเขา เขามุ่งเน้นไปที่การช่วยเหลือลูกค้าในการวางคอนเทนเนอร์และประสานปริมาณงาน ML และ AI บนบริการ AWS ที่ขับเคลื่อนด้วยคอนเทนเนอร์ เขายังเป็นผู้เขียนโอเพ่นซอร์สอีกด้วย ทำกรอบงาน และกัปตันนักเทียบท่าผู้ชื่นชอบการประยุกต์ใช้เทคโนโลยีคอนเทนเนอร์เพื่อเร่งฝีเท้าของนวัตกรรมไปพร้อมๆ กับการแก้ปัญหาความท้าทายที่ยิ่งใหญ่ที่สุดของโลก ในช่วง 10 ปีที่ผ่านมา Alex ได้ทำงานเพื่อทำให้ AI และ ML เป็นประชาธิปไตย ต่อสู้กับการเปลี่ยนแปลงสภาพภูมิอากาศ และทำให้การเดินทางปลอดภัยยิ่งขึ้น การดูแลสุขภาพดีขึ้น และประหยัดพลังงานมากขึ้น
เกอิตะ วาตานาเบ้ เป็นสถาปนิกโซลูชันอาวุโสของ Frameworks ML Solutions ที่ Amazon Web Services โดยที่เขาช่วยพัฒนาโซลูชัน Machine Learning ที่จัดการด้วยตนเองบนระบบคลาวด์ที่ดีที่สุดในอุตสาหกรรม พื้นหลังของเขาอยู่ในการวิจัยและพัฒนา Machine Learning ก่อนที่จะมาร่วมงานกับ AWS Keita เคยทำงานในอุตสาหกรรมอีคอมเมิร์ซ Keita สำเร็จการศึกษาระดับปริญญาเอก สาขาวิทยาศาสตร์จากมหาวิทยาลัยโตเกียว
- เนื้อหาที่ขับเคลื่อนด้วย SEO และการเผยแพร่ประชาสัมพันธ์ รับการขยายวันนี้
- PlatoData.Network Vertical Generative Ai เพิ่มพลังให้กับตัวเอง เข้าถึงได้ที่นี่.
- เพลโตไอสตรีม. Web3 อัจฉริยะ ขยายความรู้ เข้าถึงได้ที่นี่.
- เพลโตESG. ยานยนต์ / EVs, คาร์บอน, คลีนเทค, พลังงาน, สิ่งแวดล้อม แสงอาทิตย์, การจัดการของเสีย. เข้าถึงได้ที่นี่.
- เพลโตสุขภาพ เทคโนโลยีชีวภาพและข่าวกรองการทดลองทางคลินิก เข้าถึงได้ที่นี่.
- ChartPrime. ยกระดับเกมการซื้อขายของคุณด้วย ChartPrime เข้าถึงได้ที่นี่.
- BlockOffsets การปรับปรุงการเป็นเจ้าของออฟเซ็ตด้านสิ่งแวดล้อมให้ทันสมัย เข้าถึงได้ที่นี่.
- ที่มา: https://aws.amazon.com/blogs/machine-learning/enable-pod-based-gpu-metrics-in-amazon-cloudwatch/