Dobra wiadomość! Masz już gotową fajną aplikację Web AI, która uruchamia modele systemów uczących się bezpośrednio na urządzeniu użytkownika. Działa ona całkowicie w przeglądarce po stronie klienta, bez korzystania z chmury. Takie rozwiązanie na urządzeniu zwiększa prywatność użytkowników, poprawia wydajność i znacznie obniża koszty.
Jest jednak pewien problem. Twój model TensorFlow.js może działać zarówno na procesorach (WebAssembly), jak i na mocniejszych kartach graficznych (za pomocą WebGL i WebGPU). Pytanie brzmi: jak można konsekwentnie zautomatyzować testowanie przeglądarki za pomocą wybranego sprzętu?
Utrzymywanie spójności jest kluczowe dla porównywania skuteczności modelu uczenia maszynowego w ciągu czasu, gdy go ulepszasz i wprowadzasz kolejne wersje przed wdrożeniem, aby użytkownicy mogli go używać na swoich urządzeniach.
Skonfigurowanie spójnego środowiska testowego z użyciem kart graficznych może być trudniejsze, niż się wydaje. W tym poście na blogu opisujemy problemy, z którymi się spotkaliśmy, i sposoby ich rozwiązania, aby pomóc Ci w zwiększeniu wydajności aplikacji.
Ta funkcja nie jest przeznaczona tylko dla programistów AI na potrzeby stron internetowych. Jeśli zajmujesz się grami internetowymi lub grafiką, ten post również może być dla Ciebie przydatny.
Co znajdziesz w naszym zestawie narzędzi do automatyzacji
Oto czego używamy:
- Środowisko: notebook Google Colab oparty na systemie Linux połączony z procesorem graficznym NVIDIA T4 lub V100. Jeśli wolisz, możesz użyć innej platformy chmurowej, takiej jak Google Cloud Platform (GCP).
- Przeglądarka: Chrome obsługuje WebGPU, czyli potężne następcę WebGL, który wprowadza do sieci internetowej nowoczesne interfejsy API GPU.
- Automatyzacja: Puppeteer to biblioteka Node.js, która umożliwia sterowanie przeglądarkami za pomocą kodu JavaScript. Dzięki Puppeteer możemy zautomatyzować Chrome w trybie bez interfejsu, co oznacza, że przeglądarka działa na serwerze bez widocznego interfejsu. Używamy ulepszonej nowego trybu bez interfejsu graficznego, a nie starszej wersji.
Weryfikacja środowiska
Najlepszym sposobem na sprawdzenie, czy akceleracja sprzętowa jest włączona w Chrome, jest wpisanie chrome://gpu
na pasku adresu. Możesz zautomatyzować ten proces za pomocą Puppeteer (console.log
) lub zapisać pełny raport w formacie PDF, aby sprawdzić go ręcznie:
/* Incomplete example.js */
import puppeteer from 'puppeteer';
// Configure launch parameters: Expands later
const browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox']
});
const page = await browser.newPage();
await page.goto('chrome://gpu');
// Verify: log the WebGPU status or save the GPU report as PDF
const txt = await page.waitForSelector('text/WebGPU');
const status = await txt.evaluate(g => g.parentElement.textContent);
console.log(status);
await page.pdf({ path: './gpu.pdf' });
await browser.close();
Otwórz chrome://gpu
. Powinny pojawić się te wyniki:
Stan funkcji graficznej | |
---|---|
OpenGL: | Wyłączono |
Vulkan: | Wyłączono |
WebGL: | Tylko oprogramowanie, akceleracja sprzętowa niedostępna. |
WebGL2: | Tylko oprogramowanie, akceleracja sprzętowa niedostępna. |
WebGPU: | Wyłączono |
Wykryto problemy. |
Nie najlepszy początek. Wyraźnie widać, że wykrywanie sprzętu nie działa. WebGL, WebGL2 i WebGPU są w zasadzie wyłączone lub dostępne tylko w oprogramowaniu. Nie jesteś jedyną osobą, która ma ten problem. W internecie jest wiele dyskusji na ten temat, w tym na oficjalnych kanałach pomocy Chrome (1) (2).
Włączanie obsługi WebGPU i WebGL
Domyślnie Chrome bez interfejsu wyłącza GPU. Aby włączyć tę funkcję w Linuksie, zastosuj wszystkie te flagi podczas uruchamiania bezgłowego Chrome:
- Flaga
--no-sandbox
wyłącza piaskownicę bezpieczeństwa Chrome, która izoluje proces przeglądarki od reszty systemu. Uruchamianie Chrome jako roota bez tego piaskownicy nie jest obsługiwane. - Flaga
--headless=new
uruchamia Chrome w nowym, ulepszonym trybie bez interfejsu graficznego, bez widocznego interfejsu. - Flaga
--use-angle=vulkan
informuje Chrome, aby używać podsystemu Vulkan w ANGLE, który tłumaczy wywołania OpenGL ES 2/3 na wywołania interfejsu Vulkan API. - Flaga
--enable-features=Vulkan
włącza backend graficzny Vulkan do kompozytowania i rasteryzacji w Chrome. - Flaga
--disable-vulkan-surface
wyłącza rozszerzenie instancji vulkanVK_KHR_surface
. Zamiast łańcucha wymiany używana jest operacja Bit blit do wyświetlania wyniku renderowania na ekranie. - Flaga
--enable-unsafe-webgpu
włącza eksperymentalny interfejs WebGPU API w Chrome na Linuksie i wyłącza listę blokowania kart graficznych.
Teraz połączymy wszystkie zmiany, które do tej pory wprowadziliśmy. Oto pełny scenariusz.
/* Complete example.js */
import puppeteer from 'puppeteer';
// Configure launch parameters
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--no-sandbox',
'--headless=new',
'--use-angle=vulkan',
'--enable-features=Vulkan',
'--disable-vulkan-surface',
'--enable-unsafe-webgpu',
]
});
const page = await browser.newPage();
await page.goto('chrome://gpu');
// Verify: log the WebGPU status or save the GPU report as PDF
const txt = await page.waitForSelector('text/WebGPU');
const status = await txt.evaluate(g => g.parentElement.textContent);
console.log(status);
await page.pdf({path: './gpu.pdf'});
await browser.close();
Ponownie uruchom skrypt. Nie wykryto problemów z WebGPU, a wartość zmienia się z wyłączone na tylko oprogramowanie.
Stan funkcji graficznej | |
---|---|
OpenGL: | Wyłączono |
Vulkan: | Wyłączono |
WebGL: | Tylko oprogramowanie, akceleracja sprzętowa niedostępna. |
WebGL2: | Tylko oprogramowanie, akceleracja sprzętowa niedostępna. |
WebGPU: | Tylko oprogramowanie, akceleracja sprzętowa niedostępna. |
Akceleracja sprzętowa jest jednak nadal niedostępna, ponieważ procesor graficzny NVIDIA T4 nie został wykryty.
Zainstaluj odpowiednie sterowniki GPU.
Wspólnie z ekspertami od GPU z zespołu Chrome dokładniej przyjrzeliśmy się wynikom chrome://gpu
. Wykryliśmy problemy ze sterownikami domyślnymi zainstalowanymi na instancji Linux Colab, które powodują problemy z Vulkanem i uniemożliwiają Chrome wykrycie GPU NVIDIA T4 na poziomie GL_RENDERER
, jak pokazano na poniższym wyjściu. Może to powodować problemy z Chrome bez interfejsu graficznego.
Informacje o kierowcy | |
---|---|
GL_RENDERER | ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), sterownik SwiftShader-5.0.0) |
Instalacja odpowiednich, zgodnych sterowników rozwiązuje ten problem.
Informacje o kierowcy | |
---|---|
GL_RENDERER | ANGLE (NVIDIA Corporation, Tesla T4/PCIe/SSE2, OpenGL ES 3.2 NVIDIA 525.105.17) |
Aby zainstalować odpowiednie sterowniki, uruchom podczas konfiguracji te polecenia. Ostatnie 2 wiersze pomagają rejestrować dane wyjściowe wykrywane przez sterowniki NVIDIA, a także vulkaninfo
.
apt-get install -y vulkan-tools libnvidia-gl-525
// Verify the NVIDIA drivers detects along with vulkaninfo
nvidia-smi
vulkaninfo --summary
Uruchom ponownie skrypt, aby uzyskać ten wynik. 🎉
Stan funkcji graficznej | |
---|---|
OpenGL: | Włączono |
Vulkan: | Włączono |
WebGL: | Sprzętowa akceleracja, ale przy zmniejszonej wydajności. |
WebGL2: | Sprzętowa akceleracja, ale przy zmniejszonej wydajności. |
WebGPU: | Sprzętowa akceleracja, ale przy zmniejszonej wydajności. |
Dzięki używaniu odpowiednich sterowników i flag podczas uruchamiania Chrome mamy teraz obsługę WebGPU i WebGL w nowym trybie bez głowy.
Za kulisami: śledztwo naszego zespołu
Po wielu badaniach nie znaleźliśmy metod, które działają w środowisku, którego potrzebowaliśmy do wykonania w Google Colab, chociaż pojawiły się obiecujące wpisy, które działały w innych środowiskach. Ostatecznie nie udało nam się odtworzyć ich sukcesu w środowisku Colab NVIDIA T4, ponieważ napotkaliśmy 2 kluczowe problemy:
- Niektóre kombinacje flag umożliwiają wykrywanie karty graficznej, ale nie pozwalają na jej używanie.
- Przykłady działających rozwiązań innych firm korzystały ze starej wersji Chrome bez interfejsu graficznego, która w pewnym momencie zostanie wycofana na rzecz nowej wersji. Potrzebowaliśmy rozwiązania, które działałoby z nową bezgłową wersją Chrome, aby było bardziej perspektywiczne.
Potwierdiliśmy, że GPU jest niewykorzystane, uruchamiając przykładową stronę internetową TensorFlow.js do rozpoznawania obrazów, w której wytrenowaliśmy model do rozpoznawania próbek odzieży (coś w rodzaju „hello world” dla systemów uczących się).
Na zwykłym komputerze 50 cykli treningowych (zwanych też eponami) powinno trwać mniej niż 1 sekundę. Po wywołaniu przeglądarki bezprzewodowej w domyślnym stanie mogliśmy zapisać dane z konsoli JavaScript na linii poleceń Node.js po stronie serwera, aby sprawdzić, jak szybko przebiegały te cykle treningowe.
Zgodnie z oczekiwaniami każda epoka treningu trwała znacznie dłużej niż oczekiwano (kilka sekund), co sugeruje, że Chrome zamiast korzystać z GPU, wróciło do zwykłego wykonywania JS na procesorze:
Po naprawieniu sterowników i użyciu odpowiedniej kombinacji flag dla Chrome bez interfejsu graficznego ponowne uruchomienie przykładu treningu TensorFlow.js powoduje znacznie szybsze epoki treningowe.
Podsumowanie
AI do zastosowań internetowych rozwija się w eksponentnym tempie od momentu powstania w 2017 roku. Dzięki technologiom przeglądarki takim jak WebGPU, WebGL i WebAssembly operacje matematyczne modelu uczenia maszynowego mogą być jeszcze bardziej przyspieszane po stronie klienta.
W 2023 r. TensorFlow.js i MediaPipe Web przekroczyły barierę 1 miliarda pobrań modeli i bibliotek – to historyczny kamień milowy i znak, że deweloperzy i inżynierowie stron internetowych coraz chętniej sięgają po AI w swoich nowoczesnych aplikacjach internetowych, aby tworzyć naprawdę niesamowite rozwiązania.
Duża popularność wiąże się z dużą odpowiedzialnością. Przy takim poziomie wykorzystania w systemach produkcyjnych pojawia się potrzeba testowania modeli AI po stronie klienta w prawdziwym środowisku przeglądarki, które jest skalowalne, automatyzowane i działa w ramach znanej, standardowej konfiguracji sprzętowej.
Dzięki połączeniu możliwości nowej wersji Chrome bez interfejsu graficznego i Puppeteer możesz bez obaw testować takie zbiory zadań w standardowym i powtarzalnym środowisku, co zapewni spójne i niezawodne wyniki.
Podsumowanie
W naszej dokumentacji znajdziesz szczegółowy przewodnik, który pomoże Ci samodzielnie przeprowadzić pełną konfigurację.
Jeśli ten artykuł okazał się przydatny, daj nam znać na LinkedIn, X (dawniej Twitter) lub w innej sieci społecznościowej, używając hashtaga #WebAI. Chętnie poznamy Twoją opinię, aby w przyszłości pisać więcej takich artykułów.
Dodaj gwiazdkę do repozytorium GitHub, aby otrzymywać przyszłe aktualizacje.
Podziękowania
Dziękujemy wszystkim członkom zespołu Chrome, którzy pomogli nam w rozwiązywaniu problemów z sterownikami i WebGPU, z którymi się spotkaliśmy podczas tworzenia tego rozwiązania. Szczególne podziękowania kierujemy do Jecelyn Yeen i Alexandra White za pomoc w sporządzeniu tego wpisu na blogu. Dziękujemy Yuly’emu Novikovowi, Andreyowi Kosyakovowi i Alexowi Rudenko, którzy mieli kluczowy udział w utworzeniu ostatecznego, działającego rozwiązania.