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

François Beaufort
François Beaufort

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

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

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

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

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

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

  1. לוחצים על Connect בפינה הימנית העליונה של ה-notebook.
  2. בוחרים באפשרות Change runtime type (שינוי הסוג של סביבת זמן הריצה):
    צילום מסך תקריב שבו מוצגים השלבים לשינוי זמן הריצה.
    איור 2. שינוי סביבת זמן הריצה בממשק של Colab.
  3. בחלון החלון, בוחרים באפשרות T4 GPU כמאיץ החומרה. כשמתחברים, Colab ישתמש במופע של Linux עם GPU של NVIDIA T4.
    צילום מסך של המודול 'שינוי הסוג של סביבת זמן הריצה'.
    איור 3: בקטע 'שיפור מהירות באמצעות חומרה', בוחרים באפשרות T4 GPU.
  4. לוחצים על שמירה.
  5. לוחצים על הלחצן Connect (התחברות) כדי להתחבר לסביבת זמן הריצה. לאחר זמן מה, יוצג סימן וי ירוק, יחד עם גרפים של זיכרון ה-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. לוחצים על הלחצן קוד כדי להוסיף קוד חדש. תא קוד.
  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: אפשר לצפות בשלבים להורדת קובץ ה-PDF בצילום המסך הזה של ממשק Colab.

חלק ב': הגדרת הפקודה ב-Chrome באמצעות Puppeteer

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

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

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

import puppeteer from 'puppeteer';

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

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

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

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

משאבים

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