26.md 6.3 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
# torch.utils.cpp_extension

### torch.utils.cpp_extension.CppExtension(name, sources, *args, **kwargs)

创建一个`C++``setuptools.Extension`

便捷地创建一个`setuptools.Extension`具有最小(但通常是足够)的参数来构建`C++`扩展的方法。

所有参数都被转发给`setuptools.Extension`构造函数。



```py
>>> from setuptools import setup
>>> from torch.utils.cpp_extension import BuildExtension, CppExtension
>>> setup(
        name='extension',
        ext_modules=[
            CppExtension(
                name='extension',
                sources=['extension.cpp'],
                extra_compile_args=['-g'])),
        ],
        cmdclass={
            'build_ext': BuildExtension
        }) 
```

### torch.utils.cpp_extension.CUDAExtension(name, sources, *args, **kwargs)

`CUDA/C++`创建一个`setuptools.Extension`。 创建一个`setuptools.Extension`用于构建`CUDA/C ++`扩展的最少参数(但通常是足够的)的便捷方法。这里包括`CUDA`路径,库路径和运行库。 所有参数都被转发给`setuptools.Extension`构造函数。



```py
>>> from setuptools import setup
>>> from torch.utils.cpp_extension import BuildExtension, CppExtension
>>> setup(
        name='cuda_extension',
        ext_modules=[
            CUDAExtension(
                    name='cuda_extension',
                    sources=['extension.cpp', 'extension_kernel.cu'],
                    extra_compile_args={'cxx': ['-g'],
                                        'nvcc': ['-O2']})
        ],
        cmdclass={
            'build_ext': BuildExtension
        }) 
```

### torch.utils.cpp_extension.BuildExtension(dist,** kw )[source]

自定义`setuptools`构建扩展。

`setuptools.build_ext`子类负责传递所需的最小编译器参数(例如`-std=c++11`)以及混合的`C ++/CUDA`编译(以及一般对`CUDA`文件的支持)。

当使用`BuildExtension`时,它将提供一个用于`extra_compile_args`(不是普通列表)的词典,通过语言(`cxx``cuda`)映射到参数列表提供给编译器。这样可以在混合编译期间为`C ++``CUDA`编译器提供不同的参数。

### torch.utils.cpp_extension.load(name, sources, extra_cflags=None, extra_cuda_cflags=None, extra_ldflags=None, extra_include_paths=None, build_directory=None, verbose=False)

即时加载(JIT)`PyTorch C ++`扩展。

为了加载扩展,会创建一个`Ninja`构建文件,该文件用于将指定的源编译为动态库。随后将该库作为模块加载到当前`Python`进程中,并从该函数返回,以备使用。

默认情况下,构建文件创建的目录以及编译结果库是`<tmp>/torch_extensions/<name>`,其中`<tmp>`是当前平台上的临时文件夹以及`<name>`为扩展名。这个位置可以通过两种方式被覆盖。首先,如果`TORCH_EXTENSIONS_DIR`设置了环境变量,它将替换`<tmp>/torch_extensions`并将所有扩展编译到此目录的子文件夹中。其次,如果`build_directory`函数设置了参数,它也将覆盖整个路径,即,库将直接编译到该文件夹中。

要编译源文件,使用默认的系统编译器(c++),可以通过设置`CXX`环境变量来覆盖它。将其他参数传递给编译过程,`extra_cflags`或者`extra_ldflags`可以提供。例如,要通过优化来编译您的扩展,你可以传递`extra_cflags=['-O3']`,也可以使用 `extra_cflags`传递进一步包含目录。

提供了混合编译的`CUDA`支持。只需将`CUDA`源文件(`.cu``.cuh`)与其他源一起传递即可。这些文件将被检测,并且使用`nvcc`而不是`C ++`编译器进行编译。包括将`CUDA lib64`目录作为库目录传递并进行`cudart`链接。您可以将其他参数传递给`nvcc extra_cuda_cflags`,就像使用`C ++``extra_cflags`一样。使用了各种原始方法来查找`CUDA`安装目录,通常情况下可以正常运行。如果不可以,最好设置`CUDA_HOME`环境变量。

*   参数:
    *   name - 要构建的扩展名。这个必须和`pybind11`模块的名字一样!
    *   sources - `C++`源文件的相对或绝对路径列表。
    *   extra_cflags - 编译器参数的可选列表,用于转发到构建。
    *   extra_cuda_cflags - 编译器标记的可选列表,在构建`CUDA`源时转发给`nvcc`
    *   extra_ldflags - 链接器参数的可选列表,用于转发到构建。
    *   extra_include_paths - 转发到构建的包含目录的可选列表。
    *   build_directory - 可选路径作为构建区域。
    *   verbose - 如果为`True`,打开加载步骤的详细记录。
*   返回:
    *   加载`PyTorch`扩展作为`Python`模块。



```py
>>> from torch.utils.cpp_extension import load
>>> module = load(
        name='extension',
        sources=['extension.cpp', 'extension_kernel.cu'],
        extra_cflags=['-O2'],
        verbose=True) 
```

### torch.utils.cpp_extension.include_paths(cuda=False)

获取构建`C++``CUDA`扩展所需的路径。

*   参数: `cuda` - 如果为 True,则包含`CUDA`特定的包含路径。
*   返回: 包含路径字符串的列表。

例如:

```py
from setuptools import setup
from torch.utils.cpp_extension import BuildExtension, CppExtension

torch.utils.cpp_extension.include_paths(cuda=False)
# ['/usr/local/lib/python3.6/site-packages/torch/lib/include', '/usr/local/lib/python3.6/site-packages/torch/lib/include/TH', '/usr/local/lib/python3.6/site-packages/torch/lib/include/THC'] 
```

### torch.utils.cpp_extension.check_compiler_abi_compatibility(compiler)

验证给定的编译器是否与`PyTorch` ABI 兼容。

*   参数:compiler(str) - 要检查可执行的编译器文件名(例如 g++),必须在`shell`进程中可执行。
*   返回:如果编译器(可能)与`PyTorch`ABI 不兼容,则为`False`,否则返回`True`

### torch.utils.cpp_extension.verify_ninja_availability()

如果可以在[ninja](https://ninja-build.org/)上运行则返回`True`

文档地址:[torch.utils.cpp_extension

]([https://ptorch.com/docs/8/torch-utils-cpp_extension](https://ptorch.com/docs/8/torch-utils-cpp_extension))

### 译者署名

| 用户名 | 头像 | 职能 | 签名 |
| --- | --- | --- | --- |
| [Song](https://ptorch.com) | ![](img/2018033000352689884.jpeg) | 翻译 | 人生总要追求点什么 |