AI-LECTURER 速報課|2026-09-02|約 25 分鐘

瀏覽器也能開 GPU:Hugging Face 兩百多個 WebGPU 核心一次上線

📍 真實場景
阿凱,新創公司的前端工程師,正在做一個「上傳照片就能在瀏覽器裡自動去背」的免費小工具

他想全靠使用者自己的顯卡在瀏覽器裡跑去背模型,不把照片傳到伺服器,也想省下雲端GPU費用

😖 卡住的地方:他自己手刻的 WebGPU shader 在自己的筆電上跑得又快又對,但使用者回報在別的品牌顯卡(尤其是筆電內顯)上跑起來慢到卡住,甚至偶爾算出錯誤結果;他不可能買齊市面上所有顯卡型號一台台測試
💡 這堂課會介紹 Hugging Face 剛推出的 @huggingface/kernels:一批已經在各種顯卡上驗證過正確性與效能的現成 WebGPU 運算積木,讓他不用自己重新造輪子,也不用自己湊齊一堆顯卡來測

🧭 這到底是什麼(白話版)

如果你玩過網頁上「上傳照片自動去背」或「打字馬上生成圖片」這類小工具,它靠的其實是 WebGPU一種讓網頁程式直接呼叫你電腦顯示卡(GPU)運算能力的瀏覽器技術規格,不用另外裝驅動程式或外掛。以前瀏覽器裡的運算幾乎都丟給CPU硬算,速度有限;WebGPU出現後,網頁終於能把矩陣乘法、影像處理這類「重複又大量」的運算丟給GPU平行處理,速度可以快上好幾倍。

但WebGPU只是一條「通往GPU的路」,真正在GPU上跑的程式要用另一種語言寫,叫 WGSLWebGPU Shading Language,一種專門描述「GPU要怎麼平行處理資料」的程式語言,寫出來的運作單位叫shader(著色器/運算程式)。矩陣相乘、正規化(讓數字範圍統一方便運算)、卷積(影像特徵擷取常用的運算)這些AI模型會用到的基本運算,每一個都要有人先寫好對應的 kernel針對某個特定運算(如矩陣乘法)寫成、可以直接丟給GPU執行的最小運算單元,可以把它想成「GPU積木」,而且同一個運算在不同品牌、不同型號的顯卡上,最佳寫法不同,效能可能差好幾倍。

這正是Hugging Face這次推出@huggingface/kernels要解決的問題:他們一次釋出207個已經寫好、測試過的WebGPU kernel,每一個都放在Hugging Face Hub上,附上正確性測試、效能測試和版本號,開發者只要用一行程式碼把需要的kernel「下載」下來直接呼叫,不用自己重新設計 workgroupGPU執行運算時,把工作切成一小群一小群同時處理的分組方式,分組大小會直接影響效能,是shader最容易寫壞、寫慢的地方之一 大小、量化quantization,把模型內部原本用高精度小數(如32位元浮點數)儲存的數字,改成用更少位元儲存以換取更快的運算速度與更小的體積,代價是精確度會打折 格式這些魔鬼細節。

光是「能跑」還不夠,因為同一段shader在你的顯卡上跑得又快又對,換一台顯卡可能結果就跑錯或慢到不能用。所以Hugging Face同時推出了Fleet,一個能在瀏覽器裡直接對你自己電腦的顯卡做測試評分的工具;如果你同意,你的測試結果會回饋給Hugging Face,幫助他們找出「在哪種顯卡上會算錯或算得特別慢」的隱藏地雷,讓下一版kernel更可靠。整包東西都是Apache-2.0開源授權,任何人都可以免費商用、修改。

🎯 為什麼值得你花時間

不用重新造輪子以前每個團隊想在瀏覽器裡用GPU加速,都得自己寫WebGPU shader、自己找各廠牌顯卡測試效能與正確性;現在有一批現成、驗證過的積木可以直接呼叫,省下大量除錯與效能調校時間。
AI 可以完全留在使用者裝置上跑不用把使用者的照片、語音、文字上傳到伺服器運算,兼顧隱私也省雲端GPU費用,對做去背、語音轉文字、翻譯這類小工具的開發者是直接的成本與信任優勢。
用群眾外包的測試,補足實驗室測不到的硬體組合Fleet讓世界各地各種型號顯卡的真實使用者可以貢獻測試資料,這是任何公司內部測試實驗室做不到的規模,能加速抓出特定硬體上才會出現的bug。

⚙️ 它是怎麼運作的

1
模型被拆成一串GPU指令瀏覽器要跑一個AI模型時,其實是把模型拆解成一連串矩陣乘法、正規化、卷積等基礎運算,每一個都要對應一個kernel去執行。
2
呼叫getKernel向Hub下載對應的運算核心開發者只要指定要用哪個kernel的Hub儲存庫名稱(例如webgpu-kernels/ai.onnx.Add)和版本號,函式庫就會幫你抓下對應的WGSL shader。
3
把資料丟進去,GPU平行運算,拿回結果你只要把輸入資料(數字陣列+形狀)傳給拿到的kernel函式,它就會自動配置GPU記憶體、平行運算,再把結果丟回JavaScript能直接讀的格式。
4
背後其實會依裝置、瀏覽器、輸入形狀挑選最合適的版本同一個運算在Hub上可能有好幾個變體版本,因為workgroup大小、資料排列方式在不同硬體上的最佳解不同,函式庫的角色就是把這層複雜度包起來,你不用自己判斷。
5
Fleet把你的執行結果回報成社群證據如果你同意,每次執行的正確性與效能數據會被拿去跟Hub上的benchmark case比對,幫助Hugging Face找出特定硬體上的錯誤或效能異常。
自己手刻WebGPU shader vs. 直接呼叫@huggingface/kernels
面向自己手刻shader用@huggingface/kernels
正確性驗證只能測自己手上那幾張顯卡Hub上已附正確性測試案例,還有Fleet群眾測試
效能調校workgroup大小、資料排列要自己一台台試由套件維護者依裝置特徵挑選已驗證的最佳版本
版本管理散落在專案程式碼裡,難以追蹤變更每個kernel獨立版本化,可以指定version直接鎖定
授權與再利用通常是專案內部程式碼,難以分享Apache-2.0授權,任何專案都能直接下載重用

🔍 程式碼漫遊(點有 ● 的行看白話講解)

這段程式碼示範怎麼用@huggingface/kernels,在瀏覽器裡跑一個「廣播相加」的GPU運算:一個2x3矩陣加上一個長度3的向量。

import { getKernel } from "https://esm.sh/@huggingface/kernels@preview";
💬 直接從CDN載入這個函式庫,不用先npm install或用打包工具,對初學者最省事。
const add = await getKernel("webgpu-kernels/ai.onnx.Add", { version: 1 });
💬 這行是全部的重點:只要告訴它Hub上這個kernel的位置和版本號,它就會自動下載、編譯好對應的WGSL shader,回傳一個可以直接呼叫的函式。
const { c } = await add({
💬 呼叫剛拿到的add函式並傳入輸入資料;GPU運算是非同步的,所以要用await等它算完。
a: { data: new Float32Array([1, 2, 3, 4, 5, 6]), shape: [2, 3] },
💬 每個輸入都要講清楚兩件事:實際數字(data,型別陣列)和形狀(shape),這裡是一個2列3欄的矩陣。
b: { data: new Float32Array([10, 20, 30]), shape: [3] },
💬 b是長度3的向量,形狀跟a不同,這個kernel會自動做「廣播」,把b重複套用到a的每一列。
});
💬 結束輸入物件,等待GPU把結果c算出來並自動搬回JavaScript可讀的記憶體。
output.textContent = "GPU 運算結果:" + Array.from(c.data).join(", ");
💬 c.data是扁平化的Float32Array,直接轉成一般陣列印出來,就能看到GPU算出來的6個數字。

🛠️ 動手做:在你的瀏覽器裡跑一個真正的GPU運算:Add Kernel實測

這是一個真實小專案:下載(或複製)檔案,照步驟在你電腦上跑起來。

📄 index.html ⬇ 下載
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
  <meta charset="UTF-8" />
  <title>WebGPU Kernel 示範:瀏覽器裡的 GPU 加法</title>
</head>
<body>
  <h1>用 @huggingface/kernels 在瀏覽器裡跑 GPU 運算</h1>
  <pre id="output">尚未執行</pre>
  <script type="module" src="main.js"></script>
</body>
</html>
📄 main.js ⬇ 下載
import { getKernel } from "https://esm.sh/@huggingface/kernels@preview";

async function run() {
  const output = document.getElementById("output");
  output.textContent = "載入 WebGPU 核心中...";

  if (!navigator.gpu) {
    output.textContent = "這台電腦的瀏覽器不支援 WebGPU,請改用最新版 Chrome 或 Edge。";
    return;
  }

  try {
    const add = await getKernel("webgpu-kernels/ai.onnx.Add", { version: 1 });

    const { c } = await add({
      a: {
        data: new Float32Array([1, 2, 3, 4, 5, 6]),
        shape: [2, 3],
      },
      b: {
        data: new Float32Array([10, 20, 30]),
        shape: [3],
      },
    });

    output.textContent =
      "GPU 運算結果(廣播相加 2x3 矩陣 + 長度3向量):\n" +
      Array.from(c.data).join(", ");
  } catch (err) {
    output.textContent = "執行失敗:" + err.message;
  }
}

run();
  1. 確認電腦已安裝Node.js:在PowerShell輸入 node -v,若沒反應請先到nodejs.org安裝LTS版。
  2. 在你想放教材的地方建立新資料夾並進入:mkdir kernel-demo 然後 cd kernel-demo
  3. 用記事本或VS Code在資料夾內建立 index.html 和 main.js 兩個檔案,貼上上面的內容並存成UTF-8編碼。
  4. 在PowerShell中、於kernel-demo資料夾內執行:npx serve .(第一次執行會自動下載serve這個小工具,不用另外安裝)
  5. 瀏覽器開啟終端機顯示的網址(通常是 http://localhost:3000),需使用Chrome 113以上或最新版Edge才支援WebGPU。
  6. 若成功,畫面上的方框會顯示一行GPU算出來的數字結果;若瀏覽器不支援WebGPU,畫面會顯示提示訊息而不是報錯當機。

🧠 工程思維透鏡(資深工程師看到的是什麼)

🔭 為什麼Hugging Face要把「一個kernel」當成「一個獨立版本化的Hub儲存庫」來發布,而不是直接包成一個大函式庫讓大家npm install就好?
GPU效能高度依賴硬體與輸入形狀,把每個kernel拆成獨立、可以單獨測試、單獨升版的單位,才能做到「只更新有問題的那一個,不必逼所有人升級整包函式庫」。這是犧牲「打包方便性」換取「獨立可測試性與可維護性」的架構取捨,在需要長期維護大量硬體變體的基礎設施型專案(編譯器、驅動程式、runtime)裡很常見。
🔭 Fleet讓使用者貢獻自己顯卡的測試資料,這對Hugging Face的技術策略有什麼深意?
這本質上是用群眾外包解決「長尾硬體覆蓋率」問題——沒有一家公司買得起市面上所有顯卡型號來測試,但只要讓使用者「自願參與測試換取更穩定的kernel」,就能低成本取得真實世界的正確性與效能證據。這跟開源專案靠社群回報issue累積穩定度是同一套邏輯,只是把它做成了自動化、可量化的資料蒐集管線。
🔭 文章特別強調「可移植(portability)不等於高效能」,這對工程師選技術方案有什麼提醒?
WebGPU/WGSL保證的是「同一份程式碼能在不同顯卡上跑」,但沒保證「跑得一樣快甚至跑得對」。規格層的相容性和實作層的效能、正確性是兩件不同的事,選型時不能只看「支援不支援」,還要看「在目標硬體上實測過沒有」——這也是為什麼kernels這個中間層(而不是讓每個團隊自己手寫WGSL)有存在的價值。

📝 隨堂考(點選答案,立即回饋)

Q1. @huggingface/kernels主要解決的問題是什麼?
✅ 文章的核心是「kernel」這層:把矩陣乘法、卷積這類基礎GPU運算包成可以直接下載呼叫、且已驗證過的套件,而不是模型下載或壓縮工具。
Q2. 範例程式碼中,shape為[3]的b要跟shape為[2, 3]的a相加,能成功靠的是什麼概念?
✅ 廣播是讓形狀不完全相同但相容的兩個張量可以做運算的規則,這裡b會被重複套用到a的每一列。
Q3. 為什麼同一個運算(例如矩陣乘法)在不同顯卡上,即使結果一樣,效能可能差很多?
✅ 文章明確提到workgroup大小、記憶體存取模式、向量化、資料型別、融合策略都會影響效能,且最佳選擇會隨輸入形狀、裝置、瀏覽器而改變。
Q4. Fleet這個工具的角色最接近下面哪一個比喻?
✅ Fleet是瀏覽器內的GPU測試評分工具,重點在於讓社群貢獻自己裝置的正確性、效能證據,不是編譯器也不是模型訓練平台。
Q5. 這批kernel採用Apache-2.0授權,對開發者而言代表什麼?
✅ Apache-2.0是實務上對商業使用相對寬鬆的開源授權,不像copyleft授權那樣強制衍生專案也要開源。

🃏 翻牌記憶卡(先想答案,再點開對答)

WebGPU點我翻面
讓網頁程式直接呼叫顯卡(GPU)運算能力的瀏覽器技術規格,不用另外裝驅動程式或外掛。
WGSL點我翻面
WebGPU Shading Language,專門用來寫「GPU要怎麼平行處理資料」的程式語言。
kernel(運算核心)點我翻面
針對某個特定運算(如矩陣相乘)寫成、可以直接丟給GPU執行的最小單元,像GPU界的積木。
workgroup點我翻面
GPU執行運算時,把工作切成一小群一小群同時處理的分組方式,分組大小會直接影響效能。
量化(quantization)點我翻面
把模型內部數字從高精度(如32位元浮點數)轉成更省空間的格式,換取速度與體積,但犧牲一些精確度。
Fleet點我翻面
Hugging Face推出的瀏覽器內GPU測試工具,讓使用者貢獻自己顯卡的正確性/效能資料。

✅ 離開前自測(全勾=這課真的學會了)

0%