Количеството и разновидноста на податоци го поттикнуваат подемот на сложените и софистицирани ML алгоритми за справување со оптоварувањата со вештачка интелигенција. Овие алгоритми бараат графичките процесори да работат ефикасно и да обработуваат сетови на податоци од планетарна скала за да препознаваат шеми. Графичките процесори се многу ефикасни во обезбедувањето вредност и перформанси со справување со сложени пресметки, со што нивната побарувачка вртоглаво расте во доменот ML/AI.
И покрај нивната корисност, графичките процесори се многу скапи. Напредните оптоварувања на AI/ML бараат робусни стратегии за набљудување и управување наместо директни имплементации за да се зголемат перформансите и издржливоста при оптимизирање на трошоците. Агрегирањето на метрика на ниво на графички процесор може да помогне да се донесат исклучителни резултати, подобрувајќи го животниот циклус на AI/ML.
Работните текови на софтверот се состојат од повеќе фази како што се вчитување на податоци, иницијализација, трансформација и пишување податоци. Истите фази се однесуваат на оптоварувањата за машинско учење со сложени пресметки. Различни делови од графичкиот процесор се користат за исполнување на побарувачката во секоја фаза. Важно е инженерските тимови да ги знаат метриките за распределба и искористеност за континуирана обука и распоредување. Ова помага да се донесуваат информирани одлуки и да се искористат 100% од ресурсите за извлекување максимална вредност.
Од гледна точка на машинско учење, следните компоненти на графичкиот процесор се користат за фази на работниот тек кога се започнува обуката за моделот. Ќе ги разбереме компонентите на графичкиот процесор и метриката што тие ги изложуваат. Конечно, ќе научиме како да ги фатиме и искористиме од Prometheus alertmanager за да го подобриме целокупниот животен циклус на ML.
Извршувањето баш скрипти директно на графичкиот процесор не ја нуди флексибилноста на Пајтон. Можеме да бараме и анализираме метрика на графичкиот процесор во текот на процесот на обука за да го разбереме однесувањето. Со користење на овие метрики, можеме да поставиме предупредувања и санации за да се справиме со критичните сценарија.
Имајќи ја предвид флексибилноста и проширувањето, ќе го поставиме Prometheus да гребе и активира предупредувања врз основа на прагот и да користиме Python за гребење и евидентирање на метрика на графичкиот процесор.
Претпоставувајќи дека графичкиот процесор е NVIDIA и поставувањето на NVIDIA DCGM Exporter е завршено на вашиот графички процесор. Ќе ја дефинираме конфигурацијата на Prometheus за следење и гребење на метрика врз основа на прагот и активирање на известување за слабеење ако прагот се надмине.
Насочување на графичкиот процесор обезбеден во 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), можеме да пристапиме и да управуваме со графичкиот процесор преку код. Ќе ја напишеме метриката на 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)
Графичките процесори се познати по нивните тензорски јадра . Тоа се хардверски единици кои можат да обработуваат повеќедимензионални податоци. Од клучно значење е да се разбере како јадрата ги дистрибуираат или обработуваат оптоварувањата и кога го достигнуваат прагот. Можеме да имплементираме правила за автоматско скалирање преку овие предупредувања за да се справиме со обемот на работа и да избегнеме прегревање или падови.
Слично на следењето на меморијата, ќе поставиме конфигурации за следење и снимање на метрика за користење на јадрото на графичкиот процесор. За секоја минута, кога искористеноста на јадрото ќе надмине 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 да активира предупредувања кога фреквенцијата на SM часовникот надминува 2000 MHz. Можеме да поставиме предупредувачки предупредувања за да добиваме известувања кога фреквенцијата се приближува до границата.
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 можат да знаат што се случува под хаубата. Тие можат да го подобрат процесот на обука со анализа на метриката и поставување на санации за предупредувања со висока критичност и приоритет.
Обуката за модели за машинско учење е сложен и сложен процес. Исто како и без здрави докази и статистика, тешко е да се заклучи кои варијанти на модели покажуваат предвидувања со високи заклучоци. Потребни ни се метрика на графичкиот процесор за да разбереме како работи пресметковниот пример одговорен за ракување и обработка на оптоварувањата на ML. Со доволно метрика и предупредувања во реално време, тимовите за ML можат да постават и да ги насочат робусните и издржливи цевки за ML што го подобруваат целокупниот животен циклус на ML.