Python -扩展C++-Pytorch扩展

摘要:
Python C++库首先将C++模块编译为动态链接库。因此,然后使用python模块ctypes调用C++类文件:pycallclass。cppg++来编译和生成动态库libpycall。所以:g++-o libpycallclass。so-shared-fPICpycallclass。cpp。Python调用动态库的文件:pycallclass。py2.Python扩展火炬的底层是用c语言编写的。python的C++扩展的原理与python的C/C++扩展相似。本质上,这是为了扩展它们的功能,并使程序更高效地运行。不同的是,python的C++扩展的实现步骤比python的C/C++扩展更简单。

1.Python

 whl 文件和 egg 文件
可以执行和效率是两码事
 setup.py用来编译和安装扩展模块。负责编译c++模块,封装成python可以调用的形式
所有能被整合或导入到其它python脚本的代码,都可以被称为扩展 
  Python调用C库比较简单,不经过任何封装打包成so,直接使用python的ctypes调用即可。
  Python C++库 先将C++模块编译成动态链接库.so,再利用python模块ctypes进行调用
  (1)C++类文件:pycallclass.cpp  
  (2)g++编译生成动态库libpycall.so:g++ -o libpycallclass.so -shared -fPIC pycallclass.cpp。
  (3)Python调用动态库的文件:pycallclass.py

2.Pytorch扩展

torch的底层是由c语言编写。而到了pytorch这里,底层大部分的语言修改了一些,
但大部分依然是C,只是编译的环境由C转变为C++
因为效率以及速度-还有深度的自定义。
pytorch的C++ extension和python的c/c++ extension其实原理差不多,
 本质上都是为了扩展各自的功能,也为了使程序运行更加有效率,
 差别在于pytorch的C++ extension实施步骤
  较python的c/c++ extension的要简化一些。 

cat  /usr/local/cuda/version.txt
CppExtension
CUDAExtension
用pybind11构建共享库形式的C++和CUDA扩展
   第一步:使用C++编写算子的forward函数和backward函数
   第二步:将该算子的forward函数和backward函数使用pybind11绑定到python上
   第三步:使用setuptools/JIT/CMake编译打包C++工程为so文件
       python 提供的setuptools来编译并加载 C++ 代码。
   4.编译安装,在 python 中调用 C++ 扩展接口

训练端和部署端
    一般的深度学习项目,
        训练时为了加快速度,会使用多 GPU 分布式训练。
        但在部署推理时,为了降低成本,
        往往使用单个 GPU 机器甚至嵌入式平台(比如 NVIDIA Jetson)进行部署,
    部署端也要有与训练时相同的深度学习环境

3.python的构建工具setup.py ,

 在 setup.py 文件中写明依赖的库和版本,
 然后到目标机器上使用 python setup.py install 安装 
 说明:
     name 包名称  deform_conv
	 # 头文件目录 include_dirs
	 # 源代码目录 sources
	 # 这个 C++ 扩展被命名为 deform_conv,意思是说,
	 #在 python 中可以通过 deform_conv 模块来调用 C++ 函数
	  deform_conv.py 当作一般的 PyTorch 模块进行调用
	 
 setup.py中写这些信息,
 我们使用setuptools去编译我们的C++代码,
   CppExtension 和 BuildExtension 可以很方便地
   实现对C++和Cuda的编译	
 封装调用这个扩展(extension) 
 ext_modules
 是一个包含Extension实例的列表,Extension的定义也有一些参数	 
 python setup.py build develop
 python setup.py install  

4.Python调用

 包内的文件相互导入分两种,用绝对路径和相对路径,用.或者..都是相对路径
 from . import x
 当前目录下,而且要在当前目录下建立 __init__.py 文件
 
 _C.cpython-36m-x86_64-linux-gnu.so
 _C.cpython-36m-x86_64-linux-gnu.so
 
 so,即Shared Object,共享对象。(在LINUX下,静态函数库是以.a作后缀的)
 
 python setup.py install 
 python setup.py install,那么,foo.py就会被拷贝到python类路径下,可以被导入使用

5.异常解决

执行的python脚本。使用了相对引用方式 (类似 from .import x) 去引用包时,
可能会出现这个异常。ImportError: attempted relative import with no known parent package`【尝试相对导入,但不知道父包】。
  python -m project.demos.demo
  相对导入通过使用模块的 name 属性来确定模块在包层次结构中的位置

免责声明:文章转载自《Python -扩展C++-Pytorch扩展》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CString关系数据库设计方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

技术学习网站

这里主要用于分享一些实用的技术网站,方便查阅 _ 一、学习提升 1. 综合学习网站 MDN学习 Web 开发的最佳实践 web.devGoogle 出品的 Web 开发资源教程 LeetCode全球极客挚爱的技术成长平台小浩算法 freeCodeCamp通过成千上万个编程关卡来帮助提升你的编程技能 网道互联网开发文档 慕课网程序员的...

安装dlib C++

环境 Ubuntu18.04 dlib19 下载安装 下载 从github下载 dlib git clone https://github.com/davisking/dlib.git 安装 在dlib目录下, 依次执行。 mkdir build; cd build; cmake .. ; cmake --build . Python使用 pyt...

聚合类型与POD类型

Lippman在《深度探索C++对象模型》的前言中写道: I have heard a number of people over the years voice opinions similar to those of your colleagues. In every case, those opinions could be attributed...

linux源码“.config”文件分析

转载于:http://www.cnblogs.com/amanlikethis/p/3641097.html 一、.config文件概述 .config文件是linux内核配置文件,当执行#make uImage编译生成内核时,顶层的Makefile会读取.config文件的内容,根据这个配置文件来编译所定制的内核。 二、.config文件关联 1 文件关...

python 读取共享内存

测试环境 centos7 python3.6.5 首先使用c创建内存,这里的方法是:作为参数读一个二进制数据文件进去,把文件的内容作为共享内存的内容 定义块 #include <stdio.h>#include <sys/shm.h>#include <string.h> int main(int argc, char...

测试覆盖率 Java 覆盖率 Jacoco 插桩的不同形式总结和踩坑记录

https://testerhome.com/topics/20632 关于Jacoco的小结和踩坑记录 一、概述 测试覆盖率,老生常谈的话题。因为我测试理论基础不是很好,就不提什么需求覆盖率啦这样那样的主题了,直奔主题,咱主要指Java后端的测试覆盖率。 由于历史原因,公司基本不做UT,所以对测试来说,咱最关心的还是手工执行、接口执行(人工Postman...