Skip to content

Commit e22a738

Browse files
committed
rewrite setup.py
1 parent 598d018 commit e22a738

File tree

14 files changed

+96
-160
lines changed

14 files changed

+96
-160
lines changed

MANIFEST.in

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
include LICENSE
2-
include pyproject.toml
31
include CMakeLists.txt
4-
include requirements.txt
5-
include setup.py
6-
7-
recursive-include examples *
8-
recursive-include benchmarks *
2+
graft ucm
3+
graft examples
4+
graft benchmarks

pyproject.toml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
[build-system]
2-
requires = ["setuptools>=45", "wheel", "cmake", "torch", "pybind11"]
2+
requires = [
3+
"setuptools>=64",
4+
"cmake>=3.18",
5+
"torch>=2.5.1",
6+
"wheel",
7+
]
38
build-backend = "setuptools.build_meta"
49

510
[project]
611
name = "uc-manager"
7-
authors = [{name = "UCM Team"}]
12+
authors = [{name = "Unified Cache Team"}]
813
license = { file="LICENSE" }
914
readme = "README.md"
1015
description = "Persist and reuse KV Cache to speedup your LLM."

setup.py

Lines changed: 32 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -23,168 +23,84 @@
2323
#
2424

2525
import os
26-
import shutil
2726
import subprocess
2827
import sys
29-
import sysconfig
30-
import warnings
31-
from glob import glob
3228

33-
import pybind11
34-
import torch
35-
import torch.utils.cpp_extension
3629
from setuptools import Extension, find_packages, setup
3730
from setuptools.command.build_ext import build_ext
3831

39-
# Suppress warnings about packages absent from packages configuration
40-
# These are expected for C++ source directories, test directories, etc.
41-
warnings.filterwarnings(
42-
"ignore", message=".*Package.*is absent from the `packages` configuration.*"
43-
)
44-
4532
ROOT_DIR = os.path.abspath(os.path.dirname(__file__))
4633
PLATFORM = os.getenv("PLATFORM")
47-
4834
ENABLE_SPARSE = os.getenv("ENABLE_SPARSE")
4935

5036

5137
def _enable_sparse() -> bool:
5238
return ENABLE_SPARSE is not None and ENABLE_SPARSE.lower() == "true"
5339

5440

55-
def _is_cuda() -> bool:
56-
return PLATFORM == "cuda" or (hasattr(torch, "cuda") and torch.cuda.is_available())
57-
58-
59-
def _is_maca() -> bool:
60-
return PLATFORM == "maca"
61-
62-
6341
class CMakeExtension(Extension):
64-
def __init__(self, name: str, sourcedir: str = ""):
42+
def __init__(self, name: str, source_dir: str = ""):
6543
super().__init__(name, sources=[])
66-
self.sourcedir = os.path.abspath(sourcedir)
44+
self.cmake_file_path = os.path.abspath(source_dir)
6745

6846

6947
class CMakeBuild(build_ext):
7048
def run(self):
49+
build_dir = os.path.abspath(self.build_temp)
50+
os.makedirs(build_dir, exist_ok=True)
51+
7152
for ext in self.extensions:
7253
self.build_cmake(ext)
7354

74-
self._copy_so_files_to_build_lib()
75-
7655
def build_cmake(self, ext: CMakeExtension):
77-
build_dir = self.build_temp
78-
os.makedirs(build_dir, exist_ok=True)
56+
build_dir = os.path.abspath(self.build_temp)
57+
install_dir = os.path.abspath(self.build_lib)
7958

8059
cmake_args = [
81-
"cmake",
8260
"-DCMAKE_BUILD_TYPE=Release",
8361
f"-DPYTHON_EXECUTABLE={sys.executable}",
62+
f"-DCMAKE_INSTALL_PREFIX={install_dir}",
8463
]
8564

86-
torch_cmake_prefix = torch.utils.cmake_prefix_path
87-
pybind11_cmake_dir = pybind11.get_cmake_dir()
88-
89-
cmake_prefix_paths = [torch_cmake_prefix, pybind11_cmake_dir]
90-
cmake_args.append(f"-DCMAKE_PREFIX_PATH={';'.join(cmake_prefix_paths)}")
91-
92-
torch_includes = torch.utils.cpp_extension.include_paths()
93-
python_include = sysconfig.get_path("include")
94-
pybind11_include = pybind11.get_include()
95-
96-
all_includes = torch_includes + [python_include, pybind11_include]
97-
cmake_include_string = ";".join(all_includes)
98-
cmake_args.append(f"-DEXTERNAL_INCLUDE_DIRS={cmake_include_string}")
99-
100-
if _is_cuda():
101-
cmake_args.append("-DRUNTIME_ENVIRONMENT=cuda")
102-
else:
103-
cmake_args.append("-DRUNTIME_ENVIRONMENT=ascend")
104-
10565
if _enable_sparse():
106-
cmake_args.append("-DBUILD_UCM_SPARSE=ON")
107-
108-
cmake_args.append(ext.sourcedir)
109-
110-
print(f"[INFO] Building {ext.name} module with CMake")
111-
print(f"[INFO] Source directory: {ext.sourcedir}")
112-
print(f"[INFO] Build directory: {build_dir}")
113-
print(f"[INFO] CMake command: {' '.join(cmake_args)}")
66+
cmake_args += ["-DBUILD_UCM_SPARSE=ON"]
67+
68+
match PLATFORM:
69+
case "cuda":
70+
cmake_args += ["-DRUNTIME_ENVIRONMENT=cuda"]
71+
case "ascend":
72+
cmake_args += ["-DRUNTIME_ENVIRONMENT=ascend"]
73+
case "musa":
74+
cmake_args += ["-DRUNTIME_ENVIRONMENT=musa"]
75+
case "maca":
76+
cmake_args += ["-DRUNTIME_ENVIRONMENT=maca"]
77+
cmake_args += ["-DBUILD_UCM_SPARSE=OFF"]
78+
case _:
79+
# default ascend
80+
cmake_args += ["-DRUNTIME_ENVIRONMENT=ascend"]
11481

115-
subprocess.check_call(cmake_args, cwd=build_dir)
82+
subprocess.check_call(
83+
["cmake", *cmake_args, ext.cmake_file_path], cwd=build_dir
84+
)
11685
subprocess.check_call(
11786
["cmake", "--build", ".", "--config", "Release", "--", "-j8"],
11887
cwd=build_dir,
11988
)
12089

121-
def _copy_so_files_to_build_lib(self):
122-
"""Copy .so files from source directories to build_lib for installation."""
123-
if not hasattr(self, "build_lib") or not self.build_lib:
124-
return
125-
126-
packages = _get_packages()
127-
copied_count = 0
128-
129-
for package in packages:
130-
# Source directory where CMake outputs .so files
131-
source_package_dir = os.path.join(ROOT_DIR, package.replace(".", os.sep))
132-
133-
# Destination in build_lib
134-
build_package_dir = os.path.join(
135-
self.build_lib, package.replace(".", os.sep)
136-
)
137-
138-
# Find all .so files in the source package directory
139-
so_files = glob(os.path.join(source_package_dir, "*.so"))
140-
141-
if so_files:
142-
# Ensure destination directory exists
143-
os.makedirs(build_package_dir, exist_ok=True)
144-
145-
# Copy each .so file
146-
for so_file in so_files:
147-
dest_file = os.path.join(
148-
build_package_dir, os.path.basename(so_file)
149-
)
150-
shutil.copy2(so_file, dest_file)
151-
copied_count += 1
152-
print(
153-
f"[INFO] Copied {os.path.basename(so_file)} to {build_package_dir}"
154-
)
155-
156-
if copied_count > 0:
157-
print(f"[INFO] Successfully copied {copied_count} .so file(s) to build_lib")
158-
else:
159-
print(
160-
"[WARNING] No .so files found to copy. Extensions may not have been built."
161-
)
162-
163-
164-
def _get_packages():
165-
"""Discover Python packages, optionally filtering out sparse-related ones."""
166-
sparse_enabled = _enable_sparse()
167-
exclude_patterns = []
168-
if not sparse_enabled:
169-
exclude_patterns.append("ucm.sparse*")
170-
171-
packages = find_packages(exclude=exclude_patterns)
172-
return packages
173-
174-
175-
ext_modules = []
176-
ext_modules.append(CMakeExtension(name="ucm", sourcedir=ROOT_DIR))
90+
subprocess.check_call(
91+
["cmake", "--install", ".", "--config", "Release", "--component", "ucm"],
92+
cwd=build_dir,
93+
)
17794

178-
packages = _get_packages()
17995

18096
setup(
18197
name="uc-manager",
18298
version="0.1.2",
18399
description="Unified Cache Management",
184100
author="Unified Cache Team",
185-
packages=packages,
101+
packages=find_packages(),
186102
python_requires=">=3.10",
187-
ext_modules=ext_modules,
103+
ext_modules=[CMakeExtension(name="ucm", source_dir=ROOT_DIR)],
188104
cmdclass={"build_ext": CMakeBuild},
189105
zip_safe=False,
190106
)

ucm/shared/metrics/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,9 @@ file(GLOB_RECURSE BINDINGS_SRCS CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/c
1212
pybind11_add_module(ucmmonitor ${BINDINGS_SRCS})
1313
target_link_libraries(ucmmonitor PRIVATE -Wl,--whole-archive monitor_static -Wl,--no-whole-archive)
1414
target_include_directories(ucmmonitor PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/cc)
15-
set_target_properties(ucmmonitor PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
15+
16+
file(RELATIVE_PATH INSTALL_REL_PATH
17+
${CMAKE_SOURCE_DIR}
18+
${CMAKE_CURRENT_SOURCE_DIR}
19+
)
20+
install(TARGETS ucmmonitor LIBRARY DESTINATION ${INSTALL_REL_PATH} COMPONENT ucm)

ucm/shared/trans/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,9 @@ target_link_libraries(trans PUBLIC infra_status)
1616
file(GLOB_RECURSE UCMTRANS_CPY_SOURCE_FILES "./cpy/*.cc")
1717
pybind11_add_module(ucmtrans ${UCMTRANS_CPY_SOURCE_FILES})
1818
target_link_libraries(ucmtrans PRIVATE trans)
19-
set_target_properties(ucmtrans PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
19+
20+
file(RELATIVE_PATH INSTALL_REL_PATH
21+
${CMAKE_SOURCE_DIR}
22+
${CMAKE_CURRENT_SOURCE_DIR}
23+
)
24+
install(TARGETS ucmtrans LIBRARY DESTINATION ${INSTALL_REL_PATH} COMPONENT ucm)

ucm/sparse/esa/retrieval/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
pybind11_add_module(retrieval_backend cpy/retrieval_backend.cpp)
33

44
# 设置输出库的目录
5-
set_target_properties(retrieval_backend PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
5+
file(RELATIVE_PATH INSTALL_REL_PATH
6+
${CMAKE_SOURCE_DIR}
7+
${CMAKE_CURRENT_SOURCE_DIR}
8+
)
9+
install(TARGETS retrieval_backend LIBRARY DESTINATION ${INSTALL_REL_PATH} COMPONENT ucm)
610

711
# 设置头文件目录,以确保 numaf.h 能找到
812
target_include_directories(retrieval_backend PUBLIC

ucm/sparse/gsa/offload_ops/CMakeLists.txt

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,8 @@ if(OpenMP_CXX_FOUND)
9696
target_link_libraries(gsa_offload_ops PRIVATE OpenMP::OpenMP_CXX)
9797
endif()
9898

99-
# 设置输出路径
100-
set(OUTPUT_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR})
101-
set_target_properties(gsa_offload_ops PROPERTIES
102-
LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_LIB_DIR}
103-
RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_LIB_DIR}
104-
)
105-
106-
# 编译后输出信息
107-
add_custom_command(TARGET gsa_offload_ops POST_BUILD
108-
COMMAND ${CMAKE_COMMAND} -E echo "Built gsa_offload_ops successfully for ${RUNTIME_ENVIRONMENT}"
109-
COMMAND ${CMAKE_COMMAND} -E echo "CXX11_ABI=${CXX11_ABI}"
110-
COMMAND ${CMAKE_COMMAND} -E echo "Output location: ${OUTPUT_LIB_DIR}"
99+
file(RELATIVE_PATH INSTALL_REL_PATH
100+
${CMAKE_SOURCE_DIR}
101+
${CMAKE_CURRENT_SOURCE_DIR}
111102
)
103+
install(TARGETS gsa_offload_ops LIBRARY DESTINATION ${INSTALL_REL_PATH} COMPONENT ucm)

ucm/sparse/gsa/prefetch/CMakeLists.txt

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,8 @@ if(OpenMP_CXX_FOUND)
9494
target_link_libraries(gsa_prefetch PRIVATE OpenMP::OpenMP_CXX)
9595
endif()
9696

97-
# 设置输出路径
98-
set(OUTPUT_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR})
99-
set_target_properties(gsa_prefetch PROPERTIES
100-
LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_LIB_DIR}
101-
RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_LIB_DIR}
102-
)
103-
104-
# 编译后输出信息
105-
add_custom_command(TARGET gsa_prefetch POST_BUILD
106-
COMMAND ${CMAKE_COMMAND} -E echo "Built gsa_prefetch successfully for ${RUNTIME_ENVIRONMENT}"
107-
COMMAND ${CMAKE_COMMAND} -E echo "CXX11_ABI=${CXX11_ABI}"
108-
COMMAND ${CMAKE_COMMAND} -E echo "Output location: ${OUTPUT_LIB_DIR}"
97+
file(RELATIVE_PATH INSTALL_REL_PATH
98+
${CMAKE_SOURCE_DIR}
99+
${CMAKE_CURRENT_SOURCE_DIR}
109100
)
101+
install(TARGETS gsa_prefetch LIBRARY DESTINATION ${INSTALL_REL_PATH} COMPONENT ucm)

ucm/sparse/kvcomp/hash_retrieval/CMakeLists.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
# 添加编译目标
22
pybind11_add_module(hash_retrieval_backend cpy/hash_retrieval_backend.cpp)
33

4-
# 设置输出库的目录
5-
set_target_properties(hash_retrieval_backend PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
4+
file(RELATIVE_PATH INSTALL_REL_PATH
5+
${CMAKE_SOURCE_DIR}
6+
${CMAKE_CURRENT_SOURCE_DIR}
7+
)
8+
install(TARGETS hash_retrieval_backend LIBRARY DESTINATION ${INSTALL_REL_PATH} COMPONENT ucm)
69

710
# 设置头文件目录,以确保 numaf.h 能找到
811
target_include_directories(hash_retrieval_backend PUBLIC

ucm/sparse/kvstar/retrieve/CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# auto detect cuda ------------------------
2-
if($ENV{PLATFORM} STREQUAL "cuda")
2+
if(${RUNTIME_ENVIRONMENT} STREQUAL "cuda")
33
if(NOT DEFINED CMAKE_CUDA_COMPILER)
44
set(CUDA_ROOT "/usr/local/cuda/" CACHE PATH "Path to CUDA root directory")
55
set(CMAKE_CUDA_COMPILER ${CUDA_ROOT}/bin/nvcc)
@@ -106,4 +106,8 @@ endif()
106106
add_subdirectory(core)
107107
add_subdirectory(py_intf)
108108

109-
set_target_properties(kvstar_retrieve PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
109+
file(RELATIVE_PATH INSTALL_REL_PATH
110+
${CMAKE_SOURCE_DIR}
111+
${CMAKE_CURRENT_SOURCE_DIR}
112+
)
113+
install(TARGETS kvstar_retrieve LIBRARY DESTINATION ${INSTALL_REL_PATH} COMPONENT ucm)

0 commit comments

Comments
 (0)