[API Compatibility] Change compatibility apis to ChangePrefixMatcher, inject paddle.enable_compat() -part#895
[API Compatibility] Change compatibility apis to ChangePrefixMatcher, inject paddle.enable_compat() -part#895Manfredss wants to merge 19 commits into
Conversation
…to patch_compat
… calls hit the alias The default enable_compat() (level=1) does not alias paddle.*, so prefix-converted calls (torch.X -> paddle.X) would run native and reject torch-style kwargs. level=2 turns on the paddle.* alias; caller-aware dispatch keeps paddle internals native. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…to patch_compat
…to patch_compat
…eset import_transformer.py: - Inject paddle.enable_compat(level=2) via a transform() post-pass so it lands after the docstring, __future__ imports and the import block (fixes a pre-existing SyntaxError where injected imports preceded `from __future__`). - Gate on real torch imports (torch_packages), not paddle_package_list, so a torch-free file importing only os/einops/setuptools no longer gains a needless paddle import or the process-global compat switch. tests: - Rename confest.py -> conftest.py so the autouse compat-reset fixture is loaded by pytest (was dead due to the typo). - Dedupe the disable logic into conftest.disable_paddle_compat(), imported by apibase and called before each torch reference exec. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…into patch_compat
…ompat Switch Tensor.allclose and Tensor.sort to ChangePrefixMatcher and keep softmin's softmax call using torch arg names (input/dim), since compat paddle APIs now accept torch-style args and reject paddle-native ones. Update tests to inject enable_compat(level=2); fix torchvision model_apibase proxy leak around the torch reference forward.
| # enable_compat is injected in transform() (needs all imports in the body). | ||
| # Gate on real torch imports, not paddle_package_list: the latter also holds | ||
| # MAY_TORCH packages (os/einops/setuptools) that need no compat switch. | ||
| if self.imports_map[self.file]["torch_packages"]: |
There was a problem hiding this comment.
简化下代码,看有无更简单的写法,是否只需要修改visit_Module就可以?
|
PR冲突了 |
|
注意代码风格简化并贴合已有架构来写,不要让AI随意发挥:
|
| return True | ||
| return False | ||
|
|
||
| def _inject_enable_compat(self): |
There was a problem hiding this comment.
这个使用record_scope不能插入吗?插入这个不需要从0开始重写吧
Bring the latest API compatibility coverage into the branch while preserving the record_scope-based compat injection and test state isolation fixes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Thanks for your contribution! |
Align expected diffs with compat injection and intentional ChangePrefixMatcher behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Deduplicate paddle_package_list in ImportTransformer.visit_Module: since imports are now batched into one record_scope call, its cross-call dedup no longer removes duplicates, producing two 'import paddle' lines when a file imports multiple torch-family packages (e.g. torchvision + datasets). Regenerate default-mode goldens for the paddle.enable_compat(level=2) injection and the intentional compat-prefix removals (equal, BatchNorm1d/2d), matching the min-mode baseline update in f7e1c04. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
| line_NO += 1 | ||
| import_nodes = [] | ||
| for paddle_package in dict.fromkeys(paddle_package_list): | ||
| import_nodes.extend(ast.parse(f"import {paddle_package}").body) |
There was a problem hiding this comment.
直接在这里判断是否为 paddle_package=='paddle'
如果是,则import_nodes.extend(ast.parse(f"import paddle;paddle.enable_compat(2)").body)
并且该操作仅执行一次(当然执行多次问题也不大,后续会被isort校正)
|
|
||
| has_torch_package = bool(self.imports_map[self.file]["torch_packages"]) | ||
|
|
||
| has_enable_compat = any( |
There was a problem hiding this comment.
这些判断都需要吗?后面也会经过isort、black的格式化处理,移除多余import,这里不要想的太复杂了
| if has_torch_package and not has_enable_compat: | ||
| import_nodes.extend(ast.parse("paddle.enable_compat(level=2)").body) | ||
|
|
||
| import_end = 1 if node.body and ast.get_docstring(node, clean=False) else 0 |
There was a problem hiding this comment.
for循环,self.record_scope((self.root, "body", line_NO), import_nodes) 就行了吧。
原始的node在visit_Import、visit_ImportFrom时就已经被清除,原始node的import内容应该已经被清理掉了。
另外加上log_info,这个是比较重要的调试信息
…a single paddle.enable_compat(level=2) on top of the already-cleaned node, dropping redundant enable_compat/torch-package scans and adding log_info
…into patch_compat
| # Under `paddle.enable_compat(level=2)` the prefix-converted calls | ||
| # (torch.X -> paddle.X) resolve to the torch-aligned paddle.compat.* impls, | ||
| # so inject it once when `import paddle` is added. isort/black dedupe repeats. | ||
| if "paddle" in paddle_package_list: |
There was a problem hiding this comment.
这个应该得 == "paddle" ,然后做个一次性判断 "enable_compat" not in import_code
PR Docs
For the 23
torch.*APIs that are aligned throughpaddle.compat.*, switch theconverter to the "prefix-only + enable_compat" strategy instead of mapping each to
paddle.compat.Xexplicitly:api_mapping.json— change those 23 entries fromChangeAPIMatcher → paddle.compat.Xto{"Matcher": "ChangePrefixMatcher"}, sotorch.X(...)converts topaddle.X(...)with arguments untouched(e.g.
torch.sort(a, dim=-1)→paddle.sort(a, dim=-1)).transformer/import_transformer.py— injectimport paddle+paddle.enable_compat()right after the imports of any converted file, so theprefix-only
paddle.Xcalls resolve to the torch-alignedpaddle.compat.Ximplementations at runtime. (Included explicitly + deduped so it is valid even
when torch was imported as a submodule alias, e.g.
import torch.nn as nn.)tests/apibase.py—paddle.enable_compat()flips global state (animport torch→ Paddle proxy +paddle.*aliases). Disable it before eachPyTorch reference run (
_ensure_paddle_compat_disabled()), so the referencealways executes against real PyTorch, including across multiple
run()calls inone test. (No-op until Paddle is first imported, so it does not change torch/paddle
import ordering.)
PR APIs
related Paddle PR:
Co-authored by Claude.