Testowanie internetowego modelu AI w Google Colab

François Beaufort
François Beaufort

Skonfigurowanie spójnego środowiska testowego z układami GPU może być trudniejsze niż nie jest oczekiwany. Oto kroki, które pozwalają przetestować modele AI oparte na przeglądarce po stronie klienta prawdziwych środowisk przeglądarek przy jednoczesnej skalowalności, automatyzacji i ustandaryzowanej konfiguracji sprzętu.

W tym przypadku jest to prawdziwa przeglądarka Chrome z obsługą sprzętu, w przeciwieństwie do emulacji oprogramowania.

Niezależnie od tego, czy zajmujesz się tworzeniem sztucznej inteligencji, gier internetowych, grafiki czy też zajmujesz się interesuje Cię testowanie modeli sztucznej inteligencji w internecie, ten przewodnik jest przeznaczony dla Ciebie.

Krok 1. Utwórz nowy notatnik Google Colab

1. Otwórz stronę colab.new, aby utworzyć nowy notatnik Colab. Powinien wyglądać podobnie do ilustracji 1. 2. Postępuj zgodnie z instrukcjami, aby zalogować się na konto Google.
Zrzut ekranu nowej wersji Colab
Rys. 1 Nowy notatnik Colab.

Krok 2. Połącz się z serwerem z włączoną obsługą GPU T4

  1. Kliknij Połącz w prawym górnym rogu notatnika.
  2. Wybierz Zmień typ środowiska wykonawczego:
    Zrzut ekranu ze zbliżeniem pokazującym kroki zmiany środowiska wykonawczego.
    Rysunek 2. Zmień środowisko wykonawcze w interfejsie Colab.
    .
  3. W oknie modalnym wybierz GPU T4 jako akcelerator sprzętowy. Podczas połączenia Colab będzie używać instancji z systemem Linux z podłączonym procesorem graficznym NVIDIA T4. .
    Zrzut ekranu pokazujący moduł zmiany typu środowiska wykonawczego.
    Rys. 3. W sekcji Akcelerator sprzętowy wybierz GPU T4.
  4. Kliknij Zapisz.
  5. Kliknij przycisk Połącz, aby połączyć się ze środowiskiem wykonawczym. Po pewnym czasie pojawi się zielony znacznik wyboru oraz wykresy wykorzystania pamięci RAM i dysku. Oznacza to, że został utworzony serwer z wymaganymi sprzęt.

Dobra robota! Właśnie udało Ci się utworzyć serwer z podłączonym GPU.

Krok 3. Zainstaluj odpowiednie sterowniki i zależności

  1. Skopiuj następujące dwa wiersze i wklej je do pierwszej komórki kodu w notatniku. W środowisku Colab wykonanie wiersza poleceń rozpoczyna się ciągiem z wykrzyknikiem.

    !git clone https://github.com/jasonmayes/headless-chrome-nvidia-t4-gpu-support.git
    !cd headless-chrome-nvidia-t4-gpu-support && chmod +x scriptyMcScriptFace.sh && ./scriptyMcScriptFace.sh
    
    • Skrypt możesz sprawdzić w GitHubie. aby zobaczyć nieprzetworzony kod wiersza poleceń, który wykonuje ten skrypt.
    # Update, install correct drivers, and remove the old ones.
    apt-get install -y vulkan-tools libnvidia-gl-525
    
    # Verify NVIDIA drivers can see the T4 GPU and that vulkan is working correctly.
    nvidia-smi
    vulkaninfo --summary
    
    # Now install latest version of Node.js
    npm install -g n
    n lts
    node --version
    npm --version
    
    # Next install Chrome stable
    curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/googlechrom-keyring.gpg
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/googlechrom-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
    sudo apt update
    sudo apt install -y google-chrome-stable
    
    # Start dbus to avoid warnings by Chrome later.
    export DBUS_SESSION_BUS_ADDRESS="unix:path=/var/run/dbus/system_bus_socket"
    /etc/init.d/dbus start
    
  2. Kliknij obok komórki, aby wykonaj kod.

    Zrzut ekranu nowej wersji Colab
    Rysunek 4.

  3. Po zakończeniu wykonywania kodu sprawdź, czy nvidia-smi coś wydrukował podobnie jak na tym zrzucie ekranu, aby potwierdzić, że faktycznie masz GPU. jest rozpoznawany przez Twój serwer. Być może trzeba będzie przewinąć do wcześniejszego etapu w dziennikach, aby wyświetlić te dane wyjściowe.

    Rysunek 5. Znajdź dane wyjściowe rozpoczynające się od „NVIDIA-SMI”.

Krok 4. Używaj Chrome bez interfejsu graficznego i zautomatyzuj go

  1. Kliknij przycisk Kod, aby dodać nowy z komórką z kodem.
  2. Następnie możesz napisać własny kod, który będzie wywoływał projekt Node.js za pomocą (lub po prostu wywołaj google-chrome-stable bezpośrednio w wiersza poleceń). Poniżej podajemy przykłady.

Część A. Używaj Chrome bez interfejsu graficznego bezpośrednio z wiersza poleceń

# Directly call Chrome to dump a PDF of WebGPU testing page
# and store it in /content/gpu.pdf
!google-chrome-stable \
--no-sandbox \
--headless=new \
--use-angle=vulkan \
--enable-features=Vulkan \
--disable-vulkan-surface \
--enable-unsafe-webgpu \
--print-to-pdf=/content/gpu.pdf https://webgpureport.org

W tym przykładzie wynikowy zapis pliku PDF został zapisany w programie /content/gpu.pdf. Do wyświetl go, rozwiń treść . Następnie kliknij , aby pobrać plik PDF na komputer lokalny.

Zrzut ekranu nowej wersji Colab
Rysunek 6.: zwróć uwagę na instrukcje pobierania pliku PDF przedstawione w tym zrzucie ekranu z interfejsem Colab.

Część B. Polecanie Chrome w Puppeteer

Oto minimalistyczny przykład sterowania Chrome bez interfejsu graficznego za pomocą Puppeteer które można uruchomić w ten sposób:

# Call example node.js project to perform any task you want by passing
# a URL as a parameter
!node headless-chrome-nvidia-t4-gpu-support/examples/puppeteer/jPuppet.js chrome://gpu

W przykładzie jPuppet możemy wywołać skrypt Node.js, by utworzyć zrzut ekranu. Jak to działa? Zapoznaj się z tym przewodnikiem po Node.js. kod w jPuppet.js.

Zestawienie kodu węzła jPuppet.js

Najpierw zaimportuj Puppeteer. Dzięki temu zdalne sterowanie Chrome przy użyciu środowiska Node.js:

import puppeteer from 'puppeteer';

Następnie sprawdź, które argumenty wiersza poleceń zostały przekazane do aplikacji węzła. Upewnij się, że ustawiono trzeci argument reprezentujący adres URL, do którego należy przejść. Ty należy sprawdzić trzeci argument, ponieważ pierwsze dwa argumenty wywołują argument Node i uruchomiony skrypt. Trzeci element zawiera tak naprawdę pierwszy element parametr przekazywany do programu węzłów:

const url = process.argv[2];
if (!url) {
  throw "Please provide a URL as the first argument";
}

Zdefiniuj funkcję asynchroniczną o nazwie runWebpage(). Spowoduje to utworzenie przeglądarki obiekt skonfigurowany za pomocą argumentów wiersza poleceń w celu uruchomienia Chrome w taki sposób, by interfejsy WebGL i WebGPU działały w sposób opisany w Włącz obsługę WebGPU i WebGL.

async function runWebpage() {
  const browser = await puppeteer.launch({
    headless: 'new',
    args:  [
        '--no-sandbox',
        '--headless=new',
        '--use-angle=vulkan',
        '--enable-features=Vulkan',
        '--disable-vulkan-surface',
        '--enable-unsafe-webgpu'
      ]
  });

Utwórz nowy obiekt strony przeglądarki, którego będzie można później użyć do otwarcia dowolnego adresu URL:

const page = await browser.newPage();

Następnie dodaj detektor zdarzeń, który będzie nasłuchiwać zdarzeń console.log, gdy strona internetowa wykonuje JavaScript. Dzięki temu możesz rejestrować wiadomości w wierszu poleceń węzła oraz sprawdzić tekst konsoli pod kątem specjalnego wyrażenia (w tym przypadku captureAndEnd), który powoduje wyświetlenie zrzutu ekranu, a następnie kończy proces przeglądania w Węzeł. Jest to przydatne w przypadku stron internetowych, które muszą zostać wykonane przed i można zrobić zrzut ekranu. Jego długość nie jest deterministyczna

page.on('console', async function(msg) {
  console.log(msg.text());
  if (msg.text() === 'captureAndEnd') {
    await page.screenshot({ path: '/content/screenshotEnd.png' });
    await browser.close();
  }
});

Na koniec poleć stronie przejście do podanego adresu URL i pobierz początkowy zrzut ekranu po załadowaniu strony.

Jeśli zdecydujesz się zrobić zrzut ekranu strony chrome://gpu, możesz zamknąć przeglądarkę sesja natychmiastowa, zamiast czekać na dane wyjściowe konsoli, bo ta strona które nie są kontrolowane przez Twój kod.

  await page.goto(url,  { waitUntil: 'networkidle2' });
  await page.screenshot({path: '/content/screenshot.png'});
  if (url === 'chrome://gpu') {
    await browser.close();
  }
}
runWebpage();

Modyfikowanie pliku package.json

Jak być może zauważyliście, na początku jPuppet.js. package.json musi ustawić wartości typu module lub wyświetli się błąd informujący o tym, że moduł jest nieprawidłowy.

 {
    "dependencies":  {
      "puppeteer": "*"
    },
    "name": "content",
    "version": "1.0.0",
    "main": "jPuppet.js",
    "devDependencies": {},
    "keywords": [],
    "type": "module",
    "description": "Node.js Puppeteer application to interface with headless Chrome with GPU support to capture screenshots and get console output from target webpage"
}

To wszystko. Użycie Puppeteer ułatwia interfejs. automatycznie za pomocą Chrome.

Sukces

Możemy teraz sprawdzić, czy Klasyfikator MNIST TensorFlow.js Fashion poprawnie rozpoznają parę spodni na zdjęciu, jeśli po stronie klienta podczas przetwarzania w przeglądarce za pomocą GPU.

Możesz go używać do wszystkich zbiorów zadań opartych na GPU po stronie klienta, od systemów uczących się do testowania grafiki i gier.

Zrzut ekranu nowej wersji Colab
Rysunek 7. Udane przechwycenie modelu TensorFlow.js z akceleracją za pomocą GPU, który umożliwia rozpoznawanie w przeglądarce klienta odzieży w czasie rzeczywistym

Zasoby

Dodawanie gwiazdki do repozytorium GitHub , aby otrzymywać informacje w przyszłości.