Skip to content

[SOT][Exception][3.10-][3.13] Add exception handler for Py3.10- #72559

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from

Conversation

DrRyanHuang
Copy link
Contributor

@DrRyanHuang DrRyanHuang commented Apr 29, 2025

PR Category

Execute Infrastructure

PR Types

New features

Description

支持 Python3.10- 的SOT异常处理部分

  • 添加 Python 异常栈 ExceptionStack
  • 添加 ExceptionVariable 以及其 dispatch 机制
  • 添加字节码 SETUP_FINALLYPOP_BLOCKLOAD_ASSERTION_ERRORPOP_EXCEPTRAISE_VARARGSJUMP_IF_NOT_EXC_MATCHRERAISE 的实现
  • 核心逻辑在 opcode_executor.py 的 OpcodeExecutorBase.handle_exception
  • 移动 @SigureMo 之前的 NOTE,移动 SuperVariable dispatch 的位置
  • 单测超过1000行,本PR暂时只提交覆盖率最高的两个 unitest

  • 添加 ExceptionVariable.__eq__ 的 dispatch 机制 + operator_exception_match 的 dispatch 机制

NOTE:

  • py3.8 的测试大多会直接 fallback(主要原因是与异常相关的字节码没有实现)

PCard-66972

Copy link

paddle-bot bot commented Apr 29, 2025

你的PR提交成功,感谢你对开源项目的贡献!
请关注后续CI自动化测试结果,详情请参考Paddle-CI手册
Your PR has been submitted. Thanks for your contribution!
Please wait for the result of CI firstly. See Paddle CI Manual for details.

@paddle-bot paddle-bot bot added the contributor External developers label Apr 29, 2025
@SigureMo SigureMo changed the title [SOT][3.13] Add exception handler for Py3.10- [SOT][Exception][3.13] Add exception handler for Py3.10- Apr 29, 2025
@SigureMo SigureMo changed the title [SOT][Exception][3.13] Add exception handler for Py3.10- [SOT][Exception][3.10-][3.13] Add exception handler for Py3.10- Apr 29, 2025
@DrRyanHuang
Copy link
Contributor Author

当前会挂的原因,Python3.8 没有 JUMP_IF_NOT_EXC_MATCH

import dis

def try_except_exception_with_error(x):
    # test `JUMP_IF_NOT_EXC_MATCH`
    try:
        raise ValueError("TESTING!")
    except Exception:
        pass
    return x

dis.dis(try_except_exception_with_error)

Py3.8 的行为:

  8     >>   14 DUP_TOP
             16 LOAD_GLOBAL              1 (Exception)
             18 COMPARE_OP              10 (exception match)
             20 POP_JUMP_IF_FALSE       32
             22 POP_TOP
             24 POP_TOP
             26 POP_TOP

Py3.9/Py3.10 的行为:

  8     >>   10 DUP_TOP
             12 LOAD_GLOBAL              1 (Exception)
             14 JUMP_IF_NOT_EXC_MATCH    ...
             16 POP_TOP
             18 POP_TOP
             20 POP_TOP

需要对 ExceptionVariable 实现 COMPARE_OP 部分

@SigureMo
Copy link
Member

需要对 ExceptionVariable 实现 COMPARE_OP 部分

python/paddle/jit/sot/opcode_translator/executor/dispatch_functions.py 里有 operator_exception_match 的 dispatch function

@DrRyanHuang
Copy link
Contributor Author

目前 test/dygraph_to_static/test_basic_api_transformation.py 报这个错:

  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/variables/callable.py", line 280, in call_function
    output = inline_executor.inline_call()
  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/opcode_inline_executor.py", line 99, in inline_call
    self.run()
  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/opcode_executor.py", line 631, in run
    is_stop = self.step(cur_instr)
  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/opcode_executor.py", line 677, in step
    return getattr(self, opname)(instr)  # run single step.
  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/opcode_executor.py", line 315, in wrapper
    return call_fn(self, instr)
  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/opcode_executor.py", line 933, in LOAD_ATTR
    BuiltinVariable(
  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/variables/callable.py", line 141, in __call__
    return self.call_function(*args, **kwargs)
  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/variables/callable.py", line 873, in call_function
    return handler(*args, **kwargs)
  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/variable_dispatch.py", line 590, in <lambda>
    lambda var, name, default=None: var.getattr(
  File "/workspace/paddle/build/python/paddle/jit/sot/opcode_translator/executor/variables/basic.py", line 1514, in getattr
    raise HasNoAttributeError(
paddle.jit.sot.utils.exceptions.HasNoAttributeError: ObjectVariable SuperVariable(super(PolynomialDecay, ObjectVariable(<paddle.optimizer.lr.PolynomialDecay object at 0x7fe7c1e4c910>, object_717)), object_831) has no attribute last_epoch

定位到是 SuperVariable setattr 后,无法直接 getattr 的问题

@DrRyanHuang
Copy link
Contributor Author

DrRyanHuang commented May 7, 2025

PR-CI-Coverage / PR-CI-Windows-Inference 都报这个,先合develop看下,其他CI都过了

======================================================================
ERROR: test_base_model__sot_pir_phi (test_seq2seq.TestSeq2seq)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/mnt/paddle/build/test/dygraph_to_static/dygraph_to_static_utils.py", line 197, in sot_impl
    fn(*args, **kwargs)
  File "/mnt/paddle/build/test/dygraph_to_static/dygraph_to_static_utils.py", line 266, in pir_impl
    return fn(*args, **kwargs)
  File "/mnt/paddle/build/test/dygraph_to_static/dygraph_to_static_utils.py", line 276, in phi_impl
    fn(*args, **kwargs)
  File "/mnt/paddle/build/test/dygraph_to_static/test_seq2seq.py", line 231, in test_base_model
    self._test_train(attn_model=False)
  File "/mnt/paddle/build/test/dygraph_to_static/test_seq2seq.py", line 213, in _test_train
    static_loss = self.run_static(mode="train", attn_model=attn_model)
  File "/mnt/paddle/build/test/dygraph_to_static/test_seq2seq.py", line 207, in run_static
    return train(self.args, attn_model)
  File "/mnt/paddle/build/test/dygraph_to_static/test_seq2seq.py", line 98, in train
    loss = model(input_data_feed)
  File "/paddle/build/python/paddle/nn/layer/layers.py", line 1567, in __call__
    return self.forward(*inputs, **kwargs)
  File "/paddle/build/python/paddle/jit/dy2static/program_translator.py", line 549, in __call__
    return self._perform_call(*args, **kwargs)
  File "/paddle/build/python/paddle/jit/dy2static/program_translator.py", line 786, in _perform_call
    return traced_fun(*args, **kwargs)
  File "/paddle/build/python/paddle/jit/sot/translate.py", line 106, in impl
    raise e
  File "/paddle/build/python/paddle/jit/sot/translate.py", line 104, in impl
    outs = fn(*args, **kwargs)
  File "/paddle/build/python/paddle/jit/sot/translate.py", line 94, in callback
    return eval_frame_callback(frame, **kwargs)
  File "/paddle/build/python/paddle/jit/sot/opcode_translator/eval_frame_callback.py", line 75, in eval_frame_callback
    custom_code = *******()(frame, **kwargs)
  File "/paddle/build/python/paddle/jit/sot/opcode_translator/executor/executor_cache.py", line 123, in __call__
    new_custom_code, guard_fn, guard_chain = self.translate(
  File "/paddle/build/python/paddle/jit/sot/opcode_translator/executor/executor_cache.py", line 307, in translate
    custom_new_code, guard_fn, guard_chain = start_translate(
  File "/paddle/build/python/paddle/jit/sot/opcode_translator/executor/executor_cache.py", line 416, in start_translate
    raise InnerError(*******.error_message_summary(e)) from e
paddle.jit.sot.utils.exceptions.InnerError: In simulate execution:

    File "/mnt/paddle/build/test/dygraph_to_static/seq2seq_dygraph_model.py", line 221, in forward
            for i in range(self.num_layers):
    File "/mnt/paddle/build/test/dygraph_to_static/seq2seq_dygraph_model.py", line 223, in $resume_1@forward_8b59f
                enc_hidden = paddle.tensor.array_write(
    File "/paddle/build/python/paddle/tensor/array.py", line 252, in array_write
            i = i.item(0)
    paddle.jit.sot.utils.exceptions.InnerError: Call tensor_method error: Tensor.item, may be not a valid operator api?
Origin Exception is: 
 Traceback (most recent call last):
  File "/paddle/build/python/paddle/jit/sot/opcode_translator/executor/function_graph.py", line 725, in try_infer_meta_fn
    return args, kwargs, infer_meta_fn(func, *metas, **kwmetas)
  File "/paddle/build/python/paddle/jit/sot/utils/utils.py", line 318, in __call__
    value = self.value_fn(*args, **kwargs)
  File "/paddle/build/python/paddle/jit/sot/infer_meta.py", line 590, in value_fn
    return infer_meta(func, *args, **kwargs)
  File "/paddle/build/python/paddle/jit/sot/infer_meta.py", line 486, in infer_meta
    return VariableCreator().infer_meta(func, *args, **kwargs)
  File "/paddle/build/python/paddle/jit/sot/infer_meta.py", line 439, in infer_meta
    out = func(*args, **kwargs)
TypeError: _item() takes 1 positional argument but 2 were given

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/paddle/build/python/paddle/jit/sot/utils/exceptions.py", line 243, in impl
    return func(*args, **kwargs)
  File "/paddle/build/python/paddle/jit/sot/opcode_translator/executor/function_graph.py", line 793, in symbolic_call
    args, kwargs, out_metas = try_infer_meta_fn(args, kwargs)
  File "/paddle/build/python/paddle/jit/sot/opcode_translator/executor/function_graph.py", line 727, in try_infer_meta_fn
    bound_arguments = inspect.signature(func).bind(*args, **kwargs)
  File "/usr/lib/python3.9/inspect.py", line 3113, in signature
    return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
  File "/usr/lib/python3.9/inspect.py", line 2862, in from_callable
    return _signature_from_callable(obj, sigcls=cls,
  File "/usr/lib/python3.9/inspect.py", line 2261, in _signature_from_callable
    raise TypeError('{!r} is not a callable object'.format(obj))

TypeError: 'item' is not a callable object
----------------------------------------------------------------------

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
contributor External developers
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants