בדיקת מודלים של 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: מתחברים לשרת עם תמיכה ב-GPU מסוג T4

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

מצוין, יצרתם שרת עם GPU מחובר.

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

  1. מעתיקים ומדביקים את שתי שורות הקוד הבאות בתא הקוד הראשון של המחברות. בסביבת 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: שימוש ב-Headless Chrome ואוטומציה שלו

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

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

פירוט קוד Node של jPuppet.js

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

import puppeteer from 'puppeteer';

בשלב הבא, בודקים אילו ארגומנטים של שורת הפקודה הועברו לאפליקציית Node. מוודאים שהארגומנט השלישי מוגדר – הוא מייצג כתובת URL שרוצים לנווט אליה. צריך לבדוק את הארגומנט השלישי כאן, כי שני הארגומנטים הראשונים קוראים ל-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();

לאחר מכן, מוסיפים מאזין לאירועים כדי להאזין לאירועים מסוג console.log כשדף האינטרנט מפעיל JavaScript. כך תוכלו לתעד הודעות בשורת הפקודה של Node, וגם לבדוק את הטקסט במסוף כדי לאתר ביטוי מיוחד (במקרה הזה, 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

יכול להיות ששמתם לב שהשתמשנו בהצהרת import בתחילת הקובץ 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 באופן פרוגרמטי בקלות רבה יותר.

הפעולה הצליחה

עכשיו אנחנו יכולים לאמת שמסווג ה-MNIST של אופנה ב-TensorFlow.js יכול לזהות בצורה נכונה זוג מכנסיים בתמונה, באמצעות עיבוד בצד הלקוח בדפדפן באמצעות ה-GPU.

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

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

משאבים

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