Google Colab でのウェブ AI モデルのテスト

François Beaufort
François Beaufort

GPU を使用して一貫したテスト環境を設定することは、予想よりも難しい場合があります。以下では、スケーラブルで自動化可能であり、既知の標準化されたハードウェア設定内で、クライアントサイドのブラウザベースの AI モデルを実際のブラウザ環境でテストする手順について説明します。

この場合、ブラウザはソフトウェア エミュレーションではなく、ハードウェア サポートを備えた実際の Chrome ブラウザです。

ウェブ AI、ウェブ ゲーム、グラフィック デベロッパーの方、またはウェブ AI モデルのテストに関心をお持ちの方は、このガイドをご利用ください。

ステップ 1: 新しい Google Colab ノートブックを作成する

1. colab.new に移動して、新しい Colab ノートブックを作成します。図 1 のようになります。2. メッセージに沿って Google アカウントにログインします。
新しい Colab のスクリーンショット
図 1: 新しい Colab ノートブック。

ステップ 2: T4 GPU 対応サーバーに接続する

  1. ノートブックの右上にある [接続] をクリックします。
  2. [ランタイム タイプを変更] を選択します。
    ランタイムを変更する手順を示すクローズアップ スクリーンショット。
    図 2。Colab インターフェースでランタイムを変更します。
  3. モーダル ウィンドウで、ハードウェア アクセラレータとして [T4 GPU] を選択します。接続すると、Colab は NVIDIA T4 GPU が接続された Linux インスタンスを使用します。
    [ランタイムのタイプを変更] モジュールのスクリーンショット。
    図 3: [ハードウェア アクセラレータ] で [T4 GPU] を選択します。
  4. [保存] をクリックします。
  5. [接続] ボタンをクリックしてランタイムに接続します。しばらくすると、ボタンに緑色のチェックマークと、RAM とディスクの使用状況のグラフが表示されます。これは、必要なハードウェアを使用してサーバーが正常に作成されたことを示します。

これで、GPU が接続されたサーバーが作成されました。

ステップ 3: 適切なドライバと依存関係をインストールする

  1. 次の 2 行のコードをコピーして、ノートブックの最初のコードセルに貼り付けます。Colab 環境では、コマンドライン実行の前に感嘆符が付加されます。

    !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
    
    # 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. セルの横にある をクリックしてコードを実行します。

    新しい Colab のスクリーンショット
    図 4.

  3. コードの実行が完了したら、nvidia-smi が次のスクリーンショットのような出力を出力することを確認し、GPU が実際に接続され、サーバーで認識されていることを確認します。この出力を表示するには、ログの前の部分までスクロールする必要がある場合があります。

    図 5: 「NVIDIA-SMI」で始まる出力を確認します。

ステップ 4: ヘッドレス Chrome を使用して自動化する

  1. [コード] ボタンをクリックして、新しいコードセルを追加します。
  2. 次に、任意のパラメータで Node.js プロジェクトを呼び出す(またはコマンドラインで google-chrome-stable を直接呼び出す)カスタムコードを記述できます。以下に、両方の例を示します。

パート A: コマンドラインで直接ヘッドレス Chrome を使用する

# 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

この例では、生成された PDF キャプチャを /content/gpu.pdf に保存しました。このファイルを表示するには、コンテンツ を開きます。次に、 をクリックして PDF ファイルをローカルマシンにダウンロードします。

新しい Colab のスクリーンショット
図 6: Colab のインターフェースのスクリーン キャプチャで、PDF をダウンロードする手順を確認してください。

パート B: Puppeteer で Chrome を操作する

Puppeteer を使用してヘッドレス Chrome を制御するシンプルな例を用意しました。これは次のように実行できます。

# 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

jPuppet の例では、Node.js スクリプトを呼び出してスクリーンショットを作成できます。では、これはどんな仕組みですか?jPuppet.js の Node.js コードのチュートリアルをご覧ください。

jPuppet.js ノードのコードの内訳

まず、Puppeteer をインポートします。これにより、Node.js を使用して Chrome をリモートで制御できます。

import puppeteer from 'puppeteer';

次に、Node アプリケーションに渡されたコマンドライン引数を確認します。3 つ目の引数(移動先の URL を表す)が設定されていることを確認します。最初の 2 つの引数は Node 自体と実行中のスクリプトを呼び出すため、ここでは 3 番目の引数を調べる必要があります。3 番目の要素には、Node プログラムに渡された最初のパラメータが実際に含まれています。

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

次に、runWebpage() という名前の非同期関数を定義します。これにより、WebGPU と WebGL のサポートを有効にするで説明されているように、WebGL と WebGPU を機能させるために必要な方法で Chrome バイナリを実行するコマンドライン引数で構成されたブラウザ オブジェクトが作成されます。

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'
      ]
  });

後で任意の URL にアクセスするために使用できる、新しいブラウザページ オブジェクトを作成します。

const page = await browser.newPage();

次に、ウェブページが JavaScript を実行するときに console.log イベントをリッスンするイベント リスナーを追加します。これにより、Node コマンドライン上でメッセージをログに記録し、スクリーンショットをトリガーして Node でブラウザ プロセスを終了する特別なフレーズ(この場合は captureAndEnd)をコンソール テキストで検査できます。これは、スクリーンショットを撮影する前にある程度の作業が必要で、実行時間が非決定的であるウェブページに便利です。

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

最後に、指定された URL にアクセスするようページに指示し、ページが読み込まれたら最初のスクリーンショットを取得します。

chrome://gpu のスクリーンショットを取得する場合は、コンソール出力を待つことなく、すぐにブラウザ セッションを閉じることができます。このページは独自のコードで制御できないためです。

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

package.json を変更する

jPuppet.js ファイルの先頭で import ステートメントを使用していることに気づいたかもしれません。package.json で型値を module に設定する必要があります。設定しない場合、モジュールが無効であるというエラーが発生します。

 {
    "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"
}

これで設定は終了です。Puppeteer を使用すると、プログラムで Chrome とインターフェースを簡単に設定できます。

成功

これで、TensorFlow.js Fashion MNIST 分類器が、GPU を使用してブラウザでクライアントサイド処理を行い、画像内のズボンを正しく認識できることを確認できます。

これは、機械学習モデルからグラフィックやゲームのテストまで、クライアントサイドの GPU ベースのワークロードに使用できます。

新しい Colab のスクリーンショット
図 7: ブラウザでクライアントサイドで衣服をリアルタイムで認識できる GPU アクセラレーションの TensorFlow.js モデルを正常にキャプチャ

リソース

GitHub リポジトリにスターを付けると、今後の最新情報を受け取ることができます。