You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
而随着近期 SOT 动转静新模式和 PIR 底层 IR 的开发,两者都使用了动转静单测作为功能正确性的验证方式,为了能够同时跑多种模式,SOT 和 PIR 开发小组在 test/dygraph_to_static/dygraph_to_static_util.py 分别添加了相关的装饰器,用于选择具体跑在什么模式下。
但 SOT 和 PIR 的单测扩增机制非常不同,这将会影响之后单测的扩展(比如之后即将开展的 PIR 动转静(理想态)单测推全验证),为了能够方便、统一地对单测进行管理,#57824 中在 test/dygraph_to_static/dygraph_to_static_utils_new.py 添加了一套统一的动转静单测机制,方便灵活地启用各种单测 case。但 #57824 的主要目标只是将 SOT 合入 Paddle,为了确保动转静单测机制的一致性,我们需要尽快将新机制推全~
Design
新的机制利用了 Metaclass,将会在生成新的 class 的时候统一生成新的单测 case,比如对于如下单测代码:
新的机制只能装饰 test 开头的 test case,非 test case 使用相关装饰器是没有效果的(相关装饰器一律以 test_ 作为前缀)
我们保留了 compare_legacy_with_pir 这一个特殊的装饰器,因为它大多数情况是需要装饰在非 test case 上面的,也就是 test case 所调用的内部函数,根据我们新机制的原理,我们没有办法利用新机制实现这一点,因此保留了该装饰器,该装饰器仍然是旧的一次跑两种 case 的机制
Note
SOT 开发小组对组合方式进行了修改,请查看: #58630 、#58633
Motivation
单测在项目开发中是很重要的一部分,我们动转静相关的单测主要放置在
test/dygraph_to_static
,也一直保障着动转静功能的正确性。而随着近期 SOT 动转静新模式和 PIR 底层 IR 的开发,两者都使用了动转静单测作为功能正确性的验证方式,为了能够同时跑多种模式,SOT 和 PIR 开发小组在
test/dygraph_to_static/dygraph_to_static_util.py
分别添加了相关的装饰器,用于选择具体跑在什么模式下。但 SOT 和 PIR 的单测扩增机制非常不同,这将会影响之后单测的扩展(比如之后即将开展的 PIR 动转静(理想态)单测推全验证),为了能够方便、统一地对单测进行管理,#57824 中在
test/dygraph_to_static/dygraph_to_static_utils_new.py
添加了一套统一的动转静单测机制,方便灵活地启用各种单测 case。但 #57824 的主要目标只是将 SOT 合入 Paddle,为了确保动转静单测机制的一致性,我们需要尽快将新机制推全~Design
新的机制利用了 Metaclass,将会在生成新的 class 的时候统一生成新的单测 case,比如对于如下单测代码:
在装饰器的执行阶段,会在函数
MyTest.test_case1
上 patch 两个属性,分别是test_case1.to_static_mode = ToStaticMode.LEGACY_AST | ToStaticMode.SOT
和test_case1.ir_mode = IrMode.LEGACY_PROGRAM | IrMode.PIR
。而从 MetaclassDy2StTestMeta
生成MyTest
的时候,我们会根据 patch 的属性来生成新的单测 case,这里对于test_case1
,根据其to_static_mode
和ir_mode
,我们共有 2x2 = 4 种组合,因此我们会生成如下四个单测 case(伪码描述,实际实现会略有不同):Important
Dy2StTestBase
作为基类,如果不设置基类,根据新机制的原理,仅仅会在函数上 patch 一个属性,而不会跑两次,也就是没有任何效果,注意不仅仅是原来使用dy2static_unittest
装饰的单测 case,只要使用了dygraph_to_static_util
下装饰器的 case 都需要修改test
开头的 test case,非 test case 使用相关装饰器是没有效果的(相关装饰器一律以test_
作为前缀)compare_legacy_with_pir
这一个特殊的装饰器,因为它大多数情况是需要装饰在非 test case 上面的,也就是 test case 所调用的内部函数,根据我们新机制的原理,我们没有办法利用新机制实现这一点,因此保留了该装饰器,该装饰器仍然是旧的一次跑两种 case 的机制Tasks
Details
9test/dygraph_to_static/test_cache_program.py29test/dygraph_to_static/test_error.py30test/dygraph_to_static/test_eval_frame.py35test/dygraph_to_static/test_function_spec.py41test/dygraph_to_static/test_ignore_module.py52test/dygraph_to_static/test_logging_utils.py87test/dygraph_to_static/test_setter_helper.py92test/dygraph_to_static/test_static_analysis.pyThe text was updated successfully, but these errors were encountered: