
上一期我在 Microsoft Edge 里顺手折腾过一些音频相关的模型评论区有人问我能不能找个不需要显卡显存的 NLP 模型我当时第一反应是这个问题有点拧巴模型不都要塞进显存吗但等我认真翻了一遍 ONNX 模型库之后才发现经典的 NMTNeural Machine Translation神经机器翻译模型不仅能塞进浏览器而且真的可以做到零显存要求运行。这篇文章就是这次寻宝的记录在 Microsoft Edge 里加载并运行一个不算新但很经典的 NMT 翻译模型全程不碰显存不依赖独立显卡只用 CPU 和 WebAssembly 推理。适合显存只有 6G、8G 甚至没有独立显卡的朋友参考也适合想了解“显存作用和模型参数关系”的人。我会把完整的操作链路、原理、踩坑点都写出来照着抄就能跑。1. 为什么是 NMT又为什么要在 Edge 里跑1.1 显存的焦虑并不是只有你一个人有最近我看了不少搜索热词发现“低显存运行模型”“minimax h3 8g显存”“6g显存”“moE架构要全部参数进显存吗”这类问题特别多。大家普遍有一个默认假设跑 AI 模型必须有一块显存足够大的显卡否则连门都进不去。这个假设不能算错但不全对。显卡显存的核心作用是存放模型权重和中间激活值GPU 计算核心需要高速访问这些数据。但如果你不打算用 GPU 算而是把模型放到 CPU 上算显存这个限制条件就直接消失了。问题变成了另一个CPU 算得够不够快内存够不够装。浏览器里的 WebAssembly 推理天然就是走 CPU 的。Microsoft Edge 作为目前 Chromium 系浏览器里对 WebGPU 和 WASM 支持都比较积极的一个很适合拿来当这样的实验环境。更关键的是NMT 这类经典任务模型规模通常小到不需要 GPUCPU 就能咬牙算完。1.2 经典 NMT 模型到底经典在哪NMT 不是一个具体模型的名字而是神经网络机器翻译这一类技术的总称。它经历过几个关键阶段最早是 sequence-to-sequence 结构用一个编码器读入源语言用解码器逐步生成目标语言后来注意力机制被引入解决了长句子翻译时信息丢失的问题再往后就是 Transformer 架构把注意力机制做成了主体训练效率和翻译精度都上了一个台阶。所以当你听到“经典 NMT”一般指的是那些以 Transformer 为核心、参数量在千万到几亿级别的翻译模型比如 MarianMT、T5-small、M2M100 等。它们现在看也许不够“大”但胜在参数规模小、部署方式成熟尤其适合浏览器这种资源受限的运行时。我选择从 NMT 入手而不是一上来就折腾大语言模型还有一个现实原因浏览器里的推理能力远不如本地 GPU巨型模型的加载速度、内存占用和计算延迟都会非常感人。先拿一个经典小模型跑通链路再考虑扩大规模至少不会让你第一天就被劝退。2. 把“显存需求”从问题清单里划掉显存、参数和 WASM 推理2.1 显存到底在推理里扮演什么角色很多人把显存和内存混为一谈。简单说显存是显卡自己的工作台CPU 要算的东西先放进内存而 GPU 要算的东西则要放进显存。当你在终端里跑一个大模型并报了“CUDA out of memory”那通常就是权重加激活值加临时缓冲区把显存塞满了。做一次 GPU 推理显存里至少要放三样东西模型权重也就是网络里所有可学习的参数中间激活值每层网络执行时产生的中间结果额外的缓存比如 KV cache用于注意力计算时复用历史信息这也是为什么“模型权重体积 2G就敢说自己只需要 2G 显存”是错的因为推理时的动态内存开销同样不可忽略。模型参数和显存的关系更准确的理解是参数数量决定权重最低需求激活值和推理策略决定实际操作时的额外上限。2.2 参数数量和显存需求的那笔账下面这张表是我自己常用来快速粗估的分享出来给大家参考。它的逻辑很简单权重大小 参数量 × 单参数字节数。精度每参数占用125M 参数模型1B 参数模型fp324 字节约 500MB约 4GBfp16/bf162 字节约 250MB约 2GBint81 字节约 125MB约 1GB粗看起来1B 参数模型用 int8 量化后也就 1GB 出头普通人手里的 6G 显存似乎也能摸一摸。但注意这里只算了权重本身还没算激活、优化器状态、KV cache。真正跑起来一个 7B 模型就算量化后只有 4GB 左右也经常因为激活值和上下文缓存高企而爆显存。回到 NMT 场景一个 125M 参数的模型fp32 权重才 500MB放到今天任何一台电脑的内存里都毫无压力。既然如此干嘛还要非要占用显存直接把计算交给 CPU在浏览器里完成推理显存需求自然归零。这就是“零显存要求”最直接的来源。2.3 为什么 WASM ONNX Runtime 能做到零显存浏览器里跑模型常见方案是 ONNX Runtime Web。它有两个后端路线一个是 WebGPU走显卡需要用显存另一个是 WebAssembly也就是 WASM走 CPU不需要显存。WASM 后端会把模型加载进浏览器的线性内存中计算由 CPU 指令完成。现代 CPU 上的 AVX、SSE 指令集以及 Edge 对 WASM 多线程的支持让这种推理方式虽然比 GPU 慢但完全能跑一些小模型。我这次刻意选 WASM 后端就是为了验证“零显存”这条路径。实验环境也很朴素一台只有集显的笔记本显存为 0内存 16GEdge 稳定版跑一个经典 NMT 模型。最终实测下来模型能正常加载翻译虽然慢一点但没有发生任何显存错误。这已经达成了标题里的承诺零显存要求。3. 经典 NMT 的落地链路选模型、起服务、跑翻译3.1 选型思路为什么我建议先别碰大全模型NMT 模型虽然都属于翻译模型但也要细分。我整理了几个常见方向方便你判断自己该选谁。模型系列特点浏览器部署友好度Helsinki-NLP/opus-mt按语言对拆分模型小适合定向互译需要转 ONNX本身很轻T5-small通用文本模型也能做翻译生态好Transformers.js 直接可用M2M100多语种互译覆盖面广权重偏大偏重NLLB-200语种极多质量好对浏览器较重不建议新手我的经验是第一次跑通链路不要贪多选“下载体积小 库封装完整”的模型。这里最合适的就是 T5-small。它的英文和多语种能力足够做演示ONNX 权重也能从现成的 CDN 拉到省去了自己处理 tokenizer 和转换模型的麻烦。如果你目标很明确比如就想中英互译那可以去找 Helsinki-NLP 的 opus-mt 系列转换出的 ONNX 版本。这类模型按语言对打包单个很小下载体验也好。但新手容易卡在“模型格式转换”和“分词器适配”这两步所以我的顺序建议是先跑通 T5-small再换成你真正需要的语向模型。3.2 环境准备一台能打开 Edge 的电脑就够了开始动手前先确认环境。我这里用的是 Windows 11 下的 Microsoft Edge 稳定版没装 CUDA也没安装任何 Python 依赖。需要提醒的是虽然理论上直接双击 HTML 文件也能跑 ES module但涉及模型文件和 WASM 加载时跨域问题会让你头大。我建议起一个最简单的本地静态服务器。在项目目录下执行python -m http.server 8080然后打开http://localhost:8080。如果你机器上没有 Python用npx serve .也可以。这一步的核心目的是让页面通过 HTTP 协议加载资源避免浏览器因为 file 协议而限制模块导入和网络请求。至于 Edge 本身不需要额外设置显存或者开启什么硬件加速。我们走的是 CPU 推理路径显卡驱动是否正常都不影响。3.3 最小可运行代码一个页面把翻译跑起来下面这份代码可以原封不动复制保存成index.html放在刚才的静态服务器目录里就能直接测。!DOCTYPE html html langzh-CN head meta charsetUTF-8 titleEdge 寻宝NMT 零显存翻译/title /head body h1Edge 寻宝NMT 零显存翻译/h1 textarea idsrc rows5 placeholder输入需要翻译的英文/textarea button idbtn翻译/button pre idout/pre script typemodule import { pipeline } from https://cdn.jsdelivr.net/npm/xenova/transformers2.17.2; const btn document.getElementById(btn); const src document.getElementById(src); const out document.getElementById(out); const translator await pipeline(translation, Xenova/t5-small); btn.onclick async () { out.textContent 翻译中……; const result await translator(src.value, { src_lang: eng_Latn, tgt_lang: fra_Latn }); out.textContent result[0].translation_text; }; /script /body /html注意代码里的src_lang和tgt_lang也不是所有模型都通用。不同的 NMT 模型对语言标签格式要求不一样有的用en、fr有的用eng_Latn、fra_Latn还有的压根不需要语言标签。我这里的用法是针对 T5 类模型比较稳妥的写法如果你换成其他模型第一件事就是去它的模型卡里确认语言代码格式。这个页面加载后Edge 会自动从 CDN 拉取模型权重。第一次等待时间会比较久因为要下载 WASM 运行时和模型文件。之后 Edge 会用 Cache API 把模型缓存住二次打开就会快很多。3.4 点击翻译后发生了什么点击“翻译”按钮后后台流程其实是这样的文本先被 tokenizer 分词并转成 token ID 序列编码器把源语言句子转成隐藏向量解码器按 token 逐个生成目标语言过程中使用 beam search 或贪心搜索生成的 token ID 被解码器转回人类可读的文本整个过程完全在浏览器本地完成文字不会上传到任何翻译服务器。这也带出了本地 NMT 的一个隐藏价值隐私。如果你的工作场景里有敏感文本不能交给在线翻译这样一个零显存的本地页面可以作为轻量方案。实测下来T5-small 对简单句子的翻译质量是“能看懂大概意思”但别指望它能处理复杂从句和专业术语。它毕竟是一个几亿参数的小模型不是动辄几百亿参数的大语言模型。这个预期要放平。4. 零显存背后的三个新瓶颈4.1 没有显存限制后限制变成了内存和等待时间零显存不等于零资源占用。WASM 推理时模型权重和中间张量都放在普通系统内存里。我的测试环境是 16G 内存跑一个 500MB 左右的 fp32 模型还算宽裕。但如果你的电脑只有 4G 内存浏览器可能直接崩溃给你看。我的实际建议是如果是低配机器优先选量化版本模型。T5-small 这类模型通常有 int8 量化版本权重体积可以从 500MB 降到 125MB 左右内存占用和加载速度都会明显改善。代价只是翻译质量略降但对于测试学习和轻量翻译完全值得。另外第一次加载模型的等待时间是个劝退点。300MB 的文件在普通宽带下要等几十秒甚至一两分钟页面上一片空白很容易让人以为死机了。最好在界面上加一个进度提示或者用env.useBrowserCache true让模型文件尽快进入缓存。Edge 自身的缓存机制做得不错第二次打开之后基本不会再有明显的卡顿感。4.2 浏览器里的多线程没有想象中那么好开你可能听说过可以让 WASM 推理使用多线程来加速这确实有效。但浏览器对 SharedArrayBuffer 有严格限制页面必须在响应头里带上跨域隔离声明否则 WASM 线程数会被自动限制为 1。这就要回头看第 3.2 节里静态服务器的价值。你如果只是用python -m http.server默认不会自动加响应头多线程也就开不起来。想真正开启多线程需要在服务器端添加两个响应头Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp如果你不想折腾服务器配置也可以先单线程跑通。翻译短句子单线程都能等但长句子确实会让人有点急躁。能用多线程尽量用这是浏览器里跑 NMT 最值得做的性能优化之一。4.3 翻译质量和在线大模型比劣势很明显经典 NMT 模型的一大问题是上下文理解能力弱。它能做的更多是“逐段直译”而不是意译和风格调整。举例说英文里的反讽和双关T5-small 这类模型基本表现不出来。模型只会给出字面意思而且遇到训练集里没见过的领域词容易胡翻。但这不代表这个方案没有价值。在某些强隐私、离线、低硬件要求的场景里一个本地可跑的经典 NMT 模型依然是可用的选项。尤其是你想做一个 Edge 扩展、纯前端工具或者只是学习推理原理这种思路都是很不错的入口。我也强烈建议你把期望值设定为“把链路跑通”而不是“替换掉在线专业翻译”。这就像自己组装一台老式收音机重点在于理解电路逻辑而不是和高端音响比音质。5. 没有独立显卡也可以继续往这几个方向玩5.1 从“翻译”扩展到其他文本任务NMT 模型的底层其实就是 seq2seq 结构这个结构不止能翻译也能做摘要、改写、问答。早年间很多自然语言处理任务都是基于同一个编码器-解码器框架改出来的。我在跑通 T5-small 之后把同一套代码里pipeline(translation, ...)换成pipeline(summarization, ...)也能正常生成英文摘要。对于想要做浏览器端 AI 小工具的人来说这相当于一个通用文本生成底座。你可以自己封装一个 Web Worker把推理放到后台线程避免页面按钮点击后卡死也能进一步优化体验。5.2 给 Edge 本身做个小插件“Microsoft Edge 寻宝”这个系列一直在探索 Edge 的能力边界。如果你有兴趣下一步完全可以把这次写好的 HTML 页面包装成一个 Edge 扩展插件。Edge 扩展基于 Chromium 扩展体系支持在浏览器侧边栏或弹窗里加载自己的页面。这样你的零显存翻译模型就不是一个孤单的 HTML 文件而是一个随时可以点击调用的本地翻译工具。这里有一个实际坑需要提前提醒扩展的 popup 页面生命周期比较短如果模型推理时间太长页面可能被系统回收。更稳妥的做法是把模型推理放到扩展的 background service worker 或独立页面里跑popup 只负责接收输入和展示结果。5.3 零显存路线对我最大的启发我折腾这一圈下来最深的体会是显存不够不等于不能玩模型只是说明你选错了运行方式。GPU 显存这条路拥挤那就绕到 CPU、WASM、浏览器这条路上。经典 NMT 模型本身就是一个小而美的例子它证明了一个事实当模型足够小物理硬件门槛是可以被软件架构绕过去的。顺着这个思路很多“低显存运行模型”的问题都可以被重新审视。6G 显存跑不动大模型不代表 0 显存跑不了小模型。真正重要的不是显卡有多强而是你的任务规模与推理后端是否匹配。最后再分享一个 Edge 使用上的小细节回答一下那个高频问题“win11 里能不能单独调节 Microsoft Edge 的声音”。可以而且很简单在播放音频时打开系统音量合成器就能看到 Microsoft Edge 单独的音量滑块。这个无关模型但既然聊到 Edge 就顺手提一嘴。下一期我可能会继续在这个系列里找找看看有没有更适合在 Edge 里跑的轻量视觉模型。毕竟“零显存”这套思路放到更多任务上仍然值得继续验证。