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