- WebGPU sau thời gian dài phát triển nay đã được hỗ trợ chính thức trên Firefox 141 cho Windows
- WebGPU là giao diện GPU dựa trên web dành cho xử lý đồ họa hiện đại và tính toán hiệu năng cao, được kỳ vọng sẽ nâng tầm đáng kể game·trực quan hóa·tính toán cục bộ
- Việc triển khai WebGPU trong Firefox được xây dựng trên thư viện WGPU dựa trên Rust, hỗ trợ nhiều backend như Direct3D 12, Metal, Vulkan
- Hiện tại mới chỉ được bật chính thức trên Windows, còn hỗ trợ cho Mac, Linux và Android sẽ có sau
- Vẫn còn các hạng mục phát triển bổ sung như cải thiện hiệu năng và tuân thủ tiêu chuẩn
Ý nghĩa của việc hỗ trợ WebGPU trên Windows
- WebGPU được phát triển trong thời gian dài nay đã chính thức có mặt trên Firefox 141 trong môi trường Windows
- WebGPU là tiêu chuẩn mới cho phép nội dung web liên kết trực tiếp với GPU của người dùng để hiện thực hóa đồ họa hiệu năng cao và tính toán song song
- Nhờ công nghệ này, giới hạn hiệu năng trong nhiều lĩnh vực như game trên web, trực quan hóa dữ liệu, machine learning được kỳ vọng sẽ được mở rộng đáng kể
- Có thể học và thực hành qua hướng dẫn WebGPU, mẫu WebGPU, và tài liệu MDN
- WebGPU được định nghĩa bởi tiêu chuẩn WebGPU của W3C và tiêu chuẩn WGSL; Mozilla đã tích cực tham gia quá trình tiêu chuẩn hóa từ năm 2017
Tình hình WebGPU theo từng trình duyệt
- Trên Chrome, WebGPU đã được hỗ trợ từ năm 2023
- Safari 26 dự kiến phát hành vào mùa thu năm nay
- Firefox 141 hiện mới hỗ trợ chính thức trên Windows, còn Mac/Linux/Android sẽ được mở rộng trong các bản cập nhật sau
- Trong bản Firefox Nightly, trước đây tính năng này đã có thể dùng thử trên mọi nền tảng ngoại trừ Android
Cách Firefox triển khai WebGPU
- WebGPU của Firefox được phát triển dựa trên thư viện mã nguồn mở Rust là WGPU
- WGPU kết nối với các API đồ họa mức thấp như Direct3D 12, Metal, Vulkan để phù hợp với phần cứng trên nhiều nền tảng khác nhau
- Mozilla là một trong những bên đóng góp chính cho dự án WGPU
- Nếu là lập trình viên Rust, muốn đóng góp cho WebGPU trong Firefox thì nên bắt đầu từ dự án WGPU
- WGPU cũng được dùng rộng rãi ngoài Firefox và có một cộng đồng rất sôi động
Các thách thức chính và công việc cải thiện
- WebGPU là một API lớn và phức tạp; đến nay việc ổn định hóa chủ yếu tập trung vào các demo chính và các trường hợp sử dụng thực tế
- Những khu vực cần cải thiện thêm:
- Giải quyết vấn đề suy giảm hiệu năng do IPC không đệm với tiến trình sandbox GPU (bug 1968122, dự kiến cải thiện hiệu năng trong Firefox 142)
- Độ trễ tăng lên do chỉ phát hiện thời điểm hoàn tất tác vụ GPU bằng interval timer (bug 1870699, đang được cải thiện bằng cách tốt hơn)
- Chưa hỗ trợ importExternalTexture, nên không thể đọc trực tiếp dữ liệu video từ bộ giải mã sang GPU (bug 1827116, đang được phát triển)
- Nếu gặp vấn đề trong quá trình sử dụng thực tế, cần báo cáo kèm chi tiết tại thành phần WebGPU trên Bugzilla
Kế hoạch sắp tới
- Sau Windows, hỗ trợ chính thức sẽ lần lượt mở rộng sang Mac, Linux, Android
- Có kế hoạch tiếp tục cải thiện hiệu năng, tính tương thích và mức độ tuân thủ tiêu chuẩn
- Việc hỗ trợ chính thức WebGPU được kỳ vọng sẽ mở ra những khả năng mới cho ứng dụng web
1 bình luận
Ý kiến trên Hacker News
Đây đúng là tin rất đáng mong chờ, xin chúc mừng đội ngũ Firefox
Công ty tôi đang phát triển để có thể chạy Unreal trong trình duyệt, và đã xây dựng một WebGPU RHI tùy chỉnh cho Unreal Engine 5
Ai muốn xem trực tiếp bản demo kỹ thuật thì tham khảo các liên kết bên dưới
(Chỉ hoạt động trên các trình duyệt desktop nền Chromium và một số điện thoại Android)
Cropout: https://play-dev.simplystream.com/?token=aa91857c-ab14-4c24-963a-36203784474b
Car configurator: https://garage.cjponyparts.com/
Tôi đã thử trên Firefox 142 (nightly)
Cropout đứng ở 0% rất lâu trong khi có hơn 1200 request mạng
Cuối cùng có tải đến menu, nhưng nền màu đen và chỉ thấy các thành phần UI
Có rất nhiều lỗi khi parse shader và cả các lỗi khác nữa
Car configurator cũng báo nhiều lỗi, đứng ở 0% và không tải được
Có thông báo rằng "thiếu file game nên khó khởi tạo global shader và nội dung"
Mong là ít nhất đã thử nghiệm tối thiểu trên Firefox trước khi chia sẻ
Dù đã nói là "chỉ hoạt động trên trình duyệt nền Chromium", nhưng vì bài này đang nói đúng về WebGPU của Firefox, nên
tôi muốn hỏi liệu có kế hoạch thử nghiệm hoặc phát hành phiên bản tương thích với Firefox hay không
Tôi thử chạy "cropout" trên Android Chrome với Pixel 7a thì nó đứng ở 0%
"car configurator" chạy đến khoảng 97~98% nhưng sau đó không tiến thêm nữa
Không rõ nó có chạy trên Windows dùng Firefox 141 hay không
Nếu không thì tôi muốn biết lý do là gì
Trên Google Chrome cho macOS, liên kết đầu tiên đứng ở 0% và không nhúc nhích
bản demo thứ hai dừng ở 98% hoặc 97%
Safari cũng có hiện tượng tương tự
Nhìn tình hình graphics API hiện nay, tôi có cảm giác nó còn thụt lùi hơn cả thời OpenGL
Tôi thấy các API hiện đại không thực sự mang lại sự tiện dụng trong sử dụng hay tính portable, cross-platform đúng nghĩa
Việc tạo wrapper tùy chỉnh cho nhiều graphics backend như Vulkan, Metal, DirectX12 thực ra gần như là lãng phí thời gian
Nó giống như quay lại dùng mảng
charthay vì chuỗi chỉ vì hiệu năngTôi không biết đã có lời hứa nào, và ai là người đưa ra lời hứa đó
Mục tiêu của graphics API vốn luôn là đưa code và dữ liệu vào GPU nhanh nhất có thể, chứ trải nghiệm lập trình viên chưa bao giờ là ưu tiên hàng đầu
Tôi cảm thấy WebGPU bọc khá tốt phần compute và render trong trình duyệt
Nó chưa hoàn hảo, nhưng theo tôi còn trực quan và dễ khám phá hơn WebGL hay OpenGL
Tôi không thực sự thấy vấn đề
Trong graphics stack đã có low-level API từ rất lâu rồi (ví dụ: Gallium của Mesa), giờ chỉ là chúng được chuẩn hóa và người dùng tự chọn dùng
High-level API vẫn tồn tại, và OpenGL vẫn được hỗ trợ trên các nền tảng hợp lý
WebGPU cũng dùng khá ổn trong native code
Việc các low-level API này thiếu tính portable thực sự gần như hoàn toàn là lỗi của Apple và các hãng sản xuất console
Dù vậy, với các hãng console thì vốn cũng không ai kỳ vọng họ sẽ hợp tác
Bài học rút ra từ thời OpenGL là việc mọi nền tảng cùng dùng một high-level API không hề đảm bảo kết quả tốt
Điều quan trọng rốt cuộc là có API nào kiểm soát tốt phần cứng của nền tảng đó hay không
Luôn cần các wrapper dịch OpenGL, và trước đây không có cách nào tránh được lớp wrapper này
Cách làm để đạt kết quả tốt nhất cho từng loại phần cứng là thiếu tính thực tiễn
Điều thực sự quan trọng là có cung cấp được một translation layer dễ dùng hay không
Nếu thực sự muốn tiếp cận phần cứng thật sâu, thì thay vì giao diện đơn giản hay tổng quát, bạn lại cần API cho phép đi thẳng tới phần cứng
OpenGL đã trở nên quá phức tạp từ sau 2.0, còn WebGPU thì bọc các tính năng của Vk, D3D12, Metal khá thuận tiện
Tôi nghĩ nó được thiết kế tốt hơn OpenGL rất nhiều
Ngoài ra, D3D11 và Metalv1 có lẽ là điểm cân bằng phù hợp nhất giữa tính dễ dùng và hiệu năng (đặc biệt là hiệu năng của D3D11 thì ngay cả Vulkan và D3D12 cũng khó theo kịp)
Tôi cũng đồng ý
Tôi vẫn sẽ tiếp tục phát triển với interop giữa OpenGL và CUDA
Vulkan quá over-engineered, độ phức tạp thì cao mà lợi ích thực tế khi dùng lại không có, nên rốt cuộc tôi chuyển sang dùng CUDA
Tôi vẫn hy vọng WebGPU sẽ mở rộng thành công ra ngoài môi trường trình duyệt
và trở thành một API cross-platform dễ dùng được chuẩn chính thức đề cập tới (tức là phương án thay thế cho opengl)
Nhưng ngoài phía Rust ra, tôi không cảm thấy có nhiều xu hướng muốn dùng WebGPU cho native code
Ví dụ, tôi chưa từng nghe về dự án lớn nào dùng Dawn
Có lẽ cũng vì WebGPU ra quá muộn, khi đa số đã tự xây xong lớp trừu tượng của họ trên dx, vulkan, metal
Xét cho cùng tôi nghĩ nó sẽ không phổ biến
Có hơi đơn giản hơn một chút, nhưng lại thiếu rất nhiều tính năng
Một số tính năng vốn là tùy chọn trong Vulkan (ví dụ: render pass) vẫn còn là bắt buộc trong WebGPU
Bind group mang tính tĩnh nên ngược lại còn bất tiện
WebGPU cũng có nhiều giới hạn và thành phần không cần thiết
Ví dụ, không thể ghi trực tiếp vào subregion của buffer từ host mà bắt buộc phải dùng buffer trung gian (staging buffer)
Vì không có lựa chọn thay thế nên tôi sẽ dùng nó trên web, nhưng trên desktop thì tôi vẫn sẽ tiếp tục với framework OpenGL+CUDA interop
Tôi đang chờ một graphics API hiện đại hợp lý hơn xuất hiện
Nếu một việc lẽ ra chỉ cần
cuMemAlloc,cuMemcpylà xong mà lại bị làm phức tạp bởi cấp phát và bind buffer rườm rà, pipeline, explicit sync, bind group, descriptor set cùng các thành phần thừa thãi khác, thì tôi không muốn dùng nóWebGPU không cung cấp mức tối ưu hóa và kiểm soát chi tiết như Vulkan, và hiệu năng cũng thường không bằng Vulkan
Nhiều extension có trong Vulkan cũng vẫn chưa được hỗ trợ trong WebGPU
Đã có middleware sẵn rồi
Ngoài trình duyệt thì tôi không nghĩ cần phải chờ WebGPU làm gì
Bởi vì bản thân thiết kế API tập trung vào sandbox của trình duyệt đã mang theo những ràng buộc riêng
Tôi cũng nghĩ cái tên của nó là một vấn đề lớn
Tôi là lập trình viên native thuần túy, nên nhiều năm qua cứ thấy tên "web gpu" là mặc định coi như công nghệ chỉ dành cho web và bỏ qua, đến khi tìm hiểu mới thấy mình đã hiểu nhầm
Tôi rất vui vì crate gpu-allocator của chúng tôi https://github.com/Traverse-Research/gpu-allocator/ có vẻ sẽ được nhiều người biết đến hơn nhiều
Từ trước đến nay nó được dùng cho backend dx12 của wgpu hoặc trong sản phẩm benchmark GPU riêng của chúng tôi là evolve https://www.evolvebenchmark.com/
Tôi hy vọng từ nay nó sẽ được ứng dụng rộng rãi hơn
Giờ tôi mới biết rằng đã có thể dùng WebGPU trên Firefox Nightly cho macOS
Tôi tải nightly cho Mac từ https://www.mozilla.org/en-US/firefox/channel/desktop/
rồi chạy demo https://huggingface.co/spaces/reach-vb/github-issue-generator-webgpu, và nó hoạt động tốt
Demo này biên dịch mô hình SmolLM2 sang WebAssembly để dùng cho trích xuất dữ liệu có cấu trúc
Trước đây tôi cứ nghĩ nó chỉ chạy trên Chrome, nhưng trên Firefox chính thức (Stable) thì báo lỗi "WebGPU không được hỗ trợ"
Hỗ trợ macOS sẽ sớm được phát hành chính thức
Ngoài Windows, chúng tôi cũng dự định sớm hỗ trợ WebGPU trên Mac, Linux, và cuối cùng là Android
Tôi thấy rất vui khi đọc được rằng "có kế hoạch hỗ trợ WebGPU trên Mac, Linux, và cuối cùng là Android"
Nhưng ở thời điểm hiện tại thì khó mà kỳ vọng quá nhiều
Tôi nghĩ lý do WebGPU lâu nay chưa thể hỗ trợ trên trình duyệt Linux có lẽ là vì quá khó để tạo thêm attack surface mới
Chính sự phức tạp này là bằng chứng cho thấy các chuẩn web đã trở nên khổng lồ đến mức khiến việc phát triển trình duyệt trở nên khó khăn
Ảnh hưởng của các quyết định thiết kế kéo dài từ thời Netscape đến giờ dường như vẫn còn, và là gốc rễ của những lo ngại về sự đơn nhất của web browser, vấn đề tài trợ, v.v.
Android/Linux, WebOS/Linux, ChromeOS/Linux thì đã hỗ trợ WebGPU rồi
Tuy nhiên, điều đó cũng cho thấy việc hỗ trợ loại workload này trên GNU/Linux có ưu tiên thấp từ phía các nhà cung cấp trình duyệt
Tôi cũng đang mong chờ bản triển khai cho Linux
Không biết khi có WebGPU thì có những demo nào đáng thử
Một trong những demo gây ấn tượng mạnh nhất với tôi là
https://github.com/ArthurBrussee/brush
huấn luyện và render Gaussian splatting dựa trên WebGPU
Tôi cũng xin giới thiệu các demo dùng Unity
Phần lớn các trang demo đều ở dạng web demo
Cá nhân tôi thích Compute Toys https://compute.toys/
Nó cho phép thử nghiệm compute shader WebGPU theo kiểu Shadertoy
Có thêm nhiều demo khác tại https://github.com/mikbry/awesome-webgpu
Ngoài ra còn có dự án để tự mình thử nghiệm https://github.com/s-macke/WebGPU-Lab
Các ví dụ của engine Bevy cũng cung cấp cả WebGL lẫn WebGPU
Rất hữu ích để học cách so sánh
Liên kết tham khảo: https://bevy.org/examples-webgpu/, https://bevy.org/examples
Một demo khá ấn tượng mà tôi muốn giới thiệu là https://huggingface.co/spaces/webml-community/kokoro-webgpu
Nó vẫn chạy được ngay cả khi không có WebGPU, nhưng sẽ rất chậm
Có vẻ Firefox sẽ hỗ trợ WebGPU trên Linux trước cả Chrome
Dù dawn (bản triển khai webgpu của Google) chạy trên Linux khá tốt, Firefox vẫn là bên hỗ trợ trước
Cuối cùng thì mọi người cũng bắt đầu hỗ trợ WebGPU, xin gửi một tràng pháo tay tới tất cả
Việc trước đây chỉ thử nghiệm WebGPU trên Chrome khiến tôi hơi khó chịu
Safari cũng недавно bắt đầu hỗ trợ trong các bản preview gần đây
Tôi đã dùng wgpu trong dự án chính của mình gần 2 năm nay
Tôi hy vọng việc WebGPU mở rộng lần này sẽ giúp có thêm maintainer
để các issue tôi mở từ 18 tháng trước được giải quyết nhanh hơn
Tôi vẫn chưa đụng tới Rust, nhưng hy vọng một ngày nào đó sẽ có động lực và thời gian để tự mình đóng góp
Tôi đang phụ thuộc vào binding wgpu-native, nhưng các bản cập nhật đến khá chậm
Ví dụ, tuần trước mới lên được v25, trong khi chỉ vài ngày trước đó v26 đã phát hành