Usprawnij testowanie modeli Web AI: WebGPU, WebGL i Chrome bez interfejsu graficznego

François Beaufort
François Beaufort

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ą WebGLWebGPU). 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.
WebGPU zostało wyłączone za pomocą listy blokowania lub wiersza poleceń.

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 VulkanANGLE, 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 vulkan VK_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.

Dane wyjściowe domyślne nie wykrywają procesora graficznego NVIDIA T4.
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.

Zaktualizowane dane wyjściowe po zainstalowaniu sterowników.
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:

  1. Niektóre kombinacje flag umożliwiają wykrywanie karty graficznej, ale nie pozwalają na jej używanie.
  2. 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:

Treningowe epoki są realizowane z mniejszą częstotliwością.
Ilustracja 1.: Dane zebrane w czasie rzeczywistym, które pokazują, ile sekund zajęło wykonanie każdej epoki treningowej

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.

Wzrost szybkości w przypadku epok.
Ilustracja 2. Zrzut ekranu w czasie rzeczywistym pokazujący przyspieszenie epok.

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