前言
MindSpore有两种运行模式:动态图模式和静态图模式。默认情况下是动态图模式,也可以手工切换为静态图模式。
动态图模式
动态图的特点是计算图的构建和计算同时发生,符合Python的解释执行方式。在调试模型时较为方便,能够实时得到中间结果的值。但由于所有节点都需要被保存,导致难以对整个计算图进行优化。在MindSpore中,动态图模式又被称为PyNative模式,推荐在脚本开发和网络流程调试过程中使用。
静态图模式
相较于动态图而言,静态图的特点是将计算图的构建和实际计算分开(Define and run)。
在MindSpore中,静态图模式又被称为Graph模式,在Graph模式下,基于图优化、计算图整图下沉等技术,编译器可以针对图进行全局的优化,获得较好的性能,因此比较适合网络固定且需要高性能的场景。
静态图模式的使用场景
MindSpore编译器专注于Tensor数据的计算和微分处理,适合使用MindSpore API和基于Tensor对象的操作进行静态图编译优化。静态图模式存在编译耗时,如果函数无需反复执行,则使用静态图加速可能没有价值。
静态图模式开启方式
MindSpore提供了jit装饰器,可以通过修饰Python函数或者Python类的成员函数使其被编译成计算图,从而提高运行速度。可以针对需要优化的模块进行图编译加速,保持其他部分的动态图灵活性。jit修饰的部分始终以静态图模式运行。当需要对Tensor的某些运算进行编译加速时,可以在其定义的函数上使用jit修饰器。
基于装饰器的开启方式
MindSpore提供了jit装饰器,可以通过修饰Python函数或者Python类的成员函数使其被编译成计算图,从而提高运行速度。通过对想要进行性能优化的部分进行图编译加速,而保持其他部分仍使用解释执行方式,保持动态图的灵活性。被jit修饰的部分始终会以静态图模式进行运行。需要对Tensor的某些运算进行编译加速时,可以在其定义的函数上使用jit修饰器。
基于context的开启方式
静态图的语法约束
在MindSpore的Graph模式下,Python代码会被编译成静态计算图,然后执行。静态图编译器支持Python常用语法子集,以支持神经网络的构建和训练。可以通过JitConfig配置选项来自定义编译流程,包括控制优化等级、模型执行方式以及静态图语法支持级别。
总结
本文介绍了MindSpore中动态图(PyNative)和静态图(Graph)两种运行模式的特点和使用场景。动态图更适合模型调试和快速迭代,静态图则能提供更高的性能。详细阐述了切换运行模式的方法,包括使用jit装饰器对部分函数进行图编译加速,以及利用JitConfig选项进一步优化静态图的编译和执行。同时也提醒了静态图编程中的语法限制,并介绍了一些高级编程技巧以提高性能和稳定性。总的来说,MindSpore提供了灵活的动态图和高性能的静态图两种选择,开发者可根据具体需求进行合理选择和应用。