Page 107 - 《软件学报》2026年第2期
P. 107

586                                                        软件学报  2026  年第  37  卷第  2  期


                                           [4]
                    2018  年, 微软开源了   MMdnn , 一个开源的、综合的、可靠的深度学习模型转换工具. 它从编译的角度实现了
                 一个可扩展的转换架构, 目的是支持           Caffe、Keras、MXNet、TensorFlow、CNTK、PyTorch 和 CoreML  等框架之
                 间进行模型转换     [5−7] . MMdnn  参考  ONNX 框架采用了一种新颖的基于统一中间表示          (IR) 的方法来系统地处理转换,
                 首先将源模型转换为基于简单图的            IR 表示的中间计算图, 然后再转换为目标框架格式, 大大降低了工程复杂度.
                    2019  年, 百度发布了飞桨生态下的模型转换工具            X2Paddle. 不同于上述的   ONNX  和  MMdnn  可以将不同深度
                 学习框架的模型进行互相转换, X2Paddle 是单向地将             Caffe、TensorFlow、PyTorch  等主流深度学习框架的模型
                 转换为   PaddlePaddle 模型, 实现模型的跨框架迁移和部署. 它还支持将           PyTorch  项目中的  Python  代码  (包括训练、
                 预测) 一键转为基于飞桨框架的项目代码, 帮助开发者快速迁移项目.
                    X2Paddle 的核心原理是将模型转换为         PaddlePaddle 框架的计算图和参数, 利用     PaddlePaddle 框架的高效计算
                 能力和自动优化技术, 实现模型的高效推理和部署. 具体可以分为以下几个步骤: 第一, X2Paddle 首先加载原始模
                 型, 并根据模型的类型和结构构建出对应的计算图. 第二, 根据原始模型的计算图, X2Paddle 会自动将其转换为
                 PaddlePaddle 框架的计算图, 并将原始模型的参数转换为           PaddlePaddle 格式. 第三, 执行动转静操作, 保存静态图模
                 型到磁盘中.
                    但是, 基于   X2Paddle 进行代码转换需要使用者手动进行转换前的代码预处理以及转换后的代码后处理. 例
                 如, 由于部分   PyTorch  操作是目前   PaddlePaddle 暂不支持的操作, 因此在转换前需要使用者手动将这部分操作去
                 除或者修改, 例如不支持       TensorBoard、自动下载模型等. 此外, PaddlePaddle 在使用上有部分限制, 使用者需要在
                 转换后手动修改代码, 例如自定义           Dataset 必须继承自  paddle.io.Dataset、部分情况下  DataLoader 的  num_worker
                 只能为   0  等. 这些需要调用者手动进行预处理和后处理的操作也极大地增加了开发者的负担.
                    2020  年, MindSpore 推出了  MindConverter, 它是一款深度学习模型迁移工具, 借助华为          ModelArts 深度学习
                 平台的高效计算能力和自动化工具, 可以快速迁移和部署                  PyTorch (ONNX) 或  TensorFlow (PB) 模型到  MindSpore
                 框架下. 模型文件     (ONNX/PB) 包含网络模型结构       (network) 与权重信息  (weights), 迁移后将生成  MindSpore 框架
                 下的模型定义脚本       (model.py) 与权重文件  (ckpt). MindConverter 的架构与  X2Paddle 类似, 也是单向地将  PyTorch
                 (ONNX) 或  TensorFlow (PB) 模型快速迁移到  MindSpore 下使用, 同时提供基于抽象语法树的          PyTorch  脚本迁移.
                    MindConverter 的实现原理主要分为以下几个步骤: 第一, MindConverter 首先加载原始模型, 并根据模型的类
                 型和结构构建出对应的计算图. 第二, MindConverter 将原始模型转换为中间表示格式如抽象语法树或图结构, 该
                 格式可以方便地在不同深度学习框架之间进行转换. 第三, MindConverter 将中间表示格式的模型转换为                        MindSpore
                 深度学习框架的模型. 最后, MindConverter 将转换后的模型导出为             MindSpore 深度学习框架的模型文件, 并可以
                 直接在   MindSpore 框架上进行推理和部署.
                    但是, MindConverter 存在以下问题: 第一, 由于      MindConverter 模型转换工具本质为算子驱动, 所以在导出
                 ONNX  模型文件时, 需要     PyTorch  算子支持相应的    ONNX  算子, 并且对于    MindConverter 未维护的  ONNX  算子
                 与  MindSpore 算子映射, 将会出现相应的算子无法转换的问题. 对于该类算子, 需要用户手动进行修改. 第二, 由于
                 模型转换工具以推理模式加载           ONNX  文件, 可能会导致转换后算子丢失问题如             Dropout 算子丢失, 需要用户手动
                 补齐. 第三, MindConverter 当前仅维护   1.6.0  和  1.7.0  两个版本, 后续维护工作也将逐步向      1.7.0  倾斜, 并且  Mind-
                 Converter 从  1.9.0  开始将不再演进, 官网文档及代码也将逐步下架.
                    2022 年, 百度开源了新的代码转换工具 PaConvert, 该工具可以自动将其他深度学习框架下训练或推理的代
                 码, 迁移到 Paddlepaddle 框架下的目标代码, 方便快速地进行模型代码迁移. 与 X2Paddle 不同, PaConvert 使用抽
                 象语法树作为中间表示进行代码迁移, 首先将输入的模型代码解析为抽象语法树, 对其进行解析、遍历、匹配、
                 编辑、替换和插入等各种操作, 然后得到基于 PaddlePaddle 的抽象语法树, 最后生成 PaddlePaddle 框架下的代码.
                    不同之处在于, PaConvert 使用人工将框架间算子差异信息存储在文本文件中, 极大地增加了开发人员的编写
                 成本, 并且不容易进行版本的更新迭代. 此外, PaConvert 目前处于内测阶段, 仍然有若干算子暂时不支持迁移如
                 pad 算子、is_available 算子和 is_initialized 算子等.
                    综上所述, 大多数工具只支持将有限框架单向迁移至单个框架下, 例如                       PaConvert 只支持将  PyTorch  框架下
   102   103   104   105   106   107   108   109   110   111   112