Skip to content

Commit ac46067

Browse files
committed
Add Windows AXCL build and install support
1 parent 5806a5d commit ac46067

File tree

14 files changed

+469
-94
lines changed

14 files changed

+469
-94
lines changed

CMakeLists.txt

Lines changed: 71 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,19 @@ if(NOT CMAKE_BUILD_TYPE)
99
endif()
1010

1111
# set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/toolchains/aarch64-none-linux-gnu.toolchain.cmake)
12-
cmake_minimum_required(VERSION 3.0)
13-
project(LLAMA-AX650-CPP)
12+
cmake_minimum_required(VERSION 3.10)
13+
project(AX-LLM-CPP)
1414

15-
add_compile_options(-std=c++17)
15+
if(NOT MSVC)
16+
add_compile_options(-std=c++17)
17+
endif()
1618
set(CMAKE_CXX_STANDARD 17)
1719
set(CMAKE_CXX_STANDARD_REQUIRED ON)
20+
set(CMAKE_CXX_EXTENSIONS OFF)
21+
22+
if(WIN32)
23+
add_compile_definitions(NOMINMAX WIN32_LEAN_AND_MEAN)
24+
endif()
1825

1926
# ---------------------------------------------------------------------------
2027
# 后端选项(可组合)
@@ -56,19 +63,39 @@ endif()
5663

5764
# AXCL PCIe SDK(仅 BUILD_AXCL 时需要)
5865
if(BUILD_AXCL)
66+
if(NOT AXCL_DIR AND DEFINED ENV{AXCL_DIR})
67+
set(AXCL_DIR "$ENV{AXCL_DIR}")
68+
endif()
69+
70+
if(WIN32 AND NOT AXCL_DIR)
71+
message(FATAL_ERROR "BUILD_AXCL on Windows requires -DAXCL_DIR=<AXCL SDK root>")
72+
endif()
73+
74+
set(AXCL_INCLUDE_DIRS "")
75+
set(AXCL_LIBRARY_DIRS "")
5976
if (NOT AXCL_DIR)
60-
include_directories(/usr/include/axcl/)
61-
link_directories(/usr/lib/axcl/)
77+
list(APPEND AXCL_INCLUDE_DIRS /usr/include/axcl/)
78+
list(APPEND AXCL_LIBRARY_DIRS /usr/lib/axcl/)
6279
else()
63-
include_directories(${AXCL_DIR}/include)
64-
include_directories(${AXCL_DIR}/include/include)
65-
include_directories(${AXCL_DIR}/include/axcl/)
66-
include_directories(${AXCL_DIR}/include/axcl/include)
67-
link_directories(${AXCL_DIR}/lib)
68-
link_directories(${AXCL_DIR}/lib/axcl)
80+
list(APPEND AXCL_INCLUDE_DIRS
81+
${AXCL_DIR}/include
82+
${AXCL_DIR}/include/include
83+
${AXCL_DIR}/include/axcl/
84+
${AXCL_DIR}/include/axcl/include
85+
)
86+
list(APPEND AXCL_LIBRARY_DIRS
87+
${AXCL_DIR}/lib
88+
${AXCL_DIR}/lib/axcl
89+
${AXCL_DIR}/bin
90+
)
6991
message(STATUS "AXCL_DIR = ${AXCL_DIR}")
7092
endif()
93+
include_directories(${AXCL_INCLUDE_DIRS})
94+
if(AXCL_LIBRARY_DIRS)
95+
link_directories(${AXCL_LIBRARY_DIRS})
96+
endif()
7197
find_package(OpenMP QUIET)
98+
find_package(Threads REQUIRED)
7299
endif()
73100

74101
# ---------------------------------------------------------------------------
@@ -106,6 +133,7 @@ endif()
106133

107134
set(OPENAI_API_BUILD_EXAMPLES OFF)
108135
set(OPENAI_API_BUILD_TESTS OFF)
136+
set(OPENAI_API_BUILD_SERVER OFF)
109137
add_subdirectory(third_party/openai-api.cpp)
110138

111139
# ---------------------------------------------------------------------------
@@ -158,17 +186,30 @@ endif()
158186
# AXCL PCIe 后端 → axllm
159187
# ---------------------------------------------------------------------------
160188
if(BUILD_AXCL)
161-
set(AXCL_LINK_LIBS axcl_rt pthread tokenizer openai_api::server)
162-
163-
# Prefer real versioned axcl_rt .so to avoid linker script extra deps
164-
file(GLOB AXCL_RT_CAND "${AXCL_DIR}/lib/libaxcl_rt.so.*" "${AXCL_DIR}/lib/axcl/libaxcl_rt.so.*")
165-
if(AXCL_RT_CAND)
166-
list(SORT AXCL_RT_CAND COMPARE NATURAL ORDER DESCENDING)
167-
list(GET AXCL_RT_CAND 0 AXCL_RT_REAL)
168-
add_library(axcl_rt_real SHARED IMPORTED)
169-
set_target_properties(axcl_rt_real PROPERTIES IMPORTED_LOCATION "${AXCL_RT_REAL}")
170-
set(AXCL_LINK_LIBS axcl_rt_real pthread tokenizer openai_api::server)
171-
endif()
189+
set(AXCL_LINK_LIBS tokenizer openai_api::server Threads::Threads)
190+
191+
if(WIN32)
192+
find_library(AXCL_RT_LIBRARY
193+
NAMES axcl_rt libaxcl_rt
194+
PATHS ${AXCL_LIBRARY_DIRS}
195+
)
196+
if(NOT AXCL_RT_LIBRARY)
197+
message(FATAL_ERROR "Failed to locate AXCL runtime library (axcl_rt) under AXCL_DIR=${AXCL_DIR}")
198+
endif()
199+
list(PREPEND AXCL_LINK_LIBS ${AXCL_RT_LIBRARY})
200+
else()
201+
set(AXCL_LINK_LIBS axcl_rt ${AXCL_LINK_LIBS})
202+
203+
# Prefer real versioned axcl_rt .so to avoid linker script extra deps
204+
file(GLOB AXCL_RT_CAND "${AXCL_DIR}/lib/libaxcl_rt.so.*" "${AXCL_DIR}/lib/axcl/libaxcl_rt.so.*")
205+
if(AXCL_RT_CAND)
206+
list(SORT AXCL_RT_CAND COMPARE NATURAL ORDER DESCENDING)
207+
list(GET AXCL_RT_CAND 0 AXCL_RT_REAL)
208+
add_library(axcl_rt_real SHARED IMPORTED)
209+
set_target_properties(axcl_rt_real PROPERTIES IMPORTED_LOCATION "${AXCL_RT_REAL}")
210+
set(AXCL_LINK_LIBS axcl_rt_real tokenizer openai_api::server Threads::Threads)
211+
endif()
212+
endif()
172213

173214
if(OpenMP_CXX_FOUND)
174215
list(APPEND AXCL_LINK_LIBS OpenMP::OpenMP_CXX)
@@ -179,10 +220,9 @@ endif()
179220
src/runner/ax_model_runner/ax_model_runner_axcl.cpp
180221
src/runner/utils/axcl_manager.cpp
181222
)
182-
target_include_directories(axllm PRIVATE ${AXCL_DIR}/include)
223+
target_include_directories(axllm PRIVATE ${AXCL_INCLUDE_DIRS})
183224
target_compile_definitions(axllm PRIVATE USE_AXCL)
184225
target_link_libraries(axllm
185-
-L${AXCL_DIR}/lib
186226
${AXCL_LINK_LIBS}
187227
${AXLLM_VISION_LIBS}
188228
)
@@ -192,17 +232,18 @@ endif()
192232
src/runner/ax_model_runner/ax_model_runner_axcl.cpp
193233
src/runner/utils/axcl_manager.cpp
194234
)
195-
target_include_directories(llm_smoke PRIVATE ${AXCL_DIR}/include)
235+
target_include_directories(llm_smoke PRIVATE ${AXCL_INCLUDE_DIRS})
196236
target_compile_definitions(llm_smoke PRIVATE USE_AXCL)
197237
target_link_libraries(llm_smoke
198-
-L${AXCL_DIR}/lib
199238
${AXCL_LINK_LIBS}
200239
${AXLLM_VISION_LIBS}
201240
)
202-
set_target_properties(axllm PROPERTIES LINK_FLAGS "-Wl,--as-needed -Wl,--unresolved-symbols=ignore-in-shared-libs")
203-
install(TARGETS axllm DESTINATION bin)
204-
set_target_properties(llm_smoke PROPERTIES LINK_FLAGS "-Wl,--as-needed -Wl,--unresolved-symbols=ignore-in-shared-libs")
205-
install(TARGETS llm_smoke DESTINATION bin)
241+
if(NOT WIN32)
242+
set_target_properties(axllm PROPERTIES LINK_FLAGS "-Wl,--as-needed -Wl,--unresolved-symbols=ignore-in-shared-libs")
243+
set_target_properties(llm_smoke PROPERTIES LINK_FLAGS "-Wl,--as-needed -Wl,--unresolved-symbols=ignore-in-shared-libs")
244+
endif()
245+
install(TARGETS axllm DESTINATION bin)
246+
install(TARGETS llm_smoke DESTINATION bin)
206247
endif()
207248

208249
install(DIRECTORY ${CMAKE_SOURCE_DIR}/scripts/ DESTINATION bin/scripts)

README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@
4848
./install.sh
4949
```
5050

51+
Windows + AXCL + MinGW64 可使用:
52+
53+
```bat
54+
install.bat
55+
```
56+
5157
或使用一行命令下载并执行(默认分支 `axllm`):
5258

5359
```shell
@@ -75,6 +81,12 @@ REPO_URL=git@github.com:AXERA-TECH/ax-llm.git BRANCH=axllm ./install.sh
7581
./uninstall.sh
7682
```
7783

84+
Windows 本地安装可使用:
85+
86+
```bat
87+
uninstall.bat
88+
```
89+
7890
### 编译方式(手动)
7991

8092
如果需要手动编译,请按后端选择对应脚本:
@@ -92,6 +104,28 @@ REPO_URL=git@github.com:AXERA-TECH/ax-llm.git BRANCH=axllm ./install.sh
92104

93105
编译完成后,`build*/install/bin/` 目录下会生成 `axllm`(本分支已统一命名)。
94106

107+
Windows 下编译 AXCL 后端时,请显式关闭 `BUILD_AX650`,并传入 `AXCL_DIR`
108+
109+
```powershell
110+
# MinGW64
111+
cmake -S . -B build_windows_mingw -G "MinGW Makefiles" `
112+
-DBUILD_AX650=OFF -DBUILD_AXCL=ON `
113+
-DAXCL_DIR="C:\Program Files\AXCL\axcl\out\axcl_win_x64"
114+
cmake --build build_windows_mingw --parallel
115+
116+
# MSVC
117+
cmake -S . -B build_windows_msvc -G "Visual Studio 17 2022" -A x64 `
118+
-DBUILD_AX650=OFF -DBUILD_AXCL=ON `
119+
-DAXCL_DIR="C:\Program Files\AXCL\axcl\out\axcl_win_x64"
120+
cmake --build build_windows_msvc --config Release --parallel
121+
```
122+
123+
如需复用当前仓库的 Windows MinGW 验证流程,可运行:
124+
125+
```shell
126+
/bin/bash scripts/windows_axcl_mingw_validate.sh
127+
```
128+
95129
## 使用方式
96130

97131
编译/安装后运行:

install.bat

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
@echo off
2+
setlocal enabledelayedexpansion
3+
4+
set "ROOT=%~dp0"
5+
if "%ROOT:~-1%"=="\" set "ROOT=%ROOT:~0,-1%"
6+
7+
set "BUILD_DIR=%ROOT%\build_windows_mingw"
8+
set "INSTALL_DIR=%ROOT%\bin\windows"
9+
10+
if not defined AXCL_DIR set "AXCL_DIR=C:\Program Files\AXCL\axcl\out\axcl_win_x64"
11+
12+
where cmake >nul 2>nul || (
13+
echo Error: cmake not found in PATH.
14+
exit /b 1
15+
)
16+
17+
where mingw32-make >nul 2>nul || (
18+
echo Error: mingw32-make not found in PATH.
19+
exit /b 1
20+
)
21+
22+
where axcl-smi >nul 2>nul || (
23+
echo Error: axcl-smi not found in PATH.
24+
exit /b 1
25+
)
26+
27+
if not exist "%AXCL_DIR%" (
28+
echo Error: AXCL_DIR not found: %AXCL_DIR%
29+
echo Hint: set AXCL_DIR to your AXCL SDK root, for example:
30+
echo set AXCL_DIR=C:\Program Files\AXCL\axcl\out\axcl_win_x64
31+
exit /b 1
32+
)
33+
34+
if not exist "%ROOT%\third_party\SimpleCV\CMakeLists.txt" (
35+
echo Error: missing third_party\SimpleCV. Please init submodules first.
36+
exit /b 1
37+
)
38+
39+
if not exist "%ROOT%\third_party\openai-api.cpp\CMakeLists.txt" (
40+
echo Error: missing third_party\openai-api.cpp. Please init submodules first.
41+
exit /b 1
42+
)
43+
44+
if not exist "%BUILD_DIR%" mkdir "%BUILD_DIR%"
45+
if errorlevel 1 exit /b 1
46+
47+
echo ==^> Configuring Windows AXCL build with MinGW
48+
cmake -S "%ROOT%" -B "%BUILD_DIR%" -G "MinGW Makefiles" ^
49+
-DCMAKE_BUILD_TYPE=Release ^
50+
-DCMAKE_INSTALL_PREFIX="%BUILD_DIR%\install" ^
51+
-DBUILD_AX650=OFF ^
52+
-DBUILD_AXCL=ON ^
53+
-DAXCL_DIR="%AXCL_DIR%"
54+
if errorlevel 1 exit /b 1
55+
56+
echo ==^> Building axllm and llm_smoke
57+
cmake --build "%BUILD_DIR%" --parallel 8
58+
if errorlevel 1 exit /b 1
59+
60+
if not exist "%INSTALL_DIR%" mkdir "%INSTALL_DIR%"
61+
if errorlevel 1 exit /b 1
62+
63+
copy /Y "%BUILD_DIR%\axllm.exe" "%INSTALL_DIR%\axllm.exe" >nul || exit /b 1
64+
copy /Y "%BUILD_DIR%\llm_smoke.exe" "%INSTALL_DIR%\llm_smoke.exe" >nul || exit /b 1
65+
66+
if exist "%AXCL_DIR%\bin\axcl_rt.dll" copy /Y "%AXCL_DIR%\bin\axcl_rt.dll" "%INSTALL_DIR%\axcl_rt.dll" >nul
67+
if exist "%AXCL_DIR%\axcl_rt.dll" copy /Y "%AXCL_DIR%\axcl_rt.dll" "%INSTALL_DIR%\axcl_rt.dll" >nul
68+
69+
echo Installed:
70+
echo %INSTALL_DIR%\axllm.exe
71+
echo %INSTALL_DIR%\llm_smoke.exe
72+
exit /b 0

overlook.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#
88
###############################################################
99

10-
cmake_minimum_required(VERSION 3.1)
10+
cmake_minimum_required(VERSION 3.10)
1111

1212
# Only included once
1313
if(OVERLOOK_INCLUDE_GUARD)
@@ -603,4 +603,4 @@ if(OVERLOOK_USE_CPPCHECK)
603603
else()
604604
message(STATUS "cppcheck not found. ignore it")
605605
endif()
606-
endif()
606+
endif()
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#!/bin/bash
2+
set -euo pipefail
3+
4+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5+
PATCH_FILE="${TMPDIR:-/tmp}/axllm_windows_axcl.patch"
6+
7+
REMOTE_HOST="${REMOTE_HOST:-i@10.126.35.160}"
8+
REMOTE_PASS="${REMOTE_PASS:-0}"
9+
REMOTE_REPO="${REMOTE_REPO:-C:\\Users\\i\\projetcs\\ax-llm}"
10+
REMOTE_BUILD_DIR="${REMOTE_BUILD_DIR:-build_windows_mingw}"
11+
REMOTE_AXCL_DIR="${REMOTE_AXCL_DIR:-C:\\Program Files\\AXCL\\axcl\\out\\axcl_win_x64}"
12+
13+
FILES=(
14+
CMakeLists.txt
15+
overlook.cmake
16+
src/main.cpp
17+
src/runner/utils/files.cpp
18+
src/runner/utils/memory_utils.hpp
19+
src/runner/vision/vision_module.cpp
20+
src/runner/utils/cqdm.h
21+
src/runner/utils/cqdm.cpp
22+
src/runner/ax_model_runner/ax_model_runner_axcl.cpp
23+
)
24+
25+
SSH_BASE=(
26+
sshpass -p "${REMOTE_PASS}"
27+
ssh
28+
-o PreferredAuthentications=password
29+
-o StrictHostKeyChecking=no
30+
"${REMOTE_HOST}"
31+
)
32+
33+
SCP_BASE=(
34+
sshpass -p "${REMOTE_PASS}"
35+
scp
36+
-o PreferredAuthentications=password
37+
-o StrictHostKeyChecking=no
38+
)
39+
40+
build_patch() {
41+
(cd "${ROOT_DIR}" && git diff -- "${FILES[@]}" > "${PATCH_FILE}")
42+
}
43+
44+
remote_cmd() {
45+
"${SSH_BASE[@]}" "$1"
46+
}
47+
48+
sync_patch() {
49+
"${SCP_BASE[@]}" "${PATCH_FILE}" "${REMOTE_HOST}:/C:/Users/i/projetcs/ax-llm/axllm_windows_axcl.patch"
50+
}
51+
52+
apply_patch_remote() {
53+
local repo="${REMOTE_REPO}"
54+
remote_cmd "cd /d ${repo} && git apply --check axllm_windows_axcl.patch"
55+
}
56+
57+
reapply_patch_remote() {
58+
local repo="${REMOTE_REPO}"
59+
if ! remote_cmd "cd /d ${repo} && git apply --check axllm_windows_axcl.patch"; then
60+
remote_cmd "cd /d ${repo} && git apply -R axllm_windows_axcl.patch"
61+
remote_cmd "cd /d ${repo} && git apply --check axllm_windows_axcl.patch"
62+
fi
63+
remote_cmd "cd /d ${repo} && git apply axllm_windows_axcl.patch"
64+
}
65+
66+
configure_and_build() {
67+
local repo="${REMOTE_REPO}"
68+
local build_dir="${REMOTE_BUILD_DIR}"
69+
local axcl_dir="${REMOTE_AXCL_DIR}"
70+
71+
remote_cmd "cd /d ${repo} && if exist ${build_dir} rmdir /s /q ${build_dir}"
72+
remote_cmd "cd /d ${repo} && mkdir ${build_dir}"
73+
remote_cmd "cd /d ${repo}\\${build_dir} && cmake -G \"MinGW Makefiles\" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DAXCL_DIR=\"${axcl_dir}\" -DBUILD_AX650=OFF -DBUILD_AXCL=ON .."
74+
remote_cmd "cd /d ${repo}\\${build_dir} && cmake --build . --parallel 8"
75+
}
76+
77+
main() {
78+
build_patch
79+
sync_patch
80+
reapply_patch_remote
81+
configure_and_build
82+
}
83+
84+
main "$@"

0 commit comments

Comments
 (0)