• Python -扩展C++-Pytorch扩展


    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 属性来确定模块在包层次结构中的位置
  • 相关阅读:
    virtual private catalog
    About Health Monitor Checks
    修改ORACLE-NLS_DATE_FORMAT时间格式的四种方式
    About Quick Packaging and Custom Packaging
    Fault Diagnosability Infrastructure Overview
    Basic Concepts of Block Media Recovery
    破解:前一刻觉得还有好多事要做,突然间就不知道该干什么了
    利用OSG实现模拟飞机尾迹-粒子系统
    解决电脑上PPT频繁刷新的问题
    如何查看自己电脑系统的安装日期-Window上
  • 原文地址:https://www.cnblogs.com/ytwang/p/15147076.html
Copyright © 2020-2023  润新知