Миқдор ва гуногунии маълумот боиси афзоиши алгоритмҳои мураккаб ва мураккаби ML барои коркарди сарбории кории AI мусоидат мекунад. Ин алгоритмҳо аз GPU-ҳо талаб мекунанд, ки самаранок кор кунанд ва маҷмӯи додаҳои миқёси сайёраро барои шинохти намунаҳо коркард кунанд. GPU-ҳо дар расонидани арзиш ва иҷроиш тавассути коркарди ҳисобҳои мураккаб хеле муассир буда, талаботи онҳоро дар домени ML/AI баланд мекунанд.
Сарфи назар аз муфид будани онҳо, GPU-ҳо хеле гаронанд. Сарбории пешрафтаи AI/ML ба ҷои татбиқи мустақим барои баланд бардоштани самаранокӣ ва устуворӣ ҳангоми оптимизатсияи хароҷот, мушоҳида ва стратегияҳои устувори идоракуниро талаб мекунад. Ҷамъоварии ченакҳои сатҳи GPU метавонад ба натиҷаҳои истисноӣ мусоидат намуда, давраи зиндагии AI/ML-ро беҳтар созад.
Ҷараёни кории нармафзор аз марҳилаҳои гуногун иборат аст, ба монанди боркунии маълумот, оғозкунӣ, табдилдиҳӣ ва навиштани маълумот. Ҳамин марҳилаҳо ба сарбории кори омӯзиши мошинҳо бо ҳисобҳои мураккаб дахл доранд. Қисмҳои гуногуни GPU барои қонеъ кардани талабот дар ҳар марҳила истифода мешаванд. Барои гурӯҳҳои муҳандисӣ муҳим аст, ки ченакҳои тақсимот ва истифодаро барои омӯзиш ва ҷойгиркунии доимӣ донанд. Ин ба қабули қарорҳои оқилона ва истифодаи 100% захираҳо барои истихроҷи ҳадди аксар кӯмак мекунад.
Аз нуқтаи назари омӯзиши мошин, ҷузъҳои зерини GPU барои марҳилаҳои ҷараёни корӣ ҳангоми оғози омӯзиши модел истифода мешаванд. Мо ҷузъҳои GPU ва ченакҳои онҳоро ошкор хоҳем кард. Дар ниҳоят, мо мефаҳмем, ки чӣ гуна онҳоро аз alertmanager Prometheus гирифтан ва истифода бурданро барои беҳтар кардани давраи зиндагии умумии ML меомӯзем.
Иҷрои скриптҳои bash мустақиман дар GPU чандирии Python-ро пешниҳод намекунад. Барои фаҳмидани рафтор мо метавонем ченакҳои GPU-ро дар тамоми раванди таълим пурсем ва таҳлил кунем. Бо истифода аз ин ченакҳо, мо метавонем огоҳиҳо ва ислоҳотро барои коркарди сенарияҳои муҳим танзим кунем.
Бо дарназардошти чандирӣ ва васеъшавӣ, мо Prometheus-ро насб хоҳем кард, то ҳушдорҳоро дар асоси ҳадди ниҳоии ҳатман канда ва ангеза диҳем ва Python-ро барои кандашавӣ ва сабти ченакҳои GPU истифода мебарем.
Фарз мекунем, ки 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)
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)
Суръате, ки дар он ҳисобҳо сурат мегиранд, мустақиман ба басомади соатҳои бисёрпросессории ҷараён мутаносиб аст. Метрикаи басомади соати 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-ро беҳтар мекунанд.