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

丁嵘 等: 基于领域知识图谱的框架间          AI 源码自动迁移                                            595



                 16.       value = new_values
                 17.     end
                 18.     if value is ast.Import or ast.ImportFrom then
                 19.        /* 访问     Import 或  ImportFrom  节点, 构建通用信赖信息 */
                 20.        for alias in node.names do
                 21.           UDepInfo.add(from = node.module, import = alias.name, as = aslias.asname)
                 22.     else if value is ast.ClassDef or ast.FunctionDef then
                 23.        /* 需要递归访问其子节点 */
                 24.        VISIT(children(value));
                 25.     else if value is ast.Call or ast.Attribute then
                 26.        /* 根据     UEdepInfo  生成当前遍历到算子的特定算子信息           SOpInfo */
                 27.        SOpInfo ← get_sopinfo(value, UDepInfo);
                 28.        /* 根据特定算子信息及目标框架名称, 到领域知识图谱中获取映射关系 */
                 29.        mapping_info ← get_mapping_info(SOpInfo.get(value), TARGET_FRAMEWORK);
                 30.        if mapping_info is not None then
                 31.          /* 获取辅助映射信息 */
                 32.          special_para ← mapping_rules(SOpInfo.get(value));
                 33.          /* 根据映射关系和辅助映射信息修改算子节点 */
                 34.          change_ast(node, mapping_info, special_para);
                 35.        end
                 36.      end
                 37.    end
                 38. end

                  4.4   抽象语法树反解析模块
                    在完成抽象语法树的改写获得新的抽象语法树之后, 深度学习模型代码在不同深度学习框架上的基于抽象语
                 法树的自动转换的异构适配技术的重难点部分就已经完成了. 接下来就是使用模型代码反解析模块将新抽象语法
                 树重构成目标深度学习框架的模型代码.
                    与抽象语法树解析模块不同, 反解析模块需兼顾                 Python  语言标准与代码可读性. 反解析模块通过借助             astor
                 库的  to_source 函数, 可以将树结构转换成      Python  代码, 其步骤为使用自顶向下的方法, 遍历树中的每个节点, 当
                 进入特定的抽象语法树节点时, 根据指定的规则将其转换为程序代码. 这些规则通常是根据目标深度学习框架所
                 遵循的语法规则来定义的. 在遍历的过程中, 将还原出来的代码按照节点遍历的顺序进行组装和拼接, 最终得到的
                 就是目标深度学习框架的神经网络模型代码. 此外, 采用抽象语法树作为中间件进行转换的一个好处是, 抽象语法
                 树会将源代码的缩进情况存储起来, 在将抽象语法树恢复成代码后, 这些缩进信息仍然保留, 不会给代码结构造成
                 严重破坏. 对于反解析生成的目标代码, AST            重构可能生成长代码行如复杂表达式和嵌套公式, 因此还需要添加
                 分行符并遵循     Python  语言标准. 此外, AST  不保留注释信息, 因此需要人工添加注释, 我们也考虑在未来的工作中
                 通过后处理进行补充.
                  5   实验分析


                  5.1   实验设计
                    为了验证本文提出的模型代码自动迁移技术的有效性, 即测试基于领域知识图谱和抽象语法树的模型代码技
   111   112   113   114   115   116   117   118   119   120   121