主要观点:9 月 Mozilla 的机器学习工程师发现 Firefox 在运行微软 ONNX Runtime 编译为 WebAssembly 时消耗过多内存和 CPU 资源,本文介绍了如何解决此问题及未来改善 WebAssembly 性能的长期计划。
关键信息:
- SpiderMonkey 有两种 WebAssembly 代码编译器,基线编译器启动快但代码生成一般,Ion 编译器生成代码更快但编译时间长。
- ONNX 模块的 Ion 编译后端耗时久、内存大,其有巨大函数致 MIR 控制流图基本块多,暴露编译器后端性能缺陷。
- 通过将寄存器分配器中虚拟寄存器的 live range 存储数据结构从链表改为可选排序向量,使 Ion 编译该模块快约 20 倍至 14 秒;用 Semi-NCA 算法替代原算法使总编译时间从 14 秒降至不到 8 秒;用稀疏位集替代密集位集节省至少 3GB 内存并使编译时间至 5.4 秒;优化移动解析函数使 Ion 编译时间在作者机器上小于 3.9 秒,比之前快 75 倍多。
- 这些改变不仅提升了 ONNX Runtime 模块性能,还使 Adobe Photoshop 等其他 WebAssembly 模块编译加快,JetStream 2 基准测试的 HashSet 模块编译时间从 2.8 秒降至 0.2 秒。
- Mozilla 的 WebAssembly 团队正在重构 Wasm 编译器管道,有望实现按需 Ion 编译单个 Wasm 函数及新功能如内联等。
重要细节: - 最初用 AVL 树替代链表改善不明显且担心内存增加,后改为按起始位置可选排序的向量。
- Semi-NCA 算法由 Loukas Georgiadis 提出,LLVM 和 Julia 编译器也使用,调试测试后移除旧实现启用新代码。
- 稀疏位集用哈希表存储,多数哈希表含少量条目用 InlineMap 优化,节省内存并提升编译时间。
- 优化移动解析函数时更利用 live range 已排序的事实使循环运行时间从二次变为线性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。