setup.py 6.9 KB
Newer Older
Zhekai Zhang's avatar
Zhekai Zhang committed
1
import os
2
3
4
import re
import subprocess
import sys
Zhekai Zhang's avatar
Zhekai Zhang committed
5
6

import setuptools
7
8
9
import torch
from packaging import version as packaging_version
from torch.utils.cpp_extension import BuildExtension, CUDA_HOME, CUDAExtension
Zhekai Zhang's avatar
Zhekai Zhang committed
10

sxtyzhangzk's avatar
sxtyzhangzk committed
11
12
13
14
15
class CustomBuildExtension(BuildExtension):
    def build_extensions(self):
        for ext in self.extensions:
            if not "cxx" in ext.extra_compile_args:
                ext.extra_compile_args["cxx"] = []
sxtyzhangzk's avatar
sxtyzhangzk committed
16
17
            if not "nvcc" in ext.extra_compile_args:
                ext.extra_compile_args["nvcc"] = []
sxtyzhangzk's avatar
sxtyzhangzk committed
18
19
            if self.compiler.compiler_type == "msvc":
                ext.extra_compile_args["cxx"] += ext.extra_compile_args["msvc"]
sxtyzhangzk's avatar
sxtyzhangzk committed
20
                ext.extra_compile_args["nvcc"] += ext.extra_compile_args["nvcc_msvc"]
sxtyzhangzk's avatar
sxtyzhangzk committed
21
22
23
24
            else:
                ext.extra_compile_args["cxx"] += ext.extra_compile_args["gcc"]
        super().build_extensions()

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
def get_sm_targets() -> list[str]:
    nvcc_path = os.path.join(CUDA_HOME, "bin/nvcc") if CUDA_HOME else "nvcc"
    try:
        nvcc_output = subprocess.check_output([nvcc_path, "--version"]).decode()
        match = re.search(r"release (\d+\.\d+), V(\d+\.\d+\.\d+)", nvcc_output)
        if match:
            nvcc_version = match.group(2)
        else:
            raise Exception("nvcc version not found")
        print(f"Found nvcc version: {nvcc_version}")
    except:
        raise Exception("nvcc not found")

    support_sm120 = packaging_version.parse(nvcc_version) >= packaging_version.parse("12.8")

    install_mode = os.getenv("NUNCHAKU_INSTALL_MODE", "FAST")
    if install_mode == "FAST":
        ret = []
        for i in range(torch.cuda.device_count()):
            capability = torch.cuda.get_device_capability(i)
            sm = f"{capability[0]}{capability[1]}"
            if sm == "120" and support_sm120:
                sm = "120a"
            assert sm in ["80", "86", "89", "120a"], f"Unsupported SM {sm}"
            if sm not in ret:
                ret.append(sm)
    else:
        assert install_mode == "ALL"
        ret = ["80", "86", "89"]
        if support_sm120:
            ret.append("120a")
    return ret


Zhekai Zhang's avatar
Zhekai Zhang committed
60
61
62
63
if __name__ == "__main__":
    fp = open("nunchaku/__version__.py", "r").read()
    version = eval(fp.strip().split()[-1])

64
65
66
67
    torch_version = torch.__version__.split("+")[0]
    torch_major_minor_version = ".".join(torch_version.split(".")[:2])
    version = version + "+torch" + torch_major_minor_version

Zhekai Zhang's avatar
Zhekai Zhang committed
68
69
70
71
72
73
74
75
    ROOT_DIR = os.path.dirname(__file__)

    INCLUDE_DIRS = [
        "src",
        "third_party/cutlass/include",
        "third_party/json/include",
        "third_party/mio/include",
        "third_party/spdlog/include",
Zhekai Zhang's avatar
Zhekai Zhang committed
76
        "third_party/Block-Sparse-Attention/csrc/block_sparse_attn",
Samuel Tesfai's avatar
Samuel Tesfai committed
77
78
        "src/interop",
        "src/kernels",
Zhekai Zhang's avatar
Zhekai Zhang committed
79
80
    ]

Samuel Tesfai's avatar
Samuel Tesfai committed
81
    INCLUDE_DIRS = [os.path.join(ROOT_DIR, dir) for dir in INCLUDE_DIRS]
Zhekai Zhang's avatar
Zhekai Zhang committed
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

    DEBUG = False

    def ncond(s) -> list:
        if DEBUG:
            return []
        else:
            return [s]

    def cond(s) -> list:
        if DEBUG:
            return [s]
        else:
            return []

sxtyzhangzk's avatar
sxtyzhangzk committed
97
    GCC_FLAGS = ["-DENABLE_BF16=1", "-DBUILD_NUNCHAKU=1", "-fvisibility=hidden", "-g", "-std=c++20", "-UNDEBUG", "-Og"]
sxtyzhangzk's avatar
sxtyzhangzk committed
98
    MSVC_FLAGS = ["/DENABLE_BF16=1", "/DBUILD_NUNCHAKU=1", "/std:c++20", "/UNDEBUG", "/Zc:__cplusplus"]
Zhekai Zhang's avatar
Zhekai Zhang committed
99
    NVCC_FLAGS = [
sxtyzhangzk's avatar
sxtyzhangzk committed
100
        "-DENABLE_BF16=1",
Zhekai Zhang's avatar
Zhekai Zhang committed
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
        "-DBUILD_NUNCHAKU=1",
        "-g",
        "-std=c++20",
        "-UNDEBUG",
        "-Xcudafe",
        "--diag_suppress=20208",  # spdlog: 'long double' is treated as 'double' in device code
        *cond("-G"),
        "-U__CUDA_NO_HALF_OPERATORS__",
        "-U__CUDA_NO_HALF_CONVERSIONS__",
        "-U__CUDA_NO_HALF2_OPERATORS__",
        "-U__CUDA_NO_HALF2_CONVERSIONS__",
        "-U__CUDA_NO_BFLOAT16_OPERATORS__",
        "-U__CUDA_NO_BFLOAT16_CONVERSIONS__",
        "-U__CUDA_NO_BFLOAT162_OPERATORS__",
        "-U__CUDA_NO_BFLOAT162_CONVERSIONS__",
116
        "--threads=3",
Zhekai Zhang's avatar
Zhekai Zhang committed
117
118
119
120
        "--expt-relaxed-constexpr",
        "--expt-extended-lambda",
        "--ptxas-options=--allow-expensive-optimizations=true",
    ]
121

muyangli's avatar
muyangli committed
122
123
124
    if os.getenv("NUNCHAKU_BUILD_WHEELS", "0") == "0":
        NVCC_FLAGS.append("--generate-line-info")

125
126
127
128
129
130
131
132
    sm_targets = get_sm_targets()
    print(f"Detected SM targets: {sm_targets}", file=sys.stderr)

    assert len(sm_targets) > 0, "No SM targets found"

    for target in sm_targets:
        NVCC_FLAGS += ["-gencode", f"arch=compute_{target},code=sm_{target}"]

133
    NVCC_MSVC_FLAGS = ["-Xcompiler", "/Zc:__cplusplus"]
Zhekai Zhang's avatar
Zhekai Zhang committed
134
135
136
137
138
139
140
141
142
143

    nunchaku_extension = CUDAExtension(
        name="nunchaku._C",
        sources=[
            "nunchaku/csrc/pybind.cpp",
            "src/interop/torch.cpp",
            "src/activation.cpp",
            "src/layernorm.cpp",
            "src/Linear.cpp",
            *ncond("src/FluxModel.cpp"),
muyangli's avatar
muyangli committed
144
            *ncond("src/SanaModel.cpp"),
Zhekai Zhang's avatar
Zhekai Zhang committed
145
            "src/Serialization.cpp",
Zhekai Zhang's avatar
Zhekai Zhang committed
146
147
148
149
150
151
            *ncond("third_party/Block-Sparse-Attention/csrc/block_sparse_attn/src/flash_fwd_hdim64_fp16_sm80.cu"),
            *ncond("third_party/Block-Sparse-Attention/csrc/block_sparse_attn/src/flash_fwd_hdim64_bf16_sm80.cu"),
            *ncond("third_party/Block-Sparse-Attention/csrc/block_sparse_attn/src/flash_fwd_hdim128_fp16_sm80.cu"),
            *ncond("third_party/Block-Sparse-Attention/csrc/block_sparse_attn/src/flash_fwd_hdim128_bf16_sm80.cu"),
            *ncond("third_party/Block-Sparse-Attention/csrc/block_sparse_attn/src/flash_fwd_block_hdim64_fp16_sm80.cu"),
            *ncond("third_party/Block-Sparse-Attention/csrc/block_sparse_attn/src/flash_fwd_block_hdim64_bf16_sm80.cu"),
152
153
154
155
156
157
            *ncond(
                "third_party/Block-Sparse-Attention/csrc/block_sparse_attn/src/flash_fwd_block_hdim128_fp16_sm80.cu"
            ),
            *ncond(
                "third_party/Block-Sparse-Attention/csrc/block_sparse_attn/src/flash_fwd_block_hdim128_bf16_sm80.cu"
            ),
Zhekai Zhang's avatar
Zhekai Zhang committed
158
159
160
            "src/kernels/activation_kernels.cu",
            "src/kernels/layernorm_kernels.cu",
            "src/kernels/misc_kernels.cu",
muyangli's avatar
muyangli committed
161
162
163
164
165
            "src/kernels/zgemm/gemm_w4a4.cu",
            "src/kernels/zgemm/gemm_w4a4_launch_fp16.cu",
            "src/kernels/zgemm/gemm_w4a4_launch_bf16.cu",
            "src/kernels/zgemm/gemm_w8a8.cu",
            "src/kernels/dwconv.cu",
Zhekai Zhang's avatar
Zhekai Zhang committed
166
167
            "src/kernels/gemm_batched.cu",
            "src/kernels/gemm_f16.cu",
Samuel Tesfai's avatar
Samuel Tesfai committed
168
            "src/kernels/awq/gemm_cuda.cu",
Zhekai Zhang's avatar
Zhekai Zhang committed
169
            "src/kernels/awq/gemv_awq.cu",
Zhekai Zhang's avatar
Zhekai Zhang committed
170
171
            *ncond("third_party/Block-Sparse-Attention/csrc/block_sparse_attn/flash_api.cpp"),
            *ncond("third_party/Block-Sparse-Attention/csrc/block_sparse_attn/flash_api_adapter.cpp"),
Zhekai Zhang's avatar
Zhekai Zhang committed
172
        ],
Samuel Tesfai's avatar
Samuel Tesfai committed
173
174
175
176
177
        extra_compile_args={
            "gcc": GCC_FLAGS,
            "msvc": MSVC_FLAGS,
            "nvcc": NVCC_FLAGS,
        },
sxtyzhangzk's avatar
sxtyzhangzk committed
178
        include_dirs=INCLUDE_DIRS,
Zhekai Zhang's avatar
Zhekai Zhang committed
179
180
181
182
183
184
185
    )

    setuptools.setup(
        name="nunchaku",
        version=version,
        packages=setuptools.find_packages(),
        ext_modules=[nunchaku_extension],
sxtyzhangzk's avatar
sxtyzhangzk committed
186
        cmdclass={"build_ext": CustomBuildExtension},
Zhekai Zhang's avatar
Zhekai Zhang committed
187
    )