PyTorch、JIT(tracing、script)、onnx

       PyTorch是eager模式设计的深度学习框架,易于debug、train、experiment;(易于调试)

       JIT将PyTorch的表达转换为可以优化和序列化的静态计算图,生成torchscript IR,得到的静态图可以保存,被C++的语言前端等支持,也可转换为其他格式的文件,如ONNX;(易于部署)

       对于tracing,相当于运行一次模型,通过预先定义好的张量,追踪整个动态图的构建过程,记录下和tensor相关的操作,得到最终构建出来的动态图并转换为静态图。如果输入数据不同,导致模型的部分行为改变,tracing是记录不下来的,固定了输入以及行为,比如,if语句,只会记录执行的那一个分支;for循环的次数也是固定的。导出的表示与运行完全相同的静态图。因此tracing的输入包括模型以及模型输入参数。

       对于script,是对模型进行语法、词法分析等操作,因此可以使用if、for等动态控制流,支持的神经网络比tracing少。

       ONNX是一个深度学习模型标准,可用于模型转换及部署,MXNet、TF、PyTorch均有现成转换为ONNX的工具,大部分框架都有ONNX模型inference的支持。如果后端为CUDA或X86,可以使用onnx runtime做部署。

对于动态图(PyTorch)和静态图(TF)的区别:

动态图是同时进行运行和搭建,灵活,很方便了解运行中结果,比较方便面向对象编程,易于调试;

静态图是先搭建好图,再进行运算,类似于训练神经网络,模型构建好,直接把数据放模型中进行训练,高效但不太灵活。

比如i=a+2,j=b+3,s=i+j,return s;

对于动态图,是直接将已经赋好值的a,b进行运算。

对于静态图,是先将上述运算流程存储好,然后将a,b的值放到运算入口进行运算。

假如有模型需要放入100组数据进行训练,

对于动态图,需要生成100次计算图,因为边计算边构建。

对于静态图,只需要生成1次计算图,计算较为高效。

最近在学习编译器架构对于静态图和动态图的的一些了解,如有错误,欢迎指正。

你可能感兴趣的:(机器学习)