הגדרת סביבה עקבית לבדיקה עם מעבדי GPU עשויה להיות קשה יותר מהצפוי. ריכזנו כאן את השלבים לבדיקת מודלים מבוססי-דפדפן של AI בצד הלקוח בסביבות דפדפן אמיתיות, תוך התאמה לעומס, אוטומציה והגדרה סטנדרטית ידועה של חומרה.
במקרה הזה, הדפדפן הוא דפדפן Chrome אמיתי עם תמיכה בחומרה, בניגוד להדמיה של תוכנה.
המדריך הזה מיועד למפתחי AI לאינטרנט, למפתחי משחקים לאינטרנט או למפתחי גרפיקה, וגם למי שמעוניין לבדוק מודלים של AI לאינטרנט.
שלב 1: יוצרים מסמך notebook חדש ב-Google Colab
1. כדי ליצור notebook חדש של Colab, עוברים אל colab.new. היא אמורה להיראות כמו תמונה 1. 2. נכנסים לחשבון Google לפי ההוראות.שלב 2: מתחברים לשרת שתומך ב-T4 GPU
- לוחצים על התחברות בפינה השמאלית העליונה של המחברת.
- בוחרים באפשרות Change runtime type (שינוי הסוג של סביבת זמן הריצה):
- בחלון המודאלי, בוחרים באפשרות T4 GPU כמאיץ החומרה. כשמתחברים, Colab ישתמש במופע של Linux עם GPU של NVIDIA T4.
- לוחצים על שמירה.
- לוחצים על הלחצן Connect (קישור) כדי להתחבר לסביבת זמן הריצה. אחרי זמן מה, יופיע סימן וי ירוק על הלחצן, יחד עם תרשימים של השימוש ב-RAM ובדיסק. המשמעות היא שהשרת נוצר בהצלחה עם החומרה הנדרשת.
יפה מאוד יצרת שרת עם GPU.
שלב 3: מתקינים את מנהלי ההתקנים ויחסי התלות הנכונים
מעתיקים ומדביקים את שתי שורות הקוד הבאות בתא הקוד הראשון של המחברות. בסביבת 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
- אפשר לבדוק את הסקריפט ב-GitHub כדי לראות את קוד שורת הפקודה הגולמי שהסקריפט הזה מפעיל.
# 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
לוחצים על
לצד התא כדי להריץ את הקוד.בסיום ההרצה של הקוד, מוודאים ש-
nvidia-smi
הדפיס משהו שדומה לצילום המסך הבא כדי לוודא שבאמת יש לכם GPU מחובר והוא מזוהה בשרת. יכול להיות שתצטרכו לגלול לחלקים קודמים ביומן כדי לראות את הפלט הזה.
שלב 4: שימוש ב-Headless Chrome ואוטומציה שלו
- לוחצים על הלחצן Code כדי להוסיף תא קוד חדש.
- לאחר מכן תוכלו לכתוב קוד בהתאמה אישית כדי להפעיל פרויקט 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 למחשב המקומי.
חלק ב': שליחת פקודות ל-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 באופן פרוגרמטי בקלות רבה יותר.
הפעולה הצליחה
עכשיו אנחנו יכולים לאמת שמסווג ה-TensorFlow.js Fashion MNIST יכול לזהות בצורה נכונה מכנסי צמר בתמונה, באמצעות עיבוד בצד הלקוח בדפדפן באמצעות ה-GPU.
אפשר להשתמש ב-GPU בכל עומסי עבודה מבוססי GPU מצד הלקוח, החל ממודלים של למידת מכונה ועד לבדיקת גרפיקה ומשחקים.
משאבים
כדאי להוסיף כוכב במאגר GitHub כדי לקבל עדכונים עתידיים.