[Typing] Upgrade mypy to 2.1.0 and target Python 3.10#79289
Conversation
|
自 review 已完成:PR diff 仅包含 本地已用 Python 3.10 isolated venv 验证 @SigureMo 辛苦 review,谢谢。 |
SigureMo
left a comment
There was a problem hiding this comment.
本 PR 不启用新的并行检查选项。
这个太有用了,我建议开一下
b20bb46 to
aa1e280
Compare
|
已按建议开启:在 已重新验证: python -m mypy --version # mypy 2.1.0 (compiled: yes)
python -m mypy --config-file=pyproject.toml --cache-dir=/tmp/... -c 'x: int = 1'
cd test/tools && PYTHONPATH=/path/to/Paddle/tools:/path/to/Paddle/python python -m unittest test_type_checking
|
|
/re-run all-failed |
SigureMo
left a comment
There was a problem hiding this comment.
CI 里的报错自己看下哈,static check 挂了一堆
你修改之后,在 PR 描述里分一下类,并说明每类改动的原因
| # MYPY_NUM_WORKERS can override this default for CI/local runs. | ||
| num_workers = 2 |
There was a problem hiding this comment.
这注释没啥用啊,清理掉吧,另外你看看有没有啥选项自动匹配核心数的,如果没有就用 8 吧
以及我们的 CI type_checking 脚本里加一下 worker 数自动匹配核心数的逻辑吧
There was a problem hiding this comment.
已处理:
- 清理了这条注释。
- mypy 配置里没有“自动匹配核心数”的配置项,
num_workers需要固定整数;这里按建议改为num_workers = 8。 - 在 CI type checking 入口补了自动设置
MYPY_NUM_WORKERS的逻辑:优先nproc,其次getconf _NPROCESSORS_ONLN,取不到时 fallback 到 8。这样 CI 会按机器核心数覆盖 pyproject 里的默认值。
aa1e280 to
cb2752d
Compare
cb2752d to
6489f34
Compare
|
已更新并按类别重写 PR 描述,补充每类改动原因。 本次更新包括:
本地重新验证: |
There was a problem hiding this comment.
不是,你直接改 type_checking.py 不行吗?改这里合适吗?你还有重复改动,而且 python 里也不用 fallback 到 8
There was a problem hiding this comment.
已改:去掉了 ci/static_check.sh / paddle/scripts/paddle_build.sh 里的重复 shell 逻辑,改到 tools/type_checking.py 里统一处理。
现在逻辑是:如果外部没有设置 MYPY_NUM_WORKERS,type_checking.py 会用 os.cpu_count() 给 mypy 子进程设置 MYPY_NUM_WORKERS;如果 os.cpu_count() 不可用,就不设置环境变量,让 pyproject.toml 里的 num_workers = 8 生效。
| def __init__( | ||
| self, | ||
| value: npt.NDArray[Any] | Sequence[int] | paddle.Tensor, | ||
| value: npt.NDArray[Any] | Sequence[Any] | paddle.Tensor, |
There was a problem hiding this comment.
Sequence[Any] 是不是太宽了?是否可以用 NestedSequence 之类的?
There was a problem hiding this comment.
已收窄:改成递归 _NestedSequence,用于覆盖 Assign([[2, 2], [2, 2]]) 这类文档和运行时已支持的嵌套 sequence 初始化,不再用 Sequence[Any]。
There was a problem hiding this comment.
已调整:撤掉了把各 transform class base 全改成 Any 的做法。
现在保留原来的泛型类结构,只把 _InputT / _RetT 改成带 _ImageDataType bound 和 Any default 的 TypeVar。这样无显式类型参数实例化时不会再被 mypy 默认推断成只接受 Tensor,同时不会在每个 transform class 上直接铺开 Any。
6489f34 to
816e986
Compare
|
已按这轮 review 调整并更新 PR 描述:
本地重新验证: |
| _NestedSequence: TypeAlias = Sequence[ | ||
| int | float | bool | complex | "_NestedSequence" | ||
| ] |
There was a problem hiding this comment.
paddle._typing 里不是有现成的吗?你为啥还要自己搞一份?
There was a problem hiding this comment.
确实有现成的,已改为复用 paddle._typing.NestedSequence,不再本地重复定义。
这里用的是 Sequence[NestedSequence[int | float | bool | complex]],这样既能覆盖文档里的嵌套 list 初始化,也不会把顶层标量纳入 Assign 的参数类型。
816e986 to
ca7cbe3
Compare
ca7cbe3 to
d690a2d
Compare
|
CI Static-Check 在当前轮次暴露了一个新的 mypy 2.1 问题: 已删除该 stale ignore 并推送新 commit。顺带看了同一轮其它失败:Linux-CPU 是 custom op ninja SIGSEGV,Fleet 是 nvidia-container driver timeout,和本 PR 的 mypy/docstring typing 修改无关;新 commit 后这些结果已失效,继续等 CI 重跑。 |
|
/re-run all-failed |
3 similar comments
|
/re-run all-failed |
|
/re-run all-failed |
|
/re-run all-failed |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #79289 +/- ##
===========================================
Coverage ? 100.00%
===========================================
Files ? 1
Lines ? 2
Branches ? 0
===========================================
Hits ? 2
Misses ? 0
Partials ? 0 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
/re-run all-failed |
3 similar comments
|
/re-run all-failed |
|
/re-run all-failed |
|
/re-run all-failed |
|
@ShigureNyako Linux-CPU 失败你分析下吧,虽然应该不是这个 PR 导致的,但是现在看来稳定挂啊,合入不进去 |
|
@SigureMo 我看了下 Linux-CPU 最近几轮日志,结论是目前没有看到和这个 PR 改动相关的失败点。 具体看:
所以我判断 Linux-CPU 当前是 CI runner / 外部下载 / custom extension JIT 环境侧的问题,不是 mypy 2.1 / py3.10 typing 目标升级引入的。为了保持这个 PR 聚焦,我先不在这里加绕过或调整 Linux-CPU 的 unrelated workaround;当前失败我再触发一次全失败重跑。 |
|
/re-run all-failed |
2 similar comments
|
/re-run all-failed |
|
/re-run all-failed |
|
@ShigureNyako multi-card test 也得分析下,我初步分析是因为 tvm-ffi 用的是最新刚发布的 tvm-ffi 0.1.12 导致的,0.1.11 应该没这个问题,你看看是否可以构造一个最小的复现样例出来 |
|
@SigureMo 收到,我补了一轮横向比对;前面一直 rerun 不够,我这里先把结论和依据说清楚,后面不再无脑刷 rerun。 结论:目前 Linux-CPU 的稳定失败不指向 #79289 / #79291 的 Python typing 改动本身,更像是 Linux-CPU runner pool 里的 custom C++ extension JIT 构建环境问题,核心 fingerprint 是 具体依据:
所以我现在的判断是:#79289/#79291 只是触发了 Linux-CPU full test,失败发生在 baseline custom extension JIT 构建链路;真正需要查的是 Linux-CPU runner pool 里 ninja / cache / extension JIT 环境。可验证方向是清理 |
|
@SigureMo 我补看了 multi-card 的日志和 证据:
更贴近 Fleet 容器的最小复现可以用: pip install 'apache-tvm-ffi==0.1.12' 'tilelang-paddle==0.1.10'
python - <<'PY'
import paddle
paddle.enable_compat(scope={"tilelang"}, silent=True)
import tilelang # 这里会加载 tilelang 自带的 tvm/tilelang native libs
PY如果把 另外,最新 Linux-CPU rerun(job 80467139736,runner |
你直接用官方的 tilelang 对比,他们新发了一个 0.1.11,你看解决问题了吗?不要用 tilelang-paddle,因为按理说这俩是一致的,除非确定只有 tilelang-paddle 能复现,tilelang 不能复现,如果 tilelang 0.1.11 没问题的话,我就发一个 tilelang-paddle 0.1.11 |
|
@SigureMo 我按你的要求直接测了官方 验证结果:
所以如果发一个和官方 metadata/二进制行为一致的 |
|
tilelang 的 issue 已经提了 tile-ai/tilelang#2367,你在 PaddleFleet 提个 PR 将 tvm ffi pin 到 |
|
@SigureMo 已按你的建议在 PaddleFleet 提了 PR:PaddlePaddle/PaddleFleet#1184 变更点是把 收紧为: 本地做了最小验证: rg -n "apache-tvm-ffi" packages/paddlefleet_ops/setup.py
python3 -m py_compile packages/paddlefleet_ops/setup.pyPR 里也已自查并 @ 你。 |
|
@ShigureNyako CPU 流水线这个报错,单独提 PR 去定位下是哪里的问题吧,为什么之前没问题?难道也和 tvm-ffi 版本有关?可是我们的 CI 是锁 tvm ffi 版本的啊,你可以定位下最近通过的 CI 和没通过之间的依赖等等环境差异,如果是 cache 问题,可以尝试 CI 里清理下 cache 跑 |
|
CPU 先豁免了,单独 PR 跟进修复 |
|
@SigureMo 已按你的建议单独提了 PR:#79293 这轮先做了一个最小 cache 验证/规避:在 Linux-CPU workflow 的 Test step 进入 /root/.cache/paddle_extensions没有清理整个 我对比了最近一个通过的 Linux-CPU job
因此先用 #79293 验证是否是 stale/corrupt Paddle extension JIT cache 导致;PR 里已自查并 @ 你。 |
PR Category
User Experience
PR Types
Devs
Description
本 PR 升级 Paddle 的 mypy 工具链配置,并修复 mypy 2.1.0 / Python 3.10 下暴露出的示例类型检查问题。
1. mypy 版本与配置升级
原因:mypy 2.0 起不再支持
--python-version 3.9,因此升级 mypy 时需要同步提升类型检查目标版本。python/unittest_py/requirements.txt:mypy==1.19.1->mypy==2.1.0pyproject.toml:[tool.mypy] python_version = "3.9"->"3.10"pyproject.toml: 设置num_workers = 8,开启 mypy 2.x parallel type checking 的默认 worker 数2. mypy worker 数自动匹配
原因:mypy 配置文件中的
num_workers只能写固定整数;mypy 2.1 支持通过MYPY_NUM_WORKERS覆盖配置值。因此在tools/type_checking.py中对 mypy 子进程设置 worker 数,避免在多个 shell 入口重复维护逻辑。tools/type_checking.py: 若调用方未显式设置MYPY_NUM_WORKERS,则用os.cpu_count()设置 mypy 子进程的MYPY_NUM_WORKERSos.cpu_count()不可用,则不设置环境变量,继续使用pyproject.toml中的默认num_workers = 83. mypy 2.1.0 / Python 3.10 暴露的 docstring sample typing 修复
原因:Static-Check 会用构建好的 wheel 对 docstring examples 做 full type checking。升级后暴露出一批示例类型问题,按最小方式修复,不新增全局 ignore。
CrossEntropyLoss/cross_entropy: 避免同一 code block 内重复带注解定义weight导致no-redefAssign: initializer 类型从一层Sequence[int]改为基于paddle._typing.NestedSequence的嵌套 sequence 类型,覆盖文档和运行时已支持的嵌套 list 初始化DatasetFolder/ImageFolder:cv2.imreadloader 改为显式函数并 assert 非空,避免返回None的类型create_nccl_config: 避免示例中同名变量复用为不同类型BaseTransform/device_guard/ object list send-recv examples / brightness examples: 删除或替换 mypy 2.1 下已不需要或过宽的type: ignore_ImageDataTypebound 与Anydefault,避免无显式类型参数实例化时被 mypy 默认推断为只接受Tensormypy release note 重点变化:
--python-version 3.9--local-partial-types、--strict-bytes,并调整--allow-redefinition行为;Paddle 配置已显式启用local_partial_types = true和allow_redefinition = trueMYPY_NUM_WORKERS覆盖配置中的num_workers本地验证:
说明:
tools/type_checking.py --full-test需要先安装当前 PR 对应的 Paddle wheel;当前本地 source-only workspace 未构建libpaddle,直接运行会在导入paddle.base.libpaddle前失败。因此本地已覆盖 mypy 2.1.0 版本、配置解析、parallel smoke、shell syntax 和tools/type_checking.py的 focused unittest;完整 docstring type checking 由 CI Static-Check 使用构建 wheel 执行。是否引起精度变化
否