הגדרה של סביבת בדיקה עקבית ב-GPU עשויה להיות קשה מהצפוי. בהמשך מפורטים שלבים לבדיקת מודלים של AI מבוססי-דפדפן בצד הלקוח בסביבות אמיתיות של דפדפן, תוך שהם ניתנים להתאמה, ניתנים להתאמה אוטומטית ובמסגרת הגדרת חומרה סטנדרטית ידועה.
בדוגמה הזו, הדפדפן הוא דפדפן Chrome אמיתי עם תמיכה בחומרה, בניגוד לאמולציה של תוכנה.
בין אם אתם מפתחי AI באינטרנט, משחקים באינטרנט או מפתחי גרפיקה, או אם אתם מתעניינים בבדיקת מודלים של AI באינטרנט, המדריך הזה מיועד לכם.
שלב 1: יצירת notebook חדש של Google Colab
1. כדי ליצור notebook חדש של Colab, צריך לעבור לכתובת colab.new. הוא אמור להיות דומה לתרשים 1. 2. פועלים לפי ההוראות לכניסה לחשבון Google.שלב 2: מתחברים לשרת התומך ב-T4 GPU
- לוחצים על Connect בפינה הימנית העליונה של ה-notebook.
- בוחרים באפשרות שינוי סוג זמן הריצה:
- בחלון העזר, בוחרים באפשרות T4 GPU בתור מאיץ החומרה. כשמתחברים, Colab תשתמש במכונת Linux עם NVIDIA T4 GPU.
- לוחצים על שמירה.
- לוחצים על הלחצן התחברות כדי להתחבר לזמן הריצה. אחרי זמן מה יופיע על הלחצן סימן וי ירוק יחד עם פירוט של נתוני ה-RAM והשימוש בדיסק. זה מעיד על כך שהשרת נוצר בהצלחה עם החומרה הנדרשת.
נהדר, יצרת עכשיו שרת עם GPU מצורף.
שלב 3: מתקינים את מנהלי ההתקנים הנכונים ואת יחסי התלות הנכונים
מעתיקים את שתי שורות הקוד הבאות ומדביקים אותן בתא הקוד הראשון ב-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
- אפשר לבדוק את הסקריפט ב-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: שימוש ב-Chrome ללא דפדפן GUI והפיכתו לאוטומטי
- לוחצים על הלחצן Code על מנת להוסיף תא קוד חדש.
- לאחר מכן תוכלו לכתוב את הקוד המותאם אישית כדי לקרוא לפרויקט 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 למכונה המקומית.
חלק ב: פקודה ב-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 בצד הלקוח, ממודלים של למידת מכונה ועד לבדיקת גרפיקה ומשחקים.
משאבים
הוסיפו כוכב למאגר GitHub כדי לקבל עדכונים עתידיים.