
同事上周在群里吐槽我安利的网页抠图工具点一下要干等好几秒。我这边差不多是点完就出图。两台都是 Mac 上的 Chrome 打开同一个网页。我第一反应是他网不好后来确认模型早就缓存过了、根本没在下载。真正的差别出在浏览器拿什么跑模型一边走 WebGPU 用显卡算一边悄悄退回 WASM 用 CPU 算。界面上几乎看不出区别。等待时间却差出好几倍。同一个网页WebGPU 和 WASM 差多少为了说清楚这事我在自己那台 Apple M4 Mac16 GB上把两种情况都复现了一遍。浏览器用的是 Chromium 149 的开源构建每种状态都跑了冷启动、同页再跑和新开页面三轮。一种是开着硬件加速、WebGPU 走 Metal 的正常状态。另一种是没有可用 GPU 适配器的 Chromium关掉硬件加速就是这个状态。抠图我用的是图映 ImgIng一个免费的在线图片处理工具的快速 AI模型是 ISNet INT8。拿来抠的是我用程序画的一张 1600×1200 瓶子图不是拍出来的照片。计时没走点按钮这一步。我是直接调用页面上的TYBG.segment来计时的界面上「开始 AI 抠图」调的也是这个函数。同一个页面跑第二次时会话已经建好了剩下的只有推理加生成蒙版。WebGPU 这边是 409 ms 而退回 WASM 的那边是 1951 ms。换算下来是 0.41 秒对 1.95 秒差了差不多 4.8 倍。更气人的是两边结果完全一样。蒙版直方图逐项对得上全透明 905 936 个像素、半透明 22 934 个、全不透明 119 706 个。抠得一样好只是等的时间不一样。换一个新标签页让模型从缓存里读的话整个流程 WebGPU 是 930 ms 而 WASM 是 2643 ms。为什么有 navigator.gpu 还是用不了 WebGPU这里有个坑我一开始也没想到。浏览器里有navigator.gpu这个对象并不代表 WebGPU 真能用。我把硬件加速关掉再看就是这种状态API 还在requestAdapter()却返回 null。图映判断的恰好就是navigator.gpu在不在。在就先用 WebGPU 建会话、失败了再切到 WASM。缓存命中的页面上从开始初始化到切换只花了 160 ms用户根本感觉不到。它自带的设备画像在这种环境下也报webgpu: true它只看对象有没有。我猜是反正失败了有兜底判断写宽一点也不会出错。代价就是你以为在用显卡而其实早就退到 CPU 上了。这张图是关掉硬件加速后在图映抠完一张图的样子。要看的是红框里那一行「快速 AI抠图已完成 · WASM」。开着硬件加速时同一个位置写的是 WebGPU我两种状态都截过。切换那一下进度里还会闪过一句「快速 AI WebGPU 不兼容切换 WASM」截图时它早就过去了。整个过程既不弹窗也不报错。平时没人会盯着这一行小字看所以慢了也想不到是后端的事。怎么判断浏览器跑在哪个后端我现在排查就按从省事到靠谱的顺序看三个地方。最省事的是看工具自己的提示。图映会在完成那一行标上后端名看到 WASM 就不用往下查了。别的工具有没有类似的标记就得看各家怎么做了。其次是在地址栏打开 chrome://gpu 页面。WebGPU 那一行在 Graphics Feature Status 里。看它写的是不是 Hardware accelerated 就行。这一步只能说明浏览器这一层开没开某个网页最后用了哪个后端它管不到。最准的是在出问题的那个网页上按 F12 打开控制台。输入await navigator.gpu.requestAdapter()回车。返回一个 GPUAdapter 对象就说明这个页面能拿到适配器。返回 null 就是拿不到这时候工具再怎么写着支持 WebGPU 也只能走 WASM。顺手再敲一句crossOriginIsolated看看。它是 false 的话退到 WASM 以后连多线程都开不了。我在没配跨源隔离的页面上试过。同一个模型单线程跑要 6318 ms比 4 线程慢了三倍。控制台里只多了两条 warning 而页面上什么提示都没有。同事那台后来怎么样了我让他照着敲了那一句。返回的是 null。他那台 Chrome 为什么拿不到适配器我到现在也没查明白。关了硬件加速会这样是我自己试过的。GPU 被浏览器拉进黑名单或者在虚拟机、远程桌面里用的情况理论上也会这样这两种我没环境验证。能确定的是这件事跟网速和工具本身都无关。以后谁再说哪个网页 AI 工具慢我会先让他在控制台敲requestAdapter()看返回值。拿到 null 就先去设置里看「使用图形加速」有没有打开再决定要不要换台机器试。这比对着进度条干等有用多了。