@@ -22,34 +22,77 @@ if(NOT _gfx1250_idx EQUAL -1)
2222 endif ()
2323 set (GPU_TARGETS ${CMAKE_HIP_ARCHITECTURES} )
2424endif ()
25- set (__AITER_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR } /../../../3rdparty/QoLA/3rdparty/aiter" )
26- set (__CK_SOURCE_DIR "${__AITER_SOURCE_DIR } /3rdparty/composable_kernel" )
2725
28- set (CK_INCLUDE_DIR "${__CK_SOURCE_DIR } /include" )
29- message (STATUS "ck_include_dir: ${CK_INCLUDE_DIR} " )
30- if (NOT EXISTS "${CK_INCLUDE_DIR} " )
31- message (FATAL_ERROR
32- "Could not find CK API. "
33- "Try running 'git submodule update --init --recursive' "
34- "within the Transformer Engine source." )
26+ set (__QOLA_DIR "${CMAKE_CURRENT_LIST_DIR } /../../../3rdparty/QoLA" )
27+ set (__AITER_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR } /qola/third_party/aiter" )
28+ if (DEFINED ENV{NVTE_AITER_SOURCE_DIR } AND NOT $ENV{NVTE_AITER_SOURCE_DIR} STREQUAL "" )
29+ set (__AITER_SOURCE_DIR $ENV{NVTE_AITER_SOURCE_DIR} )
30+ message (STATUS "Using AITER source from NVTE_AITER_SOURCE_DIR=${__AITER_SOURCE_DIR } . Disable AITER checkout." )
31+ set (__SKIP_AITER_CHECKOUT TRUE )
32+ else ()
33+ set (__SKIP_AITER_CHECKOUT FALSE )
3534endif ()
36-
35+ set (__CK_SOURCE_DIR "${__AITER_SOURCE_DIR } /3rdparty/composable_kernel" )
36+ set (CK_INCLUDE_DIR "${__CK_SOURCE_DIR } /include" )
3737set (AITER_INCLUDE_DIR "${__AITER_SOURCE_DIR } /csrc/include" )
38- message (STATUS "aiter_include_dir: ${AITER_INCLUDE_DIR} " )
39- if (NOT EXISTS "${AITER_INCLUDE_DIR} " )
40- message (FATAL_ERROR
41- "Could not find AITER API. "
42- "Try running 'git submodule update --init --recursive' "
43- "within the Transformer Engine source." )
44- endif ()
4538
4639if (NOT Python_EXECUTABLE)
4740 find_package (Python COMPONENTS Interpreter QUIET )
41+ if (NOT Python_EXECUTABLE)
42+ #Don't fail the entire build if Python isn't found since it may pass if pre-built AITER is used
43+ message (ERROR "Python interpreter not found. Some build steps will be skipped or fail. Please install Python and ensure it is on the PATH." )
44+ endif ()
45+ endif ()
46+
47+ # Resolve the manifest-pinned AITER commit (defines AITER_SHA) and bring the
48+ # QoLA-managed AITER source tree to that commit before any consumer reads it
49+ # (header validation below, header includes for the .cpp build later, and
50+ # QoLA's own kernel build if the prebuilt cache misses).
51+ set (__QOLA_MANIFEST "${CMAKE_CURRENT_LIST_DIR } /qola_manifest.toml" )
52+ set_property (DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${__QOLA_MANIFEST} " )
53+ file (STRINGS "${__QOLA_MANIFEST} " __AITER_COMMIT_LINES
54+ REGEX "^[ \t ]*aiter_commit[ \t ]*=[ \t ]*\" [^\" ]+\" " )
55+ list (LENGTH __AITER_COMMIT_LINES __AITER_COMMIT_COUNT)
56+ if (NOT __AITER_COMMIT_COUNT EQUAL 1)
57+ message (FATAL_ERROR
58+ "Expected exactly one 'aiter_commit = \" ...\" ' line in "
59+ "${__QOLA_MANIFEST} , found ${__AITER_COMMIT_COUNT} ." )
60+ endif ()
61+ list (GET __AITER_COMMIT_LINES 0 __AITER_COMMIT_LINE)
62+ string (REGEX MATCH "\" ([^\" ]+)\" " _UNUSED "${__AITER_COMMIT_LINE} " )
63+ set (AITER_SHA "${CMAKE_MATCH_1} " )
64+ if ("${AITER_SHA} " STREQUAL "" )
65+ message (FATAL_ERROR
66+ "Failed to parse 'aiter_commit = \" ...\" ' line in ${__QOLA_MANIFEST} ." )
4867endif ()
4968
5069if (Python_EXECUTABLE)
70+ if (NOT __SKIP_AITER_CHECKOUT)
71+ execute_process (
72+ COMMAND sh -c
73+ "PYTHONPATH=\" ${__QOLA_DIR} :$PYTHONPATH\" '${Python_EXECUTABLE} ' -m qola.cli checkout \
74+ --manifest '${__QOLA_MANIFEST} ' \
75+ --aiter-root '${__AITER_SOURCE_DIR } '"
76+ RESULT_VARIABLE AITER_CHECKOUT_RESULT
77+ OUTPUT_VARIABLE AITER_CHECKOUT_OUTPUT
78+ ERROR_VARIABLE AITER_CHECKOUT_ERROR
79+ OUTPUT_STRIP_TRAILING_WHITESPACE
80+ ERROR_STRIP_TRAILING_WHITESPACE
81+ )
82+ if (NOT AITER_CHECKOUT_RESULT EQUAL 0)
83+ message (FATAL_ERROR
84+ "Failed to sync AITER source tree at ${__AITER_SOURCE_DIR } to "
85+ "manifest-pinned commit ${AITER_SHA} .\n "
86+ "${AITER_CHECKOUT_OUTPUT} \n ${AITER_CHECKOUT_ERROR} " )
87+ endif ()
88+ message (STATUS "[AITER] Synced ${__AITER_SOURCE_DIR } to ${AITER_SHA} " )
89+ endif ()
90+
5191 execute_process (
52- COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR } /check_aiter_mha_args.py --mode both --te-dir "${CMAKE_CURRENT_LIST_DIR } /../../.."
92+ COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR } /check_aiter_mha_args.py
93+ --mode both
94+ --te-dir "${CMAKE_CURRENT_LIST_DIR } /../../.."
95+ --aiter-root "${__AITER_SOURCE_DIR } "
5396 RESULT_VARIABLE AITER_ARG_CHECK_RESULT
5497 OUTPUT_VARIABLE AITER_ARG_CHECK_OUTPUT
5598 ERROR_VARIABLE AITER_ARG_CHECK_ERROR
@@ -63,8 +106,23 @@ if(Python_EXECUTABLE)
63106 "${AITER_ARG_CHECK_OUTPUT} \n ${AITER_ARG_CHECK_ERROR} " )
64107 endif ()
65108 message (STATUS "AITER API validation passed via check_aiter_mha_args.py" )
66- else ()
67- message (WARNING "Python interpreter not found; skipping AITER API validation." )
109+ endif ()
110+
111+ # Sanity-check the resolved include directories now that `qola checkout` has
112+ # materialized the AITER tree.
113+ message (STATUS "ck_include_dir: ${CK_INCLUDE_DIR} " )
114+ if (NOT EXISTS "${CK_INCLUDE_DIR} " )
115+ message (FATAL_ERROR
116+ "Could not find CK API at ${CK_INCLUDE_DIR} . "
117+ "Re-run the build to let `qola checkout` clone AITER and its "
118+ "composable_kernel submodule." )
119+ endif ()
120+
121+ message (STATUS "aiter_include_dir: ${AITER_INCLUDE_DIR} " )
122+ if (NOT EXISTS "${AITER_INCLUDE_DIR} " )
123+ message (FATAL_ERROR
124+ "Could not find AITER API at ${AITER_INCLUDE_DIR} . "
125+ "Re-run the build to let `qola checkout` clone AITER." )
68126endif ()
69127
70128set (__AITER_CACHE_DIR "" )
@@ -75,12 +133,12 @@ if(NOT "$ENV{NVTE_CK_JIT}" STREQUAL "0")
75133else ()
76134 set (__USE_CK_JIT FALSE )
77135endif ()
136+
78137if (DEFINED ENV{AITER_MHA_PATH})
79138 message (STATUS "[AITER-BUILD] Using AITER_MHA_PATH=$ENV{AITER_MHA_PATH} " )
80139 # use pre-built libraries and includes from a location specified by the user
81140 set (__AITER_CACHE_DIR $ENV{AITER_MHA_PATH} )
82- elseif (NOT __USE_CK_JIT) #disable for CK_JIT for now
83- # use pre-built cache
141+ elseif (NOT __USE_CK_JIT) # CK_JIT always builds from source; skip the prebuilt cache
84142 include ("${CMAKE_CURRENT_LIST_DIR } /aiter_prebuilt.cmake" )
85143 get_prebuilt_aiter (__AITER_CACHE_DIR )
86144elseif (DEFINED ENV{NVTE_AITER_PREBUILT_BASE_URL})
@@ -91,8 +149,6 @@ if(__AITER_CACHE_DIR STREQUAL "")
91149 # If not available or not requested, build from source via QoLA
92150 list (JOIN CMAKE_HIP_ARCHITECTURES ";" GPU_ARCHS_STR)
93151 message (STATUS "[AITER-BUILD] Building AITER kernels for ${GPU_ARCHS_STR} via QoLA." )
94- set (__QOLA_DIR "${CMAKE_CURRENT_LIST_DIR } /../../../3rdparty/QoLA" )
95- set (__QOLA_MANIFEST "${CMAKE_CURRENT_LIST_DIR } /qola_manifest.toml" )
96152 if (__USE_CK_JIT)
97153 message (STATUS "[AITER-BUILD] CK_JIT is enabled; will build CK kernels via CK_JIT." )
98154 set (__CK_JIT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR } /ck_jit" )
@@ -113,28 +169,30 @@ if(__AITER_CACHE_DIR STREQUAL "")
113169 --tmp-dir "${__CK_JIT_BUILD_DIR} "
114170 --install-dir ${AITER_MHA_INSTALL_DIR}
115171 --jit-name "te_ck_jit"
116- RESULT_VARIABLE QOLA_BUILD_RESULT
172+ RESULT_VARIABLE CKJIT_BUILD_RESULT
117173 )
174+ if (NOT CKJIT_BUILD_RESULT EQUAL 0)
175+ message (FATAL_ERROR "[AITER-BUILD] CK-JIT build failed." )
176+ endif ()
177+ # CK_JIT emits the libs straight into the install dir; nothing to cache.
178+ set (__AITER_MHA_PATH ${AITER_MHA_INSTALL_DIR} )
179+ set (__QOLA_INCLUDE_DIR "${__QOLA_BUILD_DIR} /include" )
118180 else ()
119- set (__QOLA_BUILD_DIR "${__QOLA_DIR} /build " )
181+ set (__QOLA_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR } /qola " )
120182 execute_process (
121183 COMMAND ${CMAKE_COMMAND } -E env "PYTHONPATH=${__QOLA_DIR} :$ENV{PYTHONPATH} "
122184 ${Python_EXECUTABLE} -m qola.cli build
123185 --manifest ${__QOLA_MANIFEST}
124186 --aiter-root ${__AITER_SOURCE_DIR }
125187 --output-dir ${__QOLA_BUILD_DIR}
126188 --arch "${GPU_ARCHS_STR} "
189+ --skip-checkout
127190 RESULT_VARIABLE QOLA_BUILD_RESULT
128191 )
129- endif ()
130- if (NOT QOLA_BUILD_RESULT EQUAL 0)
131- message (FATAL_ERROR "[AITER-BUILD] QoLA build failed." )
132- endif ()
192+ if (NOT QOLA_BUILD_RESULT EQUAL 0)
193+ message (FATAL_ERROR "[AITER-BUILD] QoLA build failed." )
194+ endif ()
133195
134- if (__USE_CK_JIT)
135- set (__AITER_MHA_PATH ${AITER_MHA_INSTALL_DIR} )
136- set (__QOLA_INCLUDE_DIR "${__QOLA_BUILD_DIR} /include" )
137- else ()
138196 # Copy the final .so libs and exported public headers into the aiter
139197 # prebuilt cache so downstream consumers see a self-contained tree.
140198 get_default_aiter_cache_dir (__AITER_CACHE_DIR )
@@ -147,6 +205,7 @@ if(__AITER_CACHE_DIR STREQUAL "")
147205 set (__QOLA_INCLUDE_DIR "${__AITER_CACHE_DIR} /include" )
148206 endif ()
149207else ()
208+ message (STATUS "[AITER-BUILD] Using pre-built AITER from ${__AITER_CACHE_DIR} " )
150209 set (__AITER_MHA_PATH "${__AITER_CACHE_DIR} /lib" )
151210 set (__QOLA_INCLUDE_DIR "${__AITER_CACHE_DIR} /include" )
152211endif ()
0 commit comments