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

François Beaufort
François Beaufort

Tin vui! Bạn đã xây dựng một ứng dụng AI trên web thú vị có thể chạy các mô hình học máy ngay trên thiết bị của người dùng. Giải pháp 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 tăng cường 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 cách nào để tự động hoá quy trình kiểm thử trình duyệt một cách nhất quán với phần cứng đã chọn?

Duy trì tính nhất quán là yếu tố quan trọng trong việc 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 để 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 thử nghiệm nhất quán với GPU có thể khó hơn dự kiến. Trong bài đăng này trên blog, chúng tôi sẽ chia sẻ các vấn đề gặp phải và cách giải quyết. Nhờ đó, bạn có thể cải thiện hiệu suất của ứng dụng.

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

Nội dung của chúng tôi về công cụ tự động hoá

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

  • Môi trường: Sổ tay Google Colab dựa trên Linux 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, phiên bản kế thừa mạnh mẽ của WebGL, mang 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 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, tức là trình duyệt chạy trên máy chủ mà không có giao diện rõ ràng. Chúng tôi đang dùng chế độ không có giao diện người dùng mới được cải tiến, chứ không phải biểu mẫu .

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ó bật trong Chrome hay không là nhập chrome://gpu vào thanh địa chỉ. Bạn có thể lập trình để thực hiện tương đương với Puppeteer bằng 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ẽ có kết quả như sau:

Trạng thái của tính năng đồ hoạ
OpenGL: Đã tắt
Vulkan: Đã tắt
WebGL: Chỉ phần mềm, không dùng được tính năng tăng tốc phần cứng.
WebGL2: Chỉ 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 thấy 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 tuyệt vời. Rõ ràng là đã không phát hiện được phần cứng. WebGL, WebGL2 và WebGPU về cơ bản bị vô hiệu hoá hoặc chỉ sử dụng phần mềm. Chúng tôi không chỉ gặp vấn đề này một mình. Chúng tôi có rất nhiều cuộc thảo luận trực tuyến về những người gặp phải tình huống tương tự, bao gồm cả trên các kênh hỗ trợ Chrome chính thức (1), (2).

Bật hỗ trợ WebGPU và WebGL

Theo mặc định, Headless Chrome sẽ tắt GPU. Để bật chế độ này trên Linux, hãy áp dụng tất cả các cờ sau khi chạy Headless Chrome:

  • Cờ --no-sandbox sẽ tắt hộp cát bảo mật của Chrome, giúp tách biệt quy trình duyệt với phần còn lại của hệ thống. Không hỗ trợ chạy Chrome ở chế độ gốc mà không có hộp cát này.
  • Cờ --headless=new chạy Chrome bằng chế độ không có giao diện người dùng mới và đã cải tiến, không hiển thị 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, giúp dịch các lệnh gọi OpenGL ES 2/3 thành các lệnh gọi API Vulkan.
  • Cờ --enable-features=Vulkan bật phần phụ trợ đồ hoạ Vulkan để kết hợp và tạo điểm ảnh trong Chrome.
  • Cờ --disable-vulkan-surface sẽ vô hiệu hoá tiện ích thực thể vulkan VK_KHR_surface. Thay vì sử dụng chuỗi hoán đổi, Bit blit sẽ được dùng cho kết quả hiển thị hiện trên màn hình.
  • Cờ --enable-unsafe-webgpu 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ả những thay đổi đã thực hiện từ trước đến nay. Đâ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 thấy sự cố WebGPU nào và giá trị thay đổi từ chỉ tắt 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ỉ phần mềm, không dùng được tính năng tăng tốc phần cứng.
WebGL2: Chỉ phần mềm, không dùng được tính năng tăng tốc phần cứng.
WebGPU: Chỉ 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 không dùng được nên không phát hiện được 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 có 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 thể phát hiện GPU NVIDIA T4 ở cấp GL_RENDERER như minh hoạ trong kết quả sau đây. Điều này gây ra sự cố với Chrome không có giao diện người dùng.

Dữ liệu đầu ra mặc định không phát hiện được 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)), trình điều khiển SwiftShader-5.0.0)

Do đó, việc cài đặt đúng trình điều khiển tương thích sẽ khắc phục được sự cố.

Cập nhật kết quả 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 quá trình thiết lập. Hai dòng cuối cùng giúp bạn ghi lại kết quả đầu ra của những 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 nhận được kết quả sau đây. 🎉

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 sử dụng chế độ không có giao diện người dùng mới, nổi bật.

Cảnh 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 phương pháp hoạt động cho môi trường cần thực thi trong Google Colab, mặc dù có một số bài đăng hy vọng đã hoạt động hiệu quả trong các môi trường khác đầy hứa hẹn. Cuối cùng, chúng tôi không thể tái tạo thành công của họ trong môi trường Colab NVIDIA T4, vì chúng tôi 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ề các giải pháp hoạt động của bên thứ ba đã sử dụng phiên bản không có giao diện người dùng cũ của Chrome. Phiên bản này tại một thời điểm nào đó 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 hiệu quả với Headless Chrome mới để phù hợp hơn với tương lai.

Chúng tôi xác nhận việc chưa khai thác GPU bằng cách chạy một trang web ví dụ TensorFlow.js để nhận dạng hình ảnh, qua đó 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ư công nghệ học máy "xin chào thế giới").

Trên một 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 chưa đầy 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 nhật ký đầu ra của bảng điều khiển JavaScript vào dòng lệnh Node.js phía máy chủ để xem tốc độ thực sự của các chu kỳ huấn luyện này.

Đú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 phương thức thực thi CPU JS cũ thay vì sử dụng GPU:

Các thời gian bắt đầu của quá trình huấn luyện diễn ra với tần suất chậm hơn.
Hình 1: Tính năng chụp theo thời gian thực cho thấy thời gian thực thi mỗi khoảng thời gian bắt đầu của hệ thống huấn luyện (giây).

Sau khi khắc phục các trình điều khiển và sử dụng tổ hợp cờ phù hợp cho Headless Chrome, việc chạy lại ví dụ huấn luyện TensorFlow.js sẽ giúp thời gian huấn luyện bắt đầu nhanh hơn nhiều.

Tốc độ trong các khoảng thời gian bắt đầu của hệ thống sẽ tăng lên.
Hình 2: Tính năng chụp 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 thành lập vào năm 2017. Với các công nghệ trình duyệt như WebGPU, WebGL và WebAssembly, các hoạt động toán học của 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 qua hơn 1 tỷ lượt tải mô hình và thư viện xuống – một cột mốc lịch sử và là một dấu hiệu cho thấy cách các nhà phát triển web và kỹ sư đang chuyển sang sử dụng 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ự đáng kinh ngạc.

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

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

Tóm tắt

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

Nếu bạn thấy tính năng này hữu ích, hãy gửi 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 mà bạn sử dụng kèm 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 trên 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ả mọi người trong nhóm Chrome đã giúp gỡ lỗi trình điều khiển và các vấn đề về WebGPU mà chúng tôi gặp phải trong giải pháp này, đồng thời gửi lời cảm ơn đặc biệt đến Jecelyn YeenAlexandra White vì đã giúp viết bài đăng trên blog này. Nhờ có Yuly Novikov, Andrey Kosyakov và Alex Rudenko, là những người có công trong việc tạo ra giải pháp cuối cùng và hoạt động.