[discussion]关于编译时和运行时的区别
Created by: jacquesqiao
主题:
Paddle编译时和运行时的区别
参与人:
董志宏,严春伟,乔龙飞
1. 如果VarDesc作为编译时,Scope/Variable作为运行时
实现方法 VarDesc创建的时候无需Scope,只需要在一个全局map中保存VarDesc,InferShape需要修改对应的VarDesc即可。
优点:
- 切换Scope简单,只需在Op Run的时候传入一个新的Scope,框架根据全局的VarDesc Map在其中创建对应的Var即可运行。
- 用VarDesc存储元信息,方便做优化。
- InferShape就可以不需要传入Scope这个参数,因为修改的VarDesc都存在于全局的map中
缺点: InferShape实现复杂,编译时Infer是基于VarDesc,但是考虑到运行时size可能会被用户修改(这点不知道是否合理),运行时也需要做InferShape,这个InferShape是基于Scope中的Variable进行,代码上会有一定的重复。
2. 不带内存的Tensor作为编译时,带内存的Tensor作为运行时。
实现方法 Var必须创建在某个已经存在的Scope中,切换Scope之前,需要clone某个创建过Var的Scope
优点 InferShape只需要实现一遍,配置时和运行时都调用同样的函数即可
缺点 Clone的实现可能并不简单,比如多种设备类型之间内存如何同步(Scope for CPU vs Scope for GPU)