在您的设备上享受 Phi-3 与 ONNX Runtime 的强大功能

社区文章 发布于 2024 年 5 月 22 日

Emma Ning (微软), Scott McKay (微软), Guenther Schmuelling (微软), Joshua Lochner (Hugging Face)

Phi-3 模型是微软开发的一系列开放式 AI 模型,它们是目前功能最强大、成本效益最高的小型语言模型 (SLM),在各种语言、推理、编码和数学基准测试中,其性能均优于同等规模和更高规模的模型。

Phi-3 系列包含不同大小的变体。Phi-3-mini 是一个拥有 38 亿参数、通过 3.3 万亿个 token 训练而成的语言模型,其性能可与 Mixtral 8x7B 和 GPT-3.5 等模型媲美。值得注意的是,它足够小巧,可以在客户端设备上部署。在客户端设备上离线运行 Phi-3-mini 为连接受限或隐私敏感的场景下的信息检索提供了众多机会。

客户端设备的计算、内存和功耗都受到高度限制。为了将大型语言模型 (LLM) 引入这些设备,压缩和优化模型与轻量级运行时至关重要。在这篇博客中,我们将展示如何利用 ONNX Runtime 在手机和浏览器中运行 Phi-3-mini。

获取压缩和优化的 Phi-3-mini 模型

量化涉及降低神经网络权重和激活的精度。这种技术可以显著减小模型大小和推理时间,但会以一定程度的精度下降为代价。图融合是另一种实现高性能的有效方法,通过最大限度地减少基本计算并充分利用运行时内的内核优化和硬件加速。

我们对网页和移动模型都应用了 4 位块量化。由于平台和实现特性,这两个版本在图融合和数据类型上略有不同。例如,网页模型使用多头注意力融合,而移动模型使用 组查询注意力 融合。此外,由于 JavaScript 不支持 float16,网页模型的输出 logits 仍为 float32。与原始 PyTorch 版本相比,针对移动和网页优化的模型明显更小,尺寸减小了 2.5 倍以上。

image/png

我们将所有这些提前量化和优化集成到 Olive 中,这是一个硬件感知的模型优化工具,允许用户轻松生成针对各种硬件目标量身定制的压缩和优化模型。这是一个 Phi-3 优化的 Olive 示例。同时,我们已将预优化的 移动模型网页模型 上传到 Hugging Face。欢迎直接下载。

在移动设备和网页上使用 ONNX Runtime 运行 Phi-3

ONNX Runtime 是一个跨平台的推理引擎,用于开放标准 ONNX 格式的机器学习模型。它支持广泛的硬件平台,并提供各种优化和加速技术,以提高性能和效率。在这里,我们重点关注其用于设备端推理的两种解决方案:ONNX Runtime Mobile 和 ONNX Runtime Web。这两种解决方案还允许客户自定义构建,以根据模型定制,从而减小二进制大小和运行时内存占用。

Phi-3 与 ONNX Runtime Mobile

ONNX Runtime Mobile 提供了一个轻量级推理引擎,可将 ONNX 模型轻松集成到 Android、iOS、React Native 和 MAUI/Xamarin 上的移动应用程序中。它支持各种针对移动设备量身定制的硬件加速器,例如所有移动平台上都可用的默认 CPU 加速器和 XNNPACK 加速器,以及特定于平台的加速器,如 iOS 的 CoreML 和 Android 的 NNAPI 和 QNN。为了便于集成到不同的移动开发环境,它还提供了丰富的语言绑定,包括 C、C++、Java、Objective-C 和 C#。

我们利用 ONNX Runtime Mobile 默认的 CPU 加速器在手机上推断 4 位量化的 Phi-3 模型。在 ONNX Runtime 内部,已经开发了优化的 ARM64 内核以加速 INT4 量化矩阵乘法。此外,它还可以适应输入端的量化 8 位整数,进一步提高 INT4 量化矩阵乘法的性能,同时保持可接受的精度损失。此外,ONNX Runtime 还支持分组查询注意力,这是一种专门设计用于高效执行注意力同时允许过去和现在的 KV 共享相同缓冲区的运算符。这些优化共同实现了 ONNX Runtime 在移动设备上的高性能 CPU 执行。在这里,我们展示了 Phi-3-mini 在三星 Galaxy S21 上生成 token 的性能。在提示长度和要生成的 token 较短的场景中,ONNX Runtime Mobile 优于 llama.cpp,在其他情况下则保持可比性。

image/png

注意:这些性能基准测试是在三星 Galaxy S21 上使用四个线程运行的。

这是 一个 E2E 示例,用于在 Android 上使用 ONNX Runtime Mobile 运行 Phi-3-mini。它利用 ONNX Runtime Generate() API,该 API 可以加速 ONNX 模型生成式 AI 循环的推理过程。这包括使用 ONNX Runtime 进行推理、处理 logits、进行搜索和采样以及管理 KV 缓存。由于 ONNX Runtime Generate() API 的官方移动绑定仍在进行中,因此该示例利用了 C API。它通过创建 JNI 包装器来实现生成式 API 的 C API 和 Java 级别调用之间的通信。请继续关注 ONNX Runtime Generate() API 官方移动绑定的更新。有关 ONNX Runtime Generate() API 的更多详细信息,请参阅文档

Phi-3 与 ONNX Runtime Web

ONNX Runtime Web 是一个 JavaScript 库,可以在浏览器和其他 Web 平台中运行 ONNX 模型。对于 CPU 推理,ORT Web 使用 Emscripten 将原生 ONNX Runtime CPU 引擎编译为 WASM 后端。此外,ONNX Runtime Web 支持 WebGPU 和 WebNN 等多个后端,以进一步利用底层硬件加速来加速推理。ONNX Runtime Web 可以轻松集成到 Web 应用程序和框架中,例如 ReactJS 和渐进式 Web 应用程序。

由于 Phi3 的庞大尺寸和计算需求,在浏览器中使用 CPU 运行它效率不高。WebGPU 引入了一个现代 Web API,允许开发人员利用 GPU 算力进行高性能计算,这在基于 CPU 的浏览器内机器学习不足的场景中提供了显著优势。微软和英特尔一直在合作完善 ONNX Runtime Web 中的 WebGPU 功能。在 ONNX Runtime 1.17 版本中,我们引入了 WebGPU 后端,现在又添加了 4 位块量化支持量化的 Phi-3 Web 模型。我们还实现了融合的 WebGPU 运算符,例如多头注意力和旋转嵌入,这些运算符简化了计算图并显著提高了性能。为了在运行具有动态形状的 Phi-3 时减少内存使用,我们应用了一种分桶空闲列表方法,并针对 80 个流行模型进行了调整,以平衡性能和内存效率。大型语言模型受益于在生成过程中通过使用键值缓存缓存先前 token 的计算结果来保存状态。为了支持这一点,我们引入了在模型输入和输出中传递 GPU 缓冲区引用的能力,从而无需跨设备复制并提高了整体性能。通过所有这些优化,ONNX Runtime Web 能够在 Nvidia RTX 4090 上以每秒超过 70 个 token 的速度运行 Phi-3-mini!不要错过 这个 E2E 示例,它展示了 ONNX Runtime Web 在浏览器中运行 Phi-3-mini 的情况。

ONNX Runtime Web 还支持 Transformers.js,这是一个用于直接在浏览器中运行 Hugging Face Transformers 的库。该库是开发人员在浏览器中运行最先进的预训练模型的流行选择,只需 3 行代码即可。利用 ONNX Runtime Web 和 WebAssembly 后端,Transformers.js 已支持自然语言处理、视觉、音频、表格和多模态领域的 众多模型。现在,Hugging Face 和 Microsoft 正在合作,通过 ONNX Runtime Web 在 Transformers.js 中启用 WebGPU 支持,以进一步加速性能,团队在取得进展时将发布新的演示。Phi-3-mini 的最新演示为用户提供了私密(且强大)的聊天机器人体验。您可以在 Hugging Face Spaces 上试用。

image/gif

在您的设备上享受 Phi-3

您是否对在设备上拥有一个私密且强大的聊天机器人感到兴奋?无需担心数据隐私或互联网连接,即可进行无缝通信。您可以下载预优化的 Phi-3 模型,或使用 Olive 优化您的定制版本,然后使用 ONNX Runtime 在手机或直接在浏览器中部署优化后的模型!快来试试吧!欢迎在 ONNX Runtime Github 上分享您的反馈!

社区

此评论已被隐藏(标记为无关话题)

注册登录 发表评论