paint-brush
Насб кардани Prometheus Alertmanager дар GPUҳо барои такмили давраи MLаз ҷониби@danielcrouch
Таърихи нав

Насб кардани Prometheus Alertmanager дар GPUҳо барои такмили давраи ML

аз ҷониби Daniel11m2024/10/12
Read on Terminal Reader

Хеле дароз; Хондан

Миқдор ва гуногунии маълумот боиси афзоиши алгоритмҳои мураккаб ва мураккаби ML барои коркарди сарбории кории AI мусоидат мекунад.
featured image - Насб кардани Prometheus Alertmanager дар GPUҳо барои такмили давраи ML
Daniel HackerNoon profile picture
0-item

Миқдор ва гуногунии маълумот боиси афзоиши алгоритмҳои мураккаб ва мураккаби ML барои коркарди сарбории кории AI мусоидат мекунад. Ин алгоритмҳо аз GPU-ҳо талаб мекунанд, ки самаранок кор кунанд ва маҷмӯи додаҳои миқёси сайёраро барои шинохти намунаҳо коркард кунанд. GPU-ҳо дар расонидани арзиш ва иҷроиш тавассути коркарди ҳисобҳои мураккаб хеле муассир буда, талаботи онҳоро дар домени ML/AI баланд мекунанд.


Сарфи назар аз муфид будани онҳо, GPU-ҳо хеле гаронанд. Сарбории пешрафтаи AI/ML ба ҷои татбиқи мустақим барои баланд бардоштани самаранокӣ ва устуворӣ ҳангоми оптимизатсияи хароҷот, мушоҳида ва стратегияҳои устувори идоракуниро талаб мекунад. Ҷамъоварии ченакҳои сатҳи GPU метавонад ба натиҷаҳои истисноӣ мусоидат намуда, давраи зиндагии AI/ML-ро беҳтар созад.

Се метрикаи ҷамъшавандаи GPU

Ҷараёни кории нармафзор аз марҳилаҳои гуногун иборат аст, ба монанди боркунии маълумот, оғозкунӣ, табдилдиҳӣ ва навиштани маълумот. Ҳамин марҳилаҳо ба сарбории кори омӯзиши мошинҳо бо ҳисобҳои мураккаб дахл доранд. Қисмҳои гуногуни GPU барои қонеъ кардани талабот дар ҳар марҳила истифода мешаванд. Барои гурӯҳҳои муҳандисӣ муҳим аст, ки ченакҳои тақсимот ва истифодаро барои омӯзиш ва ҷойгиркунии доимӣ донанд. Ин ба қабули қарорҳои оқилона ва истифодаи 100% захираҳо барои истихроҷи ҳадди аксар кӯмак мекунад.


Аз нуқтаи назари омӯзиши мошин, ҷузъҳои зерини GPU барои марҳилаҳои ҷараёни корӣ ҳангоми оғози омӯзиши модел истифода мешаванд. Мо ҷузъҳои GPU ва ченакҳои онҳоро ошкор хоҳем кард. Дар ниҳоят, мо мефаҳмем, ки чӣ гуна онҳоро аз alertmanager Prometheus гирифтан ва истифода бурданро барои беҳтар кардани давраи зиндагии умумии ML меомӯзем.




  1. Хотираи GPU : Маълумот ва лӯлаҳои ML ба хотира сахт такя мекунанд. Барои коркарди маълумоти калон, маълумот дар хотира барои натиҷаҳои тезтар ҳисоб карда мешавад. Вазнҳои модел, градиентҳо ва дигар гиперпараметрҳо/тағйирёбандаҳо дар хотираи GPU бор карда мешаванд. Ҳисоб кардани истифодаи хотира метавонад ба миқёс ва баланд бардоштани суръати таълими модел кӯмак кунад.
  2. Cores GPU : Вақте ки моделҳо амалиёти пуршиддати матритсаро иҷро мекунанд ва гузаришҳои пеш/қафоро татбиқ мекунанд, ядроҳои GPU ин амалиётҳоро иҷро мекунанд. Метрикҳои асосии фаъолияти тензорӣ барои муайян кардани он, ки то чӣ андоза воҳидҳои сахтафзор то чӣ андоза хуб истифода мешаванд ва ҷой барои такмил доранд, кӯмак мекунанд.
  3. Басомадҳои соати SM : Амалҳое, ки дар ядроҳои GPU иҷро мешаванд, барои иҷрои ҳисобҳои математикии дилхоҳ ҷараёнҳои бисёрпросессорҳоро (SM) талаб мекунанд. Басомадҳои соат метавонанд суръати ҳисобкуниро муайян кунанд.

Гирифтани ченакҳои GPU

Иҷрои скриптҳои bash мустақиман дар GPU чандирии Python-ро пешниҳод намекунад. Барои фаҳмидани рафтор мо метавонем ченакҳои GPU-ро дар тамоми раванди таълим пурсем ва таҳлил кунем. Бо истифода аз ин ченакҳо, мо метавонем огоҳиҳо ва ислоҳотро барои коркарди сенарияҳои муҳим танзим кунем.


Бо дарназардошти чандирӣ ва васеъшавӣ, мо Prometheus-ро насб хоҳем кард, то ҳушдорҳоро дар асоси ҳадди ниҳоии ҳатман канда ва ангеза диҳем ва Python-ро барои кандашавӣ ва сабти ченакҳои GPU истифода мебарем.

1. Метрикҳои хотира

Фарз мекунем, ки GPU NVIDIA аст ва танзимоти NVIDIA DCGM Exporter дар GPU-и шумо ба анҷом расидааст. Мо конфигуратсияи Prometheus-ро барои назорат ва канда кардани ченакҳо дар асоси ҳадди ниҳоӣ муайян мекунем ва дар сурати зиёд шудани ҳадди аққал огоҳии сустиро оғоз мекунем.


Ҳадаф кардани GPU, ки дар VPC зери зершабакаи 172.28.61.90 пешбинӣ шудааст ва дар порти 9400 тавассути конфигуратсияҳои Prometheus фош карда мешавад.


 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 }}."


Пас аз он метрикаҳо метавонанд ҳамчун огоҳӣ фиристода шаванд. Slack дорои имконоти осонтарини ҳамгироӣ барои танзими огоҳиҳо мебошад. Ҳамин тавр, бо истифода аз конфигуратсияи YAML дар зер мо метавонем огоҳиро ба гурӯҳҳо ё номи корбарони инфиродӣ дар Slack фаъол созем.


 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-ро барои идоракунии додаҳо ва boto3 барои коркарди AWS S3 баррасӣ хоҳем кард. Бо истифода аз китобхонаи идоракунии Nvidia (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

GPUҳо бо ядроҳои тензорҳои худ машҳуранд. Инҳо воҳидҳои сахтафзор мебошанд, ки метавонанд маълумоти бисёрченакаро коркард кунанд. Фаҳмидани он, ки ядроҳо борҳоро чӣ гуна тақсим мекунанд ё коркард мекунанд ва вақте ки онҳо ба остона мерасанд, муҳим аст. Мо метавонем қоидаҳои автоматии миқёсро тавассути ин огоҳиҳо татбиқ кунем, то сарбории корро идора кунем ва аз ҳад зиёд гармшавӣ ё садама пешгирӣ кунем.


Монанди мониторинги хотира, мо конфигуратсияҳоро барои назорат ва гирифтани ченакҳои асосии истифодаи GPU насб мекунем. Барои ҳар як дақиқа, вақте ки истифодаи аслӣ аз 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

Суръате, ки дар он ҳисобҳо сурат мегиранд, мустақиман ба басомади соатҳои бисёрпросессории ҷараён мутаносиб аст. Метрикаи басомади соати SM барои муайян кардани суръате, ки дар он ҳисобкуниҳои тензор ё ML оғоз ва анҷом медиҳанд, кӯмак мекунад.


Мо метавонем ба Prometheus имкон диҳем, ки ҳангоми аз 2000 МГс зиёд шудани басомади соати SM ҳушдор диҳад. Мо метавонем огоҳиҳои огоҳкунанда насб кунем, то вақте ки басомад ба ҳадди ниҳоӣ наздик мешавад, огоҳ шавед.


 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 метавонанд бидонанд, ки дар зери кулоҳ чӣ рӯй дода истодааст. Онҳо метавонанд тавассути таҳлили ченакҳо ва танзими ислоҳот барои огоҳиҳои муҳим ва афзалиятнок раванди таълимро такмил диҳанд.

Фикрҳои ниҳоӣ

Омӯзиши модели омӯзиши мошинҳо як раванди мураккаб ва печида аст. Мисли бе далелҳои солим ва омор, хулоса баровардан душвор аст, ки кадом вариантҳои модел пешгӯиҳо бо хулосаи баланд нишон медиҳанд. Мо ба ченакҳои GPU ниёз дорем, то бифаҳмем, ки намунаи ҳисоббарор, ки барои коркард ва коркарди сарбории кории ML масъул аст, чӣ гуна кор мекунад. Бо ченакҳои кофӣ ва огоҳиҳои вақти воқеӣ, гурӯҳҳои ML метавонанд қубурҳои мустаҳкам ва пойдори ML-ро таъсис ва ба тартиб дароранд, ки давраи зиндагии умумии ML-ро беҳтар мекунанд.

L O A D I N G
. . . comments & more!

About Author

Daniel HackerNoon profile picture
Occasional Thoughts on Coding, Security, and Management

ТЕГИ овезон кунед

ИН МАКОЛА ДАР...