【Hackathon 9th No.109】[CppExtension] Support build Custom OP in setuptools 80+ -part#4977
Conversation
|
Thanks for your contribution! |
我今天在 FD 里测了下 GPU OP 还是有问题,现在需要在 FD 里测些东西,等测完后我找时间看看是什么问题 |
There was a problem hiding this comment.
我重新测了下不用 deep_gemm 的话应该没大问题~不过得在 .gitignore 里添加一下 **/fastdeploy_ops/__init__.py 以确保新的生成的 stub 文件被 ignore 掉
这里总结一下
之前 tmp 生成的目录结构如下:
custom_ops/tmp
├── fastdeploy_ops-0.0.0-py3.10-linux-x86_64.egg
│ ├── deep_gemm # 注意这有 deep_gemm
│ │ └── ...
│ ├── EGG-INFO
│ │ ├── dependency_links.txt
│ │ ├── native_libs.txt
│ │ ├── not-zip-safe
│ │ ├── PKG-INFO
│ │ ├── SOURCES.txt
│ │ └── top_level.txt
│ ├── fastdeploy_ops_pd_.so
│ ├── fastdeploy_ops.py
│ └── version.txt
└── version.txt
copy 到 fastdeploy/model_executor/ops/gpu 结构如下:
fastdeploy/model_executor/ops/gpu
├── deep_gemm
│ └── ...
├── EGG-INFO
│ ├── dependency_links.txt
│ ├── native_libs.txt
│ ├── not-zip-safe
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ └── top_level.txt
├── fastdeploy_ops_pd_.so
├── fastdeploy_ops.py
├── __init__.py
└── version.txt
fastdeploy_ops 模块的入口是 fastdeploy_ops.py
而本 PR 结合 PaddlePaddle/Paddle#76008 修改之后的现代化目录结构如下
tmp 目录如下
custom_ops/tmp
├── deep_gemm
│ └── ...
├── fastdeploy_ops
│ ├── fastdeploy_ops_pd_.so
│ └── __init__.py
├── fastdeploy_ops-0.0.0-py3.10.egg-info
│ ├── dependency_links.txt
│ ├── not-zip-safe
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ └── top_level.txt
├── fastdeploy_ops-0.0.0-py3.10-linux-x86_64.egg # 这个目录是新增 shell 脚本里 copy 过来的,为了和之前兼容,上面两个目录才是原生生成的现代化目录结构
│ ├── deep_gemm # 这里需要把 deep_gemm 也 copy 过来,现在还没实现
│ │ └── ...
│ └── fastdeploy_ops
│ ├── fastdeploy_ops_pd_.so
│ └── __init__.py
└── version.txt
copy 到 fastdeploy/model_executor/ops/gpu 结构如下:
fastdeploy/model_executor/ops/gpu
├── deep_gemm # 同上,deep_gemm 还没 copy 过来
│ └── ...
├── fastdeploy_ops
│ ├── fastdeploy_ops_pd_.so
│ └── __init__.py
└── __init__.py
另外还有一个思路,在检测到 modern dir 时直接让 WHEEL_NAME="",这样 copy 时候也是没啥问题的(毕竟之前的目录结构就相当于比新的目录结构多了一层 WHEEL_NAME)
if [ -d "./${OPS_TMP_DIR}/${WHEEL_MODERN_NAME}" ]; then
WHEEL_NAME=""
fi此时的 fastdeploy_ops 模块的入口则变成了 fastdeploy_ops 目录,新增的 __init__.py 是新的 stub 文件,需要 ignore 下
解决上述问题后我觉得就没啥问题了
build.sh
Outdated
| WHEEL_MODERN_CPU_NAME="fastdeploy_cpu_ops" | ||
|
|
||
| # Handle GPU ops directories (WHEEL_NAME and WHEEL_MODERN_NAME) | ||
| if [ -d "./${OPS_TMP_DIR}/${WHEEL_NAME}" ]; then |
There was a problem hiding this comment.
是否可以修改为判断是否存在 WHEEL_MODERN_NAME?因为判断 WHEEL_NAME 的话,一旦第二次执行是没有清理 tmp 目录的(我记得有选项,而且调试时候可能注释掉清理那一行),就可能走到旧的逻辑,进而导致装的是旧的包
我之前测的时候可能是命中了这个逻辑误以为没有生效
| mkdir -p "./${OPS_TMP_DIR}/${WHEEL_CPU_NAME}" | ||
| cp -r "./${OPS_TMP_DIR}/${WHEEL_MODERN_CPU_NAME}" "./${OPS_TMP_DIR}/${WHEEL_CPU_NAME}/" | ||
| fi | ||
| fi |
There was a problem hiding this comment.
另外需要注意下 gpu ops 不仅仅包含 fastdeploy_ops,还包含 deep_gemm
FastDeploy/custom_ops/setup_ops.py
Lines 506 to 524 in e43a5fc
因此 deep_gemm 目录也需要 copy 过去,详情可以看整体的 review
Update 20251116
应该可以~ 只是有个小问题,gpu (或其他) 和 cpu 应该不会同时编译到 tmp 目录吧?话说,如果不会的话,为啥要区分 WHEEL_NAME 和 WHEEL_CPU_NAME ? p.s. fd 的 ci 是不是有点问题? #4998 是想用来 debug 的,结果 ci 不动 ... ... |
这个我也不清楚 😂
第一次提 PR 需要有 write 权限的人 approve 才会跑,这边我也没 write 权限,周一我找下其他同学 |
Motivation
关联 PaddlePaddle/Paddle#76008
框架兼容 setuptools80+ 之后,cpp_extension 的打包方式发生了改变,因此需要修改 FD 中 copy_ops 的逻辑。
Modifications
WHEEL_MODERN_NAMEWHEEL_MODERN_CPU_NAME这两个变量,分别表示新打包方式下算子生成的目录。WHEEL_NAMEWHEEL_CPU_NAME这两个目录,如果存在,说明使用的是旧的框架代码(注意,不是旧的 setuptools 版本,新的框架代码不区分 setuptools 版本)。此时,后续逻辑不做改变。WHEEL_MODERN_NAMEWHEEL_MODERN_CPU_NAME这两个目录是否存在,如果存在,则说明使用的是新的框架代码,然后,将WHEEL_MODERN_NAMEWHEEL_MODERN_CPU_NAME这两个目录(注意,不是目录中的文件)整个复制到WHEEL_NAMEWHEEL_CPU_NAME中(需要先新建)。之后的逻辑也不变。Usage or Command
Accuracy Tests
这里在本地测试,修改
custom_ops/setup_ops.py,只测试 cpu 算子(gpu 编译不了,cuda 版本太低了 ... ...)进行安装:
此时,
tmp_install目录中已经安装好算子,并可以加载:setuptools的版本为80.9.0也同样的效果。Checklist
[FDConfig],[APIServer],[Engine],[Scheduler],[PD Disaggregation],[Executor],[Graph Optimization],[Speculative Decoding],[RL],[Models],[Quantization],[Loader],[OP],[KVCache],[DataProcessor],[BugFix],[Docs],[CI],[Optimization],[Feature],[Benchmark],[Others],[XPU],[HPU],[GCU],[DCU],[Iluvatar],[Metax]]pre-commitbefore commit.releasebranch, make sure the PR has been submitted to thedevelopbranch, then cherry-pick it to thereleasebranch with the[Cherry-Pick]PR tag.@SigureMo