通过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 算子实现和调用全流程

版权声明:本文为CSDN博主「Dustone_Mu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HalcyonBravado/article/details/121337352

Dustone_Mu

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

目标检测-锚框概念和代码实现

前言 经历过图像分类后,进一步的就是更复杂的目标检测了,从这一章开始,将会不断记录图像目标检测中的学习经历,其中大多数思路以及代码来源,来自于李沐的动手学深度学习课程&#x

Yolo(3)(项目)Yolo v3 目标检测(85分类)

目录 基础理论 一、 读取文件 二、神经网络初始化 1、搭建神经网络 2、GPU加速 三、打开摄像头、按帧读取图像 四、向神经网络输入 五、获取神经网络输出 1、获取各层名称 2、获取输出层名称 3、获取输出层图像&#xff