WebGPU: Mẹo khắc phục sự cố và bản sửa lỗi

François Beaufort
François Beaufort

Tài liệu này giải thích lý do tại sao WebGPU có thể không hoạt động hoặc không hoạt động như mong đợi trong trình duyệt Chrome, với các bước rõ ràng để giải quyết vấn đề nếu có thể.

Ví dụ sau đây minh hoạ lỗi JavaScript mà bạn có thể gặp phải khi gpu không có trong navigator:

const adapter = await navigator.gpu.requestAdapter();
cancel Uncaught TypeError: Cannot read properties of undefined (reading 'requestAdapter')

Điều này có thể là do một trong những lý do sau. Hãy xem các sản phẩm đó theo thứ tự cụ thể sau:

  1. WebGPU yêu cầu Chrome 113 trở lên trên ChromeOS, macOS, Windows và Chrome 121 trở lên trên Android. Hãy kiểm tra phiên bản của bạn tại chrome://version và cập nhật nếu cần.

  2. Hiện không thể truy cập WebGPU từ một trình chạy dịch vụ hoặc một trình chạy dùng chung. Nếu bạn sử dụng trình chạy dịch vụ hoặc trình thực thi dùng chung, hãy di chuyển mã WebGPU sang một trình thực thi chuyên dụng hoặc trình thực thi cửa sổ chung.

  3. WebGPU chỉ có thể truy cập được qua các ngữ cảnh an toàn. Nếu bạn phân phát mã qua một giao thức không an toàn (ví dụ: http:, file:), hãy sử dụng giao thức https: bảo mật hoặc giải quyết vấn đề này trong quá trình phát triển ứng dụng web theo một trong những cách sau:

    • Phân phát mã của bạn cục bộ trên http://localhost hoặc http://127.0.0.1 bằng một trong các lệnh sau: npx http-server hoặc python3 -m http.server.

    • Thêm nguồn gốc này vào danh sách "Các nguồn gốc không an toàn được coi là an toàn" của chrome://flags/#unsafely-treat-insecure-origin-as-secure rồi khởi động lại Chrome.

    • Cài đặt Node.js và chạy npx servez --ssl để phân phát thư mục của bạn qua https bằng chứng chỉ giả mạo. Bạn vẫn sẽ nhận được cảnh báo trong Chrome mà bạn có thể bỏ qua bằng cách nhấp vào "Nâng cao" rồi nhấp vào "Tiếp tục...".

    • Hiển thị máy chủ web cục bộ của bạn trên Internet bằng ngrok.

Bộ điều hợp GPU bị rỗng

Sau đây là ví dụ về lỗi JavaScript mà bạn có thể gặp phải khi bộ chuyển đổi bạn nhận được từ việc gọi requestAdapter() có giá trị rỗng:

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
cancel Uncaught TypeError: Cannot read properties of undefined (reading requestDevice)

Điều này xảy ra vì một trong những lý do sau. Hãy xem các sản phẩm đó theo thứ tự cụ thể sau:

  1. WebGPU sẽ bị tắt khi người dùng tắt tuỳ chọn "Sử dụng tính năng tăng tốc đồ hoạ khi có" trong chrome://settings/system. Kiểm tra xem chế độ cài đặt này đã tắt hay chưa rồi bật lại

  2. WebGPU chưa được hỗ trợ trên nền tảng này. Bạn có thể bật cờ chrome://flags/#enable-unsafe-webgpu và khởi động lại Chrome. Để hỗ trợ thử nghiệm cho Linux, bạn cũng cần bật cờ chrome://flags/#enable-vulkan. Hãy xem bài viết hỗ trợ WebGPU trong giao diện người dùng Chrome để tìm hiểu thêm.

  3. Phần cứng GPU đã bị đưa vào danh sách chặn. Nếu thấy thông báo "WebGPU đã bị tắt qua danh sách chặn hoặc dòng lệnh" trong chrome://gpu, bạn có thể tắt danh sách chặn bộ chuyển đổi WebGPU bằng cách bật cờ chrome://flags/#enable-unsafe-webgpu và khởi động lại Chrome.

  4. Không có bộ chuyển đổi GPU nào phù hợp với các tuỳ chọn được truyền vào requestAdapter(). Hãy thử gọi requestAdapter() bằng các tuỳ chọn khác.

  5. WebGPU yêu cầu GPU (mô phỏng phần cứng hoặc phần mềm). Bạn có thể kiểm tra xem Chrome có phát hiện thấy GPU hay không bằng cách truy cập chrome://gpu.

WebGPU chậm hơn WebGL

  1. Mở chrome://gpu và đảm bảo bạn có thể đọc phần "WebGPU: Hardware Accelerated Accelerated (Đã tăng tốc phần cứng)". Nếu bạn đọc "WebGPU: Chỉ phần mềm, tăng tốc phần cứng không khả dụng", bạn có thể cần phải cập nhật trình điều khiển GPU của mình.

  2. Việc dịch trực tiếp các khái niệm WebGL sang WebGPU có thể không tận dụng được hết khả năng tối ưu hóa độc đáo của WebGPU. Hãy khám phá nội dung Từ WebGL đến WebGPU để tìm hiểu về một số khác biệt giữa hai thiết bị này.

Giới hạn dành riêng cho Windows

Hãy lưu ý các hạn chế sau khi sử dụng WebGPU trên thiết bị Windows:

  • Chrome không hỗ trợ sử dụng đồng thời nhiều bộ điều hợp GPU. Xem phần vấn đề về crôm:329211593.

  • Chrome luôn sử dụng cùng một bộ chuyển đổi GPU được phân bổ cho các tải công việc khác trên Chrome, đối với máy tính xách tay thường là thẻ đồ hoạ tích hợp do khía cạnh sử dụng điện năng (ví dụ: tiết kiệm điện năng). Điều này có nghĩa là tuỳ chọn powerPreference không có bất kỳ ảnh hưởng nào khi gọi requestAdapter().