Paddle
Paddle copied to clipboard
PIR 动转静理想态单测推全验证任务列表(二期)🥳
一. BackGround 📚
任务背景:#58633
二. Task 🙋🏻♀️
✅:已经完全修复,所有单测都OK! 🟢:待合入,合入之后完全修复! 🟡:当前阶段不需要人力继续跟进,下阶段推进(Save、控制流、AMP、编译器、PyFuncOp、TrainStep整图导出) ❌:单测没有通过,需要人力跟进。 🚧:待分析,单测还没有进行分析,可以进行分析或者是修复。
整体进度(95/114):
| 单测总数 | 已完成覆盖 ✅ | 即将合入 🟢 | 下阶段跟进 🟡 | 尚未支持 ❌ |
|---|---|---|---|---|
| 114 | 95 | 0 | 19 | 0 |
| - | 75% | 0% | 22% | 0% |
遗留问题修复(点击展开)
| 序号 | 认领人 | 文件 | 错误类型 | case | 问题 | 报错 | pr |
|---|---|---|---|---|---|---|---|
| ✅1 | @SigureMo | test_assert.py | 控制流 | TestAssertVariable.test_non_variable |
|||
| ✅2 | @gouzil | test_bert.py | ? | {test_train, test_train_composite} |
段错误, 详细链接 | The owner op type is:pd_op.full_like |
#60164, #60173 |
| ✅3 | @DrRyanHuang @SigureMo | test_container.py | API | TestSequential |
需要适配OpResult.__eq__ |
TypeError: The type of 'input' in ConditionalBlock must be (<class 'paddle.base.framework.Variable'>, <class 'paddle.Tensor'>), but received <class 'paddle.base.libpaddle.pir.OpResult'>. |
#63190 |
| ✅4 | test_convert_call.py | API | TestRecursiveCall2 |
需要适配paddle.nn.Layer.__call__或者paddle.nn.Layer._dygraph_call_func,含 cond OP,控制流尚不支持 |
ValueError: (InvalidArgument) linear(): argument 'weight' (position 1) must be Tensor, but got Parameter (at Paddle/paddle/fluid/pybind/eager_utils.cc:1136) [operator < linear > error] |
#61447 | |
| ✅5 | @DrRyanHuang | test_convert_operators.py | API | test_variable |
OpResult 不支持 __eq__ |
||
| ✅6 | @SigureMo | test_grad.py | ? | TestGrad |
段错误, 详细链接 | #60621 | |
| test_grad.py | Save/Load | TestGradLinear |
|||||
| ✅7 | @SigureMo | test_lac.py | 跳过 | #63192 | |||
| 🟡8 | @SigureMo | test_lstm.py | Save/Load | test_lstm_to_static |
|||
| test_lstm.py | API | test_lstm_to_static |
~~RNN 相关 API 没有适配~~ | TypeError: Cannot interpret '<DataType.FLOAT32: 10>' as a data type |
|||
| test_lstm.py | ~~精度问题~~ | test_lstm_to_static |
PIR + SOT 会导致精度不足 | Not equal to tolerance rtol=1e-05, atol=0 |
#60343 | ||
| test_lstm.py | 动转静执行 | test_lstm_to_static |
EagerTensor 传入到 API 中,需要将其转换为 Value,将会在 #59761 完成 | #59761 | |||
| ✅9 | @gouzil | test_no_gradient.py | 反向 | #59764、#63216、#63694 | |||
| 🟡10 | @DrRyanHuang | test_program_translator.py | API | all | 控制流 | ||
| 🟡11 | @gouzil | test_save_inference_model.py | API | TestDyToStaticSaveInferenceModel |
python/paddle/jit/dy2static/py_layer.py的save_for_backward有做类型检查,尝试解决后还需要解决paddle/static/nn/static_pylayer.py文件下一些方法的适配 |
ValueError: (InvalidArgument) Currently, we can only get name of OpResult that is persistable |
#60211 |
| test_save_inference_model.py | 动转静执行 | TestPartialProgramRaiseError |
需要适配PartialProgramLayer下的_check_params_all_inited |
AttributeError: 'paddle.base.libpaddle.pir.Program' object has no attribute 'blocks' |
|||
| ✅12 | @SigureMo | test_sentiment.py | 动转静执行 | all | 段错误, 挂在forward里面了, https://github.com/PaddlePaddle/Paddle/pull/59314#pullrequestreview-1754310218 |
#63192 | |
| ✅13 | @gouzil | test_seq2seq.py | API | all | paddle.nn.functional.sequence_mask 尚不支持,该任务为 #58067 202 题,见 #59058,#60345 会支持该 API | #60423、#60454 | |
| 🟡14 | @gouzil | test_slice.py | 控制流 | {TestSliceInIf, TestSliceInWhileLoop, TestSliceInForLoop} |
#60200 | ||
| ~~test_slice.py~~ | ~~依赖setitem~~ | ~~{TestSetValueWithLayerAndSave, TestSetValue} setitem @建业~~ |
|||||
| ✅15 | @SigureMo | test_tensor_memcpy_on_cpu.py | 动转静执行 | test_tensor_cuda_on_default_cpu |
set_parameter 会导致插入 D2H copy 回 CPU |
#60363 |
其他的有依赖项的具体分类见下面 comments
Save/Load
| 序号 | 认领人 | 文件 | 错误类型 | case | 问题 | 报错 | pr |
|---|---|---|---|---|---|---|---|
| ✅8 | test_layer_hook.py | Save/Load | 绕过Save:待合入 | #59532 | |||
| ✅14 | test_bmn.py | Save/Load | 绕过Save:单侧通过 | 待合入 @2742195759 | 遗留Save适配 | #59532 | |
| ✅61 | test_save_load.py | Save/Load | all | paddle.jit.api.save需要适配 |
AttributeError: 'list' object has no attribute 'type' |
||
| ✅66 | test_declarative.py | Save/Load | test_with_input_spec |
需要适配jit.api.save方法 | |||
| ✅25 | test_mobile_net.py | Save/Load | 待合入 | 绕过Save:精度问题(依赖BN反向修复)同test_ResNet单侧 | AttributeError: 'list' object has no attribute 'type' |
||
| ✅33 | test_typing.py | Save/Load | all | 需要适配jit.api.save方法 |
AttributeError: 'list' object has no attribute 'type' |
||
| ✅58 | test_build_strategy.py | Save/Load | 依赖BatchNorm反向修复 @儒婷 | ||||
| ✅38 | test_se_resnet.py | Save/Load | |||||
| ✅11 | test_save_inference_model.py | Save/Load | TestDyToStaticSaveInferenceModel |
||||
| test_save_inference_model.py | PyLayer | ||||||
| 🟡8 | test_lstm.py | Save/Load | test_lstm_to_static |
||||
| ✅45 | test_for_enumerate.py | Save/Load | TestForZip |
Save Load 不支持 |
该方向具体支持 tracking issue 见 #64098
CINN
| 序号 | 认领人 | 文件 | 错误类型 | case | 问题 | 报错 | pr |
|---|---|---|---|---|---|---|---|
| ✅10 | @SigureMo | test_cinn_prim_mean.py | CINN | all | ~~需要单独适配单测中check_prim方法~~确认移除 |
AttributeError: 'RunableProgram' object has no attribute 'block' |
#63311 |
| ✅18 | @SigureMo | test_cinn_prim.py | CINN | ~~{TestPrimForwardAndBackward, TestPrimForward}.check_prim 单测需要修改~~确认移除 |
#63311 | ||
| test_cinn_prim.py | CINN | TestBackend |
最终态尚未打通 CINN,这里能跑过应该是 CINN 没有生效 | ||||
| ✅65 | @SigureMo | test_cinn.py | CINN | all | 确认移除 | #63311 | |
| ✅67 | @SigureMo | test_fallback.py | CINN | {test_case_func_fallback, test_case_net_fallback, test_case_net_error, test_case_training, test_case_save_error_2} |
~~CINN暂不支持~~ 确认移除 | #63309 | |
| ✅80 | @SigureMo | test_cinn_prim_gelu.py | CINN | all | 确认移除 | #63311 | |
| ✅37 | @SigureMo | test_cinn_prim_layer_norm.py | 待明确 | all | ~~需要带 CINN 编译,应该也跑不通~~确认移除 | NotImplementedError: (Unimplemented) Currently we only support CINN Pass for Pir under @to_static, please compile PaddlePaddle with CINN |
#63311 |
控制流
| 序号 | 认领人 | 文件 | 错误类型 | case | 问题 | 报错 | pr |
|---|---|---|---|---|---|---|---|
| ✅9 | winter-wang | test_logical.py | 控制流 | all | 最终态尚不支持控制流 | ||
| ✅31 | test_warning.py | 控制流 | trueblock为warning,falseblock 为bool 输出 | 暂不支持控制流 | TypeError: The type of 'input' in ConditionalBlock must be <class 'paddle.base.framework.Variable'>, but received <class 'paddle.base.libpaddle.pir.OpResult'>. |
||
| ✅39 | test_cache_program.py | 控制流 | TestToOutputWithCache |
需要适配paddle.static.nn.control_flow.While._complete方法,WhileGuard 报错 |
ValueError: (InvalidArgument) Currently, we can only get name of OpResult that is persistable |
||
| 🟡41 | test_return.py | 控制流 | all | 暂不支持控制流 | TypeError: The type of 'input' in ConditionalBlock must be <class 'paddle.base.framework.Variable'>, but received <class 'paddle.base.libpaddle.pir.OpResult'>. |
||
| ✅47 | test_tensor_shape.py | 控制流 | {TestOpNumWithTensorShapeInIf1, TestOpNumWithTensorShapeInFor1, TestOpNumWithTensorShapeInWhile1} |
||||
| ✅52 | test_set_dynamic_shape.py | 控制流 | |||||
| ✅54 | test_loop.py | 控制流 | {TestTransformWhileLoop, TestTransformForLoop} |
暂不支持控制流 | |||
| test_loop.py | API | TestForLoopMeetDict |
需要适配jit.api.save方法 |
AttributeError: 'list' object has no attribute 'type' |
|||
| ✅74 | test_full_name_usage.py | 控制流 | |||||
| ✅79 | test_lambda.py | 控制流 | {test_call_lambda_in_func, test_call_lambda_with_if_expr} |
段错误,但应该是控制流问题 | |||
| ✅86 | test_break_continue.py | 控制流 | TestOptimBreakInFor |
RuntimeError: Unable to cast Python instance to C++ type (#define PYBIND11_DETAILED_ERROR_MESSAGES or compile in debug mode for details) |
#63287 使用 FLAGS_new_executor_sequential_run 绕过 |
||
| ✅97 | test_jit_setitem.py | 控制流(while) | TestCase12 | ||||
| ✅101 | test_ifelse.py | 控制流 | |||||
| ✅6 | test_list.py | 控制流 | TestListWithoutControlFlow |
大量控制流单侧 | |||
| ✅7 | test_write_python_container.py | 控制流 | all | 大量控制流单侧 | TypeError: 'paddle.base.libpaddle.pir.OpResult' object cannot be interpreted as an integer |
||
| ✅45 | test_for_enumerate.py | 控制流 | TestForInRange |
控制流 While | ValueError: (InvalidArgument) Currently, we can only get name of OpResult that is persistable (at /workspace/Paddle/paddle/fluid/pybind/pir.cc:745) |
||
| test_for_enumerate.py | Save/Load | TestForZip |
Save Load 不支持 | ||||
| test_for_enumerate.py | API & 控制流 | TestForIterVarList |
OpResult 没有 append | ||||
| test_for_enumerate.py | 控制流 | TestForEnumerateVarWithNestedRange |
面的大多数修好了,但是继承自 TestForIterVarNumpy 的 TestForEnumerateVarWithNestedRange 包含控制流,所以不支持;另外注意这个 case 中间态也有问题,中间态会在 Win 和 mac CI 上挂掉,本地没问题 | ||||
| ✅10 | test_program_translator.py | 控制流 | 仅有两个 | 控制流 | |||
| ✅14 | test_slice.py | 控制流 | {TestSliceInIf, TestSliceInWhileLoop, TestSliceInForLoop} |
#61440 |
AMP
| 序号 | 认领人 | 文件 | 错误类型 | case | 问题 | 报错 | pr |
|---|---|---|---|---|---|---|---|
| ✅26 | @0x45f | test_resnet_amp.py | AMP | TestResnet |
GPU 环境,AMP 尚不支持 | NotImplementedError: not implement error. |
#62606 |
| test_resnet_amp.py | 反向 | TestResnet |
CPU 会报 paddle.Tensor.backward api 报错, 看样子是 c++ 的检查 |
PreconditionNotMetError: The meta data must be valid when call the mutable data function |
|||
| ✅36 | @0x45f | test_resnet_pure_fp16.py | AMP | all | 动转静 AMP 尚未支持 | NotImplementedError: not implement error. |
#62606 |
| ✅111 | @0x45f | test_mnist_amp.py | AMP | #62606 | |||
| ✅113 | @0x45f | test_mnist_pure_fp16.py | AMP | #62606 |
整图导出(train step)
| 序号 | 认领人 | 文件 | 错误类型 | case | 问题 | 报错 | pr |
|---|---|---|---|---|---|---|---|
| 🟡103 | test_train_step_resnet18_sgd.py | 整图导出 | all | 同 train_step | |||
| 🟡105 | test_train_step_resnet18_adam.py | 整图导出 | all | ||||
| 🟡46 | test_train_step.py | 整图导出 | all | train_step 整图导出暂不支持 PIR | AttributeError: 'paddle.base.libpaddle.pir.OpResult' object has no attribute 'backward' |
其它
| 序号 | 认领人 | 文件 | 错误类型 | case | 问题 | 报错 | pr |
|---|---|---|---|---|---|---|---|
| 🟡32 | test_op_attr.py | 量化 | CheckOpAttr.test_set_op_attrs |
paddle.base.framework.Program下没有blocks api 需要适配 |
AttributeError: 'paddle.base.libpaddle.pir.Program' object has no attribute 'blocks' |
||
| 🟡21 | test_tensor_hook.py | 依赖PyFuncOp迁移 | 剩余case | OpResult.register_hook需要适配, 连锁适配paddle.static.py_func |
AttributeError: 'paddle.base.libpaddle.pir.OpResult' object has no attribute 'register_hook' |
||
| ✅114 | test_pylayer.py | PyLayer | 由 @MarioLulab 开发 PIR PyLayer 并适配 | #60359、#63319 |