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

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



                    def forward(self, x):
                       o = self.conv_layer(x)
                       return o


                 代码  2. PaddlePaddle 框架下的简单模型代码.
                 import paddle
                 from paddle import nn
                 class Model(nn.Layer):
                    def __init__(self):
                       super(Model, self).__init__()
                       self.conv_layer = nn.Conv2d(in_channels = 3, out_channels = 64,
                          kernel_size = 3, padding = 1)
                    def forward(self, x):
                       o = self.conv_layer(x)
                       return o


                 代码  3. MindSpore 框架下的简单模型代码.
                 import mindspore
                 from mindspore import nn
                 class Model(nn.Cell):
                    def __init__(self):
                       super(Model, self).__init__()
                       self.conv_layer = nn.Conv2d(in_channels = 3, out_channels = 64,
                          kernel_size = 3, padding = 1, pad_mode = “pad”)
                    def construct(self, x):
                       o = self.conv_layer(x)
                       return o
                    通过对比上述不同框架下的模型代码可知, 本文的根本挑战在于以下几点.
                    第一, 神经网络模型的组网代码通常通过组装若干深度学习框架的算子来实现, 因此若要实现不同深度学习
                 框架间模型代码的迁移, 则需要对这些算子进行转换. 然而, 不同深度学习框架的编程范式与组网方式不尽相同,
                 算子名称及其参数也具有一定的差异性, 如针对顺序的线性网络结构可以使用                           Sequential 方式组网, 而针对一些
                 比较复杂的网络结构, 可以使用          Layer 子类定义的方式来进行模型代码的编写等. 因此, 如果直接在字符串层面进
                 行转换则需要考虑多种情况, 从而使得迁移程序十分复杂.
                    第二, 由第   2  节的分析可知, 目前工业界的深度学习神经网络模型代码迁移程序如                      MindConverter 等将不同
                 框架间的差异信息存储在表格或代码中, 导致知识的表达能力较弱, 知识与代码之间耦合性过高, 而深度学习框架
                 更新换代较快的特性会使得上述方法难以及时迭代且更新成本过高, 实际使用起来较为困难. 具体来说, 存储在表
                 格中的映射信息关系较为单一, 较难表达一对多或者多对多的映射关系, 例如                        PyTorch  在进行数据处理时, 需要将
                 数据集和采样器对象, 以及分批、混洗和并行等参数传入                   DataLoader 接口, 以实现具有对应功能的数据迭代, 而
                 MindSpore 的采样器对象以及分批、混洗和并行等参数可以在创建数据集对象时传入, 也可以通过数据集内方法
                 来定义, 不需要类似      PyTorch 一样采用额外的加载器, 类似的复杂信息适合使用表达能力更强的图结构进行存储.
   104   105   106   107   108   109   110   111   112   113   114