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 实验设计
为了验证本文提出的模型代码自动迁移技术的有效性, 即测试基于领域知识图谱和抽象语法树的模型代码技

