paint-brush
ንዝተመሓየሸ ዑደት ህይወት ML ኣብ GPUs Prometheus Alertmanager ምድላው@danielcrouch
ሓድሽ ታሪኽ

ንዝተመሓየሸ ዑደት ህይወት ML ኣብ GPUs Prometheus Alertmanager ምድላው

Daniel11m2024/10/12
Read on Terminal Reader

ኣዝዩ ነዊሕ፤ ንምንባብ

ብዝሕን ዝተፈላለየን ዳታ ንዕብየት ዝተሓላለኹን ዝተራቐቑን ML ኣልጎሪዝማት ንAI ስራሕ ጽዕነት ንምሕላው ነዳዲ ይህብ።
featured image - ንዝተመሓየሸ ዑደት ህይወት ML ኣብ GPUs Prometheus Alertmanager ምድላው
Daniel HackerNoon profile picture
0-item

ብዝሕን ዝተፈላለየን ዳታ ንዕብየት ዝተሓላለኹን ዝተራቐቑን ML ኣልጎሪዝማት ንAI ስራሕ ጽዕነት ንምሕላው ነዳዲ ይህብ። እዞም ኣልጎሪዝማት እዚኦም፡ ጂፒዩታት ብብቕዓት ክሰርሑን ንፕላኔታት ዝዓቐኑ ዳታሴታት ንኽሰርሑን ቅዲታት ከለልዩን ይጠልቡ። GPUs ዝተሓላለኹ ስሌታት ብምሕላው ዋጋን ኣፈፃፅማን ኣብ ምቕራብ ኣዝዮም ውፅኢታት ስለዝኾኑ ኣብ ML/AI domain ጠለቦም ሰማይ ክዓርግ ይገብሩ።


ዋላ እኳ ጠቕሚ እንተሃለዎም፡ GPUs ግን ኣዝዮም ክቡራት እዮም። ምዕቡላት ጽዕነት ስራሕ AI/ML ኣብ ክንዲ ቀጥታዊ ኣተገባብራታት ድልዱል ናይ ትዕዝብትን ምሕደራን ስትራተጂታት የድልዮም፣ ንዋጋታት ኣብ ምምሕያሽ ኣፈጻጽማን ጽንዓትን ንምዕባይ። ምድማር ብደረጃ GPU መለክዒታት ፍሉይ ውጽኢት ንምርካብ ክሕግዝ ይኽእል እዩ፣ እዚ ድማ ንዑደት ህይወት AI/ML የመሓይሽ።

ሰለስተ Aggregatable GPU Metrics

ዋሕዚ ስራሕ ሶፍትዌር ከም ምጽዓን ዳታ፣ ምጅማር፣ ምቕያርን ምጽሓፍ ዳታን ዝኣመሰሉ ብዙሓት ደረጃታት ዝሓቖፈ እዩ። ተመሳሳሊ ደረጃታት ንማሽን ትምህርቲ ጽዕነት ስራሕ ምስ ዝተሓላለኸ ስሌታት ይምልከት። ዝተፈላለዩ ክፋላት ናይቲ GPU ኣብ ነፍሲ ወከፍ ደረጃ ነቲ ጠለብ ንምምላእ ይጥቀሙ። ጋንታታት ምህንድስና ንቐጻሊ ስልጠናን ምውፋርን ዝኸውን ናይ ምምቕራሕን ኣጠቓቕማን መለክዒታት ምፍላጥ ኣገዳሲ እዩ። እዚ ድማ ብግቡእ ዝተሰነየ ውሳነታት ንምውሳንን ንዝለዓለ ዋጋ ምውጻእ 100% ጸጋታት ንምጥቃምን ይሕግዝ።


ብዓይኒ ማሽን ትምህርቲ ሞዴል ስልጠና ኣብ ዝጅመረሉ እዋን እዞም ዝስዕቡ ኣካላት ጂፒዩ ንደረጃታት ዋሕዚ ስራሕ ይጥቀሙ። ንሳቶም ዘቃልዕዎ ኣካላት GPUን መለክዒታትን ክንርዳእ ኢና። ኣብ መወዳእታ፡ ንሓፈሻዊ ዑደት ህይወት ML ንምምሕያሽ፡ ካብ Prometheus alertmanager ከመይ ጌርና ከም እንሕዞምን ከም እንጥቀመሉን ክንመሃር ኢና።




  1. GPU Memory : ሻምብቆታት ዳታን MLን ብብዝሒ ኣብ መዘክር ይምርኮሱ። ንመስርሕ ዓቢ ዳታ፡ እቲ ዳታ ኣብ መዘክር ንዝቐልጠፈ ውጽኢት ይሕሰብ። እቶም ናይ ሞዴል ሚዛናት፣ ደረጃታት፣ ከምኡ እውን ካልኦት ሃይፐርፓራሜተራት/ተለዋዋጢ ኣብ GPU መዘክር ይጽዓኑ። ኣጠቓቕማ መዘክር ምክትታል ንፍጥነት ስልጠና ናይቲ ሞዴል ንምዕባይን ንምዕባይን ክሕግዝ ይኽእል።
  2. GPU Cores : ሞዴላት ማትሪክስ ዝሓትት ስርሓት ክፍጽሙን ንቕድሚት/ንድሕሪት ምሕላፍ ክገብሩን ከለዉ፡ GPU cores ነዞም ስርሓት ክሕዝዎም እዮም። እቶም ቴንሰር ኮር ኣክቲቪቲ ሜትሪክስ እቶም ሃርድዌር ኣሃዱታት ክሳብ ክንደይ ጽቡቕ ጌሮም ከም ዝጥቀሙን ንመመሓየሺ ቦታ ከም ዘለዎምን ንምውሳን ይሕግዙ።
  3. SM Clock Frequencies : ኣብ GPU cores ዝሰርሑ ስርሓት ዝድለ ናይ ሒሳብ ስሌታት ንምፍጻም ስትሪሚንግ ማልቲፕሮሰሰር (SM) የድልዮም። እቶም ናይ ሰዓት ፍሪኩዌንሲታት ነቲ ናይ ምሕሳብ ፍጥነት ንምውሳን ክሕግዙ ይኽእሉ።

ምቕራጽ GPU Metrics

bash scripts ብቐጥታ ኣብ GPU ምዝዋር ናይ Python ተዓጻጻፍነት ኣይህብን እዩ። ነቲ ባህሪ ንምርዳእ ኣብ ምሉእ መስርሕ ስልጠና ንGPU metrics ክንሓትትን ክንትንትንን ንኽእል ኢና። ነዞም መለክዒታት ብምጥቃም፡ ንኣገደስቲ ስናርዮታት ንምሕላው መጠንቀቕታን ምእራማትን ከነቐምጥ ንኽእል።


ተዓጻጻፍነትን ምዝርጋሕን ኣብ ግምት ብምእታው፡ ፕሮሚቲየስ ኣብ ደረት ዝተመርኮሰ መጠንቀቕታታት ንኽሽርሽርን ንኽጅምርን ከነዳሉ ኢና፡ ፓይቶን ድማ ንመዐቀኒታት ጂፒዩ ንምሕራስን ንምምዝጋብን ክንጥቀመሉ ኢና።

1. መለክዒታት ዝኽሪ

GPU NVIDIA እዩ ኢልና እንተወሰድናዮ ድማ እቲ NVIDIA DCGM Exporter setup ኣብ GPU ናትና ምሉእ እዩ። ኣብቲ ደረት ተመርኲስና ንመዐቀኒታት ንምክትታልን ንምሕራርን ዝሕግዝ Prometheus config ክንገልጽ ኢና፡ እቲ ደረት እንተሓሊፉ ድማ slack notification ክንጅምር ኢና።


ኣብ ትሕቲ ንኡስ መርበብ 172.28.61.90 ኣብ VPC ዝቐረበን ኣብ ፖርት 9400 ብPrometheus configs ዝተቓልዐን GPU ዕላማ ምግባር።


 configs_scrapper: - job_name: 'nvidia_gpu_metrics_scrapper' static_configs: - targets: ['172.28.61.90:9400']


እቲ ዕላማ ምስ ተነጸረ፡ ኣብ ነፍሲ ወከፍ ክልተ ደቓይቕ ኣጠቓቕማ መዘክር ንምፍታሽ ነቲ መግለጺ ክንረኽቦ ንኽእል። እቲ ደረት ካብ 80% ምስ ዝሓልፍ፡ ወሳኒ መጠንቀቕታ ይጅምር።


 groups: -name: GPU_Memory_Alerts rules: - alert: HighGPUMemoryUsage expr: (dcgm_gpu_mem_used / dcgm_gpu_mem_total) * 100 > 80 for: 2m   labels: severity: critical   annotations:summary: "GPU Memory usage is high on {{ $labels.instance }}" description: "GPU memory utilization is over 80% from more than 2 minutes on {{ $labels.instance }}."


ድሕሪኡ እቶም መለክዒታት ከም መጠንቀቕታታት ክለኣኹ ይኽእሉ። ስላክ ንመጠንቀቕታታት ንምድላው ዝቐለሉ ናይ ውህደት ኣማራጺታት ኣለዎ። ስለዚ፡ ነዚ ኣብ ታሕቲ ዘሎ YAML config ብምጥቃም፡ ኣብ ስላክ ንጉጅለታት ወይ ንውልቃዊ ኣስማት ተጠቀምቲ ምጥንቃቕ ከነኽእል ንኽእል።


 global: resolve_timeout: 2m route: receiver: 'slack_memory_notifications' group_wait: 5s group_interval: 2m repeat_interval: 1h receivers: - name: 'slack_memory_notifications' slack_configs: - api_url: 'https://databracket.slack.com/services/shrad/webhook/url' channel: 'databracket' username: 'Prometheus_Alertmanager' send_resolved: true title: 'GPU Memory Utilization >80% Alert' text: "A high memory utilization was observed triggering alert on GPU."


ምክትታልን ምጥንቃቕን ጠቓሚ ኮይኑ ውሱን ረብሓታት ዝህብ እዩ፣ ከም ሓደ ነገር ክጋገ ከሎ ምሕባር። ንትንተና ዝኸውን መለክዒታት ምሓዝን ብግቡእ ዝተሰነየ ውሳነታት ክንወስድን ኣለና።


ነዚ ስናርዮ እዚ ንዳታ ማኔጅመንት DuckDB ንAWS S3 manipulation ድማ boto3 ኣብ ግምት ከነእቱ ኢና። Nvidia management library (pynvml) ብምጥቃም፡ ብኮድ ኣቢልና ነቲ GPU ክንረኽቦን ከነመሓድሮን ንኽእል። እቶም ሜትሪክስ ናብ S3 ከም ፓርኬት ፋይላት ክንጽሕፎም ኢና። ንጽንዓት፡ እቶም ሎግስ ናብ ኣብ ውሽጢ ዝኽሪ ዳታቤዝ DuckDB ተጠቒምና ክንጽሕፎም ኢና፡ ቅጽበታዊ ስእሊ ናይቲ ዳታ ድማ ናብ S3 ንጊዝያዊ ወይ ኣብ ሓቀኛ ግዜ ትንተና ክንጽሕፍ ኢና።


 import time import pynvml import duckdb import boto3 import osfrom datetime import datetime pynvml.nvmlInit() s3 = boto3.client('s3') con = duckdb.connect(database=':memory:') con.execute(''' CREATE TABLE gpu_memory_usage ( Timestamp VARCHAR, Overall_memory DOUBLE, Memory_in_use DOUBLE, Available_memory DOUBLE ) ''') def get_gpu_memory_info(gpu_id=0): handle = pynvml.nvmlDeviceGetHandleByIndex(gpu_id) memory_info = pynvml.nvmlDeviceGetMemoryInfo(handle) return { "Overall_memory": memory_info.total / (1024 ** 2), "Memory_in_use": memory_info.used / (1024 ** 2), "Available_memory": memory_info.free / (1024 ** 2) } def upload_parquet_to_s3(bucket_name, object_name, file_path): try: s3.upload_file(file_path, bucket_name, object_name) print(f"Parquet file uploaded to S3: {object_name}") except Exception as e: print(f"Failed to upload Parquet to S3: {e}") def log_memory_utilization_to_parquet(bucket_name, filename, gpu_id=0, interval=1.0, local_file_path='gpu_memory_stats.parquet'): try: while True: gpu_memory_info = get_gpu_memory_info(gpu_id) timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') con.execute(''' INSERT INTO gpu_memory_usage VALUES (?, ?, ?, ?) ''', (timestamp, gpu_memory_info['Overall_memory'], gpu_memory_info['Memory_in_use'], gpu_memory_info['Available_memory'])) print(f"Logged at {timestamp}: {gpu_memory_info}") if int(datetime.now().strftime('%S')) %60 == 0: # Upload Every Minute object_name = f"{filename}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.parquet" upload_parquet_to_s3(bucket_name, object_name, local_file_path) time.sleep(interval) except KeyboardInterrupt: print("Logging stopped by user.") bucket_name = 'prometheus-alerts-cof' filename = 'gpu_memory_stats' log_memory_utilization_to_parquet(bucket_name, filename, gpu_id=0, interval=2.0)


2. GPU Core Metrics ዝብል ንጥረ ነገር

GPUs ብ tensor cores ፍሉጣት ’ ዮም። እዚኦም ድማ ብዙሕ ሸነኻዊ ዳታ ከሰላስሉ ዝኽእሉ ሃርድዌር ኣሃዱታት እዮም። እቶም ኮርስ ከመይ ጌሮም ነቲ ጽዕነት ይዝርግሕዎ ወይ ይሰርሕዎ ከምዘለዉን መዓስ ደረት ከምዝሃርሙን ምርዳእ ወሳኒ እዩ። ጽዕነት ስራሕ ንምሕላውን ልዕሊ ዓቐን ሙቐት ወይ ምብልሻው ንምክልኻልን በዞም መጠንቀቕታታት ኣቢልና ሕግታት ኣውቶ-ስኬሊንግ ክንተግብር ንኽእል ኢና።


ምስ ምክትታል መዝገብ ዝመሳሰል፡ ንመዐቀኒታት ኣጠቓቕማ ቀንዲ (GPU core utilization metrics) ንምክትታልን ንምሓዝን ዝሕግዙ ውቅርታት ከነዳሉ ኢና። ንነፍሲ ወከፍ ደቒቕ፡ እቲ ቀንዲ ኣጠቓቕማ ካብ 80% ምስ ዝሓልፍ፡ ወሳኒ መጠንቀቕታ ይለኣኽ፡ ንማእከላይ ኣጠቓቕማ ድማ፡ ኣብ ነፍሲ ወከፍ ሓሙሽተ ደቓይቕ ናይ ኩነታት ምዕባለ ይለኣኽ።


 groups: - name: gpu_alerts rules: - alert: HighGPUCoreUtilization expr: gpu_core_utilization > 80 for: 1m labels: severity: critical annotations: summary: "GPU Core Utilization >80% Alert" description: "GPU core utilization is above 80% for over 1 minute." - alert: MediumGPUCoreUtilization expr: gpu_core_utilization > 50 for: 5m labels: severity: warning annotations: summary: "GPU Memory Utilization = Moderate" description: "GPU core utilization is above 50% for over 5 minutes."


ኣብዚ፡ ናይ መሳርሒ መትሓዚ ኢንዴክስ ክንረክብ ኢና እሞ፡ ናይ ኣጠቓቕማ ደረጃታት ዝመልስ ሜላ ክንጽውዕ ኢና። ብድሕሪኡ እቲ መልሲ ናብቲ ኣብ ዝኽሪ ዘሎ ዳታቤዝ DuckDB ይኣቱ እሞ ምስቲ ዝተመስርሐ ናይ ግዜ ማሕተም ናብቲ s3 ባልጃ ይኣቱ።


 con.execute(''' CREATE TABLE gpu_core_usage ( Timestamp VARCHAR, GPU_Utilization_Percentage DOUBLE ) ''') def get_gpu_utilization(gpu_id=0): """Returns the GPU utilization percentage.""" handle = pynvml.nvmlDeviceGetHandleByIndex(gpu_id) utilization = pynvml.nvmlDeviceGetUtilizationRates(handle) return utilization.gpu def log_gpu_utilization_to_parquet(bucket_name, filename, gpu_id=0, interval=1.0, local_file_path='gpu_core_stats.parquet'): """Logs GPU utilization to a Parquet file and uploads it to S3 periodically.""" try: while True: gpu_utilization = get_gpu_utilization(gpu_id) timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') con.execute(''' INSERT INTO gpu_core_usage VALUES (?, ?) ''', (timestamp, gpu_utilization)) print(f"Logged at {timestamp}: GPU Utilization = {gpu_utilization}%") if int(datetime.now().strftime('%S')) % 60 == 0: con.execute(f"COPY gpu_core_usage TO '{local_file_path}' (FORMAT PARQUET)") object_name = f"{filename}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.parquet" upload_parquet_to_s3(bucket_name, object_name, local_file_path) con.execute("DELETE FROM gpu_core_usage") time.sleep(interval) except KeyboardInterrupt: print("Logging stopped by user.") # Example usage: bucket_name = 'prometheus-alerts-cof' filename = 'gpu_core_stats' log_gpu_utilization_to_parquet(bucket_name, filename, gpu_id=0, interval=2.0)

3. SM Clock ፍሪኩዌንሲ ሜትሪክስ

እቶም ስሌታት ዝፍጸሙሉ ፍጥነት ምስቲ ስትሪሚንግ ማልቲፕሮሰሰር ሰዓት ፍሪኩዌንሲ ብቐጥታ ተመጣጣኒ እዩ። እቲ ናይ SM ሰዓት ፍሪኩዌንሲ ሜትሪክ እቶም ቴንሰር ወይ ML ስሌታት ዝጅምሩሉን ዝውድኡሉን ፍጥነት ንምፍላጥ ይሕግዝ።


ፕሮሚቲየስ ፍሪኩዌንሲ ሰዓት SM ካብ 2000MHz ንላዕሊ ምስ ዝኸውን መጠንቀቕታታት ንኽጅምር ከነኽእሎ ንኽእል። እቲ ፍሪኩዌንሲ ናብቲ ደረት ምስ ቀረበ ንኽንሕበር መጠንቀቕታ መጠንቀቕታታት ከነቐምጥ ንኽእል ኢና።


 groups: - name: gpu_sm_clock_alerts rules: - alert: LowSMClockFrequency expr: gpu_sm_clock_frequency >= 1000 for: 1m labels: severity: warning annotations: summary: "Low SM Clock Frequency" description: "The SM clock frequency is below 500 MHz for over 1 minute." - alert: HighSMClockFrequency expr: gpu_sm_clock_frequency > 2000 for: 1m labels: severity: critical annotations: summary: "High SM Clock Frequency" description: "The SM clock frequency is above 2000 MHz for over 1 minute."


ምውህላል ናይ SM ሰዓት መለክዒታት ብቐሊሉ ስክሪፕት ብምግባር ነቲ መለክዒታት ኣብ ውሽጢ ዝኽሪ ዳታን S3ን ንምምዝጋብ ይከኣል።


 con.execute(''' CREATE TABLE sm_clock_usage ( Timestamp VARCHAR, SM_Clock_Frequency_MHz INT ) ''') def get_sm_clock_frequency(gpu_id=0): handle = pynvml.nvmlDeviceGetHandleByIndex(gpu_id) sm_clock = pynvml.nvmlDeviceGetClockInfo(handle, pynvml.NVML_CLOCK_SM) return sm_clock def log_sm_clock_to_parquet(bucket_name, filename, gpu_id=0, interval=1.0, local_file_path='sm_clock_stats.parquet'): try: while True: sm_clock_frequency = get_sm_clock_frequency(gpu_id) timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') con.execute(''' INSERT INTO sm_clock_usage VALUES (?, ?) ''', (timestamp, sm_clock_frequency)) print(f"Logged at {timestamp}: SM Clock Frequency = {sm_clock_frequency} MHz") if int(datetime.now().strftime('%S')) % 10 == 0: con.execute(f"COPY sm_clock_usage TO '{local_file_path}' (FORMAT PARQUET)") object_name = f"{filename}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.parquet" upload_parquet_to_s3(bucket_name, object_name, local_file_path) con.execute("DELETE FROM sm_clock_usage") time.sleep(interval) except KeyboardInterrupt: print("Logging stopped by user.") bucket_name = 'prometheus-alerts-cof' filename = 'sm_clock_stats' log_sm_clock_to_parquet(bucket_name, filename, gpu_id=0, interval=2.0)


ነዞም መለክዒታት ብምጥቃም መሃንድሳት ኤምኤል ኣብ ትሕቲ ሽፋን እንታይ ይፍጸም ከምዘሎ ክፈልጡ ይኽእሉ። ነቲ መዐቀኒታት ብምትንታንን ንልዑል ወሳኒነትን ቀዳምነት ዝወሃቦ መጠንቀቕታታት መአረምታታት ብምድላውን ነቲ መስርሕ ስልጠና ከማሓይሹ ይኽእሉ።

ናይ መወዳእታ ሓሳባት

ስልጠና ሞዴል ትምህርቲ ማሽን ዝተሓላለኸን ዝተሓላለኸን መስርሕ እዩ። ልክዕ ከምቲ ብዘይ ቅኑዕ መርትዖን ስታቲስቲክስን፡ ኣየኖት ሞዴል ፍልልያት ልዑል መደምደምታ ዘለዎም ትንበያታት ከምዘርእዩ ንምድምዳም ኣጸጋሚ እዩ። እቲ ንML workloads ንምሕላውን ንምስራሕን ሓላፍነት ዘለዎ compute instance ከመይ ይሰርሕ ከምዘሎ ንምርዳእ GPU metrics የድልየና። ብእኹል መለክዒታትን ኣብ ሓቀኛ ግዜ መጠንቀቕታን፡ ጋንታታት ኤምኤል ንሓፈሻዊ ዑደት ህይወት ኤምኤል ዘመሓይሹ ድልዱላትን ነባራትን ሻምብቆታት ኤምኤል ከቕርባን ከቃንዓን ይኽእላ።