通过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

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

暂无评论

发表评论

相关推荐

yolov5训练数据集划分

yolov5训练数据集划分 按照默认8:1:1划分训练集,测试集,验证集。 txt文件出现在imageset文件夹。 import os import randomtrainval_pe

Pytorch—万字入门SSD物体检测

前言 由于初入物体检测领域,我在学习SSD模型的时候遇到了很多的困难。一部分困难在于相关概念不清楚,专业词汇不知其意,相关文章不知所云;另一部分困难在于网上大部分文章要么只是简要介绍了SS