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ị chạy các mô hình học máy ngay trên thiết bị của người dùng. Nó 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. Trên thiết bị này thiết kế 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 chi phí đáng kể.

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 là: làm cách nào để tự động hoá quy trình kiểm thử trình duyệt với phần cứng đã chọn một cách nhất quán?

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

Thiết lập môi trường thử nghiệm nhất quán với GPU có thể khó hơn như dự kiến. Trong bài đăng này trên blog, chúng tôi sẽ chia sẻ những vấn đề đã gặp phải và cách giải quyết chúng để 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 phát triển trò chơi trên web hoặc hình ảnh đồ hoạ, 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: Google Colab dựa trên Linux sổ tay kết nối với một NVIDIA GPU T4 hoặc V100. Bạn có thể dùng các nền tảng đám mây khác, chẳng hạn như Google Cloud (GCP), nếu được ưu tiên.
  • Trình duyệt: Chrome hỗ trợ WebGPU, một người kế nhiệm mạnh mẽ của WebGL, mang đến những tiến bộ của API GPU hiện đại cho 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 cách có lập trình bằng JavaScript. Với Puppeteer, chúng ta 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 mà không cần giao diện rõ ràng trên máy chủ. Chúng tôi đang sử dụng chế độ không có giao diện người dùng mới, 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 chế độ 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ể theo phương thức lập trình thực hiện tương đương với Puppeteer 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ẽ 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 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. T4 thì không đơn độc trong vấn đề này. Ngoài ra còn có rất nhiều cuộc thảo luận trực tuyến về mọi người trong trường hợp tương tự, kể 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 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 Không có giao diện người dùng 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 trình duyệt với phần còn lại của hệ thống. Chạy Chrome ở chế độ gốc mà không cần hộp cát này không được hỗ trợ.
  • 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 mà không có giao diện người dùng nào hiển thị.
  • Cờ --use-angle=vulkan yêu cầu Chrome sử dụng Phần phụ trợ Vulkan dành cho ANGLE. dịch lệnh gọi OpenGL ES 2/3 thành lệnh gọi API Vulkan.
  • Cờ --enable-features=Vulkan bật phần phụ trợ đồ hoạ Vulkan cho kết hợp và tạo điểm ảnh trong Chrome.
  • Cờ --disable-vulkan-surface tắt tiện ích thực thể vulkan VK_KHR_surface. Thay vì sử dụng chuỗi hoán đổi, Bit blit được dùng cho hiển thị kết quả kết xuất 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. 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 sự cố WebGPU nào và giá trị thay đổi từ chỉ bị tắt đối với 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 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 khả dụng, GPU NVIDIA T4 không .

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

Chúng tôi đã điều tra kỹ hơn về kết quả của chrome://gpu, cùng 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 Colab trên Linux 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. Chiến dịch này gây ra sự cố với Headless Chrome.

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ố.

Kết quả 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 quá trình thiết lập. Hai dòng cuối cùng giúp bạn ghi lại đầ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 tính năng đồ hoạ
OpenGL: Đã bật
Vulkan: Đã bật
WebGL: Tăng tốc phần cứng 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: Tăng tốc phần cứng 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 ta có WebGPU và hỗ trợ WebGL bằng chế độ không có giao diện người dùng mới, sáng bóng.

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 hiệu quả cho môi trường mà chúng tôi cần thực thi trong Google Colab, mặc dù có một số những bài đăng đầy 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 có 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 đã có 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 làm việc của các bên thứ ba đã sử dụng giao diện người dùng cũ của Chrome mà tại một thời điểm nào đó sẽ bị ngừng sử dụng 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 Headless Chrome mới để chuẩn bị tốt hơn cho tương lai.

Chúng tôi đã xác nhận việc GPU chưa được sử dụng hết bằng cách chạy một trang web TensorFlow.js mẫu để 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 (khá giống với "xin chào thế giới" của công nghệ học máy).

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 ít thời gian hơn hơ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 ta có thể ghi nhật ký đầu ra của bảng điều khiển JavaScript đến dòng lệnh Node.js phía máy chủ để xem nhanh chóng mà những chu kỳ đào tạo này thực sự cần đến.

Đú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ũ đơn giản 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: Hình ảnh chụp theo thời gian thực cho thấy thời gian thực thi của mỗi epoch huấn luyện (giây).

Sau khi sửa lỗi trình điều khiển và sử dụng kết hợp cờ hiệu phù hợp cho Không có giao diện người dùng Chrome, việc chạy lại ví dụ huấn luyện TensorFlow.js sẽ mang lại kết quả nhanh hơn nhiều khoảng thời gian bắt đầu huấn luyện.

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: Ảnh 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 ra mắt vào năm 2017. Với các công nghệ trình duyệt như WebGPU, WebGL và WebAssembly, một mô hình học máy các phép toán 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 đã đạt hơn 1 tỷ lượt tải xuống mô hình và thư viện—một cột mốc lịch sử và dấu hiệu cho thấy cách các nhà phát triển và kỹ sư đang dần chuyển sang sử dụng AI trong thế hệ mới ứng dụng web để 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. Ở mức sử dụng này trong các hệ thống phát hành công khai, nhu cầu thử nghiệm 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 có thể mở rộng, tự động 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 tra những tải công việc đó bằng cách môi trường, đảm bảo kết quả nhất quán và đáng tin cậy.

Tóm tắt

Bạn có thể xem hướng dẫn từng bước tại 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 bài viết này hữu ích, hãy chia sẻ 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 để có thể viết thêm nhiều bài viết như thế này trong tương lai.

Thêm dấu sao trên kho lưu trữ GitHub để nhận mọi thông tin 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à Những vấn đề của WebGPU mà chúng tôi gặp phải trong giải pháp này, với lời cảm ơn đặc biệt đến Jecelyn YeenAlexandra White đã giúp tôi phát triển từ vựng bài đăng trên blog này. Cảm ơn Yuly Novikov, Andrey Kosyakov và Alex Rudenko đã đóng góp vào việc tạo ra giải pháp cuối cùng và hiệu quả.