Tăng cường hiệu quả kiểm thử mô hình AI cho web: WebGPU, WebGL và Chrome không có giao diện người dùng

[Tên người]
Jason Mayes
François Beaufort
François Beaufort

Tin vui! Bạn đã tạo được một ứng dụng AI trên web thú vị chạy các mô hình học máy ngay trên thiết bị của người dùng. Công cụ này chạy hoàn toàn trên trình duyệt web phía máy khách mà không cần dựa vào đám mây. Thiết kế trên thiết bị này giúp nâng cao quyền riêng tư của người dùng, tăng hiệu suất và giảm đáng kể chi phí.

Tuy nhiên, có một rào cản. Mô hình TensorFlow.js có thể hoạt động trên cả CPU (WebAssembly) và GPU mạnh hơn (thông qua WebGLWebGPU). Câu hỏi đặt ra là: làm thế nào để bạn có thể tự động hoá việc kiểm thử trình duyệt một cách nhất quán bằng phần cứng đã chọn?

Việc duy trì tính nhất quán là rất quan trọng trong quá trình so sánh hiệu suất của mô hình học máy theo thời gian khi bạn lặp lại và cải thiện các mô hình đó, trước khi triển khai cho người dùng thực tế sử dụng trên thiết bị của họ.

Việc thiết lập một môi trường kiểm thử nhất quán với GPU có thể khó hơn mong đợi. Trong bài đăng trên blog này, chúng tôi sẽ chia sẻ những vấn đề mà chúng tôi gặp phải cũng như cách giải quyết những vấn đề đó, để bạn có thể cải thiện hiệu suất của ứng dụng.

Nội dung này không chỉ dành cho nhà phát triển Web AI! Nếu bạn đang xử lý trò chơi trên web hoặc đồ hoạ, bài đăng này cũng có giá trị đối với bạn.

Nội dung trong hộp công cụ tự động hoá của chúng tôi

Dưới đây là những gì chúng tôi đang sử dụng:

  • Môi trường: Một sổ tay Google Colab dựa trên Linux được kết nối với GPU NVIDIA T4 hoặc V100. Bạn có thể sử dụng các nền tảng đám mây khác, chẳng hạn như Google Cloud (GCP) nếu muốn.
  • Trình duyệt: Chrome hỗ trợ WebGPU, một phiên bản kế thừa mạnh mẽ của WebGL, giúp đưa những tiến bộ của API GPU hiện đại lên web.
  • Tự động hoá: Puppeteer là một thư viện Node.js cho phép bạn kiểm soát các trình duyệt theo phương thức lập trình bằng JavaScript. Với Puppeteer, chúng tôi có thể tự động hoá Chrome ở chế độ không có giao diện người dùng, nghĩa là trình duyệt sẽ chạy mà không có giao diện hiển thị trên máy chủ. Chúng tôi đang dùng chế độ mới không có giao diện người dùng được cải tiến, chứ không phải phiên bản cũ.

Xác minh môi trường

Cách tốt nhất để kiểm tra xem tính năng tăng tốc phần cứng có được bật trong Chrome hay không là nhập chrome://gpu vào thanh địa chỉ. Bạn có thể thực hiện thao tác tương đương bằng Puppeteer theo phương thức lập trình với console.log hoặc lưu báo cáo đầy đủ dưới dạng PDF để kiểm tra theo cách thủ công:

/* 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();

Mở chrome://gpu và bạn sẽ thấy các kết quả sau:

Trạng thái của tính năng đồ hoạ
OpenGL: Đã tắt
Vulkan: Đã tắt
WebGL: Chỉ dùng được phần mềm, không dùng được tính năng tăng tốc phần cứng.
WebGL2: Chỉ dùng được phần mềm, không dùng được tính năng tăng tốc phần cứng.
WebGPU: Đã tắt

Đã phát hiện sự cố.
WebGPU đã bị tắt thông qua danh sách chặn hoặc dòng lệnh.

Không phải là một khởi đầu thuận lợi. Rõ ràng là tính năng phát hiện phần cứng đã không thành công. WebGL, WebGL2 và WebGPU về cơ bản đã bị tắt hoặc chỉ còn là phần mềm. Chúng tôi không đơn độc trong vấn đề này — có rất nhiều cuộc thảo luận trực tuyến của những người trong trường hợp tương tự, bao gồm cả trên các kênh hỗ trợ chính thức của Chrome (1), (2).

Bật tính năng hỗ trợ WebGPU và WebGL

Theo mặc định, Chrome không có giao diện người dùng sẽ tắt GPU. Để bật tính năng này trên Linux, hãy áp dụng tất cả cờ sau khi chạy Chrome không có giao diện người dùng:

  • Cờ --no-sandbox sẽ vô hiệu hoá hộp cát bảo mật của Chrome, giúp tách biệt quy trình trình duyệt với phần còn lại của hệ thống. Hệ thống không hỗ trợ việc chạy Chrome dưới dạng thư mục gốc mà không hỗ trợ hộp cát này.
  • Cờ --headless=new chạy Chrome ở chế độ không có giao diện người dùng mới và cải tiến mà không hiển thị bất kỳ giao diện người dùng nào.
  • Cờ --use-angle=vulkan yêu cầu Chrome sử dụng phần phụ trợ Vulkan cho ANGLE để dịch các lệnh gọi OpenGL ES 2/3 đến các lệnh gọi API Vulkan.
  • Cờ --enable-features=Vulkan cho phép phần phụ trợ đồ hoạ Vulkan kết hợp và tạo điểm ảnh trong Chrome.
  • Cờ --disable-vulkan-surface sẽ tắt tiện ích phiên bản vulkan VK_KHR_surface. Thay vì dùng chuỗi hoán đổi, Bit blit sẽ được dùng cho kết quả hiển thị hiện tại trên màn hình.
  • Cờ --enable-unsafe-webgpu sẽ bật API WebGPU thử nghiệm trong Chrome trên Linux và tắt danh sách chặn của bộ chuyển đổi.

Bây giờ, chúng ta kết hợp tất cả thay đổi đã thực hiện từ trước đến nay. Sau đây là tập lệnh hoàn chỉnh.

/* 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();

Chạy lại tập lệnh. Không phát hiện vấn đề WebGPU nào và giá trị thay đổi từ bị vô hiệu hoá thành chỉ phần mềm.

Trạng thái của tính năng đồ hoạ
OpenGL: Đã tắt
Vulkan: Đã tắt
WebGL: Chỉ dùng được phần mềm, không dùng được tính năng tăng tốc phần cứng.
WebGL2: Chỉ dùng được phần mềm, không dùng được tính năng tăng tốc phần cứng.
WebGPU: Chỉ dùng được phần mềm, không dùng được tính năng tăng tốc phần cứng.

Tuy nhiên, tính năng tăng tốc phần cứng vẫn chưa được hỗ trợ, nên không phát hiện thấy GPU NVIDIA T4.

Cài đặt đúng trình điều khiển GPU

Chúng tôi đã điều tra kỹ hơn kết quả của chrome://gpu với một số chuyên gia GPU trong nhóm Chrome. Chúng tôi phát hiện thấy vấn đề với trình điều khiển mặc định được cài đặt trên phiên bản Linux Colab, gây ra sự cố với Vulkan, dẫn đến việc Chrome không phát hiện được GPU NVIDIA T4 ở cấp GL_RENDERER như minh hoạ trong kết quả sau. Điều này gây ra các sự cố với Chrome không có giao diện người dùng.

Đầu ra mặc định không phát hiện thấy GPU NVIDIA T4.
Thông tin về người lái xe
GL_RENDERER ANGLE (Google, Vulkan 1.3.0 (Thiết bị SwiftShader (Subzero) (0x0000C0DE)), SwiftShader trình điều khiển-5.0.0)

Do đó, bạn có thể khắc phục vấn đề này bằng cách cài đặt đúng trình điều khiển tương thích.

Đầu ra được cập nhật sau khi cài đặt trình điều khiển.
Thông tin về người lái xe
GL_RENDERER ANGLE (NVIDIA Corporation, Tesla T4/PCIe/SSE2, OpenGL ES 3.2 NVIDIA 525.105.17)

Để cài đặt đúng trình điều khiển, hãy chạy các lệnh sau trong khi thiết lập. Hai dòng cuối cùng giúp bạn ghi nhật ký đầu ra của những gì trình điều khiển NVIDIA phát hiện cùng với vulkaninfo.

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

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

Bây giờ, hãy chạy lại tập lệnh và chúng ta sẽ nhận được kết quả sau. 🎉

Trạng thái của tính năng đồ hoạ
OpenGL: Đã bật
Vulkan: Đã bật
WebGL: Phần cứng được tăng tốc nhưng hiệu suất giảm.
WebGL2: Phần cứng được tăng tốc nhưng hiệu suất giảm.
WebGPU: Phần cứng được tăng tốc nhưng hiệu suất giảm.

Bằng cách sử dụng đúng trình điều khiển và cờ khi chạy Chrome, giờ đây chúng tôi có hỗ trợ WebGPU và WebGL nhờ sử dụng chế độ mới, không có giao diện người dùng.

Hậu trường: Cuộc điều tra của nhóm chúng tôi

Sau nhiều nghiên cứu, chúng tôi không tìm thấy các phương thức làm việc cho môi trường chúng tôi cần thực thi trong Google Colab, mặc dù một số bài đăng hy vọng đã hoạt động hiệu quả trong các môi trường khác, và điều này rất khả quan. Cuối cùng, chúng tôi không thể tái tạo thành công như vậy trong môi trường Colab NVIDIA T4 vì gặp phải 2 vấn đề chính:

  1. Một số tổ hợp cờ cho phép phát hiện GPU, nhưng không cho phép bạn thực sự sử dụng GPU.
  2. Ví dụ về giải pháp hoạt động của bên thứ ba đã sử dụng phiên bản Chrome cũ không có giao diện người dùng. Đến một thời điểm nào đó, phiên bản này sẽ không được dùng nữa và thay vào đó là phiên bản mới. Chúng tôi cần một giải pháp hoạt động với phiên bản Chrome không có giao diện người dùng mới để cải thiện hiệu quả hoạt động trong tương lai.

Chúng tôi xác nhận việc sử dụng GPU chưa hiệu quả bằng cách chạy một trang web mẫu của TensorFlow.js để nhận dạng hình ảnh, trong đó chúng tôi đã huấn luyện một mô hình để nhận dạng các mẫu quần áo (giống như mô hình máy học "chào thế giới").

Trên máy thông thường, 50 chu kỳ huấn luyện (còn gọi là thời gian bắt đầu của hệ thống) sẽ chạy trong mỗi chu kỳ chưa đến 1 giây. Khi gọi Chrome không có giao diện người dùng ở trạng thái mặc định, chúng tôi có thể ghi đầu ra của bảng điều khiển JavaScript vào dòng lệnh phía máy chủ Node.js để xem các chu kỳ huấn luyện này thực sự diễn ra nhanh đến mức nào.

Đúng như dự kiến, mỗi khoảng thời gian huấn luyện mất nhiều thời gian hơn dự kiến (vài giây), điều này cho thấy Chrome đã quay lại sử dụng quá trình thực thi CPU JS cũ thay vì sử dụng GPU:

Thời gian huấn luyện di chuyển với tần suất chậm hơn.
Hình 1: Thông tin ghi lại theo thời gian thực cho thấy thời gian cần thiết để thực thi từng khoảng thời gian bắt đầu của hệ thống huấn luyện (giây).

Sau khi sửa các trình điều khiển và sử dụng tổ hợp cờ phù hợp cho Chrome không có giao diện người dùng, việc chạy lại ví dụ huấn luyện TensorFlow.js sẽ dẫn đến thời gian đào tạo nhanh hơn nhiều.

Có sự gia tăng về tốc độ trong các khoảng thời gian bắt đầu của hệ thống.
Hình 2: Chụp ảnh theo thời gian thực cho thấy tốc độ của các khoảng thời gian bắt đầu của hệ thống.

Tóm tắt

AI trên web đã phát triển theo cấp số nhân kể từ khi được tạo ra vào năm 2017. Với các công nghệ trình duyệt như WebGPU, WebGL và WebAssembly, hoạt động toán học của một mô hình học máy có thể được tăng tốc hơn nữa ở phía máy khách.

Tính đến năm 2023, TensorFlow.js và MediaPipe Web đã vượt hơn 1 tỷ lượt tải mô hình và thư viện xuống. Đây là một cột mốc lịch sử và là dấu hiệu cho thấy các nhà phát triển và kỹ sư web đang chuyển dần sang việc sử dụng trí tuệ nhân tạo (AI) trong các ứng dụng web thế hệ mới để tạo ra một số giải pháp thực sự ấn tượng.

Việc sử dụng thành công đi kèm với trách nhiệm lớn. Ở mức độ sử dụng này trong các hệ thống sản xuất, bạn cần kiểm thử các mô hình AI dựa trên trình duyệt, phía máy khách trong môi trường trình duyệt thực sự, đồng thời có thể mở rộng, tự động hoá và trong chế độ thiết lập phần cứng được chuẩn hoá đã biết.

Bằng cách khai thác sức mạnh kết hợp của trình duyệt Chrome và Puppeteer không có giao diện người dùng mới, bạn có thể tự tin thử nghiệm những tải công việc như vậy trong môi trường được chuẩn hoá và có thể nhân rộng, đảm bảo kết quả nhất quán và đáng tin cậy.

Tóm tắt

Hướng dẫn từng bước có trong tài liệu của chúng tôi để bạn có thể tự mình thử nghiệm toàn bộ quy trình thiết lập.

Nếu bạn thấy phương pháp này hữu ích, hãy đăng lời cảm ơn trên LinkedIn, X (trước đây là Twitter) hoặc bất kỳ mạng xã hội nào bạn sử dụng bằng hashtag #WebAI. Chúng tôi rất mong nhận được ý kiến phản hồi của bạn để chúng tôi có thể tiếp tục viết thêm những nội dung tương tự trong tương lai.

Thêm dấu sao vào kho lưu trữ GitHub để nhận mọi bản cập nhật trong tương lai.

Xác nhận

Xin chân thành cảm ơn tất cả các bạn trong nhóm Chrome đã giúp chúng tôi khắc phục các vấn đề về trình điều khiển và GPU mà chúng tôi gặp phải trong giải pháp này. Xin chân thành cảm ơn Jecelyn YeenAlexandra White vì đã hỗ trợ trong bài đăng này trên blog. Nhờ Yuly Novikov, Andrey Kosyakov và Alex Rudenko đóng vai trò quan trọng trong việc tạo ra giải pháp hiệu quả cuối cùng.