微软AI研究院开源ONNX脚本库,可直接使用Python编写ONNX模型

微软AI研究院开源ONNX脚本库,可使用Python编写ONNX模型

在不断发展的机器学习领域中,ONNX(Open Neural Network Exchange)模型已经成为一个关键的技术,提供了一种标准化和灵活的表示,适用于各种硬件平台和运行时环境。从云端超级计算机到资源受限的边缘设备如智能手机和Web浏览器,ONNX模型可以在各种环境中无缝执行。

ONNX的核心是其图形格式,通常使用Protobuf格式表示。然而,ONNX不仅仅是一个图形表示,它由一组简洁的原始操作符组成,这些操作符被运行时和硬件供应商普遍实现。为了保持广泛的生态系统和减少开销,ONNX故意保持其操作符数量较少,通过ONNX函数鼓励模块化。

虽然机器学习模型通常使用PyTorch和TensorFlow等高级框架构建,但将其部署到生产环境中需要进行转换。使用框架提供的工具将模型导出到ONNX,然后使用Olive等工具对特定目标进行优化。

认识一下ONNX Script,这是由Microsoft团队设计的一种新颖的开源库,旨在通过Python直接创建ONNX模型。ONNX Script优先考虑了干净、惯用的Python语法,并通过ONNX本地函数促进了组合性。这种方法简化了模型的编写,并促进了与现有Python工具的集成,提高了可读性和生产力。重要的是,ONNX Script是未来支持TorchDynamo的PyTorch ONNX导出器的基石。

在ONNX Script出现之前,创建ONNX模型要求对规范和序列化格式有深入的了解。虽然辅助API改善了这个过程,但它需要熟悉ONNX的复杂性。ONNX Script通过在Python中嵌入两个级别来采用不同的方法:

1. 操作符的强类型API:ONNX Script提供了强类型的API,支持截至opset 19的所有186个操作符。这允许标准的Python工具、代码检查工具和IDE提供有价值的反馈并强制正确性。

2. 自然的Python结构:ONNX Script支持Python语言的特性,包括条件语句、循环、二元和一元操作符、切片等。在Python中,表达式`a + b`对应于ONNX Script中的`Add(a, b)`。

ONNX Script与PyTorch ONNX导出器的集成响应了不断变化的环境。PyTorch 2.0和TorchDynamo的出现标志着从TorchScript的转变,需要对ONNX导出器进行重大改进。ONNX Script被构想为这一转变的基础,重新构思了导出器架构的基本原理。通过开发Torchlib——一个纯粹的PyTorch操作符的ONNX实现,导出器的角色变得简化,将FX图节点转换为ONNX图节点,无需关注操作符级别的问题。

此外,ONNX Script使得可以通过自定义ONNX函数作为专门的操作符来增强PyTorch模型代码的灵活性和功能。

ONNX Script通过无缝集成到Python生态系统中,促进了简单的测试和调试。通过内置对NumPy的支持,可以通过标准的Python工具或像Visual Studio Code这样的高级IDE进行调试。

ONNX Script的未来是充满希望的。它简化了ONNX模型的编写,并打开了扩展ONNX标准本身的可能性。可以使用ONNX Script编写ONNX标准中的核心操作符和高阶函数,加快标准的演进。在未来几个月中,ONNX Script将支持将ONNX转换为ONNX Script,方便对现有模型进行更平滑的编辑和优化。目标是将ONNX Script的包含提议到ONNX GitHub组织中,巩固其在机器学习领域的地位。