Page 108 - 《软件学报》2026年第2期
P. 108
丁嵘 等: 基于领域知识图谱的框架间 AI 源码自动迁移 587
的模型代码单向迁移到 PaddlePaddle 框架下, MindConverter 同样只支持将 PyTorch 或 TensorFlow 的模型转换成
MindSpore 下的模型, 无法形成框架间模型代码互相转换的良好态势. 此外, X2Paddle 等迁移工具针对每一对源框
架和目标框架都需要手工维护相应的映射信息, 假设源框架数量为 M, 目标框架数量为 N, 则构建映射信息的复杂
度为 O(MN), 成本高且扩展性差, 给深度学习框架技术进步和协同发展带来了巨大的阻碍和挑战.
3 方法框架
3.1 关键问题
C 2 . 由于深度学习框架
定义深度学习模型为 M, 在源深度学习框架下代码为 C 1 , 目标深度学习框架下代码为
均会将代码所表征的模型形式化为有向无环图 (directed acyclic graph, DAG), 则该模型可以定义为:
{ }
N {( )} K
M = V = {u i } i=1 , E = u i ,u j i,j , P = {p i } i=1 (1)
.
其中, V 代表节点集合, 每个节点 u i 表示调用深度学习框架中的某个算子, 定义为 u i .op E 代表有向边集合, 具体
的, 一条有向边表示将 u i 的输出张量作为输入张量传递给 u j 节点, 并遵从只有在 u i 节点运行完毕之后 u j 节点才能
开始执行. 模型 M 有一些没有父节点的节点, 例如从磁盘读取输入数据的节点, 这类节点提供初始值来激活深度
M 的输出由无后继节点的输出张量元
学习的计算, 并将它们的输出张量的元组作为模型 M 的输入. 类似的, 模型
组表示. P 代表超参数集合, 每个 p 都表示一个超参数, 如批量大小 (batch size)、学习率 (learning rate)、丢失率
(dropout rate) 等. 如前所述, 模型 M 本质上是一个可以被表示为 F M 的数学函数.
,
假设 X i∈[1,m] Z i∈[1,n] 都是张量, 则张量元组 X =< X 1 ,X 2 ,...,X m > 表示节点或算子的输入, 张量元组 Z =< Z 1 ,
Z 2 ,...,Z m > 表示节点或算子的输出. 令 F 为接收 m 维输入张量并返回 n 维输出张量的算子 op 的数学函数, 则 op
定义为:
< Z 1 ,Z 2 ,...,Z m >= F op (< X 1 ,X 2 ,...,X m >) (2)
根据上述符号和参数的定义, 将深度学习模型代码迁移算法记为 A. 采用 MMdnn 的定义, 如果 A 满足以下两
个条件, 则是准确忠实的深度学习模型代码迁移算法.
(1) 语法合法性: 给定任意源框架深度学习代码 C 1 所表征的模型 M 1 =< V 1 ,E 1 ,P 1 >, 应该通过模型代码自动迁
移算法 A 生成一个目标框架下的代码 C 2 所表征的模型 M 2 =< V 2 ,E 2 ,P 2 >:
M 1 ⊢ A M 2 ∧(P 2 = P 1 ) (3)
(2) 语义等价性: 给定任意有效输入的张量元组 X , 原框架深度学习代码 C 1 所表征的模型 M 1 和经过准确忠实
Z
的模型代码自动迁移算法 A 生成的目标框架代码 C 2 所表征的模型 M 2 应该总是返回相同的结果 :
(X) (4)
Z = F M 1 (X)⊢ A Z = F M 2
综上所述, 本文的目标就是设计出准确忠实的不同深度学习框架间模型代码的自动迁移方案. 如下代码 1–代
码 3 所示是一些深度学习模型代码的示例, 通过对比不同深度学习框架下相同模型对应的神经网络代码, 可以对
代码差异有更直观的认识, 并更好地理解代码迁移的思路.
代码 1. PyTorch 框架下的简单模型代码.
import torch
from torch import nn
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.conv_layer = nn.Conv2d(in_channels = 3, out_channels = 64,
kernel_size = 3, padding = 1)

