Latest / M365.FM – podcast o Microsoft 365, Copilot i AI po polsku / Wolna inferencja na GPU zdemaskowana: fallback na CPU, konflikty wersji CUDA/TensorRT i błędy kontenerów (Dubbing AI)
Transcript
- 0:00Zaczęło się od ostrzeżenia, potem zapadła cisza.
- 0:02Rachunek za GPU rusł, jakby akcelerator nigdy nie spał, a mimo to wyniki spływały tak wolno, jakby zgasły światła.
- 0:07Dashboardy świeciły na zielono, klienci nie.
- 0:09Ta anomalia do niczego nie pasowała.
- 0:11Bliskie zeru wykorzystanie GPU przy gwałtownym wzroście opóźnień.
- 0:15Żadnych alertów, żadnych czerwonych linii, po prostu czas przeciekający przez palce.
- 0:18Dowody wskazują na jedną patologię, która podszywa się pod normalność.
- 0:22Oto obietnica.
- 0:23Przeanalizujemy artefakty, nazwiemy winowajce i naprawimy usterkę.
- 0:26Zbadamy trzy tryby awarii, przełączenie na CPU, niezgodność wersji między cuda i ONNX Tensorszt oraz błędną konfigurację kontenera,
- 0:33a następnie udowodnimy to, porównując opóźnienia, przepustowość i wykorzystanie GPU przed i po naprawie.
- 0:38Konfiguracja przypadku, środowisko i profil ofiary.
- 0:41Każda konfiguracja opowiada pewną historię, a ta zaczyna się od zwykłego użytkownika pod presją.
- 0:46Obciążenie to dyfuzja tekstu na obraz, warianty stable diffusion działające w 512 na 512 i skalujące się do 1024 na 1024.
- 0:53Ruch jest skokowy. Współbieżność waha się między 8 a 32 żądaniami.
- 0:58Rozmiary partii wahają się od 1 do 8.
- 1:00Poziomy usług są rygorystyczne w kwestii opóźnień końcowych.
- 1:02Naruszenia P95 przekładają się bezpośrednio na zwroty kosztów i kary.
- 1:05Modele nie są egzotyczne, ale wybory z nimi związane mają znaczenie.
- 1:08Potoki stable diffusion eksportowane do ONNX, optymalizacje cross-attention,
- 1:12takie jak sformers lub scalet dot product attention oraz wybory harmonogramu, które zamieniają kroki na jakość.
- 1:17Ekosystem ma przyspieszać, gdy infrastruktura działa poprawnie.
- 1:20Sprzęt na papierze wygląda przyzwoicie.
- 1:23Karty Nvidia RTX i serii A w chmurze 16 do 32 GB VRAM.
- 1:27Magistrala PCIe znajduje się między hostem a urządzeniem niczym punkt poboru opłat.
- 1:30Wystarczająco szybka, gdy jest skonfigurowana i zabójcza, gdy powiązania i owracają do transferów stronicowalnych.
- 1:34W tym środowisku nic nie jest przypadkowe.
- 1:36Łańcuch narzędzi układa się w znane warstwy.
- 1:38Pythorch służy do eksportu, a potem ONNX Runtime lub Tensorst przejmuje wnioskowanie.
- 1:42Sterowniki cuda znajdują się pod wszystkim.
- 1:44Jądra Attention obiecują szybkość, jeśli wersje są zgodne.
- 1:48Wdrożenie jest ściśle konteneryzowane, obrazy niezmienne, wdrożenia sterowane ci.
- 1:52Polityka Blue Green.
- 1:53To ograniczenie powinno zapewniać bezpieczeństwo.
- 1:56Może jednak również zakonserwować błędy.
- 1:58Stawki biznesowe nie są abstrakcyjne.
- 2:00Koszt żądania definiuje marżę.
- 2:01Rezerwacje GPU wyceniane godzinowo, niezależnie od tego, czy jądra działają, czy nie.
- 2:05Gdy opóźnienie wydłuża się z sekund do pół minuty, przepustowość załamuje się.
- 2:08Jedna błędna konfiguracja zmienia akcelerator w grzejnik.
- 2:11Drogi, cichy i zajęty robieniem czegoś, co nie pomaga kolejce.
- 2:14Przy bliższym przyjrzeniu się profil ofiary zawęża się.
- 2:17Współbieżność 16, partie po dwie, aby pozostać poniżej limitów VRAM przy 512, przechodząc do 1024 roku dla jakości.
- 2:24Użytkownik oczekuje spójnego P95.
- 2:27Zamiast tego ślady pokazują nieregularne opóźnienia, szerokie delty między P50 a P95 oraz cykle pracy GPU oscylujące od 5% do 40% bez wyraźnego powodu.
- 2:36Wykresy CPU mówią co innego.
- 2:38Rdzenie obciążone, choć brak przetwarzania wstępnego, by to uzasadnić.
- 2:41Dowody wskazują na trzy możliwe przyczyny.
- 2:43Po pierwsze, awaryjne przełączenie na CPU.
- 2:45Gdy dostawca wykonań cuda lub tensorszt nie może się załadować, silnik po cichu wybiera wykres CPU.
- 2:50Model działa, ale z od 10 do 30-krotnie większym opóźnieniem.
- 2:53Po drugie, niezgodność wersji.
- 2:54ONNX Runtime skompilowany pod jedno cuda, węzły używające innego, silniki tensorszt unieważnione i przebudowane z ogólnymi jądrami.
- 3:02Wykorzystanie jest widoczne, ale szybkie ścieżki zniknęły.
- 3:05Po trzecie, błędna konfiguracja kontenera, przeładowane obrazy, brak zamontowanych urządzeń GPU, złe ustawienia NVID, a container toolkit oraz obszary pamięci przetrzymujące, alokacje, co zwiększa opóźnienia końcowe pod obciążeniem.
- 3:15Ostatecznie nie jest to zagadka dotycząca modeli, to sprawa dotycząca uczciwości infrastruktury.
- 3:20Prześledzimy artefakty, kolejność dostawców, logi możliwości, punkty montowania urządzeń i powiążemy je z trzema niezmiennymi metrykami, opóźnieniem, przepustowością i wykorzystaniem GPU.
- 3:30Plik dowodowy, a awaryjne przełączenie na CPU, cichy sabotażysta.
- 3:35Zaczęło się od zapytania, które powinno zająć sekundy, a nie zajęło.
- 3:38Wskaźnik GPU był cichy, zbyt cichy.
- 3:41Wykres CPU tymczasem wzrósł jak alarm przeciwpożarowy.
- 3:43Po bliższym przyjrzeniu się, silnik dokonał wyboru.
- 3:46Uruchomił zadanie przeznaczone dla GPU na procesorze.
- 3:48Żaden alert się nie włączył.
- 3:50Wynik w końcu się pojawił.
- 3:51Oto cichy sabotażysta, awaryjne przełączenie na CPU.
- 3:54Dlaczego to ważne?
- 3:55To proste.
- 3:55Stable diffusion na procesorze to strata czasu.
- 3:58Model działa, ale opóźnienie rośnie wielokrotnie od 10 do 30 razy wolniej, a przepustowość drastycznie spada.
- 4:03W środowisku, gdzie sprzedaje się milisekundy, ta różnica jest krytyczna.
- 4:06Rachunek nalicza czas GPU, ale urządzenie nie wykonuje pracy.
- 4:09Oś czasu ujawniła wzorzec.
- 4:10Kontenery, które lokalnie działały z cuda, śmigały.
- 4:13Po wdrożeniu do węzła klastra z nieco innym stosem sterowników, te same kontenery uruchamiały się, odpowiadały na sondy zdrowia, a potem zwalniały.
- 4:19Punkt końcowy zdrowia sprawdzał tylko, czy serwer działa, więc nigdy nie sprawdzał, czy GPU faktycznie wykonuje pracę.
- 4:25W tym środowisku nic nie jest przypadkowe.
- 4:27Cisza to artefakt.
- 4:29Głównym artefaktem jest kolejność dostawców wykonań w ONN X Runtime.
- 4:33Silnik akceptuje listę, spróbuj ten sorszt, potem cuda, potem CPU.
- 4:37Jeśli cuda nie zainicjuje się zły sterownik, brak bibliotek, niezamontowane urządzenie ORT po cichu przypisze dostawcę wykonań CPU.
- 4:44Brak wyjątku, brak awarii, tylko linijka w logach często ukryta na dole.
- 4:48Dostawca wykonań cuda niedostępny przełączam na CPU.
- 4:51Ta linijka to wyznanie, którego większość zespołów nigdy nie czyta.
- 4:54A teraz najdziwniejsza część.
- 4:55Wykresy wykorzystania wyglądają na pierwszy rzut oka zwodniczo normalnie.
- 4:58Zapytania nadal się kończą.
- 5:00Mapa usług świeci się na zielono, ale cykl pracy GPU utrzymuje się na poziomie 5%,
- 5:03podczas gdy zużycie procesora przez użytkownika jest wysokie i stałe.
- 5:06Opóźnienie P50 rośnie czterokrotnie, a P95 wymyka się spod kontroli.
- 5:09Nagłe skoki ruchu tylko pogarszają sprawę.
- 5:11Kolejki rosną, a autoskalowanie dodaje kolejne repliki, z których każda dziedziczy tę samą wadę.
- 5:15Wyobraź sobie sztafetę, w której sprinter się nie zjawia, więc jego odcinek biegnie bibliotekarz.
- 5:24Podczas śledzenia sekwencji uruchamiania szybko pojawiają się dowody problemów.
- 5:29Dzienniki ładowania dostawców pokazują próby inicjalizacji cuda wraz z weryfikacją wersji sterownika.
- 5:33Jeśli kontener zbudowano w oparciu o cuda 12.2, a węzeł ma tylko 12.0, inicjalizacja kończy się niepowodzeniem.
- 5:39Jeśli zestaw narzędzi NVID i a-container toolkit nie jest skonfigurowany,
- 5:42montowanie urządzenia nigdy nie pojawi się w kontenerze.
- 5:44Brak dev Nvidia oznacza brak libcuda.
- 5:47Jeśli więc specyfikacja podanie rząda GPU wprost, harmonogram nigdy nie przypisze urządzenia.
- 5:52Każda z tych przyczyn wywołuje cichą degradację wydajności.
- 5:55Odtworzenie błędu jest proste.
- 5:58Na źle skonfigurowanym węźle prosta inferencja wskazuje dostawcę CPU zamiast oczekiwanego tensorszt lub cuda.
- 6:07Wysłanie pojedynczego promptu pozostawia GPU w stanie bezczynności.
- 6:10Wątki CPU gwałtownie rosną, a obraz wraca po od 20 do 40 sekundach zamiast po 2 do 6.
- 6:15Powtórz to na węźle z właściwymi sterownikami i montowaniami.
- 6:18Ten sam prompt kończy się w ułamku czasu, a cykl pracy GPU wchodzi w stabilny zakres.
- 6:22Dowody sugerują, że obecne zabezpieczenia są tylko fasadowe.
- 6:25Sondy zdrowia zwracają 200, ponieważ serwer odpowiada.
- 6:28Brak jest asercji przy starcie, która potwierdzałaby, że ścieżka GPU działa.
- 6:31Sondy wydajności nie istnieją, więc orkiestracja uznaje repliki za sprawne.
- 6:35System nie potrafi odróżnić akceleracji od emulacji.
- 6:37Środek zaradczy jest z założenia radykalny.
- 6:40Całkowita awaria, jeśli dostawca wykonawczy GPU jest nieobecny lub działa nieprawidłowo.
- 6:44Odmowa uruchomienia z użyciem CPU w środowisku produkcyjnym.
- 6:47Przy uruchomieniu procesu wylicz dostawców, sprawdź, czy załadowano tensorszt lub cuda i czy liczba urządzeń jest zgodna z oczekiwaniami.
- 6:54Zaloguj zestaw możliwości QDNN, dostępne rdzenie tensorą, limity pamięci i zakończ z kodem błędu, jeśli czegokolwiek brakuje.
- 7:01Poświęć dostępność na rzecz integralności i pozwól orkiestratorom przenieść zadania na zdrowy węzeł.
- 7:05Aby to zapewnić, wprowadź weryfikację wiązania we W.
- 7:08Przypisz wejścia i wyjścia do pamięci urządzenia i zweryfikuj prostą inferencję przy starcie.
- 7:12Jeden rozgrzewkowy przebieg, który uruchamia jądro Fused Attention.
- 7:15Jeśli czas przekroczy limit opóźnienia, uznaj ścieżkę za zdegradowaną i zrestartuj poda.
- 7:20Dodaj zestaw promptów kontrolnych z deterministycznymi ziarnami losowości.
- 7:23Porównaj opóźnienia z oknem bazowym.
- 7:25Jeśli odchylenie przekracza tolerancję, wyślij alert i zatrzymaj wdrażanie.
- 7:29Może się to wydawać surowe, ale alternatywa jest znacznie gorsza.
- 7:32Klaster, który działa jednocześnie marnując czas i budżet.
- 7:35Zablokuj kolejność dostawców, odrzuć użycie procesora, fallback i wymuś, by system udowodnił szybkość, zanim uznamy go za sprawny.
- 7:41Dopiero wtedy zielony kolor oznacza akcelerację.
- 7:44Dowód B. Niedopasowanie wersji, niekompatybilność, cuda ONNX i TensorSzt.
- 7:48Jeśli GPU nie zostało użyte, kolejne pytanie brzmi, czy mogłoby działać z pełną prędkością, nawet jeśli jest obecne?
- 7:54Dowody wskazują na bardziej subtelną awarię.
- 7:56Wersje są na tyle zgodne, by uruchomić system, ale nie na tyle, by odblokować szybką ścieżkę.
- 8:00System wygląda na przyspieszony, dopóki nie spojrzysz na zegary.
- 8:03Powód, dla którego to ważne, jest oczywisty.
- 8:04Potoki dyfuzyjne zależą od wydajności mechanizmu Attention.
- 8:08Gdy ONNX Runtime i TensorSzt nie mogą załadować oczekiwanych połączonych jąder Fused Kernels,
- 8:13przez różnice w wersjach cuda, cudne lub TensorSzt, cicho przełączają się na implementacje ogólne.
- 8:17Model działa.
- 8:19Wykorzystanie oscyluje wokół od 30 do 50%, a opóźnienia przekraczają budżet.
- 8:24Kompilacja wygląda tak samo, praca jest wolniejsza.
- 8:26Przy bliższym przyjrzeniu się, artefakty są precyzyjne.
- 8:29Logi ładowania dostawców ogłaszają sukces z pewnym, ale...
- 8:32Powrót do domyślnych jąder lub wyłączone z Formers.
- 8:36Zobaczysz, że deserializacja planu TensorSzt zawodzi, wymuszając przebudowę silnika, co inicjuje kompilację na węźle.
- 8:42Silniki zbudowane na jednej wersji MinorTensorSzt nie zdeserializują się na innej.
- 8:46Przebudowa kończy się sukcesem, ale wynikowy plan może pomijać Fused Attention lub optymalizację FP16.
- 8:51Wyścig dobiega końca.
- 8:52Bez skoków wydajności, cykle pracy rdzeni Tensor pozostają stłumione.
- 8:55Oto część sprzeczna z intuicją.
- 8:57Zespoły interpretują fakt, że system działa jako optymalny.
- 9:00W tym środowisku nic nie jest przypadkowe.
- 9:03Jeśli Scaled Dot Product Attention nie jest aktywne, jeśli Sformers jest wyłączone, jeśli Cudny zgłasza ograniczony obszar roboczy, wydajność uprzejmie się załamuje.
- 9:10Mówiąc prościej, niedopasowane pliki binarne wymuszają użycie jąder, które częściej przenoszą dane w pamięci kosztem gęstości obliczeń.
- 9:15Pcie staje się widoczne w śladach Traces.
- 9:17Opóźnienia końcowe, Tail Latencies, rosną wraz ze wzrostem współbieżności.
- 9:20Potraktuj stos oprogramowania jak zestaw zamków.
- 9:23Sterownik, zestaw narzędzi Cuda, Cudne, flagi kompilacji, ONNX Runtime i TensorSzt.
- 9:28Jeden ząbek nie na swoim miejscu i klucz obraca się tylko do połowy.
- 9:31Ord ogłasza graf możliwości dla każdego dostawcy wykonawczego.
- 9:34Jeśli skompilowany Ord oczekuje Cuda 12.2, a sterownik węzła udostępnia 12.1, Cuda ładuje się z ograniczonymi funkcjami lub wcale.
- 9:42Jeśli na węźle jest TensorSzt 8.6, a plany wygenerowano w 8.4, deserializacja zawodzi i generuje je ponownie z użyciem konserwatywnych taktyk.
- 9:50System po cichu przedkłada poprawność nad szybkość.
- 9:52Benchmarki dowodzą strat w praktycznym ujęciu. Z aktywnym sformers lub SDP mechanizm Attention w dyfuzji mierzalnie skraca czas rzeczywisty.
- 10:00Badania konsekwentnie pokazują przyspieszenie od 2x do 5x w ścieżce Attention w zależności od rozdzielczości i rozmiarów sadu.
- 10:06Wyłączając je przez rozbieżność wersji tracisz te mnożniki.
- 10:09Token Merging Tome sumuje się z tymi zyskami.
- 10:12Bez połączonych jąder korzyść jest ograniczona przepustowością pamięci i niezoptymalizowanymi układami.
- 10:17Różnica potęguje się przy rozdzielczości 1024 na 1024 i wyższej współbieżności.
- 10:22Aby śledzić artefakty, zacznij od wyliczenia możliwości.
- 10:24Przy starcie wypisz dokładną listę dostawców i zgłaszane przez nich funkcje.
- 10:28Wersja TensorSt, dostępność FP16 i INT8, maksymalna przestrzeń robocza, heurystyka, splotu cudne, obecność NCCL dla wielu GPU.
- 10:38Dla środowiska wykonawczego ONNX zrzuć priorytety app.
- 10:41TensorSt, cuda, a następnie CPU.
- 10:43Zweryfikuj, co faktycznie łączy się z węzłami Twojego grafu.
- 10:47Zaloguj, czy węzły uwagi są przypisane do TensorSt ze scalonymi jądrami, czy do ogólnych jąder cuda.
- 10:52Następnie sprawdź środowisko.
- 10:54Odpytaj sterownik NVID i ASM i pokazuje moduł jądra i kompatybilność z cuda.
- 10:58Odczytaj wersję bibliotek w kontenerze.
- 11:00Libcuda, libcublas, libcan, libnywinfer.
- 11:03Jeśli obraz zawiera biblioteki cuda 12.3, a sterownik hosta obsługuje do 12.2,
- 11:07tryb kompatybilności środowiska uruchomieniowego może wczytać się z ograniczeniami.
- 11:11Jeśli obraz oczekuje na główku w TensorSt 8.6, a wtyczka węzła dostarcza 8.4,
- 11:15wywołania API ulegną degradacji lub anulują niektóre optymalizacje.
- 11:18Rozwiązaniem jest macierz budowania, a nie życzenia.
- 11:21Zablokuj dokładne wersje w jednym źródle prawdy.
- 11:23Obraz bazowy z kompatybilnością sterowników, wersją podrzędną cuda, cudne,
- 11:28haszem kompilacji ORD i wersją TensorSt.
- 11:30Przygotuj obrazy inferencji zgodnie z tą macierzą i odrzucaj węzły,
- 11:33które nie pasują poprzez etykiety węzłów i kontrolę przyjęcia.
- 11:35Wstępnie buduj i buforuj silniki TensorSt dla każdego wariantu modelu i rozdzielczości na dokładnie tej wersji TensorSt, którą wdrażasz.
- 11:41Traktuj pliki planu jako artefakty powiązane z macierzą.
- 11:44Nigdy nie polegaj na budowaniu silnika na węźle w środowisku produkcyjnym.
- 11:47Maskuje to dry w wersji i wydłuża zimne starty.
- 11:50Aby to utrzymać, dodaj testy dymne Ci, które potwierdzają możliwości jądra.
- 11:54Uruchom kontener w izolowanym środowisku z docelowym sterownikiem i zweryfikuj,
- 11:57czy TensorSt wczytuje używane jądra FP16,
- 12:00czy węzły uwagi są scalone,
- 12:01czy wiązanie IO jest aktywne i czy Sformers lub SDP są rozpoznawane.
- 12:05Uruchom deterministyczny zestaw promptów i przerwi budowanie,
- 12:08jeśli opóźnienie przekracza bazowe okno
- 12:09lub jeśli logi zawierają komunikaty o przełączaniu na inne tryby.
- 12:13Przechowuj migawkę możliwości wraz z sumą kontrolną obrazu,
- 12:15aby wycofanie zmian przywracało zarówno kod, jak i charakterystykę wydajności.
- 12:19Ostatecznie dowody wskazują, że dry w wersji to nie błąd, jak widać.
- 12:22To szybkość, za którą płacisz.
- 12:24System będzie działać.
- 12:25Zegary złożą świadectwo.
- 12:27Dowód plik C – kontener.
- 12:28Erozja wydajności przez błędną konfigurację w projekcie.
- 12:33Nawet gdy wersje są zgodne, kontener może od wewnątrz sabotować wydajność.
- 12:37Dowody wskazują na powolny wyciek, rozrost obrazu,
- 12:39brakującą infrastrukturę GPU i zachowanie alokatora,
- 12:42które zniekształca opóźnienia pod obciążeniem.
- 12:44Nic się nie zawiesza.
- 12:45Wszystko ulega degradacji.
- 12:47Dlaczego to ważne jest proste?
- 12:49Kontenery kształtują rzeczywistość wykonawczą.
- 12:51Jeśli obraz jest ociężały, a zimne starty się wleką,
- 12:54repliki przybywają spóźnione do incydentu.
- 12:56Jeśli urządzenia GPU nie są zamontowane lub środowisko uruchomieniowe
- 12:59nie ma odpowiednich flag, dostawcy wykonawczy działają nieprawidłowo.
- 13:02Jeśli obszary pamięci gromadzą alokację,
- 13:04rotacja RAM wywołuje stronicowanie i skoki opóźnień.
- 13:06Model wygląda dobrze.
- 13:08Kontener po cichu obciąża każde żądanie.
- 13:10Przy bliższym przyjrzeniu się,
- 13:11artefakty gromadzą się podczas budowania.
- 13:14Obrazy przekraczają 2 GB,
- 13:15wypchane kompilatorami, nagłówkami i testami,
- 13:18bo brak budowania wieloetapowego.
- 13:19Brak Docker Ignore wpuszcza notatniki,
- 13:21cache i eksperymentalne wagi do warstw produkcyjnych.
- 13:24Każde wdrożenie przesyła gigabajty przez sieć.
- 13:27Przeskaluj to na pulę węzłów,
- 13:29a zimny start stanie się normą, niewyjątkiem.
- 13:31Dowody nie są tajemnicze.
- 13:33Historia Dockera opowiada historię w warstwach.
- 13:35Środowisko uruchomieniowe ujawnia drugi poziom erozji.
- 13:38Bez jawnych flag GPU,
- 13:40braku GPU w Dockerze lub konfiguracji
- 13:42wtyczek urządzeń w Kubernetes,
- 13:44proces nie widzi urządzeń NVIDIA.
- 13:46Błędna konfiguracja zestawu narzędzi kontenera NVIDIA
- 13:50ukrywa LiMQDA,
- 13:51więc dostawca wykonawczy ładuje się z ograniczeniami lub wcale.
- 13:55MIG nie są wymuszane,
- 13:56więc obciążenia walczą o plasterki pamięci,
- 13:58generując straty, których planiści nie rozumieją.
- 14:00Logi pozostają grzeczne, a wydajność wycieka.
- 14:02Zachowanie pamięci to trzeci poziom.
- 14:04Domyślnie obszar pamięci cuda w ONNX Runtime
- 14:07agresywnie cachuje alokację.
- 14:08Przy współbieżności wygląda to na stabilność,
- 14:10dopóki obszar nie zarezerwuje zbyt wiele
- 14:12i nie zagłodzi nowych żądań.
- 14:14Pamięć przypięta nie jest ustawiona,
- 14:15więc transfery host urządzenie
- 14:16idą przez bufory stronicowalne,
- 14:18zmieniając pcie w wąskie gardło.
- 14:20Wejście-wyjście nie jest przypisane do urządzenia,
- 14:22więc tensory skaczą między CPU a GPU,
- 14:24tworząc ukryte koszty opóźnień.
- 14:25Zachowanie ogonowe pogarsza się najpierw,
- 14:27potem podąża za nim mediana.
- 14:29Oto jak objawy wyglądają w praktyce.
- 14:31Efektywna przepustowość kuleje
- 14:32mimo umiarkowanego użycia GPU.
- 14:34Opóźnienie przy lekkim obciążeniu jest akceptowalne,
- 14:36ale P95 chwieje się przy współbieżności,
- 14:42tworząc efekt stada.
- 14:44Restartujący się kaskadowo autoskalowanie drga,
- 14:46a kolejki rosną od nowa.
- 14:47Operatorzy szukają błędnej przyczyny,
- 14:48wierząc, że model jest ciężki,
- 14:50podczas gdy polityki kontenera powodują upadek.
- 14:52Pomyśl o higienie kontenerów,
- 14:53jak o zabezpieczaniu dowodów.
- 14:54Budowanie wieloetapowe usuwa odciski palców.
- 14:56Kompilatory i narzędzia deweloperskie
- 14:57nigdy nie wchodzą do środowiska uruchomieniowego.
- 14:59Obraz bazowy Distroles lub Slim
- 15:00zwęża powierzchnię ataku
- 15:01i skraca czas pobierania.
- 15:03Audyty Docker Slim lub DAEW
- 15:04potwierdzają, co przetrwało budowanie.
- 15:05Plik Docker Ignore zapobiega
- 15:07przypadkowemu gromadzeniu zbędnych plików.
- 15:09Efektem jest czystość kryminalistyczna.
- 15:11Uruchamia się tylko to, co powinno.
- 15:13Instalacja GPU wymaga jawnych deklaracji.
- 15:15W Dockerze zadeklaruj wszystkie GPU
- 15:17lub dokładny plasterek MIG.
- 15:19W Kubernetes żądaj zasobów GPU NVIDIA
- 15:21i upewnij się, że wtyczka urządzenia
- 15:23pasuje do gałęzi sterownika.
- 15:25Przy starcie potwierdź obecność urządzenia
- 15:26i kompatybilność sterownika.
- 15:28Konfiguracje NVID i ASME i LD
- 15:30nie są dla ozdoby, to kontrole dostępu.
- 15:32Jeśli czegoś brakuje lub jest niedopasowane,
- 15:33zaloguj to jako naruszenie i wyjdź.
- 15:35Następnie dostrój ONNX Runtime i Tensor z rozmysłem.
- 15:38Zablokuj kolejność dostawcy wykonawczego
- 15:40tylko do ścieżek GPU na produkcji.
- 15:41Rozważ wyłączenie lub ponowną konfigurację
- 15:43obszaru pamięci cuda, gdy gromadzi on zasoby
- 15:45poza Twoim zestawem roboczym.
- 15:47Ogranicz wzrost lub ustaw przealokację
- 15:49na przewidywalne limity.
- 15:50Włącz FP16 domyślnie, gdy pozwalają na to bariery dokładności.
- 15:54Zabezpiecz i NT8 testem dokładności.
- 15:57Powiąż i OS pamięcią urządzenia,
- 15:58aby wejścia trafiały tam,
- 15:59gdzie odbywają się obliczenia
- 16:00i wybieraj strumienie świadomie,
- 16:02by zapobiec blokowaniu kolejki.
- 16:04Wymuś to za pomocą dwóch bramek,
- 16:05stanu i wydajności.
- 16:06Stan to nie tylko kod 200,
- 16:08to zweryfikowany migawka możliwości.
- 16:10Dostawcy załadowani,
- 16:11połączone jądra obecne,
- 16:12wdzenie tensorą rozpoznane i opowiązane.
- 16:15Wydajność to bazowy zestaw poleceń,
- 16:17który uruchamia się na rozgrzewkę
- 16:18z oknem opóźnienia
- 16:19i minimalnym progiem utylizacji.
- 16:21Jeśli kontener nie osiąga obu,
- 16:22nie zostaje dopuszczony do obsługi.
- 16:24Dołącz budżety rozmiaru pobierania do Ci,
- 16:26aby obrazy przekraczające progi
- 16:27i przerywały budowanie.
- 16:28Przechowuj różnice zawartości obrazów
- 16:30dla każdego skrótu,
- 16:31aby wycofania przywracały kod i porządek.
- 16:33Dowody wskazują,
- 16:34że kontenery nie tylko wdrażają oprogramowanie,
- 16:36one kodują zachowanie pod obciążeniem.
- 16:38Gdy są hałaśliwe,
- 16:39ciężkie lub niejasne w kwestii GPU,
- 16:41zmieniają akcelerację w ceremonie.
- 16:43Gdy są lekkie, konkretne i asertywne,
- 16:44zachowują szybką ścieżkę,
- 16:45za którą zapłaciłeś.
- 16:46W tym środowisku nic nie jest przypadkowe.
- 16:49Kontener albo pomaga GPU w pracy,
- 16:50albo wchodzi w drogę.
- 16:52Laboratorium kryminalistyczne,
- 16:53metryki, które wydają wyrok.
- 16:54Opóźnienie, przepustowość, utylizacja.
- 16:56Dowody są lepsze od opinii,
- 16:58więc ustalamy zestaw poleceń,
- 16:59blokujemy ziarna
- 17:00i uruchamiamy na rozgrzewkę.
- 17:01Te same harmonogramy,
- 17:02te same kroki,
- 17:03od 20 do 25 dla 512,
- 17:05rozszerzone do 50 dla 1024 na 1024,
- 17:08aby ujawnić obciążenie.
- 17:09Współbieżność utrzymywana na 16,
- 17:11z próbą do 32.
- 17:12Rozmiar partii zaczyna się od 1,
- 17:14rosnąc ostrożnie,
- 17:15aż granice VRAM dadzą o sobie znać.
- 17:16Żadnych ekstrapolacji,
- 17:18żadnych wymówek,
- 17:18tylko zegary i liczniki.
- 17:19Opóźnienie zeznaje jako pierwsze.
- 17:21W stanie zdegradowanym
- 17:22przy awaryjnym CPU
- 17:23lub ogólnej ścieżce uwagi,
- 17:24P50 przy 512 na 512
- 17:26rozciąga się do wartości dwucyfrowych.
- 17:28P95 mówi całą prawdę.
- 17:30Waha się nieprzewidywalnie
- 17:31od 20 do 40 sekund,
- 17:33ponieważ kolejki potęgują
- 17:34małe nieefektywności.
- 17:35Przy 1024 na 1024 i 50 krokach
- 17:38P95 staje się naruszeniem
- 17:40już na starcie.
- 17:41Po naprawie zablokowanym EPU
- 17:42aktywną połączoną uwagą
- 17:44i opowiązanym z urządzeniem P50
- 17:46wraca do niskich wartości jednocyfrowych,
- 17:48a P95 mieści się w budżecie.
- 17:50Zakres się kurczy,
- 17:51system staje się przewidywalny.
- 17:53Przepustowość potwierdza.
- 17:54Przy współbieżności 16
- 17:56zdegradowana ścieżka
- 17:57daje tylko namiastkę wydajności.
- 17:58Obrazy na minutę
- 17:59ledwo rosną wraz z replikami,
- 18:00ponieważ każda instancja
- 18:01sama się blokuje.
- 18:02Skalowanie do 32
- 18:03z wielokrotnia spory,
- 18:05a nie wynik.
- 18:05Po naprawie relacja się prostuje.
- 18:07Obrazy na minutę
- 18:08rosną niemal liniowo,
- 18:09aż cykl pracy rdzeni
- 18:10tensorowych się nasyci
- 18:11lub VRAM ograniczy partię.
- 18:13Różnica w nachyleniu
- 18:14to dowód winy.
- 18:15Praca faktycznie dociera
- 18:16do mety szybciej,
- 18:17a nie tylko głośniej.
- 18:18Utylizacja zamyka sprawę.
- 18:19Wcześniej cykl pracy GPU
- 18:21oscylował między zerem
- 18:22a 50% z długimi,
- 18:24płaskimi dolinami.
- 18:25Liczniki PC
- 18:25wykazywały szum
- 18:26związany z transferami
- 18:28stronicowalnymi.
- 18:29Po zmianach cykl pracy
- 18:31stabilizuje się
- 18:31na wysokim,
- 18:32stałym poziomie
- 18:33z widocznym zaangażowaniem
- 18:34rdzeni tensorowych.
- 18:35CPU powraca do orkiestracji
- 18:37i lekkiego wstępnego przetwarzania.
- 18:39Piki PC
- 18:39wygładzają się,
- 18:40ponieważ przypięta pamięć
- 18:41i wiązanie
- 18:42i owy eliminowały
- 18:43zbędny ruch.
- 18:43Nic innego nie tłumaczy
- 18:45tej zmiany
- 18:45poza rzeczywistym przyspieszeniem.
- 18:46Dodajemy stres
- 18:47test weryfikacyjny.
- 18:48Dla 512 na 512 kroków
- 18:502025
- 18:51poprawiona ścieżka
- 18:52utrzymuje współbieżność
- 18:5216 bez skoków na końcu.
- 18:54Przy 32 system
- 18:55degraduje się
- 18:55w sposób kontrolowany.
- 18:56P95 rośnie przewidywalnie,
- 18:59a nie chaotycznie.
- 18:59Dla 1024 na 1024
- 19:01przy 50 krokach
- 19:03różnica jest wyolbrzymiona.
- 19:04Zdegradowana ścieżka
- 19:05załamuje się
- 19:05pod wpływem przekroczeń czasu.
- 19:07Wzmocniona ścieżka
- 19:07utrzymuje użyteczne P50
- 19:09i akceptowalne P95
- 19:10przy partii od 1 do 2
- 19:13areny i strumienie.
- 19:15Po optymalizacji
- 19:15blokowanie typu
- 19:16Head of Line ustępuje.
- 19:17Kwestia kosztów
- 19:18to prosta arytmetyka.
- 19:19Liczba zapytań
- 19:20na godzinę pracy GPU
- 19:21rośnie od 2 do 5 razy
- 19:22po weryfikacji
- 19:23Fused Attention FP16
- 19:24i wiązania IO.
- 19:25Efektywny koszt
- 19:26za 1000 obrazów
- 19:27odpowiednio spada.
- 19:28Kary za zimny start maleją,
- 19:30ponieważ obrazy są lekkie,
- 19:31a silniki są wstępnie zbudowane.
- 19:33Węzły nie płacą już podatku
- 19:34od kompilacji
- 19:34przy pierwszym użyciu.
- 19:35Rejestr zgadza się z logami.
- 19:37Weryfikacja zapobiega
- 19:38przypadkowym sukcesom.
- 19:39Powtórz na drugiej puli węzłów
- 19:41z inną wersją sterownika.
- 19:42Wzmocniony obraz z założenia
- 19:44odmawia uruchomienia
- 19:45na niedopasowanym węźle.
- 19:46Dzięki temu wyniki są porównywalne,
- 19:48a nie zafałszowane.
- 19:49Sprawdź migawki możliwości.
- 19:51Ta sama kolejność dostawców,
- 19:52ten sam tensor,
- 19:53te same asercje Kerneli.
- 19:55Uruchom ponownie zestaw promptów
- 19:56i odzyskaj rozkłady.
- 19:58Gdy histogramy się pokrywają,
- 19:59pewność wzrasta.
- 20:00Gdy nie, różnica w możliwościach
- 20:02wyjaśnia dlaczego.
- 20:03Ostatecznie liczby nie dyskutują,
- 20:04one wydają werdykt.
- 20:05Opóźnienia maleją,
- 20:09metodologia nie jest hipotetyczna.
- 20:11Jest mierzalna i po fakcie
- 20:12pozostawia odciski palców
- 20:13na każdym wykresie.
- 20:15Protokół naprawczy,
- 20:16powtarzalna lista kontrolna wzmocnienia.
- 20:18Kontrola wstępu jest najważniejsza.
- 20:20Odmów uruchomienia,
- 20:21jeśli dostawcy tensorszt lub cuda
- 20:23nie są obecni.
- 20:24Wylicz dostawców,
- 20:25zweryfikuj liczbę urządzeń,
- 20:26wydrukuj migawki możliwości,
- 20:28obszar roboczy cudne,
- 20:29FP16 i NT8.
- 20:31Jeśli czegokolwiek brakuje,
- 20:32zakończ z kodem błędu.
- 20:33Dostępność wynika z integralności.
- 20:35Przypinanie wersji to kręgosłup.
- 20:37Utrzymuj jedną macierz,
- 20:38gałąź sterownika,
- 20:39cuda minor do cudne,
- 20:40hash kompilacji
- 20:41o NNX Runtime,
- 20:42tensorszt.
- 20:42Buduj obrazy wnioskowania
- 20:43zgodnie z tą macierzą.
- 20:45Oznacz węzły, aby pasowały.
- 20:46Uzależnij dostęp od zgodności.
- 20:48Wstępnie zbudowane silniki
- 20:49tensorszt dla każdego modelu
- 20:50i rozdzielczości.
- 20:51Plany to artefakty,
- 20:52niezgadywanie w czasie wykonywania.
- 20:54Higiena kontenerów zachowuje prawdę.
- 20:56Stosuj wieloetapowe budowanie.
- 20:57Utrzymuj środowisko uruchomieniowe
- 20:59jako distroles lub slim.
- 21:00Uwzględnij restrykcyjny plik Docker Ignore.
- 21:02Zweryfikuj za pomocą historii
- 21:03Dockera i audytu odchudzania.
- 21:04Ustaw budżety wielkości puli w CII.
- 21:06Odrzucaj napuchnięte obrazy,
- 21:07podpisuj je i porównuj zawartość
- 21:09według skrótów.
- 21:10Skonfiguruj najpierw GPU.
- 21:11Zablokuj kolejność app
- 21:12na tensorszt cuda.
- 21:13Wyłącz dostawcę CPU
- 21:14w środowisku produkcyjnym.
- 21:16Zweryfikuj obecność
- 21:16DevNV i DIA
- 21:17oraz wersję zestawu narzędzi
- 21:18kontenera NV i DIA.
- 21:20Żądaj GPU NVIDIA.com jawnie
- 21:22lub łącz licencję
- 21:22i weryfikuj je przy starcie.
- 21:30Powiąż i o bezpośrednio
- 21:31z pamięcią urządzenia
- 21:33włącz pamięć przypiętą.
- 21:34Wybierz strumienie,
- 21:35by uniknąć blokowania kolejki.
- 21:37Dostrój ponownie lub wyłącz
- 21:38arenę Ord Cuda,
- 21:39gdy zatrzymuje się
- 21:40poza zestawem roboczym.
- 21:41Ustaw SL o wydajności jako kod.
- 21:43Test autostartu
- 21:44z oknem opóźnień
- 21:44deterministycznych podpowiedzi
- 21:46i progiem wykorzystania.
- 21:47Przerywaj działanie
- 21:48przy narastających zaległościach.
- 21:49Dodaj obserwowalność
- 21:50metryki GPU dla żądania,
- 21:52alerty o obniżonej wydajności,
- 21:53podpowiedzi Canary
- 21:54i porównywalne linie bazowe.
- 21:56Wdruż Blue, Green
- 21:57z bramkami wydajności
- 21:58i automatycznym wycofaniem
- 21:59przy naruszeniu.
- 22:00Dzięki egzekwowaniu protokołu
- 22:02akceleracja jest dowodliwa,
- 22:03a nie zakładana.
- 22:05Lekcja jest kliniczna.
- 22:06Cichy fallback na CPU,
- 22:07dry w wersji
- 22:08i rozrost kontenerów
- 22:09to nie błędy.
- 22:10To przewidywalne wzorce awarii,
- 22:11które możesz zablokować.
- 22:13Stosuj protokół,
- 22:13mierz wykorzystanie GPU,
- 22:14odrzucaj zdegradowane ścieżki,
- 22:16przypinaj wersję,
- 22:17traktuj silniki jak artefakty.
- 22:18Jeśli chcesz głębiej poznać
- 22:19środowisko uruchomieniowe ONNX,
- 22:21zachowanie pamięci tensorszt
- 22:23i kiedy wyłączać Areny,
- 22:24obejrzyj kolejny odcinek
- 22:25i zasubskrybuj notatki laboratoryjne.