在Firefox Nightly中实验本地替代文本生成
为何需要替代文本?
网页具有基本简单的结构,其语义允许浏览器根据不同用户的需求和偏好以不同方式解释相同内容。这对于屏幕阅读器等辅助技术特别有用,但近半图像缺少替代文本。传统上浏览器无法在不发送敏感数据到远程服务器的情况下生成高质量替代文本,但AI的最新发展使这种图像分析即使仅在CPU上也能高效进行。
使用小型开源模型生成替代文本
我们使用基于Transformer的机器学习模型描述图像。这些模型擅长识别图像内容,且足够紧凑以在资源有限的设备上运行。虽然无法超越GPT-4 Turbo with Vision或LLaVA等大型语言模型,但它们在各种硬件上都能提供有价值的本地洞察。
像BLIP或VIT这样的模型架构,在COCO(常见对象在上下文中)或Flickr30k等数据集上训练,擅长识别图像中的对象。当与OpenAI的GPT-2等文本解码器结合时,它们可以用2亿或更少的参数生成替代文本。量化后,这些模型在磁盘上可小于200MB,在笔记本电脑上几秒内即可运行——相比LLM所需的千兆字节和资源大幅减少。
小巧即美
使用小型模型进行本地推理具有诸多优势:
- 隐私保护:所有操作都在设备内完成,确保数据隐私。我们无法访问您的图像、PDF内容、生成的标题或最终标题。您的数据不会用于训练模型。
- 资源效率:小型模型消除了对云端高功率GPU的需求,减少资源消耗,更环保。
- 透明度提升:内部管理模型可以直接监督训练数据集,相比某些大型语言模型(LLM)提供更多透明度。
- 碳足迹监控:内部训练模型便于使用CodeCarbon等工具精确跟踪CO2排放。
- 易于改进:由于在单台硬件上重新训练可在不到一天内完成,允许频繁更新和增强模型。
将本地推理集成到Firefox中
扩展翻译推理架构
Firefox翻译使用由Marian C++推理运行时驱动的Bergamot项目。运行时被编译成WASM,每个翻译任务都有一个模型文件。推理任务在单独进程中运行,防止浏览器或其标签页因推理运行时崩溃而崩溃。
ONNX和Transformers.js
我们决定在Firefox Nightly中嵌入ONNX运行时和Transformers.js库,以扩展翻译架构执行不同的推理工作。与Bergamot类似,ONNX运行时具有WASM分发版,可以直接在浏览器中运行。ONNX项目最近引入了WebGPU支持,最终将在Firefox Nightly中为此功能激活。
Transformers.js在ONNX推理运行时之上提供Javascript层,使得为大量模型架构添加推理变得容易。API模仿非常流行的Python库。它完成了所有繁琐的数据准备工作,这些数据传递给运行时,并将输出转换回可用结果。它还处理从Hugging Face下载模型并缓存它们。
模型缓存
Transformers.js项目可以使用本地和远程模型,并具有使用浏览器缓存的缓存机制。由于我们在隔离的web worker中运行推理,我们不希望提供对文件系统的访问或将模型存储在浏览器缓存中。我们也不希望在Firefox中使用Hugging Face作为模型中心,而是希望从我们自己的服务器提供模型文件。
由于Transformers.js为自定义缓存提供了回调,我们实现了一个特定的模型缓存层,从我们自己的服务器下载文件并将它们缓存在IndexedDB中。
随着项目的发展,我们预计浏览器将存储更多模型,这可能会占用磁盘上的大量空间。我们计划在Firefox中添加一个界面来管理下载的模型,以便我们的用户可以列出它们并在需要时删除一些。
在PDF.js中生成替代文本
Firefox能够使用我们流行的开源pdf.js库在PDF中添加图像:
从Firefox 130开始,我们将自动生成替代文本并让用户验证它。因此,每次添加图像时,我们都会获取一个像素数组传递给ML引擎,几秒钟后,我们得到一个对应于该图像描述的字符串。
用户第一次添加图像时,需要等待一段时间下载模型(根据连接情况可能长达几分钟),但后续使用将更快,因为模型将本地存储。
未来,我们希望能够为PDF中的任何现有图像提供替代文本,除了仅包含文本的图像(对于包含扫描书籍的PDF通常如此)。
后续步骤
我们的替代文本生成器远非完美,但我们希望采取迭代方法并在开放中改进它。推理引擎已经作为新的ml组件登陆Firefox Nightly,并附有初始文档页面。
我们目前正在用本文中描述的内容改进图像到文本数据集和模型,这将在我们的Hugging Face页面上持续更新。生成模型的代码位于GitHub https://github.com/mozilla/distilvit,我们为团队改进模型构建的Web应用程序位于 https://github.com/mozilla/checkvite。我们希望确保我们构建的模型和数据集以及所有使用的代码都对社区可用。
一旦PDF.js中的替代文本功能成熟并证明有效,我们希望使该功能在常规浏览中可供屏幕阅读器用户使用。