בדיקת מודלים של AI באינטרנט ב-Google Colab

François Beaufort
François Beaufort

הגדרה של סביבת בדיקה עקבית ב-GPU עשויה להיות קשה מהצפוי. בהמשך מפורטים שלבים לבדיקת מודלים של AI מבוססי-דפדפן בצד הלקוח בסביבות אמיתיות של דפדפן, תוך שהם ניתנים להתאמה, ניתנים להתאמה אוטומטית ובמסגרת הגדרת חומרה סטנדרטית ידועה.

בדוגמה הזו, הדפדפן הוא דפדפן Chrome אמיתי עם תמיכה בחומרה, בניגוד לאמולציה של תוכנה.

בין אם אתם מפתחי AI באינטרנט, משחקים באינטרנט או מפתחי גרפיקה, או אם אתם מתעניינים בבדיקת מודלים של AI באינטרנט, המדריך הזה מיועד לכם.

שלב 1: יצירת notebook חדש של Google Colab

1. כדי ליצור notebook חדש של Colab, צריך לעבור לכתובת colab.new. הוא אמור להיות דומה לתרשים 1. 2. פועלים לפי ההוראות לכניסה לחשבון Google.
צילום מסך של פריט Colab חדש
איור 1: notebook חדש של Colab.

שלב 2: מתחברים לשרת התומך ב-T4 GPU

  1. לוחצים על Connect בפינה הימנית העליונה של ה-notebook.
  2. בוחרים באפשרות שינוי סוג זמן הריצה:
    צילום מסך של תקריב שבו מוצגים השלבים לשינוי סביבת זמן הריצה.
    איור 2. שינוי זמן הריצה בממשק של Colab.
  3. בחלון העזר, בוחרים באפשרות T4 GPU בתור מאיץ החומרה. כשמתחברים, Colab תשתמש במכונת Linux עם NVIDIA T4 GPU.
    צילום מסך של המודול 'שינוי סוג זמן ריצה'.
    איור 3: בקטע 'שיפור מהירות באמצעות חומרה', בוחרים באפשרות T4 GPU.
  4. לוחצים על שמירה.
  5. לוחצים על הלחצן התחברות כדי להתחבר לזמן הריצה. אחרי זמן מה יופיע על הלחצן סימן וי ירוק יחד עם פירוט של נתוני ה-RAM והשימוש בדיסק. זה מעיד על כך שהשרת נוצר בהצלחה עם החומרה הנדרשת.

נהדר, יצרת עכשיו שרת עם GPU מצורף.

שלב 3: מתקינים את מנהלי ההתקנים הנכונים ואת יחסי התלות הנכונים

  1. מעתיקים את שתי שורות הקוד הבאות ומדביקים אותן בתא הקוד הראשון ב-notebook. בסביבת 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 ללא דפדפן GUI והפיכתו לאוטומטי

  1. לוחצים על הלחצן Code על מנת להוסיף תא קוד חדש.
  2. לאחר מכן תוכלו לכתוב את הקוד המותאם אישית כדי לקרוא לפרויקט Node.js עם הפרמטרים המועדפים עליכם (או פשוט לקרוא ל-google-chrome-stable ישירות בשורת הפקודה). יש לנו דוגמאות לשתי האפשרויות הבאות.

חלק א': שימוש ב-Headless 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.

חלק ב: פקודה ב-Chrome עם Puppeteer

בקישור הבא סיפקנו דוגמה מינימליסטית לשימוש ב-Puppeteer לשליטה ב-Headless 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 כדי ליצור צילום מסך. אבל איך זה עובד? קראו את המדריך הזה על קוד Node.js ב-jPuppet.js.

פירוט קוד הצומת jPuppet.js

קודם כול, מייבאים את Puppeteer. כך תוכלו לשלוט מרחוק ב-Chrome באמצעות Node.js:

import puppeteer from 'puppeteer';

בשלב הבא צריך לבדוק אילו ארגומנטים של שורת הפקודה הועברו לאפליקציה של הצומת. מוודאים שהארגומנט השלישי מוגדר, שמייצג את כתובת ה-URL שאליה צריך לעבור. צריך לבדוק את הארגומנט השלישי כאן כי שני הארגומנטים הראשונים קוראים ל-Nodeself ולסקריפט שאנחנו מריצים. הרכיב השלישי מכיל בפועל את הפרמטר הראשון שמועבר לתוכנית Node:

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

עכשיו צריך להגדיר פונקציה אסינכרונית בשם runWebpage(). כך נוצר אובייקט דפדפן שמוגדר באמצעות הארגומנטים של שורת הפקודה כדי להריץ את הקובץ הבינארי של Chrome באופן שאנחנו צריכים כדי ש-WebGL ו-WebGPU יפעלו כפי שמתואר במאמר הפעלת התמיכה ב-WebGPU וב-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'
      ]
  });

יוצרים אובייקט חדש של דף דפדפן כדי שאפשר יהיה להשתמש בו מאוחר יותר כדי להיכנס לכל כתובת URL:

const page = await browser.newPage();

לאחר מכן מוסיפים event listener כדי להאזין לאירועים של console.log כשדף האינטרנט מריץ JavaScript. כך אפשר לרשום הודעות בשורת הפקודה של הצומת וגם לחפש בטקסט המסוף ביטוי מיוחד (במקרה הזה, captureAndEnd) שמפעיל צילום מסך ואז מסיים את תהליך הדפדפן ב-Node. האפשרות הזו שימושית בדפי אינטרנט שצריכים לבצע כמות מסוימת של עבודה לפני שאפשר לצלם את המסך, ועם משך זמן לא מוגדר לביצוע.

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. ב-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 אופנה MNIST יכול לזהות זוג מכנסיים בתמונה בצורה נכונה, והעיבוד בצד הלקוח מתבצע בדפדפן באמצעות ה-GPU.

אפשר להשתמש בה בכל עומסי העבודה (workloads) מבוססי-GPU בצד הלקוח, ממודלים של למידת מכונה ועד לבדיקת גרפיקה ומשחקים.

צילום מסך של פריט Colab חדש
איור 7: צילום מוצלח של מודל TensorFlow.js עם האצת GPU, שיכול לזהות בזמן אמת את צד הלקוח של הביגוד בדפדפן

משאבים

הוסיפו כוכב למאגר GitHub כדי לקבל עדכונים עתידיים.