|
|
|
|
|
|
|
|
|
|
|
import glob |
|
|
import os |
|
|
import shutil |
|
|
from os import path |
|
|
from typing import List |
|
|
|
|
|
import torch |
|
|
from setuptools import find_packages, setup |
|
|
from torch.utils.cpp_extension import CUDA_HOME, CppExtension, CUDAExtension |
|
|
|
|
|
torch_ver = [int(x) for x in torch.__version__.split(".")[:2]] |
|
|
assert torch_ver >= [1, 8], "Requires PyTorch >= 1.8" |
|
|
|
|
|
|
|
|
def get_version(): |
|
|
init_py_path = path.join(path.abspath(path.dirname(__file__)), "ape", "__init__.py") |
|
|
init_py = open(init_py_path, "r").readlines() |
|
|
version_line = [l.strip() for l in init_py if l.startswith("__version__")][0] |
|
|
version = version_line.split("=")[-1].strip().strip("'\"") |
|
|
|
|
|
|
|
|
|
|
|
suffix = os.getenv("D2_VERSION_SUFFIX", "") |
|
|
version = version + suffix |
|
|
if os.getenv("BUILD_NIGHTLY", "0") == "1": |
|
|
from datetime import datetime |
|
|
|
|
|
date_str = datetime.today().strftime("%y%m%d") |
|
|
version = version + ".dev" + date_str |
|
|
|
|
|
new_init_py = [l for l in init_py if not l.startswith("__version__")] |
|
|
new_init_py.append('__version__ = "{}"\n'.format(version)) |
|
|
with open(init_py_path, "w") as f: |
|
|
f.write("".join(new_init_py)) |
|
|
return version |
|
|
|
|
|
|
|
|
def get_extensions(): |
|
|
this_dir = path.dirname(path.abspath(__file__)) |
|
|
extensions_dir = path.join(this_dir, "ape", "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 |
|
|
) |
|
|
if is_rocm_pytorch: |
|
|
assert torch_ver >= [1, 8], "ROCM support requires PyTorch >= 1.8!" |
|
|
|
|
|
|
|
|
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"] = [] |
|
|
|
|
|
nvcc_flags_env = os.getenv("NVCC_FLAGS", "") |
|
|
if nvcc_flags_env != "": |
|
|
extra_compile_args["nvcc"].extend(nvcc_flags_env.split(" ")) |
|
|
|
|
|
if torch_ver < [1, 7]: |
|
|
|
|
|
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( |
|
|
"ape._C", |
|
|
sources, |
|
|
include_dirs=include_dirs, |
|
|
define_macros=define_macros, |
|
|
extra_compile_args=extra_compile_args, |
|
|
) |
|
|
] |
|
|
|
|
|
return ext_modules |
|
|
|
|
|
|
|
|
def get_model_zoo_configs() -> List[str]: |
|
|
""" |
|
|
Return a list of configs to include in package for model zoo. Copy over these configs inside |
|
|
detectron2/model_zoo. |
|
|
""" |
|
|
|
|
|
|
|
|
source_configs_dir = path.join(path.dirname(path.realpath(__file__)), "configs") |
|
|
destination = path.join(path.dirname(path.realpath(__file__)), "ape", "model_zoo", "configs") |
|
|
|
|
|
|
|
|
|
|
|
if path.exists(source_configs_dir): |
|
|
if path.islink(destination): |
|
|
os.unlink(destination) |
|
|
elif path.isdir(destination): |
|
|
shutil.rmtree(destination) |
|
|
|
|
|
if not path.exists(destination): |
|
|
try: |
|
|
os.symlink(source_configs_dir, destination) |
|
|
except OSError: |
|
|
|
|
|
shutil.copytree(source_configs_dir, destination) |
|
|
|
|
|
config_paths = glob.glob("configs/**/*.yaml", recursive=True) + glob.glob( |
|
|
"configs/**/*.py", recursive=True |
|
|
) |
|
|
return config_paths |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PROJECTS = { |
|
|
} |
|
|
|
|
|
setup( |
|
|
name="ape", |
|
|
version=get_version(), |
|
|
author="Yunhang Shen", |
|
|
url="https://github.com/shenyunhang", |
|
|
description="APE is next-generation research " |
|
|
"framework for object detection and segmentation.", |
|
|
packages=find_packages(exclude=("configs", "tests*")) + list(PROJECTS.keys()), |
|
|
package_dir=PROJECTS, |
|
|
package_data={"ape.model_zoo": get_model_zoo_configs(), "ape.modeling.text.eva02_clip": ["*.gz", "**/*.json"], "ape.modeling.text.eva01_clip": ["*.gz", "**/*.json"]}, |
|
|
python_requires=">=3.7", |
|
|
install_requires=[ |
|
|
], |
|
|
ext_modules=get_extensions(), |
|
|
cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension}, |
|
|
) |
|
|
|