torch.utils.cpp_extension.CppExtension(name, sources, *args, **kwargs)?
為 C ++創(chuàng)建一個(gè)setuptools.Extension
。
一種便捷方法,它使用最少的(但通常是足夠的)參數(shù)創(chuàng)建setuptools.Extension
來(lái)構(gòu)建 C ++擴(kuò)展。
所有參數(shù)都轉(zhuǎn)發(fā)到setuptools.Extension
構(gòu)造函數(shù)。
例
>>> 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 ++創(chuàng)建一個(gè)setuptools.Extension
。
一種便捷方法,它使用最少的(但通常是足夠的)參數(shù)創(chuàng)建setuptools.Extension
,以構(gòu)建 CUDA / C ++擴(kuò)展。 這包括 CUDA 包含路徑,庫(kù)路徑和運(yùn)行時(shí)庫(kù)。
All arguments are forwarded to the setuptools.Extension
constructor.
Example
>>> from setuptools import setup
>>> from torch.utils.cpp_extension import BuildExtension, CUDAExtension
>>> 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(*args, **kwargs)?
自定義setuptools
構(gòu)建擴(kuò)展。
這個(gè)setuptools.build_ext
子類(lèi)負(fù)責(zé)傳遞所需的最低編譯器標(biāo)志(例如-std=c++11
)以及混合的 C ++ / CUDA 編譯(并通常支持 CUDA 文件)。
使用 BuildExtension
時(shí),可以提供extra_compile_args
(而不是通常的列表)的字典,該字典從語(yǔ)言(cxx
或nvcc
)映射到其他編譯器標(biāo)志的列表 提供給編譯器。 這樣就可以在混合編譯期間向 C ++和 CUDA 編譯器提供不同的標(biāo)志。
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, with_cuda=None, is_python_module=True)?
即時(shí)加載 PyTorch C ++擴(kuò)展(JIT)。
要加載擴(kuò)展,將發(fā)出 Ninja 構(gòu)建文件,該文件用于將給定的源編譯到動(dòng)態(tài)庫(kù)中。 隨后將該庫(kù)作為模塊加載到當(dāng)前的 Python 進(jìn)程中,并從此函數(shù)返回,以供使用。
默認(rèn)情況下,生成文件的發(fā)布目錄和編譯到的結(jié)果庫(kù)為<tmp>/torch_extensions/<name>
,其中<tmp>
是當(dāng)前平臺(tái)上的臨時(shí)文件夾,<name>
是擴(kuò)展名。 可以通過(guò)兩種方式覆蓋此位置。 首先,如果設(shè)置了TORCH_EXTENSIONS_DIR
環(huán)境變量,它將替換<tmp>/torch_extensions
,所有擴(kuò)展名都將編譯到該目錄的子文件夾中。 第二,如果提供了此函數(shù)的build_directory
參數(shù),它將覆蓋整個(gè)路徑,即庫(kù)將直接編譯到該文件夾中。
要編譯源,使用默認(rèn)的系統(tǒng)編譯器(c++
),可以通過(guò)設(shè)置CXX
環(huán)境變量來(lái)覆蓋它。 要將其他參數(shù)傳遞給編譯過(guò)程,可以提供extra_cflags
或extra_ldflags
。 例如,要使用優(yōu)化來(lái)編譯擴(kuò)展,請(qǐng)傳遞extra_cflags=['-O3']
。 您也可以使用extra_cflags
傳遞更多的包含目錄。
提供帶有混合編譯的 CUDA 支持。 只需將 CUDA 源文件(.cu
或.cuh
)與其他源一起傳遞即可。 將使用 nvcc 而不是 C ++編譯器檢測(cè)并編譯此類(lèi)文件。 這包括將 CUDA lib64 目錄作為庫(kù)目錄傳遞,并鏈接cudart
。 您可以通過(guò)extra_cuda_cflags
將其他標(biāo)志傳遞給 nvcc,就像 C ++的extra_cflags
一樣。 使用各種啟發(fā)式方法來(lái)查找 CUDA 安裝目錄,通??梢哉9ぷ?。 否則,設(shè)置CUDA_HOME
環(huán)境變量是最安全的選擇。
參數(shù)
True
,則打開(kāi)加載步驟的詳細(xì)日志記錄。None
(默認(rèn)值),則根據(jù)sources
中是否存在.cu
或.cuh
自動(dòng)確定該值。 將其設(shè)置為 <cite>True`</cite> 以強(qiáng)制包含 CUDA 標(biāo)頭和庫(kù)。True
(默認(rèn)),則將生成的共享庫(kù)作為 Python 模塊導(dǎo)入。 如果為False
,則將其作為純動(dòng)態(tài)庫(kù)加載到進(jìn)程中。退貨
如果is_python_module
為True
,則將加載的 PyTorch 擴(kuò)展名作為 Python 模塊返回。 如果is_python_module
為False
,則什么都不返回(作為副作用,共享庫(kù)已加載到進(jìn)程中)。
Example
>>> 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.load_inline(name, cpp_sources, cuda_sources=None, functions=None, extra_cflags=None, extra_cuda_cflags=None, extra_ldflags=None, extra_include_paths=None, build_directory=None, verbose=False, with_cuda=None, is_python_module=True, with_pytorch_error_handling=True)?
從字符串源實(shí)時(shí)加載 PyTorch C ++擴(kuò)展(JIT)。
此函數(shù)的行為與 load()
完全相同,但是將其源作為字符串而不是文件名使用。 這些字符串存儲(chǔ)到構(gòu)建目錄中的文件中,之后 load_inline()
的行為與 load()
相同。
源可能會(huì)省略典型的非內(nèi)聯(lián) C ++擴(kuò)展的兩個(gè)必需部分:必需的頭文件以及(pybind11)綁定代碼。 更準(zhǔn)確地說(shuō),首先將傳遞給cpp_sources
的字符串連接到單個(gè).cpp
文件中。 該文件然后以#include <torch/extension.h>
開(kāi)頭。
此外,如果提供functions
參數(shù),則將為指定的每個(gè)函數(shù)自動(dòng)生成綁定。 functions
可以是函數(shù)名稱(chēng)列表,也可以是從函數(shù)名稱(chēng)到文檔字符串的字典映射。 如果給出了列表,則將每個(gè)函數(shù)的名稱(chēng)用作其文檔字符串。
cuda_sources
中的源被連接到單獨(dú)的.cu
文件中,并以torch/types.h
,cuda.h
和cuda_runtime.h
包括在內(nèi)。 .cpp
和.cu
文件是分別編譯的,但最終鏈接到一個(gè)庫(kù)中。 注意,cuda_sources
本身不為函數(shù)生成任何綁定。 要綁定到 CUDA 內(nèi)核,您必須創(chuàng)建一個(gè)調(diào)用它的 C ++函數(shù),并在cpp_sources
之一中聲明或定義此 C ++函數(shù)(并在functions
中包括其名稱(chēng))。
有關(guān)以下省略的自變量的說(shuō)明,請(qǐng)參見(jiàn) load()
。
Parameters
None
(默認(rèn)),則根據(jù)是否提供cuda_sources
自動(dòng)確定該值。 將其設(shè)置為True
以強(qiáng)制包含 CUDA 標(biāo)頭和庫(kù)。foo
都通過(guò)中間_safe_foo
功能調(diào)用。 這種重定向在 cpp 晦澀的情況下可能會(huì)引起問(wèn)題。 當(dāng)此重定向?qū)е聠?wèn)題時(shí),應(yīng)將此標(biāo)志設(shè)置為False
。Example
>>> from torch.utils.cpp_extension import load_inline
>>> source = '''
at::Tensor sin_add(at::Tensor x, at::Tensor y) {
return x.sin() + y.sin();
}
'''
>>> module = load_inline(name='inline_extension',
cpp_sources=[source],
functions=['sin_add'])
torch.utils.cpp_extension.include_paths(cuda=False)?
獲取構(gòu)建 C ++或 CUDA 擴(kuò)展所需的包含路徑。
Parameters
cuda -如果<cite>為真</cite>,則包含特定于 CUDA 的包含路徑。
Returns
包含路徑字符串的列表。
torch.utils.cpp_extension.check_compiler_abi_compatibility(compiler)?
驗(yàn)證給定的編譯器是否與 PyTorch 兼容。
Parameters
編譯器 (str )–要檢查的編譯器可執(zhí)行文件名稱(chēng)(例如g++
)。 必須在 Shell 進(jìn)程中可執(zhí)行。
Returns
如果編譯器(可能)與 PyTorch 不兼容,則為 False,否則為 True。
torch.utils.cpp_extension.verify_ninja_availability()?
如果系統(tǒng)上有 ninja 構(gòu)建系統(tǒng),則返回True
。
更多建議: