通过setup.py上传含CUDA代码的Python模块到PyPI并进行自动编译

通过setup.py上传含CUDA代码的Python模块到PyPI并进行自动编译

pypi setup.py

通过https://pypi.org/project/ 可以搜索模块并download files 查看其他人的模块如何构建的。

通过官方教程Packaging Python Projects以一个简单的例子介绍打包的基本工作过程,官方教程中推荐使用setup.cfg。可参考API ReferenceBuilding C and C++ Extensions with distutils

博客Python 库打包分发(setup.py 编写)简易指南以及Python 包构建教程为相关的中文教程以及补充。

.cu ext_module

当模块包含用c/c++写的代码时,需要使用ext_module 进行拓展,在前面的教程中有相关的说明,但是当模块中包含采用CUDA编写的 .cu 文件时,setup.py就不能通过简单的ext_module进行拓展了。

在文章三、faster-rcnn源码阅读:C/C++/CU扩展的编译和安装中介绍了多重拓展CUDA的方式,如cupy 中采用的无需编译直接调CUDA源码的方式;PyTorch中构建的 torch.utils.cpp_extension 里面BuildExtension, CppExtension,CUDAExtension可以帮助生成扩展代码,完成度很高,但依赖torch;还有使用Cython进行构建的,但没有详解。

在文章cython代码编译和setup.py文件编写中介绍了Cython在setup.py里面的使用,其中提到了一个pytorch版本中的fasterrcnn 源码的setup.py具有较大参考价值,采用Cython,重写了cmdclass build_ext,检测CUDA的home, nvcc, include, lib64并使用ext_modules进行.cu文件的nvcc/gcc编译。其中编译命令可以参考CUDA toolkit documentation

但采用这个方法进行改写的时候出现了一些问题,没找到指定输出名的接口,编译出现问题。

简单但不正规

将.cu文件直接进行打包,不编译,当import 模块运行相关代码时检测链接库.so,如果不存在直接进行编译

os.system('nvcc -Xcompiler -fPIC -shared -o a.so a.cu')  # linux
os.system('nvcc -o a.dll --shared a.cu')  # win

其中nvcc采用采用上述pytorch版fasterrcnn的setup.py里检测的nvcc path。

其他tips

在 MANIFEST.in里面include modules/file.dll可直接涵盖到非.py文件
在模块包同级终端下python3 -m build构建dist文件夹生成tar.gz/.whl文件。
可以直接pip install dist/pydpmtest-0.3.0.tar.gz进行安装测试,在相应环境的site-packages中可以找到,可使用python import 进行测试。
之后可通过python3 -m twine upload --repository testpypi dist/*上传testpypi(官方教程).
或者twine upload dist/*直接上传pypi.
setup.py中的name即为模块名,上传 搜索 安装均采用这个名字,但是安装后在site-packages/Python中是py_modules

其他参考

setup.py实现C++扩展和python库编译
PyTorch 源码解读之 cpp_extension:揭秘 C++/CUDA 算子实现和调用全流程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值