paint-brush
Gowulandyrylan ML ömri üçin GPU-larda Prometheus Alertmanager gurmaktarapyndan@danielcrouch
Täze taryh

Gowulandyrylan ML ömri üçin GPU-larda Prometheus Alertmanager gurmak

tarapyndan Daniel11m2024/10/12
Read on Terminal Reader

Örän uzyn; Okamak

Maglumatlaryň mukdary we dürlüligi AI iş ýüklerini dolandyrmak üçin çylşyrymly we çylşyrymly ML algoritmleriniň ýokarlanmagyna itergi berýär.
featured image - Gowulandyrylan ML ömri üçin GPU-larda Prometheus Alertmanager gurmak
Daniel HackerNoon profile picture
0-item

Maglumatlaryň mukdary we dürlüligi AI iş ýüklerini dolandyrmak üçin çylşyrymly we çylşyrymly ML algoritmleriniň ýokarlanmagyna itergi berýär. Bu algoritmler GPU-laryň netijeli işlemegini we nagyşlary tanamak üçin planetadaky maglumatlar bazalaryny gaýtadan işlemegini talap edýär. GPU-lar çylşyrymly hasaplamalary dolandyrmak, ML / AI domeninde isleglerini artdyrmak arkaly gymmaty we öndürijiligi üpjün etmekde örän täsirli.


Peýdalydygyna garamazdan, GPU-lar gaty gymmat. Ösen AI / ML iş ýükleri çykdajylary optimizirlemek bilen öndürijiligi we çydamlylygy ýokarlandyrmak üçin gönüden-göni durmuşa geçirmegiň ýerine berk gözegçilik we dolandyryş strategiýalaryny talap edýär. GPU derejesindäki ölçegleri jemlemek, AI / ML ömrüni gowulandyryp, ajaýyp netijeleri bermäge kömek edip biler.

Üç sany jemlenen GPU ölçegleri

Programma üpjünçiliginiň iş akymlary maglumatlary ýüklemek, başlangyçlaşdyrmak, üýtgetmek we maglumatlary ýazmak ýaly birnäçe basgançakdan durýar. Şol etaplar, çylşyrymly hasaplamalar bilen maşyn öwrenmek iş ýüklerine-de degişlidir. GPU-nyň dürli bölekleri her etapda islegi kanagatlandyrmak üçin ulanylýar. In engineeringenerçilik toparlary üçin üznüksiz okuw we ýerleşdiriş üçin bölüniş we ulanyş ölçeglerini bilmek möhümdir. Bu habarly karar bermäge we iň ýokary bahany çykarmak üçin çeşmeleriň 100% -ini ulanmaga kömek edýär.


Maşyn öwrenmek nukdaýnazaryndan, model okuwy başlanda iş prosesi üçin aşakdaky GPU komponentleri ulanylýar. GPU komponentlerine we olaryň görkezýän ölçeglerine düşüneris. Ahyrynda, umumy ML ömrüni gowulandyrmak üçin Prometheus duýduryş dolandyryjysyndan nädip tutmalydygyny we ulanmalydygyny öwreneris.




  1. GPU ýady : Maglumatlar we ML turbageçirijiler ýada baglydyr. Uly maglumatlary gaýtadan işlemek üçin maglumatlar has çalt netijeler üçin ýatda hasaplanýar. Model agramlary, gradiýentler we beýleki giperparametrler / üýtgeýjiler GPU ýadyna ýüklenýär. Memoryadyň ulanylyşyny yzarlamak, modeliň okuw tizligini ýokarlandyrmaga we ýokarlandyrmaga kömek edip biler.
  2. GPU ýadroslary : Modeller matrisa köp talap edýän amallary ýerine ýetirip, öňe / yza geçişleri ulananda, GPU ýadroslary bu amallary ýerine ýetirer. Densoryň esasy işjeňlik ölçegleri, enjam enjamlarynyň näderejede ulanylýandygyny we gowulaşmak üçin ýeriniň bardygyny kesgitlemäge kömek edýär.
  3. SM sagat ýygylyklary : GPU ýadrosynda işleýän amallar, islenýän matematiki hasaplamalary ýerine ýetirmek üçin akymly prosessorlary (SM) talap edýär. Sagat ýygylyklary hasaplama tizligini kesgitlemäge kömek edip biler.

GPU ölçeglerini almak

GPU-da baş skriptleri işletmek Python-yň çeýeligini teklip etmeýär. Özüňi alyp barşyna düşünmek üçin okuwyň dowamynda GPU ölçeglerini sorap we analiz edip bileris. Bu ölçegleri ulanmak bilen, möhüm ssenariýalary dolandyrmak üçin duýduryşlary we düzedişleri gurup bileris.


Çeýeligi we giňelmegi göz öňünde tutup, “Prometheus” -y bosagada esaslanýan duýduryşlary döwmek we işletmek üçin dörederis we GPU ölçeglerini çyzmak we hasaba almak üçin Python-dan peýdalanarys.

1. oryat ölçegleri

GPU-ny NVIDIA diýip hasap etsek we NVIDIA DCGM Exporter gurmak GPU-da tamamlandy. Bosaganyň esasynda ölçeglere gözegçilik etmek we döwmek üçin, Prometheus konfigurasiýasyny kesgitläris we bosagadan ýokary bolsa, ýalňyş habarnamany başlarys.


172.28.61.90 subnet ulgamyndaky VPC-de üpjün edilen we Prometheus sazlamalary arkaly 9400 portda görkezilen GPU-ny nyşana almak.


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


Maksat kesgitlenensoň, her iki minutdan ýadyň ulanylyşyny barlamak üçin aňlatma alyp bileris. Bosag 80% -den geçende, möhüm duýduryş ýüze çykýar.


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


Soňra ölçegler duýduryş hökmünde iberilip bilner. Slack duýduryşlary gurmak üçin iň aňsat integrasiýa wariantlaryna eýe. Şeýlelik bilen, aşakdaky YAML konfigurasiýasyny ulanyp, Slackdäki toparlara ýa-da aýratyn ulanyjy atlaryna duýduryş berip bileris.


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


Gözegçilik we duýduryş peýdaly we bir zadyň nädogrydygyny bize habar bermek ýaly çäkli peýdalary hödürleýär. Derňew üçin ölçegleri ele almaly we habarly kararlar bermeli.


Bu ssenariýa üçin maglumatlary dolandyrmak üçin DuckDB we AWS S3 manipulýasiýasy üçin boto3 göz öňünde tutarys. Nvidia dolandyryş kitaphanasyny (pynvml) ulanyp, GPU-ny kod arkaly dolandyryp bileris. Ölçegleri S3-e parket faýly hökmünde ýazarys. Dowamlylyk üçin, ýazgylary DuckDB ulanyp, ýatda saklaýan maglumatlar bazasyna ýazarys we mahabatyň ýa-da real wagt derňewi üçin maglumatlaryň gysgaça suratyny S3-e ýazarys.


 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 esasy ölçegleri

GPU-lar öz datçikleri bilen meşhurdyr. Bular köp ölçegli maglumatlary gaýtadan işläp bilýän apparat bölümleri. Oresadrolaryň ýükleri nädip paýlaýandygyna ýa-da gaýtadan işleýändigine we bosagada haçan düşendigine düşünmek gaty möhümdir. Iş ýüklerini dolandyrmak we aşa gyzmagyň ýa-da heläkçiligiň öňüni almak üçin bu duýduryşlar arkaly awtomatik ulaltmak düzgünlerini durmuşa geçirip bileris.


Memoryat gözegçiligine meňzeş ýaly, GPU ýadro ulanyş ölçeglerine gözegçilik etmek we ele almak üçin konfigurasiýalary gurarys. Her minut üçin, ýadro ulanylyşy 80% -den geçende, möhüm duýduryş iberiler we ortaça ulanmak üçin her bäş minutdan status täzelenmesi iberiler.


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


Bu ýerde, enjamyň işleýiş indeksini alarys we ulanyş nyrhlaryny yzyna gaýtarýan usula jaň ederis. Jogap, ýatda saklanýan DuckDB maglumatlar bazasyna girýär we gaýtadan işlenen wagt belgisi bilen s3 bedrä salynýar.


 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 sagat ýygylygynyň ölçegleri

Hasaplamalaryň bolup geçýän tizligi, akymly köp prosessorly sagat ýygylygyna gönüden-göni proporsionaldyr. SM sagat ýygylygy ölçegi, datçigiň ýa-da ML hasaplamalarynyň başlaýan we tamamlaýan tizligini kesgitlemäge kömek edýär.


SM sagat ýygylygy 2000MHz-dan ýokary bolsa, Prometheus-a duýduryş bermäge mümkinçilik berip bileris. Encyygylyk çägine ýakynlaşanda habar bermek üçin duýduryş duýduryşlaryny gurup bileris.


 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 sagat ölçegleriniň toplanmagy, ýatda saklaýan maglumatlary we S3 ölçeglerini hasaba almak üçin aňsatlyk bilen ýazylyp bilner.


 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)


Bu ölçegleri ulanmak bilen ML inersenerleri kapotyň aşagynda nämeleriň bolup biljekdigini bilip bilerler. Ölçegleri seljermek we ýokary tankyt we ileri tutulýan duýduryşlar üçin düzedişleri düzmek arkaly okuw prosesini gowulaşdyryp bilerler.

Jemleýji pikirler

Maşyn öwrenmek modeli okuwy çylşyrymly we jemlenen prosesdir. Edil dogry subutnamalar we statistika bolmazdan, haýsy model wariantlarynyň çaklamalary ýokary ähmiýet bilen görkezýändigi barada netije çykarmak kyn. ML iş ýüklerini dolandyrmak we gaýtadan işlemek üçin jogapkär hasaplaýyş mysalynyň işleýşine düşünmek üçin GPU ölçegleri gerek. Enougheterlik ölçegler we real wagt duýduryşlary bilen ML toparlary umumy ML ömrüni gowulandyrýan berk we çydamly ML turbalaryny gurup we tertipleşdirip bilerler.