mv paddlefleet to paddleformers#4731
Conversation
|
root seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account. You have signed the CLA already but the status is still pending? Let us recheck it. |
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交,仍有需要先修复的阻塞问题。可附着到 diff 的问题已写在行级评论中;下面是 GitHub 当前无法附着到具体行的问题。
优先级:P1 非行级:
paddleformers/fleet/transformer/moe/{fusion_layer_utils.py,moe_layer.py,vmm_utils.py}是超大新增文件,GitHub 没有提供可评论 patch preview。当前 Lint 在这些文件上报多处F821 undefined name 'paddlefleet_ops',并且源码只导入了paddleformers.fleet as fleet_ops却调用paddlefleet_ops.*,会导致 lint 和相关 MoE 导入/执行路径失败。请显式import paddlefleet_ops,或统一改成实际导入的别名,并修复所有 F821。优先级:P2 非行级:新增的
0_Integration test (H20, single card).txt是 3.1MB、35605 行的 CI 日志,GitHub 没有提供 patch preview。请从 PR 中移除该生成日志文件,必要时改放到 CI artifact 或 PR 评论链接。优先级:P3 非行级:PR 描述仍是模板内容。建议补充迁移范围、兼容性/API 变化、风险点和已执行的测试/CI 结果,方便维护者判断这次 PaddleFleet 迁移的影响面。
| self.experts_group_gemm_node.recompute_fwd_gate_up | ||
| ), "recompute_fwd_gate_up must be true when use_mlp_subbatch = True" | ||
| map_unzipped_indices_to_zipped = paddlefleet.extensions.ops.tokens_unzip_slice( | ||
| map_unzipped_indices_to_zipped = fleet.extensions.ops.tokens_unzip_slice( |
There was a problem hiding this comment.
paddleformers.fleet 当前只导出 core fleet 模块,并没有 extensions.ops;这些自定义算子在新增的 paddlefleet_ops 包顶层导出。因此进入 mlp_fwd_subbatch_rows 分支会直接 AttributeError。同文件后面的 tokens_unzip_slice/tokens_zip_prob_seq_subbatch,以及 paddleformers/cli/train/deepseek_v3_pretrain/moe_layer.py 的同名拷贝也需要一起改。请显式导入 paddlefleet_ops,并把这些调用统一切到该入口。
| map_unzipped_indices_to_zipped = fleet.extensions.ops.tokens_unzip_slice( | |
| map_unzipped_indices_to_zipped = paddlefleet_ops.tokens_unzip_slice( |
同类调用的期望形态:
import paddlefleet_ops
dispatched_probs_grad = paddlefleet_ops.tokens_zip_prob_seq_subbatch(...)| """ | ||
| if subbatch_rows is None or subbatch_rows <= 0 or zipped_rows <= 0: | ||
| return paddlefleet.extensions.ops.tokens_zip_unique_add(zipped, unzipped, index_unzipped, zipped_rows) | ||
| return fleet.extensions.ops.tokens_zip_unique_add(zipped, unzipped, index_unzipped, zipped_rows) |
There was a problem hiding this comment.
这里同样把旧 paddlefleet.extensions.ops 迁到了 fleet.extensions.ops,但 paddleformers.fleet 不提供 extensions;paddlefleet_ops 才是 tokens_zip_unique_add、tokens_zip_unique_add_subbatch 和 merge_subbatch_cast 的公开入口。这个 helper 在 subbatch/merge 路径会直接失败,paddleformers/cli/train/deepseek_v3_pretrain/moe_utils.py 的同名拷贝也有同样问题。请导入 paddlefleet_ops 并统一替换这些调用。
| return fleet.extensions.ops.tokens_zip_unique_add(zipped, unzipped, index_unzipped, zipped_rows) | |
| return paddlefleet_ops.tokens_zip_unique_add(zipped, unzipped, index_unzipped, zipped_rows) |
同类调用的期望形态:
import paddlefleet_ops
return paddlefleet_ops.tokens_zip_unique_add_subbatch(...)
return paddlefleet_ops.merge_subbatch_cast(...)| @@ -203,9 +203,6 @@ def get_console_scripts() -> list[str]: | |||
| setup_requires=["numpy"], | |||
| install_requires=REQUIRED_PACKAGES, | |||
| entry_points={"console_scripts": get_console_scripts()}, | |||
| extras_require={ | |||
There was a problem hiding this comment.
删除 paddlefleet extra 后,当前包安装流程没有任何地方声明或安装新的 paddlefleet_ops 运行时依赖;但迁移后的 paddleformers.fleet.transformer.transformer_layer 顶层直接 from paddlefleet_ops import is_deep_ep_available。最新 XPU CI 已经在执行 paddleformers-cli train ... 时失败为 ModuleNotFoundError: No module named 'paddlefleet_ops'。请恢复一个可安装的依赖入口(例如把 paddlefleet-ops 加到对应 extra/运行时依赖并同步 README/CI),或者把 paddlefleet_ops 导入改成按 GPU/功能分支延迟导入,保证未安装 custom ops 的 XPU/基础 CLI 路径仍可启动。
期望形态示例:
extras_require={
"paddlefleet": ["paddlefleet-ops==<compatible-version>"],
}如果仍保持 optional dependency,则相关模块内应使用 try/except ImportError 或延迟导入,避免 CLI 基础路径在导入阶段失败。
| @@ -1,158 +0,0 @@ | |||
| **简体中文**🀄 | [English🌎](.github/CONTRIBUTING_en.md) | |||
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交,发现一个新的阻塞问题,详情已写在行级评论中。此前未解决的 PaddleFleet 迁移问题仍由原有讨论线程跟进;本次没有重复展开。
| pip cache dir | ||
| pip install --upgrade pip | ||
| pip install uv coverage==7.13.0 bce-python-sdk==0.8.74 wrapt | ||
| uv build --wheel --package paddleformers --out-dir dist --clear -v |
There was a problem hiding this comment.
此前这条评论的正文没有正确提交到 GitHub。当前提交已经改为在 pyproject.toml 中声明根项目,原先 uv build --package paddleformers 找不到 workspace package 的问题按现状看已被后续改动取代;新的安装依赖问题已在当前 diff 的行级评论中单独指出。
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交。上一轮 uv build --package paddleformers 的问题已被新的 pyproject.toml 元数据改动取代;但当前基础依赖又引入了一个会阻塞 XPU/非 CUDA 安装的新问题,详情已写在行级评论中。其他未解决的迁移问题仍由原有讨论线程跟进。
| "librosa", | ||
| "binpacking", | ||
| "orjson", | ||
| "paddlepaddle-gpu==3.4.0.post20260626+93ecba8dc6c", |
There was a problem hiding this comment.
这里把 CUDA 版 paddlepaddle-gpu 放进了 paddleformers 的基础依赖,导致非 CUDA 环境也必须解析这个精确 GPU wheel。最新 XPU CI 已经在 python -m pip install -e . 阶段失败为 No matching distribution found for paddlepaddle-gpu==3.4.0.post20260626+93ecba8dc6c,而该流程刚安装的是 paddlepaddle-xpu。请不要在基础依赖里固定 CUDA wheel;保持 Paddle 安装由各硬件 CI/用户按目标环境单独安装,或拆成明确的 GPU optional extra。
| "paddlepaddle-gpu==3.4.0.post20260626+93ecba8dc6c", |
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交,发现一个新的阻塞问题,详情已写在行级评论中。此前已有未解决问题仍由原有线程跟进,本次未重复展开。
| def get_requires_for_build_sdist(config_settings=None): | ||
| return orig.get_requires_for_build_sdist(config_settings) | ||
|
|
||
|
|
||
| def get_requires_for_build_wheel(config_settings=None): | ||
| return orig.get_requires_for_build_wheel(config_settings) | ||
|
|
||
|
|
||
| def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): | ||
| return _with_temporary_build_version( | ||
| orig.prepare_metadata_for_build_wheel, | ||
| metadata_directory, | ||
| config_settings, | ||
| ) | ||
|
|
||
|
|
||
| def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): | ||
| return _with_temporary_build_version( | ||
| orig.build_wheel, | ||
| wheel_directory, | ||
| config_settings, | ||
| metadata_directory, | ||
| ) | ||
|
|
||
|
|
||
| def build_sdist(sdist_directory, config_settings=None): | ||
| return _with_temporary_build_version( | ||
| orig.build_sdist, | ||
| sdist_directory, | ||
| config_settings, | ||
| ) |
There was a problem hiding this comment.
这个自定义 backend 只在 prepare_metadata_for_build_wheel/build_wheel 阶段写入临时 _build_version.py,但 CI 里 uv build --wheel --package paddleformers 先调用 get_requires_for_build_wheel(),setuptools 读取动态 version 时找不到该文件,转而导入 paddleformers/__init__.py 并在隔离构建环境里因缺少运行时依赖 colorlog 直接失败。同时 XPU CI 的 python -m pip install -e . 也因为 backend 没有暴露 PEP 660 build_editable hook 而失败。请把获取 build requirements 的 hook 也放进临时 version 上下文,并代理 editable hooks,保证 wheel 构建和 editable install 都能工作。
| def get_requires_for_build_sdist(config_settings=None): | |
| return orig.get_requires_for_build_sdist(config_settings) | |
| def get_requires_for_build_wheel(config_settings=None): | |
| return orig.get_requires_for_build_wheel(config_settings) | |
| def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): | |
| return _with_temporary_build_version( | |
| orig.prepare_metadata_for_build_wheel, | |
| metadata_directory, | |
| config_settings, | |
| ) | |
| def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): | |
| return _with_temporary_build_version( | |
| orig.build_wheel, | |
| wheel_directory, | |
| config_settings, | |
| metadata_directory, | |
| ) | |
| def build_sdist(sdist_directory, config_settings=None): | |
| return _with_temporary_build_version( | |
| orig.build_sdist, | |
| sdist_directory, | |
| config_settings, | |
| ) | |
| def get_requires_for_build_sdist(config_settings=None): | |
| return _with_temporary_build_version( | |
| orig.get_requires_for_build_sdist, | |
| config_settings, | |
| ) | |
| def get_requires_for_build_wheel(config_settings=None): | |
| return _with_temporary_build_version( | |
| orig.get_requires_for_build_wheel, | |
| config_settings, | |
| ) | |
| def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): | |
| return _with_temporary_build_version( | |
| orig.prepare_metadata_for_build_wheel, | |
| metadata_directory, | |
| config_settings, | |
| ) | |
| def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): | |
| return _with_temporary_build_version( | |
| orig.build_wheel, | |
| wheel_directory, | |
| config_settings, | |
| metadata_directory, | |
| ) | |
| def build_sdist(sdist_directory, config_settings=None): | |
| return _with_temporary_build_version( | |
| orig.build_sdist, | |
| sdist_directory, | |
| config_settings, | |
| ) | |
| def get_requires_for_build_editable(config_settings=None): | |
| return _with_temporary_build_version( | |
| orig.get_requires_for_build_editable, | |
| config_settings, | |
| ) | |
| def prepare_metadata_for_build_editable(metadata_directory, config_settings=None): | |
| return _with_temporary_build_version( | |
| orig.prepare_metadata_for_build_editable, | |
| metadata_directory, | |
| config_settings, | |
| ) | |
| def build_editable(wheel_directory, config_settings=None, metadata_directory=None): | |
| return _with_temporary_build_version( | |
| orig.build_editable, | |
| wheel_directory, | |
| config_settings, | |
| metadata_directory, | |
| ) |
There was a problem hiding this comment.
最新提交已经把 get_requires_for_build_sdist / get_requires_for_build_wheel 放进临时 version 上下文,这部分看起来已处理;但同一线程里的 editable install 问题仍未解决。当前 backend 仍只导出 wheel/sdist hooks,没有代理 PEP 660 的 get_requires_for_build_editable、prepare_metadata_for_build_editable 和 build_editable,因此 python -m pip install -e . 这类开发/CI 安装路径仍会被判定为不支持 editable 安装。请继续在同一临时 version 上下文中代理 editable hooks。
建议补齐的形态:
def get_requires_for_build_editable(config_settings=None):
return _with_temporary_build_version(orig.get_requires_for_build_editable, config_settings)
def prepare_metadata_for_build_editable(metadata_directory, config_settings=None):
return _with_temporary_build_version(
orig.prepare_metadata_for_build_editable,
metadata_directory,
config_settings,
)
def build_editable(wheel_directory, config_settings=None, metadata_directory=None):
return _with_temporary_build_version(
orig.build_editable,
wheel_directory,
config_settings,
metadata_directory,
)
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交。_build_backend.py 中上一轮提到的 wheel build hooks 已部分修复,但 editable install 支持仍缺失,已在原行级线程补充说明。其他仍未解决的问题继续由原有线程跟进,本次未重复展开。
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #4731 +/- ##
==========================================
Coverage ? 14.14%
==========================================
Files ? 631
Lines ? 112129
Branches ? 19790
==========================================
Hits ? 15859
Misses ? 94597
Partials ? 1673
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交,发现一个新的 Python 3.8 构建兼容性问题,详情已写在行级评论中。此前仍未解决的问题继续由原有线程跟进,本次未重复展开。
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
|
|
||
| import os |
There was a problem hiding this comment.
_build_backend.py 会被 PEP 517 前端在构建前直接导入,但项目仍声明 requires-python = ">=3.8"。当前文件第 66 行使用 tuple[str, str],在 Python 3.8 上没有延迟注解时会在导入阶段求值并触发 TypeError: 'type' object is not subscriptable,导致 pip install / python -m build 在受支持的 3.8 环境直接失败。请延迟注解求值,或改用 typing.Tuple;这里可以直接在首个普通 import 前开启 future annotations:
| import os | |
| from __future__ import annotations | |
| import os |
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交。paddleformers/fleet/transformer/moe/fusion_layer_utils.py 已补 import paddlefleet_ops,此前该文件的 F821 部分看起来已处理;同类问题在 moe_layer.py、vmm_utils.py 仍由已有讨论跟进。_build_backend.py 的 Python 3.8 注解兼容和 editable hooks 问题本次没有改动,继续由原行级线程跟进。本次未新增行级评论。
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交,发现一个新的阻塞问题,详情已写在行级评论中。此前未解决的问题继续由原有线程跟进,本次未重复展开。
| wget -q --no-proxy https://paddle-qa.bj.bcebos.com/CodeSync/develop/PaddleFormers.tar --no-check-certificate | ||
| echo "Extracting PaddleFormers.tar" | ||
| echo "Downloading PaddleFormers.tar.gz" | ||
| wget -q --no-proxy --no-check-certificate "${{ needs.clone.outputs.repo_archive_url }}" -O PaddleFormers.tar.gz |
There was a problem hiding this comment.
这里改为下载 _clone_linux.yml 产物后,容器里的仓库已经是共享 clone job 在本地 develop 分支上合并 PR 后打出的 archive;当前 CI 日志显示 checkout 后是 HEAD -> develop 且提交为 Merge branch 'pr/4731' into develop。但后续 scripts/unit_test/ci_unittest.sh 仍收到 AGILE_COMPILE_BRANCH=develop,并用 git diff --numstat ${AGILE_COMPILE_BRANCH} -- 判断是否运行测试,同时把同一个 ref 交给 scripts/install_or_build_ops_wheel.sh 判断 packages/ 是否需要本地构建。实际本次 unittest-gpu-ci 已在约两分钟内结束,PYTEST_EXECUTE_FLAG_FILE 未创建、coverage upload 被跳过,说明 PR 的 GPU 单测没有真正执行。请改为保留并传入真正的 base ref,例如远端 base 或 merge commit 的第一父提交,避免 diff 变成当前分支与自身比较。unittest-gpu-ce.yml 的同类下载逻辑也需要一起修正。
修复形态示例:
bash -x scripts/unit_test/ci_unittest.sh ${paddle_whl} false ${PYTEST_EXECUTE_FLAG_FILE} ${AGILE_COMPILE_BRANCH:+origin/${AGILE_COMPILE_BRANCH}}There was a problem hiding this comment.
最新提交 a8a435b 仍复现这个问题:当前 unittest-gpu-ci 日志里 archive 解出后仍是 HEAD -> develop 的 merge commit,环境里 AGILE_COMPILE_BRANCH=develop,ci_unittest.sh 实际执行 git diff --numstat develop -- 后进入 Changed Not CI case, Skips,最终 PYTEST_EXECUTE_FLAG_FILE 未创建且 coverage upload 被跳过。也就是说 GPU 单测仍没有真正执行。请不要把本地 develop 分支名作为 diff base 传给脚本,改为传入可解析到真实 base 的 ref/sha,例如远端 base 或 merge commit 第一父。
修复形态示例:
bash -x scripts/unit_test/ci_unittest.sh ${paddle_whl} false ${PYTEST_EXECUTE_FLAG_FILE} origin/${AGILE_COMPILE_BRANCH}
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交,发现一个新的阻塞问题,详情已写在行级评论中。此前未解决的问题继续由原有线程跟进,本次未重复展开。
| -e "PR_ID=$PR_ID" \ | ||
| -e "BRANCH=$BRANCH" \ | ||
| -e "COMMIT_ID=$COMMIT_ID" \ | ||
| -e "AGILE_COMPILE_BRANCH=$BRANCH" \ |
There was a problem hiding this comment.
这里把 AGILE_COMPILE_BRANCH 设成 develop,同时下面 ci_model_unittest.sh 仍以同一个 BRANCH 参数执行 git diff --numstat ${BRANCH} --。但当前代码来源已经改成 _clone_linux.yml 打包的 merge archive,该 archive 在本地 develop 分支上包含 PR 合并提交;在容器里再拿 develop 和当前 HEAD -> develop 比较会得到空 diff。影响是 scripts/regression/install_requirements.sh/install_or_build_ops_wheel.sh 无法识别本 PR 的 packages/ 变更,可能安装旧的 paddlefleet_ops wheel;模型选择也会退回默认 glm4_moe,而不是按 PR diff 覆盖相关模型。请传入真实 base ref(例如 origin/${BRANCH} 或 merge commit 第一父),并让 ci_model_unittest.sh 的第四个参数使用同一个 base ref。
修复形态示例:
-e "AGILE_COMPILE_BRANCH=origin/$BRANCH" \
...
bash -x scripts/regression/ci_model_unittest.sh True False "$UPDATE_BASELINE_MODELS" "origin/$BRANCH" "${PR_NUMBER}"There was a problem hiding this comment.
最新提交 20b08ad6 仍未解决这里的模型选择问题,并且把 ci_model_unittest.sh 中 packages/* 变更直接设置 models="all" 的兜底删除了。当前 workflow 仍调用 ci_model_unittest.sh ... $BRANCH ${PR_NUMBER},脚本也仍执行 git diff --numstat ${BRANCH} --;在 merge archive 的本地 develop 上这仍会得到空 diff,并退回默认 glm4_moe。即使后续把 ${BRANCH} 改成真实 base ref,删除这个兜底也会让仅 packages/ 的变更不再覆盖所有相关模型。请同时处理两点:传入真实 base ref/sha,并恢复 packages/* 触发全量模型,或提供等价的覆盖策略。
修复形态示例:
if [[ "$file_name" == packages/* ]]; then
models="all"
echo "packages/ changes detected, running all models"
return
fi
risemeup1111
left a comment
There was a problem hiding this comment.
已复查最新提交。unittest-gpu.yml 的 GPU 单测仍会因为本地 develop diff 为空而跳过,model-unittest-gpu.yml 的预构建 wheel 只部分处理了上一轮问题,模型选择仍使用同样的空 diff;这两点已在原有行级线程补充最新证据,未新增重复行级评论。此前其他未解决问题继续由原有线程跟进。
Before submitting
testsfolder. If there are codecov issues, please add tests cases first.PR types
PR changes
Description