Paddle icon indicating copy to clipboard operation
Paddle copied to clipboard

[Typing] 添加 `libpaddle` 的 stub 文件生成脚本

Open megemini opened this issue 1 year ago • 7 comments

PR Category

User Experience

PR Types

Improvements

Description

添加 libpaddle 的 stub 文件生成脚本。

使用工具 pybind11-stubgen 生成 libpaddle 的 stub 文件。

有几点需要注意的:

  • 没有在 python/paddle/base 下直接生成 libpaddle 文件夹(内含 stub 文件)

    主要原因是,一旦这个文件夹被污染,则极有可能程序中无法正常导入 libpaddle 模块。 因此,将生成的文件统一放到了 python/paddle/_typing/libs 目录下,这里以后也可以放置其他 pybind11 的 C++ API 相应的 stub 文件。

  • patch 了 pybind11-stubgenPrinter 的方法,主要目的是,使 pyi 文件消除语法错误,以可以正常进行 mypy 检查

    主要改动为:

    • 对于 Printer 中的 print_xxx 方法,如果输入参数中的 name 不合法,则会在 name 后添加 _

      这里主要应对 C++ 中有参数用的 in 作为输入参数,因此修改了输入参数名,如 in 改为 in_ 。影响是,使用 kwargs 的方式调用的时候可能会发现输入参数名不对。另外,发现有个函数名是 assert ,也改为了 assert_ ,这个函数是没法直接调用了(静态检查的时候)~ 整体上来说感觉影响不大 ~

    • 对于 Printer 中的 print_invalid_exp 方法,由直接输出不合法的名称,改为通过引号引用。

      def dist_config(self) -> paddle::DistConfig 改为了 def dist_config(self) -> "paddle::DistConfig": 。改动前的代码是存在语法错误的,改动后的语法正常,而在类型检查时转为了 Any 。这类错误主要是 pybind11 使用不当引起的 ~

  • Tensor.pyi 一样,会在 paddle_binary_dirpaddle_source_dir 中同时添加。

大体看了一下生成的文件,出问题的地方基本都是 pybind11 使用不当导致的,整体来看可用性还行?!~

关联

  • https://github.com/PaddlePaddle/Paddle/issues/63597
  • https://github.com/PaddlePaddle/Paddle/issues/65008

@SigureMo

megemini avatar Jul 22 '24 12:07 megemini

你的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[bot] avatar Jul 22 '24 12:07 paddle-bot[bot]

Update 20240724

  • 增加 libpaddle.pyi ,使其指向 paddle._typing.libs.libpaddle

    由于 paddle.__init__.py 本身没有导入 base ,而生成的 pyi 里面会用到 import paddle.base.libpaddle ,所以,增加 libpaddle.pyi 文件,这样逻辑上也清楚一点吧 ~

  • 增加/更新 core.pyi _C_ops.pyi ,使其指向 paddle._typing.libs.libpaddle 及子目录

    貌似这两个文件基本上就是抽取了 libpaddle 里面的东西?

另外,计划通过解析 ops.yaml 完善 libpaddleops 的标注,也就是 _C_ops 中的标注。目前 ops 还都是 def abs(*args, **kwargs): 的形式。

megemini avatar Jul 24 '24 06:07 megemini

Update 20240724 parse ops

  • 增加 ops 的解析,覆盖 pybind11-stubgen 生成的
    • python/paddle/_typing/libs/libpaddle/eager/ops/__init__.pyi
    • python/paddle/_typing/libs/libpaddle/pir/ops.pyi

目前测试可以推导 _C_ops 中相关内容

image

但,仍存在不完整的情况,如 paddle/_typing/libs/libpaddle/pir/ops.pyi 中的 add ,这部分暂时没找到好的解决方案 ~

megemini avatar Jul 24 '24 14:07 megemini

Update 20240725

目前 patch 之后,大部分错误和 warning 可以解决,仍存在:

  • 找不到合适的 mapping ,如 paddle::dialect::OperationDistAttribute
  • 不方便 patch 的地方,如 TypeGuard[xxx]

可以推进:

  • 有没有其他需要注意的地方
  • 以及 pybind11-stubgen 的 req 放在哪里?

megemini avatar Jul 25 '24 15:07 megemini

Update 20240726

  • 将 bad expression 转换为 typing.Any ,如 paddle::XXX -> typing.Any

    这样,生成的 stub 文件中已经消除掉所有的错误信息

  • 去掉 paddle.__init__.py 对于 libpaddle 的导入

    导入关系的修改可以考虑放到另一个 PR 里面,以及 paddle._typing paddle._typing.libs paddle._typing.libs.XXX 等导入关系是否建立,都可以另提 PR 讨论

megemini avatar Jul 26 '24 13:07 megemini

Update 20240731

  • 修改 setup 中对于 requirements 的过滤行为

记得合入前需要实现这个机制,并验证下(unzip wheel 包查看 dist-info 里的 METADATA 就可以看到依赖项了)

image

安装包中已无 pybind11-stubgen

megemini avatar Jul 31 '24 07:07 megemini

Sorry to inform you that 7175f55's CIs have passed for more than 7 days. To prevent PR conflicts, you need to re-run all CIs manually.

paddle-ci-bot[bot] avatar Aug 08 '24 03:08 paddle-ci-bot[bot]

Update 20240830

  • 依赖 https://github.com/PaddlePaddle/Paddle/pull/67868 修复示例中类型标注的问题

在本 PR 中修复此问题 ~

megemini avatar Aug 30 '24 07:08 megemini