3 điểm bởi GN⁺ 2025-07-17 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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
  • WebGPUgiao 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, LinuxAndroid 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ăngtuâ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 W3Ctiê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ở RustWGPU
    • 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íchmứ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

 
GN⁺ 2025-07-17
Ý 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 char thay vì chuỗi chỉ vì hiệu năng

    • Tô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, cuMemcpy là 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ợ"

    • Tôi là thành viên của đội WebGPU Firefox
      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.

    • Còn tùy là Linux nào
      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ử

  • Có vẻ Firefox sẽ hỗ trợ WebGPU trên Linux trước cả Chrome

    • Thực ra điều đó hơi bất ngờ
      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