发布 ONNX Runtime MultiLoRA:彻底改变 AI 定制化

作者:

Dmitri SmirnovJambay KinleyNatalie KershawParinita RahiPranav SharmaDevang PatelSamuel Kemp

2024 年 11 月 20 日

AI 定制化的新时代

当今的 AI 服务必须满足广泛用户的需求——每个用户都有独特的需求和偏好。传统上,为单个客户或说话人定制大型语言模型是一项资源密集且耗时的任务。

LoRA 适配器在为特定任务定制大型 AI 模型方面已证明具有变革性,而无需进行资源密集型微调。MultiLoRA 通过实现轻量级适配器的无缝集成,改变了游戏规则,使模型能够动态适应不同的上下文和客户。以 ONNX Runtime 为基础,MultiLoRA 提供无与伦比的性能,确保高效的内存使用。

与 Olive 的集成更流畅

MultiLoRA 依赖现有的 Olive 工具链来生成适配后的 ONNX 模型。

这确保了

  • 创建 LoRA 适配模型时的统一流程。
  • 跨模型和适配器版本控制及元数据处理的一致性。

通过围绕 Olive 进行标准化,MultiLoRA 简化了工作流程,并消除了与第三方源的兼容性问题。

ONNX Runtime 适配

简化的适配器激活和加载

  • 动态激活 API:一个单一的 API,SetActiveAdapters(string[] adapters),允许在运行时激活或停用适配器。

    • 空输入:将模型重置为其基本状态,在不使用任何适配器的情况下运行。
    • 多适配器支持:同时激活多个适配器以满足复杂的客户需求。
  • 生成循环支持

    • 只要 GeneratorParams 实例存在,活跃适配器就会保持加载状态,确保高效的内存使用。
    • 当实例被销毁时,引用会自动释放,从而避免资源泄漏。

非生成循环的适配器管理

对于不与用户提示或生成过程绑定的模型,引入了新的 Run() API

Results = Run(RunOptions, input_names[], input_data[], output_names[]); 
  • RunOptions 类:有助于无缝执行基础模型或适配器增强型变体。
  • 共享适配器加载:适配器存储在模型实例中,允许多个会话之间高效重用。

语言绑定扩展

当前的 MultiLoRA 实现提供了 Python、C、C++、C# 和 Java 的绑定。

内存管理

我们的实现将 LoRA 参数从磁盘内存映射,这改进了内存管理。

MultiLoRA 工作原理

生成 ONNX 模型和适配器

如果您拥有 Hugging Face PEFT 格式的现有基础模型和适配器,您可以通过利用以下命令,使用 MultiLoRA 范式自动创建可在 ONNX Runtime 上高效运行的优化 ONNX 模型

olive auto-opt -m <path to model> -a <example adapter> -o <output folder> --device cpu|gpu --provider <execution provider>

然后,您可以通过将 Hugging Face(或本地磁盘)上存在用于相同基础模型的其他适配器转换为 ONNX 适配器格式来添加它们,使用

olive convert-adapters -a <adapter> -o <output>

或者,您可以使用以下命令微调自己的适配器

# Step 1: finetune (output a PyTorch model and PEFT adapter) 
olive fine-tune --method qlora -m <model> -d <dataset> -o models/ft 
# Step 2 : Optimize base model and adapter into ONNX format 
olive auto-opt -m models/ft/model -a models/ft/adapter -o <output folder> --device cpu|gpu --provider <execution provider> 

运行 ONNX 模型并切换适配器

  1. 加载适配器:为基础模型动态加载适配器

    adapters = oga.Adapters(model) 
    adapters.load("file", "name")
  2. 设置活跃适配器:根据客户请求即时切换适配器

    generator.set_active_adapter(adapters, "name") 

展望未来

开发中

  • 批处理支持:增强 ONNX Runtime 内核以支持适配器感知的批处理。
  • 扩展绑定:引入语言绑定以实现更广泛的采用。
  • 内存功能:额外的内存管理改进。

您的反馈很重要

随着 MultiLoRA 的发展,我们邀请开发者测试此功能、提供见解并塑造其路线图。通过共同努力,我们的目标是为 AI 适配创建一个灵活、强大的基础。

总结

MultiLoRA 不仅仅是对 ONNX Runtime 的增强,更是朝着使 AI 系统模块化、适应性强且易于访问迈出的一步。通过解决内存管理、批处理和数据格式效率低下等技术挑战,MultiLoRA 为 AI 部署的新时代奠定了基础。

让我们共同构建适应性 AI 的未来。与我们一起探索 ONNX Runtime MultiLoRA!

资源