def get_extensions(): this_dir = os.path.dirname(os.path.abspath(__file__)) extensions_dir = os.path.join(this_dir, 'torchvision', 'csrc') main_file = glob.glob(os.path.join(extensions_dir, '*.cpp')) source_cpu = glob.glob(os.path.join(extensions_dir, 'cpu', '*.cpp')) is_rocm_pytorch = False if torch.__version__ >= '1.5': from torch.utils.cpp_extension import ROCM_HOME is_rocm_pytorch = True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False if is_rocm_pytorch: hipify_python.hipify( project_directory=this_dir, output_directory=this_dir, includes="torchvision/csrc/cuda/*", show_detailed=True, is_pytorch_extension=True, ) source_cuda = glob.glob(os.path.join(extensions_dir, 'hip', '*.hip')) # Copy over additional files shutil.copy("torchvision/csrc/cuda/cuda_helpers.h", "torchvision/csrc/hip/cuda_helpers.h") shutil.copy("torchvision/csrc/cuda/vision_cuda.h", "torchvision/csrc/hip/vision_cuda.h") else: source_cuda = glob.glob(os.path.join(extensions_dir, 'cuda', '*.cu')) sources = main_file + source_cpu extension = CppExtension compile_cpp_tests = os.getenv('WITH_CPP_MODELS_TEST', '0') == '1' if compile_cpp_tests: test_dir = os.path.join(this_dir, 'test') models_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'models') test_file = glob.glob(os.path.join(test_dir, '*.cpp')) source_models = glob.glob(os.path.join(models_dir, '*.cpp')) test_file = [os.path.join(test_dir, s) for s in test_file] source_models = [os.path.join(models_dir, s) for s in source_models] tests = test_file + source_models tests_include_dirs = [test_dir, models_dir] define_macros = [] extra_compile_args = {} if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) or os.getenv('FORCE_CUDA', '0') == '1': extension = CUDAExtension sources += source_cuda
def hipify_extension(self): if self.is_rocm_pytorch(): from torch.utils.hipify import hipify_python hipify_python.hipify( project_directory=os.getcwd(), output_directory=os.getcwd(), header_include_dirs=self.include_paths(), includes=[os.path.join(os.getcwd(), '*')], extra_files=[os.path.abspath(s) for s in self.sources()], show_detailed=True, is_pytorch_extension=True, hipify_extra_files_only=True, )
def get_extensions(): this_dir = path.dirname(path.abspath(__file__)) extensions_dir = path.join(this_dir, "detectron2", "layers", "csrc") main_source = path.join(extensions_dir, "vision.cpp") sources = glob.glob(path.join(extensions_dir, "**", "*.cpp")) is_rocm_pytorch = False if torch_ver >= [1, 5]: from torch.utils.cpp_extension import ROCM_HOME is_rocm_pytorch = (True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False) if is_rocm_pytorch: hipify_python.hipify( project_directory=this_dir, output_directory=this_dir, includes="/detectron2/layers/csrc/*", show_detailed=True, is_pytorch_extension=True, ) # Current version of hipify function in pytorch creates an intermediate directory # named "hip" at the same level of the path hierarchy if a "cuda" directory exists, # or modifying the hierarchy, if it doesn't. Once pytorch supports # "same directory" hipification (PR pendeing), the source_cuda will be set # similarly in both cuda and hip paths, and the explicit header file copy # (below) will not be needed. source_cuda = glob.glob(path.join( extensions_dir, "**", "hip", "*.hip")) + glob.glob( path.join(extensions_dir, "hip", "*.hip")) shutil.copy( "detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_utils.h", "detectron2/layers/csrc/box_iou_rotated/hip/box_iou_rotated_utils.h", ) shutil.copy( "detectron2/layers/csrc/deformable/deform_conv.h", "detectron2/layers/csrc/deformable/hip/deform_conv.h", ) else: source_cuda = glob.glob(path.join( extensions_dir, "**", "*.cu")) + glob.glob( path.join(extensions_dir, "*.cu")) sources = [main_source] + sources extension = CppExtension extra_compile_args = {"cxx": []} define_macros = [] if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) or os.getenv( "FORCE_CUDA", "0") == "1": extension = CUDAExtension sources += source_cuda if not is_rocm_pytorch: define_macros += [("WITH_CUDA", None)] extra_compile_args["nvcc"] = [ "-DCUDA_HAS_FP16=1", "-D__CUDA_NO_HALF_OPERATORS__", "-D__CUDA_NO_HALF_CONVERSIONS__", "-D__CUDA_NO_HALF2_OPERATORS__", ] else: define_macros += [("WITH_HIP", None)] extra_compile_args["nvcc"] = [] # It's better if pytorch can do this by default .. CC = os.environ.get("CC", None) if CC is not None: extra_compile_args["nvcc"].append("-ccbin={}".format(CC)) include_dirs = [extensions_dir] ext_modules = [ extension( "detectron2._C", sources, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, ) ] return ext_modules
def get_extensions(): this_dir = os.path.dirname(os.path.abspath(__file__)) extensions_dir = os.path.join(this_dir, "torchvision", "csrc") main_file = glob.glob(os.path.join(extensions_dir, "*.cpp")) + glob.glob( os.path.join(extensions_dir, "ops", "*.cpp")) source_cpu = ( glob.glob(os.path.join(extensions_dir, "ops", "autograd", "*.cpp")) + glob.glob(os.path.join(extensions_dir, "ops", "cpu", "*.cpp")) + glob.glob( os.path.join(extensions_dir, "ops", "quantized", "cpu", "*.cpp"))) is_rocm_pytorch = False if torch.__version__ >= "1.5": from torch.utils.cpp_extension import ROCM_HOME is_rocm_pytorch = (torch.version.hip is not None) and (ROCM_HOME is not None) if is_rocm_pytorch: from torch.utils.hipify import hipify_python hipify_python.hipify( project_directory=this_dir, output_directory=this_dir, includes="torchvision/csrc/ops/cuda/*", show_detailed=True, is_pytorch_extension=True, ) source_cuda = glob.glob( os.path.join(extensions_dir, "ops", "hip", "*.hip")) # Copy over additional files for file in glob.glob(r"torchvision/csrc/ops/cuda/*.h"): shutil.copy(file, "torchvision/csrc/ops/hip") else: source_cuda = glob.glob( os.path.join(extensions_dir, "ops", "cuda", "*.cu")) source_cuda += glob.glob( os.path.join(extensions_dir, "ops", "autocast", "*.cpp")) sources = main_file + source_cpu extension = CppExtension compile_cpp_tests = os.getenv("WITH_CPP_MODELS_TEST", "0") == "1" if compile_cpp_tests: test_dir = os.path.join(this_dir, "test") models_dir = os.path.join(this_dir, "torchvision", "csrc", "models") test_file = glob.glob(os.path.join(test_dir, "*.cpp")) source_models = glob.glob(os.path.join(models_dir, "*.cpp")) test_file = [os.path.join(test_dir, s) for s in test_file] source_models = [os.path.join(models_dir, s) for s in source_models] tests = test_file + source_models tests_include_dirs = [test_dir, models_dir] define_macros = [] extra_compile_args = {"cxx": []} if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) or os.getenv( "FORCE_CUDA", "0") == "1": extension = CUDAExtension sources += source_cuda if not is_rocm_pytorch: define_macros += [("WITH_CUDA", None)] nvcc_flags = os.getenv("NVCC_FLAGS", "") if nvcc_flags == "": nvcc_flags = [] else: nvcc_flags = nvcc_flags.split(" ") else: define_macros += [("WITH_HIP", None)] nvcc_flags = [] extra_compile_args["nvcc"] = nvcc_flags if sys.platform == "win32": define_macros += [("torchvision_EXPORTS", None)] define_macros += [("USE_PYTHON", None)] extra_compile_args["cxx"].append("/MP") debug_mode = os.getenv("DEBUG", "0") == "1" if debug_mode: print("Compile in debug mode") extra_compile_args["cxx"].append("-g") extra_compile_args["cxx"].append("-O0") if "nvcc" in extra_compile_args: # we have to remove "-OX" and "-g" flag if exists and append nvcc_flags = extra_compile_args["nvcc"] extra_compile_args["nvcc"] = [ f for f in nvcc_flags if not ("-O" in f or "-g" in f) ] extra_compile_args["nvcc"].append("-O0") extra_compile_args["nvcc"].append("-g") sources = [os.path.join(extensions_dir, s) for s in sources] include_dirs = [extensions_dir] ext_modules = [ extension( "torchvision._C", sorted(sources), include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, ) ] if compile_cpp_tests: ext_modules.append( extension( "torchvision._C_tests", tests, include_dirs=tests_include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, )) # ------------------- Torchvision extra extensions ------------------------ vision_include = os.environ.get("TORCHVISION_INCLUDE", None) vision_library = os.environ.get("TORCHVISION_LIBRARY", None) vision_include = vision_include.split( os.pathsep) if vision_include is not None else [] vision_library = vision_library.split( os.pathsep) if vision_library is not None else [] include_dirs += vision_include library_dirs = vision_library # Image reading extension image_macros = [] image_include = [extensions_dir] image_library = [] image_link_flags = [] if sys.platform == "win32": image_macros += [("USE_PYTHON", None)] # Locating libPNG libpng = distutils.spawn.find_executable("libpng-config") pngfix = distutils.spawn.find_executable("pngfix") png_found = libpng is not None or pngfix is not None print(f"PNG found: {png_found}") if png_found: if libpng is not None: # Linux / Mac png_version = subprocess.run([libpng, "--version"], stdout=subprocess.PIPE) png_version = png_version.stdout.strip().decode("utf-8") print(f"libpng version: {png_version}") png_version = parse_version(png_version) if png_version >= parse_version("1.6.0"): print("Building torchvision with PNG image support") png_lib = subprocess.run([libpng, "--libdir"], stdout=subprocess.PIPE) png_lib = png_lib.stdout.strip().decode("utf-8") if "disabled" not in png_lib: image_library += [png_lib] png_include = subprocess.run([libpng, "--I_opts"], stdout=subprocess.PIPE) png_include = png_include.stdout.strip().decode("utf-8") _, png_include = png_include.split("-I") print(f"libpng include path: {png_include}") image_include += [png_include] image_link_flags.append("png") else: print( "libpng installed version is less than 1.6.0, disabling PNG support" ) png_found = False else: # Windows png_lib = os.path.join(os.path.dirname(os.path.dirname(pngfix)), "lib") png_include = os.path.join( os.path.dirname(os.path.dirname(pngfix)), "include", "libpng16") image_library += [png_lib] image_include += [png_include] image_link_flags.append("libpng") # Locating libjpeg (jpeg_found, jpeg_conda, jpeg_include, jpeg_lib) = find_library("jpeglib", vision_include) print(f"JPEG found: {jpeg_found}") image_macros += [("PNG_FOUND", str(int(png_found)))] image_macros += [("JPEG_FOUND", str(int(jpeg_found)))] if jpeg_found: print("Building torchvision with JPEG image support") image_link_flags.append("jpeg") if jpeg_conda: image_library += [jpeg_lib] image_include += [jpeg_include] # Locating nvjpeg # Should be included in CUDA_HOME for CUDA >= 10.1, which is the minimum version we have in the CI nvjpeg_found = (extension is CUDAExtension and CUDA_HOME is not None and os.path.exists( os.path.join(CUDA_HOME, "include", "nvjpeg.h"))) print(f"NVJPEG found: {nvjpeg_found}") image_macros += [("NVJPEG_FOUND", str(int(nvjpeg_found)))] if nvjpeg_found: print("Building torchvision with NVJPEG image support") image_link_flags.append("nvjpeg") image_path = os.path.join(extensions_dir, "io", "image") image_src = (glob.glob(os.path.join(image_path, "*.cpp")) + glob.glob(os.path.join(image_path, "cpu", "*.cpp")) + glob.glob(os.path.join(image_path, "cuda", "*.cpp"))) if png_found or jpeg_found: ext_modules.append( extension( "torchvision.image", image_src, include_dirs=image_include + include_dirs + [image_path], library_dirs=image_library + library_dirs, define_macros=image_macros, libraries=image_link_flags, extra_compile_args=extra_compile_args, )) ffmpeg_exe = distutils.spawn.find_executable("ffmpeg") has_ffmpeg = ffmpeg_exe is not None # FIXME: Building torchvision with ffmpeg on MacOS or with Python 3.9 # FIXME: causes crash. See the following GitHub issues for more details. # FIXME: https://github.com/pytorch/pytorch/issues/65000 # FIXME: https://github.com/pytorch/vision/issues/3367 if sys.platform != "linux" or (sys.version_info.major == 3 and sys.version_info.minor == 9): has_ffmpeg = False if has_ffmpeg: try: # This is to check if ffmpeg is installed properly. subprocess.check_output(["ffmpeg", "-version"]) except subprocess.CalledProcessError: print("Error fetching ffmpeg version, ignoring ffmpeg.") has_ffmpeg = False print(f"FFmpeg found: {has_ffmpeg}") if has_ffmpeg: ffmpeg_libraries = { "libavcodec", "libavformat", "libavutil", "libswresample", "libswscale" } ffmpeg_bin = os.path.dirname(ffmpeg_exe) ffmpeg_root = os.path.dirname(ffmpeg_bin) ffmpeg_include_dir = os.path.join(ffmpeg_root, "include") ffmpeg_library_dir = os.path.join(ffmpeg_root, "lib") gcc = distutils.spawn.find_executable("gcc") platform_tag = subprocess.run([gcc, "-print-multiarch"], stdout=subprocess.PIPE) platform_tag = platform_tag.stdout.strip().decode("utf-8") if platform_tag: # Most probably a Debian-based distribution ffmpeg_include_dir = [ ffmpeg_include_dir, os.path.join(ffmpeg_include_dir, platform_tag) ] ffmpeg_library_dir = [ ffmpeg_library_dir, os.path.join(ffmpeg_library_dir, platform_tag) ] else: ffmpeg_include_dir = [ffmpeg_include_dir] ffmpeg_library_dir = [ffmpeg_library_dir] has_ffmpeg = True for library in ffmpeg_libraries: library_found = False for search_path in ffmpeg_include_dir + include_dirs: full_path = os.path.join(search_path, library, "*.h") library_found |= len(glob.glob(full_path)) > 0 if not library_found: print( f"{library} header files were not found, disabling ffmpeg support" ) has_ffmpeg = False if has_ffmpeg: print(f"ffmpeg include path: {ffmpeg_include_dir}") print(f"ffmpeg library_dir: {ffmpeg_library_dir}") # TorchVision base decoder + video reader video_reader_src_dir = os.path.join(this_dir, "torchvision", "csrc", "io", "video_reader") video_reader_src = glob.glob( os.path.join(video_reader_src_dir, "*.cpp")) base_decoder_src_dir = os.path.join(this_dir, "torchvision", "csrc", "io", "decoder") base_decoder_src = glob.glob( os.path.join(base_decoder_src_dir, "*.cpp")) # Torchvision video API videoapi_src_dir = os.path.join(this_dir, "torchvision", "csrc", "io", "video") videoapi_src = glob.glob(os.path.join(videoapi_src_dir, "*.cpp")) # exclude tests base_decoder_src = [ x for x in base_decoder_src if "_test.cpp" not in x ] combined_src = video_reader_src + base_decoder_src + videoapi_src ext_modules.append( CppExtension( "torchvision.video_reader", combined_src, include_dirs=[ base_decoder_src_dir, video_reader_src_dir, videoapi_src_dir, extensions_dir, *ffmpeg_include_dir, *include_dirs, ], library_dirs=ffmpeg_library_dir + library_dirs, libraries=[ "avcodec", "avformat", "avutil", "swresample", "swscale", ], extra_compile_args=["-std=c++14"] if os.name != "nt" else ["/std:c++14", "/MP"], extra_link_args=[ "-std=c++14" if os.name != "nt" else "/std:c++14" ], )) # Locating video codec # CUDA_HOME should be set to the cuda root directory. # TORCHVISION_INCLUDE and TORCHVISION_LIBRARY should include the location to # video codec header files and libraries respectively. video_codec_found = (extension is CUDAExtension and CUDA_HOME is not None and any([ os.path.exists(os.path.join(folder, "cuviddec.h")) for folder in vision_include ]) and any([ os.path.exists(os.path.join(folder, "nvcuvid.h")) for folder in vision_include ]) and any([ os.path.exists( os.path.join(folder, "libnvcuvid.so")) for folder in library_dirs ])) print(f"video codec found: {video_codec_found}") if (video_codec_found and has_ffmpeg and any([ os.path.exists(os.path.join(folder, "libavcodec", "bsf.h")) for folder in ffmpeg_include_dir ])): gpu_decoder_path = os.path.join(extensions_dir, "io", "decoder", "gpu") gpu_decoder_src = glob.glob(os.path.join(gpu_decoder_path, "*.cpp")) cuda_libs = os.path.join(CUDA_HOME, "lib64") cuda_inc = os.path.join(CUDA_HOME, "include") ext_modules.append( extension( "torchvision.Decoder", gpu_decoder_src, include_dirs=include_dirs + [gpu_decoder_path] + [cuda_inc] + ffmpeg_include_dir, library_dirs=ffmpeg_library_dir + library_dirs + [cuda_libs], libraries=[ "avcodec", "avformat", "avutil", "swresample", "swscale", "nvcuvid", "cuda", "cudart", "z", "pthread", "dl", "nppicc", ], extra_compile_args=extra_compile_args, )) else: print( "The installed version of ffmpeg is missing the header file 'bsf.h' which is " "required for GPU video decoding. Please install the latest ffmpeg from conda-forge channel:" " `conda install -c conda-forge ffmpeg`.") return ext_modules
def get_extensions(): this_dir = os.path.dirname(os.path.abspath(__file__)) extensions_dir = os.path.join(this_dir, 'torchvision', 'csrc') main_file = glob.glob(os.path.join(extensions_dir, '*.cpp')) source_cpu = glob.glob(os.path.join(extensions_dir, 'cpu', '*.cpp')) is_rocm_pytorch = False if torch.__version__ >= '1.5': from torch.utils.cpp_extension import ROCM_HOME is_rocm_pytorch = True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False if is_rocm_pytorch: hipify_python.hipify( project_directory=this_dir, output_directory=this_dir, includes="torchvision/csrc/cuda/*", show_detailed=True, is_pytorch_extension=True, ) source_cuda = glob.glob(os.path.join(extensions_dir, 'hip', '*.hip')) # Copy over additional files for file in glob.glob(r"torchvision/csrc/cuda/*.h"): shutil.copy(file, "torchvision/csrc/hip") else: source_cuda = glob.glob(os.path.join(extensions_dir, 'cuda', '*.cu')) sources = main_file + source_cpu extension = CppExtension compile_cpp_tests = os.getenv('WITH_CPP_MODELS_TEST', '0') == '1' if compile_cpp_tests: test_dir = os.path.join(this_dir, 'test') models_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'models') test_file = glob.glob(os.path.join(test_dir, '*.cpp')) source_models = glob.glob(os.path.join(models_dir, '*.cpp')) test_file = [os.path.join(test_dir, s) for s in test_file] source_models = [os.path.join(models_dir, s) for s in source_models] tests = test_file + source_models tests_include_dirs = [test_dir, models_dir] define_macros = [] extra_compile_args = {'cxx': []} if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) \ or os.getenv('FORCE_CUDA', '0') == '1': extension = CUDAExtension sources += source_cuda if not is_rocm_pytorch: define_macros += [('WITH_CUDA', None)] nvcc_flags = os.getenv('NVCC_FLAGS', '') if nvcc_flags == '': nvcc_flags = [] else: nvcc_flags = nvcc_flags.split(' ') else: define_macros += [('WITH_HIP', None)] nvcc_flags = [] extra_compile_args['nvcc'] = nvcc_flags if sys.platform == 'win32': define_macros += [('torchvision_EXPORTS', None)] extra_compile_args['cxx'].append('/MP') elif sys.platform == 'linux': extra_compile_args['cxx'].append('-fopenmp') debug_mode = os.getenv('DEBUG', '0') == '1' if debug_mode: print("Compile in debug mode") extra_compile_args['cxx'].append("-g") extra_compile_args['cxx'].append("-O0") if "nvcc" in extra_compile_args: # we have to remove "-OX" and "-g" flag if exists and append nvcc_flags = extra_compile_args["nvcc"] extra_compile_args["nvcc"] = [ f for f in nvcc_flags if not ("-O" in f or "-g" in f) ] extra_compile_args["nvcc"].append("-O0") extra_compile_args["nvcc"].append("-g") sources = [os.path.join(extensions_dir, s) for s in sources] include_dirs = [extensions_dir] ext_modules = [ extension( 'torchvision._C', sources, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, ) ] if compile_cpp_tests: ext_modules.append( extension( 'torchvision._C_tests', tests, include_dirs=tests_include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, )) # ------------------- Torchvision extra extensions ------------------------ vision_include = os.environ.get('TORCHVISION_INCLUDE', None) vision_library = os.environ.get('TORCHVISION_LIBRARY', None) vision_include = (vision_include.split(os.pathsep) if vision_include is not None else []) vision_library = (vision_library.split(os.pathsep) if vision_library is not None else []) include_dirs += vision_include library_dirs = vision_library # Image reading extension image_macros = [] image_include = [extensions_dir] image_library = [] image_link_flags = [] # Locating libPNG libpng = distutils.spawn.find_executable('libpng-config') pngfix = distutils.spawn.find_executable('pngfix') png_found = libpng is not None or pngfix is not None print('PNG found: {0}'.format(png_found)) if png_found: if libpng is not None: # Linux / Mac png_version = subprocess.run([libpng, '--version'], stdout=subprocess.PIPE) png_version = png_version.stdout.strip().decode('utf-8') print('libpng version: {0}'.format(png_version)) png_version = parse_version(png_version) if png_version >= parse_version("1.6.0"): print('Building torchvision with PNG image support') png_lib = subprocess.run([libpng, '--libdir'], stdout=subprocess.PIPE) png_lib = png_lib.stdout.strip().decode('utf-8') if 'disabled' not in png_lib: image_library += [png_lib] png_include = subprocess.run([libpng, '--I_opts'], stdout=subprocess.PIPE) png_include = png_include.stdout.strip().decode('utf-8') _, png_include = png_include.split('-I') print('libpng include path: {0}'.format(png_include)) image_include += [png_include] image_link_flags.append('png') else: print('libpng installed version is less than 1.6.0, ' 'disabling PNG support') png_found = False else: # Windows png_lib = os.path.join(os.path.dirname(os.path.dirname(pngfix)), 'lib') png_include = os.path.join( os.path.dirname(os.path.dirname(pngfix)), 'include', 'libpng16') image_library += [png_lib] image_include += [png_include] image_link_flags.append('libpng') # Locating libjpeg (jpeg_found, jpeg_conda, jpeg_include, jpeg_lib) = find_library('jpeglib', vision_include) print('JPEG found: {0}'.format(jpeg_found)) image_macros += [('PNG_FOUND', str(int(png_found)))] image_macros += [('JPEG_FOUND', str(int(jpeg_found)))] if jpeg_found: print('Building torchvision with JPEG image support') image_link_flags.append('jpeg') if jpeg_conda: image_library += [jpeg_lib] image_include += [jpeg_include] image_path = os.path.join(extensions_dir, 'cpu', 'image') image_src = glob.glob(os.path.join(image_path, '*.cpp')) if png_found or jpeg_found: ext_modules.append( extension('torchvision.image', image_src, include_dirs=image_include + include_dirs + [image_path], library_dirs=image_library + library_dirs, define_macros=image_macros, libraries=image_link_flags, extra_compile_args=extra_compile_args)) ffmpeg_exe = distutils.spawn.find_executable('ffmpeg') has_ffmpeg = ffmpeg_exe is not None print("FFmpeg found: {}".format(has_ffmpeg)) if has_ffmpeg: ffmpeg_libraries = { 'libavcodec', 'libavformat', 'libavutil', 'libswresample', 'libswscale' } ffmpeg_bin = os.path.dirname(ffmpeg_exe) ffmpeg_root = os.path.dirname(ffmpeg_bin) ffmpeg_include_dir = os.path.join(ffmpeg_root, 'include') ffmpeg_library_dir = os.path.join(ffmpeg_root, 'lib') gcc = distutils.spawn.find_executable('gcc') platform_tag = subprocess.run([gcc, '-print-multiarch'], stdout=subprocess.PIPE) platform_tag = platform_tag.stdout.strip().decode('utf-8') if platform_tag: # Most probably a Debian-based distribution ffmpeg_include_dir = [ ffmpeg_include_dir, os.path.join(ffmpeg_include_dir, platform_tag) ] ffmpeg_library_dir = [ ffmpeg_library_dir, os.path.join(ffmpeg_library_dir, platform_tag) ] else: ffmpeg_include_dir = [ffmpeg_include_dir] ffmpeg_library_dir = [ffmpeg_library_dir] has_ffmpeg = True for library in ffmpeg_libraries: library_found = False for search_path in ffmpeg_include_dir + include_dirs: full_path = os.path.join(search_path, library, '*.h') library_found |= len(glob.glob(full_path)) > 0 if not library_found: print('{0} header files were not found, disabling ffmpeg ' 'support') has_ffmpeg = False if has_ffmpeg: print("ffmpeg include path: {}".format(ffmpeg_include_dir)) print("ffmpeg library_dir: {}".format(ffmpeg_library_dir)) # TorchVision base decoder + video reader video_reader_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'cpu', 'video_reader') video_reader_src = glob.glob( os.path.join(video_reader_src_dir, "*.cpp")) base_decoder_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'cpu', 'decoder') base_decoder_src = glob.glob( os.path.join(base_decoder_src_dir, "*.cpp")) # Torchvision video API videoapi_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'cpu', 'video') videoapi_src = glob.glob(os.path.join(videoapi_src_dir, "*.cpp")) # exclude tests base_decoder_src = [ x for x in base_decoder_src if '_test.cpp' not in x ] combined_src = video_reader_src + base_decoder_src + videoapi_src ext_modules.append( CppExtension( 'torchvision.video_reader', combined_src, include_dirs=[ base_decoder_src_dir, video_reader_src_dir, videoapi_src_dir, extensions_dir, *ffmpeg_include_dir, *include_dirs ], library_dirs=ffmpeg_library_dir + library_dirs, libraries=[ 'avcodec', 'avformat', 'avutil', 'swresample', 'swscale', ], extra_compile_args=["-std=c++14"] if os.name != 'nt' else ['/std:c++14', '/MP'], extra_link_args=[ "-std=c++14" if os.name != 'nt' else '/std:c++14' ], )) return ext_modules
def get_extensions(): this_dir = path.dirname(path.abspath(__file__)) extensions_dir = path.join(this_dir, "detectron2", "layers", "csrc") main_source = path.join(extensions_dir, "vision.cpp") sources = glob.glob(path.join(extensions_dir, "**", "*.cpp")) from torch.utils.cpp_extension import ROCM_HOME is_rocm_pytorch = (True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False) hipify_ver = ([int(x) for x in torch.utils.hipify.__version__.split(".")] if hasattr(torch.utils.hipify, "__version__") else [0, 0, 0]) if is_rocm_pytorch and hipify_ver < [1, 0, 0]: # Earlier versions of hipification and extension modules were not # transparent, i.e. would require an explicit call to hipify, and the # hipification would introduce "hip" subdirectories, possibly changing # the relationship between source and header files. # This path is maintained for backwards compatibility. hipify_python.hipify( project_directory=this_dir, output_directory=this_dir, includes="/detectron2/layers/csrc/*", show_detailed=True, is_pytorch_extension=True, ) source_cuda = glob.glob(path.join( extensions_dir, "**", "hip", "*.hip")) + glob.glob( path.join(extensions_dir, "hip", "*.hip")) shutil.copy( "detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_utils.h", "detectron2/layers/csrc/box_iou_rotated/hip/box_iou_rotated_utils.h", ) shutil.copy( "detectron2/layers/csrc/deformable/deform_conv.h", "detectron2/layers/csrc/deformable/hip/deform_conv.h", ) sources = [main_source] + sources sources = [ s for s in sources if not is_rocm_pytorch or torch_ver < [1, 7] or not s.endswith("hip/vision.cpp") ] else: # common code between cuda and rocm platforms, # for hipify version [1,0,0] and later. source_cuda = glob.glob(path.join( extensions_dir, "**", "*.cu")) + glob.glob( path.join(extensions_dir, "*.cu")) sources = [main_source] + sources extension = CppExtension extra_compile_args = {"cxx": []} define_macros = [] if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) or os.getenv( "FORCE_CUDA", "0") == "1": extension = CUDAExtension sources += source_cuda if not is_rocm_pytorch: define_macros += [("WITH_CUDA", None)] extra_compile_args["nvcc"] = [ "-O3", "-DCUDA_HAS_FP16=1", "-D__CUDA_NO_HALF_OPERATORS__", "-D__CUDA_NO_HALF_CONVERSIONS__", "-D__CUDA_NO_HALF2_OPERATORS__", ] else: define_macros += [("WITH_HIP", None)] extra_compile_args["nvcc"] = [] if torch_ver < [1, 7]: # supported by https://github.com/pytorch/pytorch/pull/43931 CC = os.environ.get("CC", None) if CC is not None: extra_compile_args["nvcc"].append("-ccbin={}".format(CC)) include_dirs = [extensions_dir] ext_modules = [ extension( "detectron2._C", sources, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, ) ] return ext_modules
def get_extensions(): extensions = [] if os.getenv('MMCV_WITH_TRT', '0') != '0': ext_name = 'mmcv._ext_trt' from torch.utils.cpp_extension import include_paths, library_paths library_dirs = [] libraries = [] include_dirs = [] tensorrt_path = os.getenv('TENSORRT_DIR', '0') tensorrt_lib_path = glob.glob( os.path.join(tensorrt_path, 'targets', '*', 'lib'))[0] library_dirs += [tensorrt_lib_path] libraries += ['nvinfer', 'nvparsers', 'nvinfer_plugin'] libraries += ['cudart'] define_macros = [] extra_compile_args = {'cxx': []} include_path = os.path.abspath('./mmcv/ops/csrc/common/cuda') include_trt_path = os.path.abspath('./mmcv/ops/csrc/tensorrt') include_dirs.append(include_path) include_dirs.append(include_trt_path) include_dirs.append(os.path.join(tensorrt_path, 'include')) include_dirs += include_paths(cuda=True) op_files = glob.glob('./mmcv/ops/csrc/tensorrt/plugins/*') define_macros += [('MMCV_WITH_CUDA', None)] define_macros += [('MMCV_WITH_TRT', None)] cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args['nvcc'] = [cuda_args] if cuda_args else [] library_dirs += library_paths(cuda=True) from setuptools import Extension ext_ops = Extension( name=ext_name, sources=op_files, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, language='c++', library_dirs=library_dirs, libraries=libraries) extensions.append(ext_ops) if os.getenv('MMCV_WITH_OPS', '0') == '0': return extensions if EXT_TYPE == 'parrots': ext_name = 'mmcv._ext' from parrots.utils.build_extension import Extension # new parrots op impl do not use MMCV_USE_PARROTS # define_macros = [('MMCV_USE_PARROTS', None)] define_macros = [] include_dirs = [] op_files = glob.glob('./mmcv/ops/csrc/pytorch/cuda/*.cu') +\ glob.glob('./mmcv/ops/csrc/parrots/*.cpp') include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common')) include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common/cuda')) cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args = { 'nvcc': [cuda_args] if cuda_args else [], 'cxx': [], } if torch.cuda.is_available() or os.getenv('FORCE_CUDA', '0') == '1': define_macros += [('MMCV_WITH_CUDA', None)] extra_compile_args['nvcc'] += [ '-D__CUDA_NO_HALF_OPERATORS__', '-D__CUDA_NO_HALF_CONVERSIONS__', '-D__CUDA_NO_HALF2_OPERATORS__', ] ext_ops = Extension( name=ext_name, sources=op_files, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, cuda=True, pytorch=True) extensions.append(ext_ops) elif EXT_TYPE == 'pytorch': ext_name = 'mmcv._ext' from torch.utils.cpp_extension import CppExtension, CUDAExtension # prevent ninja from using too many resources os.environ.setdefault('MAX_JOBS', '4') define_macros = [] extra_compile_args = {'cxx': []} include_dirs = [] is_rocm_pytorch = False try: from torch.utils.cpp_extension import ROCM_HOME is_rocm_pytorch = True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False except ImportError: pass project_dir = 'mmcv/ops/csrc/' if is_rocm_pytorch: from torch.utils.hipify import hipify_python hipify_python.hipify( project_directory=project_dir, output_directory=project_dir, includes='mmcv/ops/csrc/*', show_detailed=True, is_pytorch_extension=True, ) define_macros += [('MMCV_WITH_CUDA', None)] define_macros += [('HIP_DIFF', None)] cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args['nvcc'] = [cuda_args] if cuda_args else [] op_files = glob.glob('./mmcv/ops/csrc/pytorch/hip/*') extension = CUDAExtension include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common/hip')) elif torch.cuda.is_available() or os.getenv('FORCE_CUDA', '0') == '1': define_macros += [('MMCV_WITH_CUDA', None)] cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args['nvcc'] = [cuda_args] if cuda_args else [] op_files = glob.glob('./mmcv/ops/csrc/pytorch/*.cpp') + \ glob.glob('./mmcv/ops/csrc/pytorch/cuda/*.cu') extension = CUDAExtension include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common')) include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common/cuda')) else: print(f'Compiling {ext_name} without CUDA') op_files = glob.glob('./mmcv/ops/csrc/pytorch/*.cpp') extension = CppExtension include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common')) ext_ops = extension( name=ext_name, sources=op_files, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args) extensions.append(ext_ops) if EXT_TYPE == 'pytorch' and os.getenv('MMCV_WITH_ORT', '0') != '0': ext_name = 'mmcv._ext_ort' from torch.utils.cpp_extension import library_paths, include_paths import onnxruntime library_dirs = [] libraries = [] include_dirs = [] ort_path = os.getenv('ONNXRUNTIME_DIR', '0') library_dirs += [os.path.join(ort_path, 'lib')] libraries.append('onnxruntime') define_macros = [] extra_compile_args = {'cxx': []} include_path = os.path.abspath('./mmcv/ops/csrc/onnxruntime') include_dirs.append(include_path) include_dirs.append(os.path.join(ort_path, 'include')) op_files = glob.glob('./mmcv/ops/csrc/onnxruntime/cpu/*') if onnxruntime.get_device() == 'GPU' or os.getenv('FORCE_CUDA', '0') == '1': define_macros += [('MMCV_WITH_CUDA', None)] cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args['nvcc'] = [cuda_args] if cuda_args else [] op_files += glob.glob('./mmcv/ops/csrc/onnxruntime/gpu/*') include_dirs += include_paths(cuda=True) library_dirs += library_paths(cuda=True) else: include_dirs += include_paths(cuda=False) library_dirs += library_paths(cuda=False) from setuptools import Extension ext_ops = Extension( name=ext_name, sources=op_files, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, language='c++', library_dirs=library_dirs, libraries=libraries) extensions.append(ext_ops) return extensions
def get_extensions(): this_dir = os.path.dirname(os.path.abspath(__file__)) extensions_dir = os.path.join(this_dir, 'torchvision', 'csrc') main_file = glob.glob(os.path.join(extensions_dir, '*.cpp')) source_cpu = glob.glob(os.path.join(extensions_dir, 'cpu', '*.cpp')) is_rocm_pytorch = False if torch.__version__ >= '1.5': from torch.utils.cpp_extension import ROCM_HOME is_rocm_pytorch = True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False if is_rocm_pytorch: hipify_python.hipify( project_directory=this_dir, output_directory=this_dir, includes="torchvision/csrc/cuda/*", show_detailed=True, is_pytorch_extension=True, ) source_cuda = glob.glob(os.path.join(extensions_dir, 'hip', '*.hip')) ## Copy over additional files shutil.copy("torchvision/csrc/cuda/cuda_helpers.h", "torchvision/csrc/hip/cuda_helpers.h") shutil.copy("torchvision/csrc/cuda/vision_cuda.h", "torchvision/csrc/hip/vision_cuda.h") else: source_cuda = glob.glob(os.path.join(extensions_dir, 'cuda', '*.cu')) sources = main_file + source_cpu extension = CppExtension compile_cpp_tests = os.getenv('WITH_CPP_MODELS_TEST', '0') == '1' if compile_cpp_tests: test_dir = os.path.join(this_dir, 'test') models_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'models') test_file = glob.glob(os.path.join(test_dir, '*.cpp')) source_models = glob.glob(os.path.join(models_dir, '*.cpp')) test_file = [os.path.join(test_dir, s) for s in test_file] source_models = [os.path.join(models_dir, s) for s in source_models] tests = test_file + source_models tests_include_dirs = [test_dir, models_dir] define_macros = [] extra_compile_args = {} if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) or os.getenv( 'FORCE_CUDA', '0') == '1': extension = CUDAExtension sources += source_cuda if not is_rocm_pytorch: define_macros += [('WITH_CUDA', None)] nvcc_flags = os.getenv('NVCC_FLAGS', '') if nvcc_flags == '': nvcc_flags = [] else: nvcc_flags = nvcc_flags.split(' ') else: define_macros += [('WITH_HIP', None)] nvcc_flags = [] extra_compile_args = { 'cxx': [], 'nvcc': nvcc_flags, } if sys.platform == 'win32': define_macros += [('torchvision_EXPORTS', None)] extra_compile_args.setdefault('cxx', []) extra_compile_args['cxx'].append('/MP') sources = [os.path.join(extensions_dir, s) for s in sources] include_dirs = [extensions_dir] ext_modules = [ extension( 'torchvision._C', sources, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, ) ] if compile_cpp_tests: ext_modules.append( extension( 'torchvision._C_tests', tests, include_dirs=tests_include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, )) ffmpeg_exe = distutils.spawn.find_executable('ffmpeg') has_ffmpeg = ffmpeg_exe is not None if has_ffmpeg: ffmpeg_bin = os.path.dirname(ffmpeg_exe) ffmpeg_root = os.path.dirname(ffmpeg_bin) ffmpeg_include_dir = os.path.join(ffmpeg_root, 'include') # TorchVision base decoder + video reader video_reader_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'cpu', 'video_reader') video_reader_src = glob.glob( os.path.join(video_reader_src_dir, "*.cpp")) base_decoder_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'cpu', 'decoder') base_decoder_src = glob.glob( os.path.join(base_decoder_src_dir, "[!sync_decoder_test,!utils_test]*.cpp")) combined_src = video_reader_src + base_decoder_src ext_modules.append( CppExtension( 'torchvision.video_reader', combined_src, include_dirs=[ base_decoder_src_dir, video_reader_src_dir, ffmpeg_include_dir, extensions_dir, ], libraries=[ 'avcodec', 'avformat', 'avutil', 'swresample', 'swscale', ], extra_compile_args=["-std=c++14"], extra_link_args=["-std=c++14"], )) return ext_modules
def get_extensions(): this_dir = os.path.dirname(os.path.abspath(__file__)) extensions_dir = os.path.join(this_dir, 'torchvision', 'csrc') main_file = glob.glob(os.path.join(extensions_dir, '*.cpp')) source_cpu = glob.glob(os.path.join(extensions_dir, 'cpu', '*.cpp')) is_rocm_pytorch = False if torch.__version__ >= '1.5': from torch.utils.cpp_extension import ROCM_HOME is_rocm_pytorch = True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False if is_rocm_pytorch: hipify_python.hipify( project_directory=this_dir, output_directory=this_dir, includes="torchvision/csrc/cuda/*", show_detailed=True, is_pytorch_extension=True, ) source_cuda = glob.glob(os.path.join(extensions_dir, 'hip', '*.hip')) # Copy over additional files shutil.copy("torchvision/csrc/cuda/cuda_helpers.h", "torchvision/csrc/hip/cuda_helpers.h") shutil.copy("torchvision/csrc/cuda/vision_cuda.h", "torchvision/csrc/hip/vision_cuda.h") else: source_cuda = glob.glob(os.path.join(extensions_dir, 'cuda', '*.cu')) sources = main_file + source_cpu extension = CppExtension compile_cpp_tests = os.getenv('WITH_CPP_MODELS_TEST', '0') == '1' if compile_cpp_tests: test_dir = os.path.join(this_dir, 'test') models_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'models') test_file = glob.glob(os.path.join(test_dir, '*.cpp')) source_models = glob.glob(os.path.join(models_dir, '*.cpp')) test_file = [os.path.join(test_dir, s) for s in test_file] source_models = [os.path.join(models_dir, s) for s in source_models] tests = test_file + source_models tests_include_dirs = [test_dir, models_dir] define_macros = [] extra_compile_args = {} if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) \ or os.getenv('FORCE_CUDA', '0') == '1': extension = CUDAExtension sources += source_cuda if not is_rocm_pytorch: define_macros += [('WITH_CUDA', None)] nvcc_flags = os.getenv('NVCC_FLAGS', '') if nvcc_flags == '': nvcc_flags = [] else: nvcc_flags = nvcc_flags.split(' ') else: define_macros += [('WITH_HIP', None)] nvcc_flags = [] extra_compile_args = { 'cxx': [], 'nvcc': nvcc_flags, } if sys.platform == 'win32': define_macros += [('torchvision_EXPORTS', None)] extra_compile_args.setdefault('cxx', []) extra_compile_args['cxx'].append('/MP') sources = [os.path.join(extensions_dir, s) for s in sources] include_dirs = [extensions_dir] ext_modules = [ extension( 'torchvision._C', sources, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, ) ] if compile_cpp_tests: ext_modules.append( extension( 'torchvision._C_tests', tests, include_dirs=tests_include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, ) ) # ------------------- Torchvision extra extensions ------------------------ vision_include = os.environ.get('TORCHVISION_INCLUDE', None) vision_library = os.environ.get('TORCHVISION_LIBRARY', None) vision_include = (vision_include.split(os.pathsep) if vision_include is not None else []) vision_library = (vision_library.split(os.pathsep) if vision_library is not None else []) include_dirs += vision_include library_dirs = vision_library # Image reading extension image_macros = [] image_include = [extensions_dir] image_library = [] image_link_flags = [] # Detect if build is running under conda/conda-build conda = distutils.spawn.find_executable('conda') is_conda = conda is not None build_prefix = os.environ.get('BUILD_PREFIX', None) is_conda_build = build_prefix is not None running_under_conda = is_conda or is_conda_build # Locating libPNG libpng = distutils.spawn.find_executable('libpng-config') pngfix = distutils.spawn.find_executable('pngfix') png_found = libpng is not None or pngfix is not None image_macros += [('PNG_FOUND', str(int(png_found)))] print('PNG found: {0}'.format(png_found)) if png_found: if libpng is not None: # Linux / Mac png_version = subprocess.run([libpng, '--version'], stdout=subprocess.PIPE) png_version = png_version.stdout.strip().decode('utf-8') print('libpng version: {0}'.format(png_version)) png_version = parse_version(png_version) if png_version >= parse_version("1.6.0"): print('Building torchvision with PNG image support') linux = sys.platform == 'linux' not_debian = False libpng_on_conda = False if linux: bin_folder = os.path.dirname(sys.executable) png_bin_folder = os.path.dirname(libpng) libpng_on_conda = ( running_under_conda and bin_folder == png_bin_folder) release_info = get_linux_distribution() not_debian = release_info["NAME"] not in {'Ubuntu', 'Debian'} if not linux or libpng_on_conda or not_debian: png_lib = subprocess.run([libpng, '--libdir'], stdout=subprocess.PIPE) png_lib = png_lib.stdout.strip().decode('utf-8') image_library += [png_lib] png_include = subprocess.run([libpng, '--I_opts'], stdout=subprocess.PIPE) png_include = png_include.stdout.strip().decode('utf-8') _, png_include = png_include.split('-I') print('libpng include path: {0}'.format(png_include)) image_include += [png_include] image_link_flags.append('png') else: print('libpng installed version is less than 1.6.0, ' 'disabling PNG support') png_found = False else: # Windows png_lib = os.path.join( os.path.dirname(os.path.dirname(pngfix)), 'lib') png_include = os.path.join(os.path.dirname( os.path.dirname(pngfix)), 'include', 'libpng16') image_library += [png_lib] image_include += [png_include] image_link_flags.append('libpng') image_path = os.path.join(extensions_dir, 'cpu', 'image') image_src = glob.glob(os.path.join(image_path, '*.cpp')) if png_found: ext_modules.append(extension( 'torchvision.image', image_src, include_dirs=image_include + include_dirs + [image_path], library_dirs=image_library + library_dirs, define_macros=image_macros, libraries=image_link_flags, extra_compile_args=extra_compile_args )) ffmpeg_exe = distutils.spawn.find_executable('ffmpeg') has_ffmpeg = ffmpeg_exe is not None if has_ffmpeg: ffmpeg_bin = os.path.dirname(ffmpeg_exe) ffmpeg_root = os.path.dirname(ffmpeg_bin) ffmpeg_include_dir = os.path.join(ffmpeg_root, 'include') # TorchVision base decoder + video reader video_reader_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'cpu', 'video_reader') video_reader_src = glob.glob(os.path.join(video_reader_src_dir, "*.cpp")) base_decoder_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'cpu', 'decoder') base_decoder_src = glob.glob( os.path.join(base_decoder_src_dir, "*.cpp")) # exclude tests base_decoder_src = [x for x in base_decoder_src if '_test.cpp' not in x] combined_src = video_reader_src + base_decoder_src ext_modules.append( CppExtension( 'torchvision.video_reader', combined_src, include_dirs=[ base_decoder_src_dir, video_reader_src_dir, ffmpeg_include_dir, extensions_dir, ], libraries=[ 'avcodec', 'avformat', 'avutil', 'swresample', 'swscale', ], extra_compile_args=["-std=c++14"], extra_link_args=["-std=c++14"], ) ) return ext_modules
if torch.cuda.is_available() and CUDA_HOME is not None: extension = CUDAExtension( 'torch_test_cpp_extension.cuda', [ 'cuda_extension.cpp', 'cuda_extension_kernel.cu', 'cuda_extension_kernel2.cu', ], extra_compile_args={'cxx': CXX_FLAGS, 'nvcc': ['-O2']}) ext_modules.append(extension) elif torch.cuda.is_available() and ROCM_HOME is not None: from torch.utils.hipify import hipify_python this_dir = os.path.dirname(os.path.abspath(__file__)) hipify_python.hipify( project_directory=this_dir, output_directory=this_dir, includes="./*", show_detailed=True, is_pytorch_extension=True,) extension = CUDAExtension( 'torch_test_cpp_extension.cuda', [ 'cuda_extension.cpp', 'hip/hip_extension_kernel.hip', 'hip/hip_extension_kernel2.hip', ]) ext_modules.append(extension) setup( name='torch_test_cpp_extension', packages=['torch_test_cpp_extension'], ext_modules=ext_modules, include_dirs='self_compiler_include_dirs_test',
def get_extensions(): extensions = [] if os.getenv('MMCV_WITH_TRT', '0') != '0': ext_name = 'mmcv._ext_trt' from torch.utils.cpp_extension import include_paths, library_paths library_dirs = [] libraries = [] include_dirs = [] tensorrt_path = os.getenv('TENSORRT_DIR', '0') tensorrt_lib_path = glob.glob( os.path.join(tensorrt_path, 'targets', '*', 'lib'))[0] library_dirs += [tensorrt_lib_path] libraries += ['nvinfer', 'nvparsers', 'nvinfer_plugin'] libraries += ['cudart'] define_macros = [] extra_compile_args = {'cxx': []} include_path = os.path.abspath('./mmcv/ops/csrc/common/cuda') include_trt_path = os.path.abspath('./mmcv/ops/csrc/tensorrt') include_dirs.append(include_path) include_dirs.append(include_trt_path) include_dirs.append(os.path.join(tensorrt_path, 'include')) include_dirs += include_paths(cuda=True) op_files = glob.glob('./mmcv/ops/csrc/tensorrt/plugins/*') define_macros += [('MMCV_WITH_CUDA', None)] define_macros += [('MMCV_WITH_TRT', None)] cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args['nvcc'] = [cuda_args] if cuda_args else [] library_dirs += library_paths(cuda=True) from setuptools import Extension ext_ops = Extension(name=ext_name, sources=op_files, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, language='c++', library_dirs=library_dirs, libraries=libraries) extensions.append(ext_ops) if os.getenv('MMCV_WITH_OPS', '0') == '0': return extensions if EXT_TYPE == 'parrots': ext_name = 'mmcv._ext' from parrots.utils.build_extension import Extension # new parrots op impl do not use MMCV_USE_PARROTS # define_macros = [('MMCV_USE_PARROTS', None)] define_macros = [] include_dirs = [] op_files = glob.glob('./mmcv/ops/csrc/pytorch/cuda/*.cu') +\ glob.glob('./mmcv/ops/csrc/parrots/*.cpp') include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common')) include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common/cuda')) cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args = { 'nvcc': [cuda_args] if cuda_args else [], 'cxx': [], } if torch.cuda.is_available() or os.getenv('FORCE_CUDA', '0') == '1': define_macros += [('MMCV_WITH_CUDA', None)] extra_compile_args['nvcc'] += [ '-D__CUDA_NO_HALF_OPERATORS__', '-D__CUDA_NO_HALF_CONVERSIONS__', '-D__CUDA_NO_HALF2_OPERATORS__', ] ext_ops = Extension(name=ext_name, sources=op_files, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, cuda=True, pytorch=True) extensions.append(ext_ops) elif EXT_TYPE == 'pytorch': ext_name = 'mmcv._ext' from torch.utils.cpp_extension import CppExtension, CUDAExtension # prevent ninja from using too many resources try: import psutil num_cpu = len(psutil.Process().cpu_affinity()) cpu_use = max(4, num_cpu - 1) except (ModuleNotFoundError, AttributeError): cpu_use = 4 os.environ.setdefault('MAX_JOBS', str(cpu_use)) define_macros = [] # Before PyTorch1.8.0, when compiling CUDA code, `cxx` is a # required key passed to PyTorch. Even if there is no flag passed # to cxx, users also need to pass an empty list to PyTorch. # Since PyTorch1.8.0, it has a default value so users do not need # to pass an empty list anymore. # More details at https://github.com/pytorch/pytorch/pull/45956 extra_compile_args = {'cxx': []} # Since the PR (https://github.com/open-mmlab/mmcv/pull/1463) uses # c++14 features, the argument ['std=c++14'] must be added here. # However, in the windows environment, some standard libraries # will depend on c++17 or higher. In fact, for the windows # environment, the compiler will choose the appropriate compiler # to compile those cpp files, so there is no need to add the # argument if platform.system() != 'Windows': extra_compile_args['cxx'] = ['-std=c++14'] include_dirs = [] is_rocm_pytorch = False try: from torch.utils.cpp_extension import ROCM_HOME is_rocm_pytorch = True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False except ImportError: pass project_dir = 'mmcv/ops/csrc/' if is_rocm_pytorch: from torch.utils.hipify import hipify_python hipify_python.hipify( project_directory=project_dir, output_directory=project_dir, includes='mmcv/ops/csrc/*', show_detailed=True, is_pytorch_extension=True, ) define_macros += [('MMCV_WITH_CUDA', None)] define_macros += [('HIP_DIFF', None)] cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args['nvcc'] = [cuda_args] if cuda_args else [] op_files = glob.glob('./mmcv/ops/csrc/pytorch/hip/*') \ + glob.glob('./mmcv/ops/csrc/pytorch/cpu/hip/*') extension = CUDAExtension include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common/hip')) elif torch.cuda.is_available() or os.getenv('FORCE_CUDA', '0') == '1': define_macros += [('MMCV_WITH_CUDA', None)] cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args['nvcc'] = [cuda_args] if cuda_args else [] op_files = glob.glob('./mmcv/ops/csrc/pytorch/*.cpp') + \ glob.glob('./mmcv/ops/csrc/pytorch/cpu/*.cpp') + \ glob.glob('./mmcv/ops/csrc/pytorch/cuda/*.cu') + \ glob.glob('./mmcv/ops/csrc/pytorch/cuda/*.cpp') extension = CUDAExtension include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common')) include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common/cuda')) else: print(f'Compiling {ext_name} without CUDA') op_files = glob.glob('./mmcv/ops/csrc/pytorch/*.cpp') + \ glob.glob('./mmcv/ops/csrc/pytorch/cpu/*.cpp') extension = CppExtension include_dirs.append(os.path.abspath('./mmcv/ops/csrc/common')) # Since the PR (https://github.com/open-mmlab/mmcv/pull/1463) uses # c++14 features, the argument ['std=c++14'] must be added here. # However, in the windows environment, some standard libraries # will depend on c++17 or higher. In fact, for the windows # environment, the compiler will choose the appropriate compiler # to compile those cpp files, so there is no need to add the # argument if 'nvcc' in extra_compile_args and platform.system() != 'Windows': extra_compile_args['nvcc'] += ['-std=c++14'] ext_ops = extension(name=ext_name, sources=op_files, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args) extensions.append(ext_ops) if EXT_TYPE == 'pytorch' and os.getenv('MMCV_WITH_ORT', '0') != '0': ext_name = 'mmcv._ext_ort' from torch.utils.cpp_extension import library_paths, include_paths import onnxruntime library_dirs = [] libraries = [] include_dirs = [] ort_path = os.getenv('ONNXRUNTIME_DIR', '0') library_dirs += [os.path.join(ort_path, 'lib')] libraries.append('onnxruntime') define_macros = [] extra_compile_args = {'cxx': []} include_path = os.path.abspath('./mmcv/ops/csrc/onnxruntime') include_dirs.append(include_path) include_dirs.append(os.path.join(ort_path, 'include')) op_files = glob.glob('./mmcv/ops/csrc/onnxruntime/cpu/*') if onnxruntime.get_device() == 'GPU' or os.getenv('FORCE_CUDA', '0') == '1': define_macros += [('MMCV_WITH_CUDA', None)] cuda_args = os.getenv('MMCV_CUDA_ARGS') extra_compile_args['nvcc'] = [cuda_args] if cuda_args else [] op_files += glob.glob('./mmcv/ops/csrc/onnxruntime/gpu/*') include_dirs += include_paths(cuda=True) library_dirs += library_paths(cuda=True) else: include_dirs += include_paths(cuda=False) library_dirs += library_paths(cuda=False) from setuptools import Extension ext_ops = Extension(name=ext_name, sources=op_files, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, language='c++', library_dirs=library_dirs, libraries=libraries) extensions.append(ext_ops) return extensions
if torch.utils.cpp_extension.CUDA_HOME is None and (not is_rocm_pytorch): raise RuntimeError( "--cuda_ext was requested, but nvcc was not found. Are you sure your environment has nvcc available? If you're installing within a container from https://hub.docker.com/r/pytorch/pytorch, only images whose names contain 'devel' will provide nvcc." ) else: if not is_rocm_pytorch: check_cuda_torch_binary_vs_bare_metal( torch.utils.cpp_extension.CUDA_HOME) if is_rocm_pytorch: import shutil with hipify_python.GeneratedFileCleaner( keep_intermediates=True) as clean_ctx: hipify_python.hipify(project_directory=this_dir, output_directory=this_dir, includes="csrc/*", show_detailed=True, is_pytorch_extension=True, clean_ctx=clean_ctx) shutil.copy("csrc/compat.h", "csrc/hip/compat.h") shutil.copy("csrc/type_shim.h", "csrc/hip/type_shim.h") if not is_rocm_pytorch: ext_modules.append( CUDAExtension( name='amp_C', sources=[ 'csrc/amp_C_frontend.cpp', 'csrc/multi_tensor_sgd_kernel.cu', 'csrc/multi_tensor_scale_kernel.cu', 'csrc/multi_tensor_axpby_kernel.cu', 'csrc/multi_tensor_l2norm_kernel.cu',