Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to use phi C++ API in a standalone cmake project? #43965

Closed
gglin001 opened this issue Jun 30, 2022 · 15 comments
Closed

How to use phi C++ API in a standalone cmake project? #43965

gglin001 opened this issue Jun 30, 2022 · 15 comments
Labels
PFCC Paddle Framework Contributor Club,https://github.com/PaddlePaddle/community/tree/master/pfcc status/close 已关闭 type/question 用户提问

Comments

@gglin001
Copy link
Contributor

请提出你的问题 Please ask your question

HI, 请问在安装 paddlepaddle 的 wheel 包后如何在独立的 cmake 项目中使用 phi 的C++ 接口(而不需要编译 paddle 的源码), 比如注册一些外部 kernel, 请问有如何配置的例子吗?

另外似乎 wheel 包里面只导出了头文件, 比如这个路径

/opt/conda/lib/python3.7/site-packages/paddle/include/paddle/phi/api/all.h

请问是需要 link core_avx.so 吗, 还是存在 phi 相关的动态库?

/opt/conda/lib/python3.7/site-packages/paddle/fluid/core_avx.so
@paddle-bot-old
Copy link

您好,我们已经收到了您的问题,会安排技术人员尽快解答您的问题,请耐心等待。请您再次检查是否提供了清晰的问题描述、复现代码、环境&版本、报错信息等。同时,您也可以通过查看官网API文档常见问题历史IssueAI社区来寻求解答。祝您生活愉快~

Hi! We've received your issue and please be patient to get responded. We will arrange technicians to answer your questions as soon as possible. Please make sure that you have posted enough message to demo your request. You may also check out the APIFAQGithub Issue and AI community to get the answer.Have a nice day!

@gglin001 gglin001 changed the title How to use phi C++ API in a standalone cmake project How to use phi C++ API in a standalone cmake project? Jun 30, 2022
@chenwhql
Copy link
Contributor

目前是link core_avx.so,phi目前还没有独立成库,后续才会拆分

目前我们有相应的自定义算子和自定义kernel机制,您看下是不是可以参考:

https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/custom_op/new_cpp_op_cn.html

https://www.paddlepaddle.org.cn/documentation/docs/zh/dev_guides/custom_device_docs/index_cn.html

@gglin001
Copy link
Contributor Author

目前是link core_avx.so,phi目前还没有独立成库,后续才会拆分

目前我们有相应的自定义算子和自定义kernel机制,您看下是不是可以参考:

https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/custom_op/new_cpp_op_cn.html

https://www.paddlepaddle.org.cn/documentation/docs/zh/dev_guides/custom_device_docs/index_cn.html

好的, 我看到了如何配置 cmake , 感谢您的回复

@gglin001
Copy link
Contributor Author

gglin001 commented Jun 30, 2022

我发现如果不使用构建时使用的环境添加下面的依赖, 而使用别的路径(conda 环境下相同版本的 package), 构建的 exe 运行时失败, 失败来自于 glog 和 gflags

但是这种接口的使用场景本来就应该是不必编译 paddle 源码而直接使用分发的 wheel包的

############ 三方依赖,本示例中使用Paddle相同依赖
set(BOOST_INC_DIR "/path/to/Paddle/build/third_party/boost/src/extern_boost")
set(GFLAGS_INC_DIR "/path/to/Paddle/build/third_party/install/gflags/include")
set(GLOG_INC_DIR "/path/to/Paddle/build/third_party/install/glog/include")
set(MKLDNN_INC_DIR "/path/to/Paddle/build/third_party/install/mkldnn/include")

from
https://www.paddlepaddle.org.cn/documentation/docs/zh/dev_guides/custom_device_docs/custom_device_example_cn.html

@chenwhql
Copy link
Contributor

chenwhql commented Jun 30, 2022

您这边具体是想写什么样的功能:

  1. 是要写自定义kernel,然后替换掉框架原有kernel执行?
  2. 还是要写自定义算子,实现框架没有的自定义运算?
  3. 还是就是直接要写C++代码编译可执行文件灵活使用?

@gglin001
Copy link
Contributor Author

我希望尝试一下 使用 phi 接口实现

  1. 是要写自定义kernel,然后替换掉框架原有kernel执行?

其中的一些测试会使用到

  1. 还是就是直接要写C++代码编译可执行文件灵活使用?

前面遇到的编译问题应该是配置不太对, 应该是不需要 link glog/gflags 动/静态库, 只需要它们的头文件, 目前可以编译了🎉, 感谢帮助

@gglin001
Copy link
Contributor Author

gglin001 commented Jun 30, 2022

请教一个额外的问题, 看起来 phi 实现了类似于 torch dispatcher 的机制(这句话可能有误), 但是似乎只是对注册的 kernel 使用, 请问是否可有可能实现下面的机制

python 层调用 gather_nd, input 是 C++ 的 paddle::experimental::Tensor

    if in_dygraph_mode():
        return _C_ops.final_state_gather_nd(input, index)

通过 C++ dispatcher或者类似机制选择 gather_nd 对应的 “实现” (和 input 的 place 有关, 当然不仅仅是 place, 还有其他的属性或者其他环境的配置)
这里的 “实现” 不是指目前已有的 kernel , 也许还会再经过一次 dispatch 才最终调用对应的 kernel(比如 cpu 的kernel), 这里 “实现” 的输入将是 paddle::experimental::Tensor 而不是 phi::DenseTensor

我在之前提过类似的 issue

@chenwhql
Copy link
Contributor

chenwhql commented Jul 1, 2022

3. 还是就是直接要写C++代码编译可执行文件灵活使用?

如果您是第三种使用方式,目前paddle理论上也可以使用,但我们还没有做过比较广泛的验证,也没有推广,所以可能会有一些问题,昨天我试了一下,发现一个问题,修复了一下,您看下这里面的示例是您要的吗?

#43977

@chenwhql
Copy link
Contributor

chenwhql commented Jul 1, 2022

请教一个额外的问题, 看起来 phi 实现了类似于 torch dispatcher 的机制(这句话可能有误), 但是似乎只是对注册的 kernel 使用, 请问是否可有可能实现下面的机制

python 层调用 gather_nd, input 是 C++ 的 paddle::experimental::Tensor

    if in_dygraph_mode():
        return _C_ops.final_state_gather_nd(input, index)

通过 C++ dispatcher或者类似机制选择 gather_nd 对应的 “实现” (和 input 的 place 有关, 当然不仅仅是 place, 还有其他的属性或者其他环境的配置) 这里的 “实现” 不是指目前已有的 kernel , 也许还会再经过一次 dispatch 才最终调用对应的 kernel(比如 cpu 的kernel), 这里 “实现” 的输入将是 paddle::experimental::Tensor 而不是 phi::DenseTensor

我在之前提过类似的 issue

paddle目前phi的实现和torch的dispatcher有所差别,phi只会进行一次kernel查找,找到kernel执行,不会有多层的分发

看您写的例子似乎就是想使用这样的API

image

目前是可以的,您可以参照上面链接PR中的示例,在C++函数中调用paddle::gather_nd使用,输入是paddle::Tensor

@chenwhql
Copy link
Contributor

chenwhql commented Jul 1, 2022

上图中的API在paddle的安装目录中有,我们当前这个机制可以在自定义算子中使用,您可以参考这节文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/custom_op/new_cpp_op_cn.html#pythonc-api

@gglin001
Copy link
Contributor Author

gglin001 commented Jul 1, 2022

上图中的API在paddle的安装目录中有,我们当前这个机制可以在自定义算子中使用,您可以参考这节文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/custom_op/new_cpp_op_cn.html#pythonc-api

我有遇到 #43977 处理的问题, 目前实现

  1. 还是就是直接要写C++代码编译可执行文件灵活使用?

是ok的!

请问我可以自定义

/opt/conda/lib/python3.7/site-packages/paddle/include/paddle/phi/api/include/api.h

里面的

PADDLE_API Tensor abs(const Tensor& x);

的实现吗?

@gglin001
Copy link
Contributor Author

gglin001 commented Jul 1, 2022

上图中的API在paddle的安装目录中有,我们当前这个机制可以在自定义算子中使用,您可以参考这节文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/custom_op/new_cpp_op_cn.html#pythonc-api

我有遇到 #43977 处理的问题, 目前实现

  1. 还是就是直接要写C++代码编译可执行文件灵活使用?

是ok的!

请问我可以自定义

/opt/conda/lib/python3.7/site-packages/paddle/include/paddle/phi/api/include/api.h

里面的

PADDLE_API Tensor abs(const Tensor& x);

的实现吗?

这样做似乎是没有意义的, 我会尝试一下注册外部 kernel, 感谢帮助👍🏼

@chenwhql
Copy link
Contributor

chenwhql commented Jul 1, 2022

所以您还是要将框架原有的运算,替换为您自定义的运算?

这种目前还不支持,后面可以考虑下让自定义kernel的机制更灵活,在外部实现之后,替换内部原有的kernel

请问具体是什么样的场景需要将一个标准运算替换为自定义的运算,并且还不能通过自定义新的API实现(比如您可以新增一个custom_abs自定义算子),可以展开介绍下吗?

@chenwhql
Copy link
Contributor

chenwhql commented Jul 1, 2022

这样做似乎是没有意义的, 我会尝试一下注册外部 kernel, 感谢帮助👍🏼

不客气,您可以试试通过自定义算子在外部新增一个custom_abs

@paddle-bot-old paddle-bot-old bot added status/following-up 跟进中 and removed status/new-issue 新建 labels Jul 1, 2022
@gglin001
Copy link
Contributor Author

gglin001 commented Jul 2, 2022

所以您还是要将框架原有的运算,替换为您自定义的运算?

这种目前还不支持,后面可以考虑下让自定义kernel的机制更灵活,在外部实现之后,替换内部原有的kernel

请问具体是什么样的场景需要将一个标准运算替换为自定义的运算,并且还不能通过自定义新的API实现(比如您可以新增一个custom_abs自定义算子),可以展开介绍下吗?

我在尝试将 lazy-tensr 的机制引入到 paddle 中(pytorch 中已经有比较完善的支持, 比如 https://github.com/pytorch/xla/ ), 这需要推迟 算子的执行, 但是在目前 paddle 只支持自定义 kernel 的情况下操作会受到一些限制

感觉paddle目前的想法是所有后端都是以 kernel 为基础的, 但是一些 custom-device 未必如此, pytorch 的 dispatcher 机制使得支持 lazy-tensor/functorch 以及自由拓展后端变得更加灵活, paddle 目前则达不到这样的效果, 如果 可以实现 API 层面的 dispatch 而不仅仅只处理 kernel, 也许可以激发更多新的想法(比如完全脱离静态图的动转静trace方案, 以及一些 torch 里面的使用 https://pytorch.org/tutorials/advanced/dispatcher.html#going-beyond-autograd)

遇到的一些具体的问题

  1. 如何 实现 custom-device 使用 cpu 的 kernel, 比如 gauss_random, 我希望在 custom-device 上调用 cpu 的kernel, 然后复制过来, 而不必重复定义一遍 kernel 实现, 似乎没有开放的接口实现(或者我没找到)?

@luotao1 luotao1 added the PFCC Paddle Framework Contributor Club,https://github.com/PaddlePaddle/community/tree/master/pfcc label Aug 15, 2022
@paddle-bot paddle-bot bot added status/close 已关闭 and removed status/following-up 跟进中 labels Sep 26, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
PFCC Paddle Framework Contributor Club,https://github.com/PaddlePaddle/community/tree/master/pfcc status/close 已关闭 type/question 用户提问
Projects
None yet
Development

No branches or pull requests

3 participants