From 6006402fa2f15a8a8ea5be9af194058cc1a68666 Mon Sep 17 00:00:00 2001 From: Daniel Han Date: Fri, 19 Jun 2026 00:40:19 -0700 Subject: [PATCH] fix(provision): address Codex review (3 P2s on the aarch64 CUDA provisioner) - find_nvcc now prefers the highest /usr/local/cuda- toolkit so a stale unversioned `cuda` symlink or an older nvcc earlier on PATH can't win and rebuild with CUDA 12.x (re-hitting the glibc>=2.41 / Blackwell clash this script avoids); falls back to a PATH nvcc only when no versioned toolkit. - Validate the GPU compute_cap is purely numeric before using it as CMAKE_CUDA_ARCHITECTURES: some WSL GPU-PV / driver combos report "N/A", which CMake rejects (aborting an otherwise-usable build) instead of letting "native" autodetect. - Gate the native-Linux aarch64 provisioner on _SKIP_GGUF_BUILD: when a non-root user declines the sudo prompt (or lacks sudo) for GGUF deps, don't then run a provisioner that does its own sudo apt-get installs. --- studio/scripts/provision_llama_cuda.sh | 21 ++++++++++++++++++--- studio/setup.sh | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/studio/scripts/provision_llama_cuda.sh b/studio/scripts/provision_llama_cuda.sh index 1f36b8b90f..a7fc34103c 100644 --- a/studio/scripts/provision_llama_cuda.sh +++ b/studio/scripts/provision_llama_cuda.sh @@ -50,8 +50,17 @@ if [ "$HAVE_APT" -eq 1 ]; then $SUDO apt-get install -y --no-install-recommends gcc-14 g++-14 >/dev/null 2>&1 || true fi -# 3. Locate nvcc; install the CUDA toolkit if missing. -find_nvcc() { command -v nvcc 2>/dev/null || ls /usr/local/cuda*/bin/nvcc 2>/dev/null | sort -V | tail -1; } +# 3. Locate nvcc; install the CUDA toolkit if missing. Prefer the highest +# /usr/local/cuda- toolkit: a stale unversioned `cuda` symlink or an older +# nvcc earlier on PATH could otherwise win and rebuild with CUDA 12.x, re-hitting +# the glibc>=2.41 / Blackwell clash this script exists to avoid. Fall back to a +# PATH nvcc (e.g. conda) only when no versioned system toolkit is present. +find_nvcc() { + local _v + _v="$(ls -d /usr/local/cuda-*/bin/nvcc 2>/dev/null | sort -V | tail -1)" + if [ -n "$_v" ]; then printf '%s\n' "$_v"; return 0; fi + command -v nvcc 2>/dev/null || ls /usr/local/cuda*/bin/nvcc 2>/dev/null | sort -V | tail -1 +} NVCC="$(find_nvcc)" if [ -z "$NVCC" ] && [ "$HAVE_APT" -eq 1 ]; then log "CUDA toolkit (nvcc) not found - installing CUDA 13.3 (matches torch cu13x; avoids glibc>=2.41 rsqrt clash)" @@ -99,8 +108,14 @@ HCXX=g++; command -v g++-14 >/dev/null 2>&1 && HCXX=g++-14 export CC="$HCC" CXX="$HCXX" CUDAHOSTCXX="$HCXX" # 5. CUDA arch from the GPU's compute capability (e.g. "12.1" -> 121). Fallback: native. +# Only a purely-numeric capability is a valid CMAKE_CUDA_ARCHITECTURES; some WSL +# GPU-PV / driver combos report "N/A", which CMake would reject (aborting an +# otherwise-usable build) instead of letting "native" autodetect. CC_CAP="$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader 2>/dev/null | head -1 | tr -d ' .')" -if [ -n "$CC_CAP" ]; then CUDA_ARCH="$CC_CAP"; else CUDA_ARCH="native"; fi +case "$CC_CAP" in + ''|*[!0-9]*) CUDA_ARCH="native" ;; + *) CUDA_ARCH="$CC_CAP" ;; +esac # 6. Clone + build into ~/.unsloth/llama.cpp, honoring a UNSLOTH_LLAMA_TAG pin # (same var setup.sh uses) instead of always tracking ggml-org main. diff --git a/studio/setup.sh b/studio/setup.sh index fc1a7e121b..bd3d7a1304 100755 --- a/studio/setup.sh +++ b/studio/setup.sh @@ -1731,6 +1731,7 @@ if [ "$_HOST_SYSTEM" = "Linux" ] \ && { [ "$_HOST_MACHINE" = "aarch64" ] || [ "$_HOST_MACHINE" = "arm64" ]; } \ && { ! grep -qi microsoft /proc/version 2>/dev/null || [ "${UNSLOTH_WSL_LLAMA_DEFERRED:-0}" != "1" ]; } \ && [ "${UNSLOTH_NO_LLAMA_CUDA:-0}" != "1" ] \ + && [ "${_SKIP_GGUF_BUILD:-}" != true ] \ && command -v nvidia-smi >/dev/null 2>&1 \ && nvidia-smi -L 2>/dev/null | awk '/^GPU[[:space:]]+[0-9]+:/{found=1} END{exit !found}' \ && ! _have_cuda_llama_server; then