שיפור בדיקות המודלים של Web AI: WebGPU, WebGL ו-Chrome ללא GUI

ג'ייסון מייס
ג'ייסון מייס
פרנסואה בופורט
פרנסואה בופורט

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

עם זאת, קיימת מכשול. המודל TensorFlow.js יכול לפעול גם במעבדים (CPU) (WebAssembly) וגם במעבדי GPU חזקים יותר (דרך WebGL ו-WebGPU). השאלה היא: איך אפשר לבצע באופן עקבי בדיקות דפדפן אוטומטיות באמצעות החומרה שנבחרה?

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

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

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

מה כלול בארגז הכלים שלנו לאוטומציה

אלה הפרטים שאנחנו משתמשים בהם:

  • סביבה: מחשב נייד מבוסס-Linux של Google Colab, שמחובר ל-GPU של NVIDIA T4 או V100. אם רוצים, אפשר להשתמש בפלטפורמות אחרות של ענן, כמו Google Cloud (GCP).
  • דפדפן: Chrome תומך ב-WebGPU, יורש רב-עוצמה של WebGL, שמביא את הפיתוחים של ממשקי API מודרניים ל-GPU לאינטרנט.
  • אוטומציה: Puppeteer היא ספריית Node.js שמאפשרת לשלוט בדפדפנים באופן פרוגרמטי באמצעות JavaScript. באמצעות Puppeteer אנחנו יכולים להפוך את Chrome לאוטומטי בשרת, כלומר הדפדפן פועל ללא ממשק גלוי. אנחנו משתמשים במצב החדש והמשופר של 'דפדפן ללא GUI', ולא בגרסה הקודמת.

אימות הסביבה

הדרך הטובה ביותר לבדוק אם שיפור המהירות באמצעות חומרה מופעלת ב-Chrome היא להקליד chrome://gpu בסרגל הכתובות. ניתן לבצע את הפעולות המקבילות בצורה פרוגרמטית באמצעות Puppeteer באמצעות console.log, או לשמור את הדוח המלא כ-PDF כדי לבדוק אותו באופן ידני:

/* Incomplete example.js */
import puppeteer from 'puppeteer';

// Configure launch parameters: Expands later
const browser = await puppeteer.launch({
  headless: 'new',
  args:  ['--no-sandbox']
});

const page = await browser.newPage();
await page.goto('chrome://gpu');

// Verify: log the WebGPU status or save the GPU report as PDF
const txt = await page.waitForSelector('text/WebGPU');
const status = await txt.evaluate(g => g.parentElement.textContent);
console.log(status);
await page.pdf({ path: './gpu.pdf' });

await browser.close();

פתח את chrome://gpu ואמורות להתקבל התוצאות הבאות:

סטטוס של תכונות גרפיקה
OpenGL: מושבת
Vulkan: מושבת
WebGL: תוכנה בלבד, שיפור המהירות באמצעות חומרה לא זמין
WebGL2: תוכנה בלבד, שיפור המהירות באמצעות חומרה לא זמין
WebGPU: מושבת

זוהו בעיות.
WebGPU הושבת באמצעות רשימת חסימה או שורת הפקודה.

זו לא התחלה טובה. די ברור שזיהוי החומרה נכשל. WebGL, WebGL2 ו-WebGPU מושבתים למעשה או שהתוכנה בלבד. אנחנו לא לבד - יש אינספור דיונים באינטרנט על אנשים שנמצאים במצב דומה, כולל בערוצי התמיכה הרשמיים של Chrome (1), (2).

הפעלת התמיכה ב-WebGPU וב-WebGL

כברירת מחדל, Chrome ללא ממשק גרפי משביתים את ה-GPU. כדי להפעיל אותה ב-Linux, עליכם להחיל את כל הדגלים הבאים כשמפעילים את Chrome ללא ממשק גרפי:

  • הסימון --no-sandbox משבית את ארגז החול לאבטחה של Chrome, שמבודד את תהליך הדפדפן משאר המערכת. אין תמיכה בהפעלת Chrome בתור root ללא ארגז החול הזה.
  • הדגל --headless=new מפעיל את Chrome באמצעות המצב החדש והמשופר, בלי ממשק משתמש גלוי.
  • הסימון --use-angle=vulkan מורה ל-Chrome להשתמש בקצה העורפי של Vulkan בשביל ANGLE, שמתרגם קריאות של OpenGL ES 2/3 לקריאות של Vulkan API.
  • הסימון --enable-features=Vulkan מאפשר לקצה העורפי של הגרפיקה של Vulkan ליצירה ולרסטר ב-Chrome.
  • הדגל --disable-vulkan-surface משבית את תוסף המופע VK_KHR_surface של vulkan. במקום להשתמש ב-החלפה, המערכת משתמשת ב-Bit blit לתוצאת הרינדור הנוכחית במסך.
  • הסימון --enable-unsafe-webgpu מפעיל את ה-WebGPU API הניסיוני ב-Chrome ב-Linux, ומשבית את רשימת החסימה של המתאמים.

עכשיו נשלב את כל השינויים שביצענו עד כה. הנה הסקריפט המלא.

/* Complete example.js */
import puppeteer from 'puppeteer';

// Configure launch parameters
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--no-sandbox',
    '--headless=new',
    '--use-angle=vulkan',
    '--enable-features=Vulkan',
    '--disable-vulkan-surface',
    '--enable-unsafe-webgpu',
  ]
});

const page = await browser.newPage();
await page.goto('chrome://gpu');

// Verify: log the WebGPU status or save the GPU report as PDF
const txt = await page.waitForSelector('text/WebGPU');
const status = await txt.evaluate(g => g.parentElement.textContent);
console.log(status);
await page.pdf({path: './gpu.pdf'});

await browser.close();

מריצים את הסקריפט שוב. לא זוהו בעיות ב-WebGPU והערך משתנה ממושבת לתוכנה בלבד.

סטטוס של תכונות גרפיקה
OpenGL: מושבת
Vulkan: מושבת
WebGL: תוכנה בלבד, שיפור המהירות באמצעות חומרה לא זמין
WebGL2: תוכנה בלבד, שיפור המהירות באמצעות חומרה לא זמין
WebGPU: תוכנה בלבד, שיפור המהירות באמצעות חומרה לא זמין

עם זאת, שיפור המהירות באמצעות חומרה עדיין לא זמין, ה-NVIDIA T4 GPU לא מזוהה.

מתקינים את מנהלי ההתקנים הנכונים של ה-GPU

בדקנו לעומק את הפלט של chrome://gpu, עם כמה מומחי GPU בצוות Chrome. מצאנו בעיות במנהלי ההתקנים שמוגדרים כברירת מחדל במכונה של Linux Colab. הבעיות גרמו לבעיות ב-Vulkan, וכתוצאה מכך Chrome לא הצליח לזהות את NVIDIA T4 GPU ברמה GL_RENDERER, כפי שמוצג בפלט הבא. זה גורם לבעיות ב-Chrome ללא ממשק גרפי.

פלט ברירת המחדל לא מזהה NVIDIA T4 GPU.
פרטי הנהג/ת
GL_RENDERER ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShaderdrive-5.0.0)

לכן, התקנת מנהלי ההתקן הנכונים ותואמים פותרת את הבעיה.

הפלט עודכן לאחר התקנת מנהלי ההתקנים.
פרטי הנהג/ת
GL_RENDERER ANGLE (NVIDIA Corporation, Tesla T4/PCIe/SSE2, OpenGL ES 3.2 NVIDIA 525.105.17)

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

apt-get install -y vulkan-tools libnvidia-gl-525

// Verify the NVIDIA drivers detects along with vulkaninfo
nvidia-smi
vulkaninfo --summary

עכשיו מריצים שוב את הסקריפט ומקבלים את התוצאה הבאה. 🎉

סטטוס של תכונות גרפיקה
OpenGL: מופעל
Vulkan: מופעל
WebGL: האצת החומרה אבל רמת הביצועים נמוכה יותר.
WebGL2: האצת החומרה אבל רמת הביצועים נמוכה יותר.
WebGPU: האצת החומרה אבל רמת הביצועים נמוכה יותר.

הודות לשימוש במנהלי ההתקנים והדגלים הנכונים בזמן הרצת Chrome, יש לנו עכשיו תמיכה ב-WebGPU וב-WebGL באמצעות מצב חדש ונוצץ ללא GUI.

מאחורי הקלעים: החקירה של הצוות שלנו

אחרי הרבה מחקר, לא מצאנו שיטות עבודה לסביבה שעלינו לבצע ב-Google Colab, למרות שהיו כמה פוסטים מלאי תקווה שעבדו בסביבות אחרות, מה שמבטיח. בסופו של דבר לא הצלחנו לשחזר את ההצלחה שלהם בסביבת Colab NVIDIA T4, כי היו לנו שתי בעיות עיקריות:

  1. שילובי דגלים מסוימים מאפשרים לזהות את ה-GPU, אבל לא מאפשרים להשתמש ב-GPU בפועל.
  2. דוגמאות לפתרונות עבודה של צדדים שלישיים השתמשו בגרסה הישנה של Chrome ללא GUI, שבשלב מסוים תצא משימוש לטובת הגרסה החדשה. היינו צריכים פתרון שפועל עם Chrome ללא ממשק גרפי, כדי לספק הוכחה טובה יותר לעתיד.

ביררנו את השימוש ב-GPU באמצעות הרצת דף אינטרנט לדוגמה של TensorFlow.js לזיהוי תמונות, שבאמצעותו אימנו מודל לזהות דוגמאות בגדים (כמו 'שלום עולם' של למידת מכונה).

במכונה רגילה, 50 מחזורי אימון (שנקראים תקופות של זמן מערכת) צריכים לרוץ כל אחד בפחות משנייה. על ידי הפעלת דפדפן 'דפדפן ללא GUI' במצב ברירת המחדל, יכולנו לרשום את הפלט של לוח JavaScript לשורת הפקודה בצד השרת של Node.js, כדי לראות את מהירות מחזורי האימון האלה.

כצפוי, כל תקופה של אימון נמשכה הרבה יותר זמן מהצפוי (כמה שניות), וזה סימן לכך ש-Chrome חזר לביצוע פשוט של מעבד CPU ישן במקום להשתמש ב-GPU:

תקופות האימון נעות בקצב איטי יותר.
איור 1: תיעוד בזמן אמת שמראה כמה זמן נדרש לכל תקופה של אימון (בשניות).

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

חלה עלייה במהירות במהלך תקופות של זמן מערכת.
איור 2: צילום בזמן אמת שמציג את המהירות של תקופות של זמן מערכת.

סיכום

טכנולוגיית ה-AI מבית האינטרנט צמחה בצורה עצומה מאז שהיא הוקמה ב-2017. בעזרת טכנולוגיות דפדפן כמו WebGPU, WebGL ו-WebAssembly, אפשר להאיץ עוד יותר את הפעולות המתמטיות של מודל למידת המכונה בצד הלקוח.

נכון לשנת 2023, יותר ממיליארד הורדות של מודלים וספריות – בין TensorFlow.js ו-MediaPipe Web – ציון דרך היסטורי וסימן לכך שמפתחי אתרים ומהנדסים עוברים להשתמש בAI באפליקציות האינטרנט של הדור הבא שלהם כדי ליצור פתרונות מדהימים.

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

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

סיכום

במסמכי התיעוד שלנו יש מדריך מפורט, כך שאתם יכולים לנסות את תהליך ההגדרה בעצמכם.

אם המידע הזה עזר לכם, תוכלו לומר תודה ב-LinkedIn, ב-X (לשעבר Twitter) או בכל רשת חברתית אחרת שבה אתם משתמשים באמצעות ה-hashtag #WebAI. נשמח לקבל ממך משוב כדי שנדע לכתוב דברים כאלה בעתיד.

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

אישורים

תודה רבה לכל חברי צוות Chrome שעזרו לנפות באגים בבעיות של מנהלי ההתקנים וה-WebGPU שבהם נתקלנו בפתרון זה. אנו מודים לך במיוחד על ג'סלין יין ואלכסנדרה ווייט שסייעו בניסוח הפוסט בבלוג. תודה ליולי נוביקוב, אנדריי קוסיאקוב ואלכס רודנקו שעזרו מאוד ליצור את הפתרון הסופי והעובד.