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

[Imię]
Jason Mayes
François Beaufort
François Beaufort

Dobra wiadomość! Masz świetną aplikację Web AI, która uruchamia modele systemów uczących się bezpośrednio na urządzeniu użytkownika. Działa w całości w przeglądarce po stronie klienta i nie polega na chmurze. Taka konstrukcja poprawia prywatność użytkownika, poprawia wydajność i znacznie obniża koszty.

Znaleźliśmy jednak przeszkodę. Twój model TensorFlow.js może działać zarówno na procesorach (WebAssembly), jak i na bardziej wydajnych GPU (przez WebGL i WebGPU). Pytanie brzmi: Jak możesz spójnie zautomatyzować testowanie przeglądarek na wybranym sprzęcie?

Zachowanie spójności ma kluczowe znaczenie w porównywaniu skuteczności modelu systemów uczących się z upływem czasu podczas iteracji i ulepszania ich przed wdrożeniem dla rzeczywistych użytkowników.

Skonfigurowanie spójnego środowiska testowego z GPU może być trudniejsze, niż się spodziewasz. W tym poście omówimy napotkane problemy i sposób ich rozwiązania, aby umożliwić Ci zwiększenie wydajności aplikacji.

To rozwiązanie nie jest przeznaczone tylko dla programistów korzystających z internetowej AI. Jeśli zajmujesz się grami internetowymi lub grafikami, ten post przyda Ci się też.

Co zawiera nasz zestaw narzędzi do automatyzacji

Używamy:

  • Środowisko: notatnik Google Colab oparty na systemie Linux podłączony do GPU NVIDIA T4 lub V100. Jeśli wolisz, możesz używać innych platform chmurowych, takich jak Google Cloud (GCP).
  • Przeglądarka: Chrome obsługuje WebGPU, rozbudowany następca WebGL, który wprowadza rozwój nowoczesnych interfejsów API z GPU w internecie.
  • Automatyzacja: Puppeteer to biblioteka Node.js, która umożliwia programowe sterowanie przeglądarkami za pomocą JavaScriptu. Za pomocą Puppeteer możemy zautomatyzować działanie przeglądarki Chrome w trybie bez interfejsu graficznego, co oznacza, że przeglądarka działa na serwerze bez widocznego interfejsu. Używamy ulepszonego nowego trybu bez interfejsu graficznego, a nie starszego formularza.

Sprawdzanie środowiska

Najlepszym sposobem na sprawdzenie, czy w Chrome jest włączona akceleracja sprzętowa, jest wpisanie chrome://gpu w pasku adresu. Możesz wykonać odpowiednik w Puppeteer automatycznie za pomocą 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ę takie wyniki:

Stan funkcji graficznych
OpenGL: Wyłączono
Interfejs Vulkan: Wyłączono
WebGL: Tylko oprogramowanie, akceleracja sprzętowa niedostępna
WebGL2: 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. Wykrywanie sprzętu nie działa jak należy. WebGL, WebGL2 i WebGPU są zasadniczo wyłączone lub działają tylko jako oprogramowanie. Nie tylko zmagamy się z tym problemem – w internecie istnieje wiele dyskusji na temat osób w podobnej sytuacji, w tym w oficjalnych kanałach pomocy Chrome (1) i 2.

Włącz obsługę WebGPU i WebGL

Domyślnie Chrome bez interfejsu graficznego wyłącza GPU. Aby włączyć tę funkcję w systemie Linux, przy uruchamianiu Chrome bez interfejsu graficznego zastosuj wszystkie te flagi:

  • Flaga --no-sandbox wyłącza bezpieczną piaskownicę Chrome, która izoluje proces przeglądarki od reszty systemu. Uruchamianie Chrome jako root bez tej piaskownicy nie jest obsługiwane.
  • Flaga --headless=new uruchamia Chrome w nowym, ulepszonym trybie bez interfejsu graficznego bez widocznego interfejsu użytkownika.
  • Flaga --use-angle=vulkan informuje Chrome, że ma użyć backendu interfejsu Vulkan dla ANGLE, który przekształca wywołania OpenGL ES 2/3 na wywołania interfejsu Vulkan API.
  • Flaga --enable-features=Vulkan włącza backend grafiki Vulkan do komponowania i rasteryzacji w Chrome.
  • Flaga --disable-vulkan-surface wyłącza rozszerzenie instancji vulkan VK_KHR_surface. Zamiast łańcucha wymiany, do wyników renderowania prezentacji na ekranie jest używany Bit blit.
  • Flaga --enable-unsafe-webgpu włącza eksperymentalny interfejs WebGPU API w Chrome w systemie Linux i wyłącza listę zablokowanych adapterów.

Teraz zestawiamy wszystkie dotychczasowe zmiany. Oto cały 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();

Uruchom skrypt ponownie. Nie wykryto problemów z GPU, a wartość zmienia się z wyłączonego na „tylko oprogramowanie”.

Stan funkcji graficznych
OpenGL: Wyłączono
Interfejs 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

Jednak akceleracja sprzętowa jest nadal niedostępna, a GPU NVIDIA T4 nie jest wykrywany.

Zainstaluj odpowiednie sterowniki GPU

We współpracy z kilkoma ekspertami ds. GPU w zespole Chrome dokładniej zbadaliśmy dane wyjściowe narzędzia chrome://gpu. Wykryliśmy problemy z domyślnymi sterownikami zainstalowanymi w instancji Colab na urządzeniu z systemem Linux, które powodowały problemy z Vulkanem. W rezultacie Chrome nie mógł wykryć GPU NVIDIA T4 na poziomie GL_RENDERER, jak pokazano poniżej. Powoduje to problemy z Chrome bez interfejsu graficznego.

Ustawienie domyślne nie wykrywa GPU NVIDIA T4.
Informacje kierowcy
GL_RENDERER ANGLE (Google, Vulkan 1.3.0 (urządzenie SwiftShader (Subzero) (0x0000C0DE)), sterownik SwiftShader) 5.0.0)));

Zainstalowanie odpowiednich sterowników rozwiązuje problem.

Dane wyjściowe zostały zaktualizowane po zainstalowaniu sterowników.
Informacje kierowcy
GL_RENDERER ANGLE (NVIDIA Corporation, Tesla T4/PCIe/SSE2, OpenGL ES 3.2 NVIDIA 525.105.17)

Aby zainstalować odpowiednie sterowniki, uruchom następujące polecenia podczas konfiguracji. Ostatnie 2 wiersze pomagają rejestrować dane wyjściowe wykrytych przez sterowniki NVIDIA razem z plikiem vulkaninfo.

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

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

Teraz ponownie uruchom skrypt i uzyskaj następujący wynik. 🎉

Stan funkcji graficznych
OpenGL: Włączono
Interfejs Vulkan: Włączono
WebGL: Przyspieszone sprzętowe działanie, ale z zmniejszoną wydajnością.
WebGL2: Przyspieszone sprzętowe działanie, ale z zmniejszoną wydajnością.
WebGPU: Przyspieszone sprzętowe działanie, ale z zmniejszoną wydajnością.

Używając odpowiednich sterowników i flag w Chrome, obsługujemy WebGPU i WebGL w nowym, błyszczącym trybie bez interfejsu graficznego.

Za kulisami: śledztwo naszego zespołu

Po przeprowadzeniu wielu badań nie znaleźliśmy żadnych metod działających w środowisku, które chcieliśmy uruchomić w Google Colab. Mimo to pojawiły się pewne posty, które sprawdziły się w innych środowiskach i były obiecujące. Ostatecznie nie udało nam się powtórzyć ich sukcesu w środowisku Colab NVIDIA T4, ponieważ mieliśmy 2 kluczowe problemy:

  1. Niektóre kombinacje flag umożliwiają wykrywanie GPU, ale nie umożliwiają korzystania z niego.
  2. Przykłady działających rozwiązań innych firm wykorzystywały starą wersję bez interfejsu graficznego Chrome, która w pewnym momencie zostanie wycofana i zastąpiona nową wersją. Potrzebowaliśmy rozwiązania, które działało z nowym Chrome bez interfejsu graficznego, by było lepiej przygotowane na przyszłość.

Potwierdziliśmy niedostateczne wykorzystanie GPU, uruchamiając przykładową stronę internetową TensorFlow.js do rozpoznawania obrazów i trenując model do rozpoznawania próbek ubrań (w rodzaju „Witaj świecie” systemów uczących się).

Na zwykłych maszynach 50 cykli trenowania (nazywanych epokami) powinno trwać mniej niż 1 sekundę. Wywołując Chrome bez interfejsu graficznego w domyślnym stanie, możemy zarejestrować dane wyjściowe konsoli JavaScript w wierszu poleceń Node.js po stronie serwera, aby sprawdzić, jak szybko wyglądają poszczególne cykle trenowania.

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

Epoki treningowe przebiegają z mniejszą częstotliwością.
Rysunek 1. Ilustracja w czasie rzeczywistym pokazująca czas trwania każdej epoki trenowania (w sekundach).

Po naprawieniu sterowników i użyciu odpowiedniej kombinacji flag Chrome bez interfejsu graficznego ponownie uruchom przykład trenowania TensorFlow.js, co znacznie przyspieszy trenowanie epoki.

Epoki są przyspieszające...
Rysunek 2. Ilustracja w czasie rzeczywistym przedstawiająca przyspieszenie epok.

Podsumowanie

Technologia Web AI rozwinęła się znacząco od momentu jej powstania w 2017 roku. Dzięki technologiom przeglądarek, takim jak WebGPU, WebGL i WebAssembly, operacje matematyczne modelu systemów uczących się można jeszcze bardziej przyspieszyć po stronie klienta.

W 2023 r. TensorFlow.js i MediaPipe Web przekroczyły miliard pobrań modeli i bibliotek. Jest to historyczny krok milowy oraz znak, że programiści i inżynierowie korzystają z AI w swoich aplikacjach internetowych nowej generacji, aby tworzyć naprawdę niesamowite rozwiązania.

Duży sukces w korzystaniu z aplikacji wiąże się z dużą odpowiedzialnością. Na tym poziomie wykorzystania w systemach produkcyjnych pojawia się potrzeba testowania modeli AI po stronie klienta i przeglądarki w prawdziwym środowisku przeglądarki przy jednoczesnym skalowalności, automatyzacji i zastosowaniu do znanej ustandaryzowanej konfiguracji sprzętu.

Korzystając z połączonych możliwości nowych przeglądarek Chrome i Puppeteer bez interfejsu graficznego, możesz bezpiecznie testować takie zadania w ustandaryzowanym i możliwym do replikacji środowisku, co zapewnia spójne i wiarygodne wyniki.

Podsumowanie

Szczegółowy przewodnik jest dostępny w naszej dokumentacji, dzięki czemu możesz samodzielnie wypróbować całą konfigurację.

Jeśli te informacje były dla Ciebie przydatne, napisz o nich na LinkedIn, X (dawniej Twitter) lub w innej sieci społecznościowej, używając hashtagu #WebAI. Chętnie poznamy Twoją opinię, abyśmy mogli tworzyć więcej podobnych treści.

Dodaj gwiazdkę do repozytorium GitHub, aby otrzymywać wszystkie przyszłe aktualizacje.

Podziękowania

Serdecznie dziękujemy wszystkim członkom zespołu Chrome, którzy pomogli rozwiązać problemy ze sterownikiem i WebGPU, jakie napotkaliśmy w tym rozwiązaniu. Szczególnie dziękujemy Jecelyn Yeen i Alexandra White za pomoc w rozwiązaniu problemu dotyczącego wordsmith w tym poście na blogu. Dziękuję za współpracę, Yuly Nowikov, Andrieja Kosyakova i Aleksa Rudenko, którzy odegrali kluczową rolę w stworzeniu ostatecznego, działającego rozwiązania.