浏览器内 LoRA 微调:WebGPU 训练从 PoC 到可行 · 干货攻略

  • 链接: https://x.com/ngxson/status/2096379210939994573
  • 分类: x-tips
  • 来源: X @ngxson / @maximelabonne
  • 作者: Jay
  • 更新: 2026-09-08

这是什么

浏览器内 LLM 微调(In-browser Fine-tuning on WebGPU)指的是不依赖任何服务器端 GPU,直接在浏览器 Tab 内通过 WebGPU API 对语言模型进行反向传播训练(backpropagation),输出可用的 LoRA 适配器权重。

这一进展由独立开发者 Xuan-Son Nguyen(@ngxson)在 2026 年 9 月 5 日发布,他在 X 上表示:

"You heard about LLM inference on WebGPU, but what about... finetuning LLM on WebGPU? 🤯 I put together a super earlier PoC that proves it's possible, backed by llama.cpp / wllama"

Maxime Labonne(@maximelabonne)随后转发了这一发现,标题为 "In-browser fine-tuning is coming"

这不是一个正式发布的产品,而是"超级早期 PoC"(ngxson 原话)。 核心意义在于证明了技术可行性,而非提供可直接生产的工具。


为什么值得关注

推理 vs 训练:本质不同的难度

在浏览器里跑 LLM 推理(forward pass)已有成熟方案:wllama、Transformers.js、WebLLM 均已生产可用。但微调(fine-tuning)难得多,原因在于训练需要推理所不需要的三个额外步骤:

步骤 推理 微调
Forward pass(前向传播)
Loss 计算
Backward pass(反向传播) ✅ 计算梯度并逐层回传
Optimizer step(优化器更新) ✅ Adam 等优化器通常每个参数额外维护 2 个状态

结果:微调的显存需求通常是推理的 3–4 倍以上。 在浏览器沙盒的显存限制和 WebGPU 通用计算 API 的约束下实现这一点,是真正的工程挑战。

隐私场景意义巨大

如果训练数据和权重更新全程留在本地浏览器,意味着:

  • 写作风格适配:用本地文档直接微调模型,无需上传任何内容
  • 完全本地化的个性化:网站分发小型基座模型,访客浏览器自行完成 specialization,权重永不回传
  • 联邦学习的浏览器实现:不依赖多设备协调,单 Tab 即可完成参数高效微调

为什么 LoRA 是唯一现实路径

在浏览器显存约束下,全量微调任何稍大一点的模型都不现实。LoRA(Low-Rank Adaptation)通过冻结基座权重、只训练注入到少数层的低秩矩阵,将可训练参数减少几个数量级,从而将梯度+优化器状态的显存占用压缩到可接受范围。

这也正是 wllama 官方路线图的下一个目标(见其 TODO: "Add support for LoRA adapter")。


核验过程

官方来源

1. ngxson/wllama(WebAssembly 绑定) - GitHub: ngxson/wllama,MIT 协议,2026 年 9 月 6 日刚同步上游 llama.cpp v3.5.0 - V3.1 版本(2026 年中)引入 WebGPU 支持,自动启用,默认全量 GPU 卸载 - n_gpu_layers 参数控制卸载层数,可设为 0 禁用 GPU - 官方 TODO 明确列出 "Add support for LoRA adapter" — LoRA 支持已在路线图上 - 仓库: ngxson/wllama

2. ngxson/llama.cpp(训练支持 fork) - GitHub: ngxson/llama.cpp,fork 自 ggml-org/llama.cpp,2026 年 9 月 7 日有最新提交 - llama.cpp 官方 finetune 工具支持 LoRA 训练(--lora-out 输出适配器权重) - ngxson 的 fork 在此基础上增加了 WebGPU 后端的训练路径支持 - 仓库: ngxson/llama.cpp

3. llama.cpp WebGPU 官方文档(ggml-org) - WebGPU 后端由 Reese Levine(@reeselevine)主导开发,2026 年 5 月正式发布 - 构建方式:cmake -B build -DGGML_WEBGPU=ON;或使用 Emscripten 交叉编译为 WebAssembly - WebGPU 后端文件:ggml/src/ggml-webgpu/ggml-webgpu.cpp + WGSL 着色器

交叉验证

关键说法 1:WebGPU 后端训练确实可行 - arXiv 2605.20706 论文 "Llamas on the Web"(Reese Levine 等)描述了 llama.cpp WebGPU 推理架构,明确指出 WGSL 着色器覆盖了矩阵乘法、Flash Attention 等核心操作 - 这些着色器理论上可扩展支持梯度计算,但目前 llama.cpp 官方对 WebGPU 训练的支持状态未完全确认——ngxson 的 PoC 可能是实验性补丁而非上游合并

关键说法 2:LoRA 是浏览器微调的唯一现实路径 - wllama 官方 TODO 明确说 "Add support for LoRA adapter" - explainx.ai 技术分析指出:LoRA 将可训练参数量降低数个量级,使梯度/优化器状态显存需求压缩到浏览器可接受范围 - llama.cpp finetune 工具已有完整 LoRA 支持,命令示例:llama-finetune --model-base <base.gguf> --train-data <data.txt> --lora-out lora.bin

关键说法 3:这是一个早期 PoC,非生产工具 - ngxson 原话:"super earlier PoC" 和 "Working on LoRA next" - 目前没有独立的 Demo 页面或可运行仓库(PoC 在他的 llama.cpp fork 中,未作为独立项目发布) - wllama 本身 V3.5.1(最新版本)尚未内置微调功能

⚠️ 未能核验处

以下说法原帖主张,未完全核验: - PoC 实际 Demo 效果(速度、收敛性、显存占用)——ngxson 未公开具体数字 - PoC 的实现路径(是直接扩展了 wllama 的 WebGPU 路径,还是另有方案)——无详细代码链接 - 具体支持的模型规模——推测为小型模型(几百 MB GGUF),但无官方说明


上手步骤

架构概览

浏览器 Tab
 └── WebGPU API(Chrome/Edge/Safari 16+)
      └── wllama(ngxson/wllama)
           └── llama.cpp WebGPU 后端(ggml-webgpu.cpp + WGSL shaders)
                ├── Forward pass(已有)
                ├── Backward pass(ngxson PoC 新增)
                └── Optimizer step(ngxson PoC 新增)

当前可用:浏览器 WebGPU 推理(基线)

import { Wllama } from '@wllama/wllama';

// 单文件模式(推荐,简化初始化)
const wllama = new Wllama('./esm/wasm/wllama.wasm');

// 从 HuggingFace 加载 GGUF 模型
await wllama.loadModelFromHF(
  { repo: 'ggml-org/models', file: 'tinyllamas/stories260K.gguf' },
  { progressCallback: ({ loaded, total }) => console.log(`${Math.round(loaded/total*100)}%`) }
);

// 对话补全
const response = await wllama.createChatCompletion({
  messages: [{ role: 'user', content: 'Hello!' }],
  max_tokens: 50,
  temperature: 0.5,
});
console.log(response.choices[0].message.content);

启用 WebGPU 加速(代替纯 WASM)

// WebGPU 自动在 V3.1+ 启用
// 手动控制 GPU 卸载层数
await wllama.loadModel(files, {
  n_gpu_layers: 4,  // 4 层卸载到 GPU;设为 0 纯 CPU
});

构建 wllama 开发版(含最新 upstream)

git clone --depth 1 https://github.com/ngxson/wllama.git
cd wllama
npm ci
# 构建 WASM 部分(需 Docker)
npm run build:wasm && npm run build

llama.cpp LoRA 微调(桌面端参考,训练工具)

# 克隆官方仓库
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp

# 构建(CUDA 加速,如适用)
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j$(nproc)

# 准备训练数据(Alpaca 格式,每条以 <SFT> 开始)
# 训练 LoRA 适配器
./build/bin/llama-finetune \
  --model-base ./models/llama-3-8b-instruct-q4_k_m.gguf \
  --train-data ./data/train.txt \
  --sample-start '<SFT>' \
  --adam-iter 1024 \
  --lora-out ./lora-output/lora.bin

# 合并适配器到基座(如需独立运行)
# (见 llama.cpp 文档 merge-lora 部分)

注:上述 llama-finetune 为桌面端 CPU/CUDA 工具,不是浏览器版本。浏览器版微调目前只有 ngxson 的 PoC 代码,尚未合并入主流分支。

关注 LoRA 适配器工作流

wllama 官方 LoRA 支持上线后,预期工作流:

// 加载基座模型
await wllama.loadModel(modelFiles);

// 动态加载 LoRA 适配器
await wllama.loadLora('/path/to/adapter.gguf');

// 使用微调后的模型
const response = await wllama.createChatCompletion({ ... });

坑与适用边界

当前阶段的根本限制

  1. 这只是 PoC,不是库:ngxson 明确说 "super early PoC",没有可安装的 npm 包或 Demo 页面,代码在他的 llama.cpp fork 里
  2. 上游未合并:WebGPU 训练路径未进入 llama.cpp 主流分支,未来 API 可能变化
  3. 显存硬上限:即使 LoRA,小型模型在浏览器中也受 WebGPU 缓冲区大小限制;典型移动设备显存极为有限
  4. 速度极慢:反向传播的 WGSL 实现远不如 CUDA kernels 成熟,训练速度无法与桌面 GPU 相比

适用边界

场景 是否适合
小型模型(≤1B 参数) LoRA 微调 ✅ 可探索
生产级模型训练 ❌ 完全不适合
隐私敏感数据本地微调(离线) ✅ 长期方向,短期需等上游支持
移动端浏览器 ❌ 显存不足

浏览器兼容性

  • Chrome/Edge 113+:完整 WebGPU 支持
  • Safari 16+:需 @wllama/wllama-compat 兼容包,性能明显下降
  • Firefox:实验性支持,同样需要 compat 模式

一句话结论

浏览器内 LLM 微调在技术上已被证明可行(ngxson PoC),核心路径是 llama.cpp WebGPU 后端 + LoRA;这是隐私优先的端侧个性化长期方向,但目前只是早期实验,生产使用需等上游正式支持。


参考来源

  1. ngxson (@ngxson) X post, 2026-09-05 — PoC 宣布 https://x.com/ngxson/status/2096379210939994573
  2. Maxime Labonne (@maximelabonne) X post, 2026-09-05 — 社区传播 https://x.com/maximelabonne/status/2096456605076476239
  3. ngxson/wllama GitHub — WebAssembly + WebGPU 绑定 https://github.com/ngxson/wllama
  4. ngxson/llama.cpp GitHub — 含训练支持的 fork https://github.com/ngxson/llama.cpp
  5. llama.cpp WebGPU 官方博客 "Llamas on the Web" — arXiv 2605.20706,WebGPU 架构说明 https://arxiv.org/html/2605.20706v1
  6. explainx.ai 技术分析 "In-Browser LLM Fine-Tuning: Why Training on WebGPU Is a Bigger Deal Than Inference" https://www.explainx.ai/blog/in-browser-llm-fine-tuning-webgpu-2026
  7. ggml-org/llama.cpp 官方 build 文档 — WebGPU 构建说明 https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md