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. To na urządzeniu Zapewnia ochronę prywatności użytkowników, zwiększa wydajność i obniża koszty znacznie obniżył się.

Istnieje jednak przeszkoda. Twoje Model TensorFlow.js może działać na zarówno przez CPU (WebAssembly), jak i wydajniejsze układy GPU WebGL oraz WebGPU). Pytanie: jak w spójny sposób 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 układami GPU może być trudniejsze niż nie jest oczekiwany. W tym poście opowiemy o napotkanych problemach i o tym, jak je rozwiązaliśmy. aby poprawić wydajność aplikacji.

Dotyczy to nie tylko programistów internetowych AI! Jeśli zajmujesz się grami internetowymi lub grafiki, post jest również przydatny dla Ciebie.

Co znajduje się w naszych narzędziach do automatyzacji

Korzystamy z tych rozwiązań:

  • Środowisko: oparta na systemie Linux usługa Google Colab notebook podłączony do NVIDIA GPU: T4 lub V100. Możesz używać innych platform chmurowych, takich jak Google Cloud (GCP), jeśli jest to preferowane.
  • Przeglądarka: Chrome obsługuje WebGPU, potężnym następcą WebGL, przenosi postępy nowoczesnych interfejsów API GPU do internetu.
  • Automatyzacja: Puppeteer to biblioteka Node.js, która umożliwia zarządzać przeglądarkami automatycznie za pomocą JavaScriptu. Dzięki Puppeteer możemy automatyzować Chrome w trybie bez interfejsu graficznego, co oznacza, że przeglądarka działa bez widoczny interfejs na serwerze. Używamy ulepszonego nowy tryb 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. Dostępne opcje automatycznie wykonywać odpowiednik za pomocą Puppeteer. za pomocą console.log lub zapisz 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 plik chrome://gpu. Powinien pojawić się następujący wynik:

Stan funkcji graficznej
OpenGL: Wyłączono
Vulkan: Wyłączono
WebGL: Tylko oprogramowanie, akceleracja sprzętowa niedostępna.
WebGL 2 Tylko oprogramowanie, akceleracja sprzętowa niedostępna.
WebGPU: Wyłączono

Wykryto problemy.
Interfejs WebGPU został wyłączony za pomocą listy zablokowanych lub wiersza poleceń.

Nie był to dobry początek. Od razu widać, że nie udało się wykryć sprzętu. WebGL, WebGL2 i WebGPU są wyłączone lub mogą mieć tylko oprogramowanie. Śr nie są sami w tym problemie – w internecie wiele osób mówi o nich, w podobnej sytuacji, m.in. w oficjalnych kanałach pomocy Chrome, (1), (2)

Włącz obsługę WebGPU i WebGL

Domyślnie Chrome bez interfejsu wyłącza GPU. Aby włączyć ten tryb w Linuksie, podczas uruchamiania bez interfejsu graficznego zastosuj wszystkie te flagi Chrome:

  • Flaga --no-sandbox wyłącza bezpieczną piaskownicę Chrome, która izoluje z reszty systemu. Uruchamianie Chrome jako root bez ta piaskownica nie jest obsługiwana.
  • Flaga --headless=new uruchamia Chrome w nowym, ulepszonym interfejsie tryb bez interfejsu graficznego bez widocznego interfejsu użytkownika.
  • 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 interfejs Vulkan VK_KHR_surface instancji. 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 skrypt.

/* 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 tylko do oprogramowania.

Stan funkcji graficznej
OpenGL: Wyłączono
Vulkan: Wyłączono
WebGL: Tylko oprogramowanie, akceleracja sprzętowa niedostępna.
WebGL 2 Tylko oprogramowanie, akceleracja sprzętowa niedostępna.
WebGPU: Tylko oprogramowanie, akceleracja sprzętowa niedostępna.

Akceleracja sprzętowa jest nadal niedostępna, a procesor GPU NVIDIA T4 – wykryto.

Zainstaluj odpowiednie sterowniki GPU.

We współpracy z kilkoma specjalistami ds. GPU dokładniej zbadaliśmy wynik działania chrome://gpu w zespole Chrome. Wykryliśmy problemy z domyślnymi sterownikami zainstalowanymi na urządzeniu Linux Colab powodują problemy z interfejsem Vulkan, przez co Chrome nie może wykryć Procesor graficzny NVIDIA T4 na poziomie GL_RENDERER, jak pokazano poniżej. Ten powoduje problemy z Chrome bez interfejsu graficznego.

Domyślne wyjście nie spowoduje wykrycia GPU NVIDIA T4.
Informacje o kierowcy
GL_RENDERER ANGLE (Google, Vulkan 1.3.0 (SwiftShader Urządzenie (Subzero) (0x0000C0DE)), sterownik SwiftShader-5.0.0)

Zainstalowanie zgodnych sterowników rozwiąże 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ć prawidłowe sterowniki, podczas konfiguracji uruchom te polecenia. ostatnie 2 wiersze pozwalają zapisać dane wyjściowe wykryte przez sterowniki NVIDIA dzięki vulkaninfo.

apt-get install -y vulkan-tools libnvidia-gl-525

// Verify the NVIDIA drivers detects along with vulkaninfo
nvidia-smi
vulkaninfo --summary

Teraz uruchom skrypt jeszcze raz. Otrzymasz następujący wynik. 🎉

Stan funkcji graficznej
OpenGL: Włączono
Interfejs Vulkan: Włączono
WebGL: Akceleracja sprzętowa przy zmniejszonej wydajności.
WebGL 2 Akceleracja sprzętowa przy zmniejszonej wydajności.
WebGPU: Akceleracja sprzętowa, ale przy zmniejszonej wydajności.

Dzięki zastosowaniu właściwych sterowników i flag w Chrome mamy teraz WebGPU i obsługę WebGL dzięki nowemu, atrakcyjnemu trybowi bez interfejsu graficznego.

Za kulisami: śledztwo naszego zespołu

Po wielu badaniach nie znaleźliśmy metod pracy dla środowiska, którą trzeba wykonać w Google Colab, chociaż zostały posty z nadzieją która sprawdzała się w innych środowiskach, co było obiecujące. Ostatecznie udało nam się odtworzyć sukces w środowisku Colab NVIDIA T4, bo mieliśmy kluczowe problemy:

  1. Niektóre kombinacje flag umożliwiają wykrywanie GPU, ale nie pozwalają używać GPU.
  2. Przykłady działających rozwiązań innych firm, w których używano starej wersji Chrome bez interfejsu graficznego który w pewnym momencie zostanie wycofany i zastąpiony przez Nowa wersja. Potrzebowaliśmy rozwiązania pracował z nową wersją Chrome bez interfejsu graficznego, dzięki czemu jest lepiej przygotowana na przyszłość.

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ę. Wywołuję Chrome bez interfejsu graficznego w stanie domyślnym, więc udało nam się zapisać danych wyjściowych konsoli JavaScript do wiersza poleceń Node.js po stronie serwera, ale ich szybkie cykle treningowe.

Zgodnie z oczekiwaniami każda epoka trenowania trwała znacznie dłużej niż oczekiwano (kilka sekund), co sugeruje, że Chrome korzysta ze zwykłego trybu uruchamiania procesora JS. zamiast korzystać z GPU:

Epoki trenowania następują w wolniejszym tempie.
Rysunek 1. Przechwytywanie w czasie rzeczywistym pokazujące czas trwania każdej epoki trenowania (sekundy).

Po naprawieniu sterowników i użyciu odpowiedniej kombinacji flag dla bez interfejsu graficznego Chrome ponowne uruchomienie przykładowego trenowania TensorFlow.js działa znacznie szybciej epok trenowania.

Wzrosła szybkość w epokach...
Rysunek 2. Robienie zdjęć w czasie rzeczywistym pokazujące przyspieszenie epok.

Podsumowanie

Internetowa AI rozwinęła się w gwałtowny sposób od czasu powstania w 2017 r. Z technologiami przeglądarek, takimi jak WebGPU, WebGL WebAssembly to model systemów uczących się może też przyśpieszyć operacje matematyczne po stronie klienta.

W 2023 r. biblioteki TensorFlow.js i MediaPipe Web przekroczyły miliard pobrań i biblioteki – historyczny kamień milowy, który pokazuje, jak internet deweloperzy i inżynierowie przechodzą na AI w swojej nowej generacji, i aplikacjami internetowymi, aby tworzyć naprawdę niesamowite rozwiązania.

Duża odpowiedzialność wynika z dużej odpowiedzialności. Przy tym poziomie użycia w systemach produkcyjnych pojawia się potrzeba testowania AI opartej na przeglądarce po stronie klienta w prawdziwym środowisku przeglądarki, a jednocześnie są skalowalne, oraz w ramach znanej, ustandaryzowanej konfiguracji sprzętowej.

Wykorzystując połączone możliwości nowej wersji Chrome bez interfejsu graficznego i aplikacji Puppeteer, mogą śmiało testować takie zbiory zadań w ustandaryzowanym i możliwym do replikacji co zapewnia spójne i wiarygodne wyniki.

Podsumowanie

Szczegółowy przewodnik jest dostępny: naszą dokumentację, dzięki czemu możesz samodzielnie wypróbować pełną konfigurację.

Jeśli te informacje były przydatne, wspomnij o nich na stronie LinkedIn, X (dawniej Twitter) lub cokolwiek innego sieć społecznościowa, z której korzystasz, używając hashtagu #WebAI. Jeśli masz jakieś pytania, Waszej opinii. Dzięki temu będziemy mogli napisać więcej podobnych rzeczy w przyszłości.

Dodawanie gwiazdki do repozytorium GitHub .

Podziękowania

Serdecznie dziękujemy wszystkim członkom zespołu Chrome, którzy pomagali w debugowaniu sterownika problemów z WebGPU, które napotkaliśmy w tym rozwiązaniu, ze szczególnym uwzględnieniem Jecelyn Yeen i Alexandra White za pomoc w pracy słownej tego posta na blogu. Dzięki Julijowi Novikowi, Andriejowi Kosiakowi Alex Rudenko, odegrał ważną rolę w tworzeniu ostatecznego, działającego rozwiązania.