diff --git a/.github/ISSUE_TEMPLATE/amd_split_report.yml b/.github/ISSUE_TEMPLATE/amd_split_report.yml new file mode 100644 index 000000000..13d3e8d53 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/amd_split_report.yml @@ -0,0 +1,68 @@ +name: AMD split engine report +description: Tell us whether the all-cards split engine works on your AMD cards (it prints a line asking for this on cards Strata has not run it on) +title: "[Engine] AMD split engine: x " +labels: ["engine", "amd-split-report"] +body: + - type: markdown + value: | + Strata runs the all-cards split engine by itself on Radeon AI PRO R9700 / RX 9070 (gfx1201). On other AMD cards (RX 9060, RX 7000, the 780M and similar) it only starts when you ask for it with `strata launch --split-engine on`, and it prints one line asking you to report whether it works. We cannot test those cards, so your report is how we learn. + + Write only what you saw. A report that says "it did not start" is as useful as one that says "it works". + - type: input + id: card + attributes: + label: Card model and count + description: For example "2 x RX 7900 XTX 24 GB" or "3 x RX 9060 XT 16 GB" + validations: + required: true + - type: input + id: arch + attributes: + label: Architecture (the gfx name) + description: From the engine's line, or `rocminfo | grep gfx`. For example gfx1100. + validations: + required: true + - type: input + id: rocm + attributes: + label: ROCm / driver version + description: Strata's engine package brings its own ROCm libraries; the kernel driver is yours (`uname -r`, `amd-smi version`). + validations: + required: true + - type: input + id: model + attributes: + label: Model and quantization + description: The model Strata loaded, for example Qwen3.8-Flash-Next UD-Q4_K_XL or the IQ3_S set. + validations: + required: true + - type: textarea + id: selftest + attributes: + label: The self-test line + description: Paste the line from the engine's log that starts "The split engine's self-test" (passed or failed). The log is in the run folder shown at launch; `strata launch` also prints it. + render: text + validations: + required: true + - type: dropdown + id: result + attributes: + label: What happened + options: + - It started and the answers look right + - It started and the answers look wrong + - The self-test failed, so the normal layer split started + - It failed to start (not the self-test) + - It started and crashed or hung later + validations: + required: true + - type: input + id: speed + attributes: + label: Speed, tok/s (the split engine, then the layer split with `--split-engine off` if you tried both) + description: For example "decode 61 tok/s, layer split 48 tok/s, one user". + - type: textarea + id: more + attributes: + label: Anything else + description: Wrong answers (the prompt and what you got), crashes (the last lines of the engine log), or what you changed. diff --git a/packaging/build_split_hip.sh b/packaging/build_split_hip.sh index 94babc6af..a19fa930b 100644 --- a/packaging/build_split_hip.sh +++ b/packaging/build_split_hip.sh @@ -28,7 +28,7 @@ SYSDEPS=""; [ -d "$HP/lib/rocm_sysdeps" ] && SYSDEPS=";$HP/lib/rocm_sysdeps" BC=$HP/lib/llvm/amdgcn/bitcode; [ -d "$BC" ] || BC=$HP/amdgcn/bitcode rm -f "$B/CMakeCache.txt" cmake -G Ninja -S "$SRC" -B "$B" -DCMAKE_BUILD_TYPE=Release -DSTRATA_ENABLE_HIP=ON -DSTRATA_ENABLE_CUDA=OFF -DSTRATA_BUILD_TESTS=OFF -DSTRATA_BUILD_SPLIT=ON \ - "-DSTRATA_SPLIT_CARDS=${CARDS// /;}" "-DCMAKE_HIP_ARCHITECTURES=$ARCHS" -DSTRATA_PREFILL_MMQ=ON -DSTRATA_NATIVE_EXPERTS=ON -DSTRATA_GGML_DIR="$GG" \ + "-DSTRATA_SPLIT_CARDS=${CARDS// /;}" "-DCMAKE_HIP_ARCHITECTURES=gfx1201" "-DSTRATA_SPLIT_HIP_ARCHS=$ARCHS" -DSTRATA_PREFILL_MMQ=ON -DSTRATA_NATIVE_EXPERTS=ON -DSTRATA_GGML_DIR="$GG" \ -DCMAKE_HIP_COMPILER="$HP/llvm/bin/clang++" -DCMAKE_HIP_COMPILER_ROCM_ROOT="$HP" "-DCMAKE_PREFIX_PATH=$HP;$LIBW$SYSDEPS" \ "-DCMAKE_HIP_FLAGS=--rocm-path=$HP --rocm-device-lib-path=$BC" -DSTRATA_PORTABLE=ON \ "-DCMAKE_EXE_LINKER_FLAGS=-Wl,-rpath,'\$ORIGIN' -Wl,--enable-new-dtags" diff --git a/src/split/CMakeLists.txt b/src/split/CMakeLists.txt index f09e84f70..ca8a21650 100644 --- a/src/split/CMakeLists.txt +++ b/src/split/CMakeLists.txt @@ -34,15 +34,23 @@ if(_fnx_hip) # gfx11-generic = gfx1100 gfx1101 gfx1102 gfx1103 in one code object (RX 7000 and the 780M iGPU; the gfx11 WMMA path, hip/mma.h FNX_WMMA_GFX11; the self-test passes on a 780M, # no multi-card PC has run it). Only gfx1201 is automatic # (strata_control/split_engine.py AUTO_SPLIT_AMD_ARCHS); on another card the engine runs src/selftest.cu before it loads the model + # STRATA_SPLIT_HIP_ARCHS names the split engine's code objects when they are not the tree's CMAKE_HIP_ARCHITECTURES (whose list the HIP backend checks for the main + # engine and does not know gfx11-generic); empty: the tree's list + set(STRATA_SPLIT_HIP_ARCHS "" CACHE STRING "code objects of strata-split-N (gfx1201;gfx1200;gfx11-generic), empty: CMAKE_HIP_ARCHITECTURES") + if(STRATA_SPLIT_HIP_ARCHS) + set(_fnx_hip_archs ${STRATA_SPLIT_HIP_ARCHS}) + else() + set(_fnx_hip_archs ${STRATA_HIP_ARCH_LIST}) + endif() set(_fnx_hip_ok gfx1100 gfx1101 gfx1102 gfx1103 gfx11-generic gfx1200 gfx1201) set(_fnx_hip_bad "") - foreach(_a ${STRATA_HIP_ARCH_LIST}) + foreach(_a ${_fnx_hip_archs}) if(NOT _a IN_LIST _fnx_hip_ok) list(APPEND _fnx_hip_bad ${_a}) endif() endforeach() - if(NOT STRATA_HIP_ARCH_LIST OR _fnx_hip_bad) - message(WARNING "STRATA_BUILD_SPLIT (HIP): the split engine builds for ${_fnx_hip_ok} only (CMAKE_HIP_ARCHITECTURES=${STRATA_HIP_ARCH_LIST}), skipped") + if(NOT _fnx_hip_archs OR _fnx_hip_bad) + message(WARNING "STRATA_BUILD_SPLIT (HIP): the split engine builds for ${_fnx_hip_ok} only (got ${_fnx_hip_archs}), skipped") return() endif() set(STRATA_SPLIT_ARCH 1201) # (FNX_ARCH is only compared with 80 and 70: any HIP value takes the WMMA paths) @@ -95,7 +103,7 @@ foreach(_n ${STRATA_SPLIT_CARDS}) FNX_DIR="${_sp}") target_compile_options(${_t} PRIVATE "$<$:SHELL:-include ${_sp}/src/hip/fnx_hip.h>") target_link_libraries(${_t} PRIVATE strata_hip_runtime ${STRATA_HIP_BLAS_TARGETS}) - set_target_properties(${_t} PROPERTIES CXX_STANDARD 17 HIP_STANDARD 17 HIP_STANDARD_REQUIRED ON) + set_target_properties(${_t} PROPERTIES CXX_STANDARD 17 HIP_STANDARD 17 HIP_STANDARD_REQUIRED ON HIP_ARCHITECTURES "${_fnx_hip_archs}") find_package(Threads REQUIRED) target_link_libraries(${_t} PRIVATE Threads::Threads) continue()