From 74944b1696df6344a56f72e2dbbbae3111abdc40 Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Fri, 27 Feb 2026 12:16:25 +0100 Subject: [PATCH] fix(ci): keep CUDA stubs when GPU not available Without nvidia RuntimeClass, there's no real libcuda.so in the container. The before_script was stripping CUDA stubs, leaving test binaries (like backtesting) unable to load libcuda.so.1. Now nvidia-smi is checked first: if GPU present, strip stubs (real CUDA from RuntimeClass). If no GPU, keep stubs so CUDA-linked test binaries can load. CUDA compute cap defaults to 89 (L4). Co-Authored-By: Claude Opus 4.6 --- .gitlab-ci.yml | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2223f5712..a6a7dd355 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -206,16 +206,20 @@ test: - name: redis:7-alpine alias: redis script: - # Remove CUDA stubs from LD_LIBRARY_PATH — nvidia RuntimeClass provides real libcuda.so - - export LD_LIBRARY_PATH=$(echo "$LD_LIBRARY_PATH" | tr ':' '\n' | grep -v stubs | tr '\n' ':' | sed 's/:$//') - - nvidia-smi || echo "nvidia-smi not available (no GPU RuntimeClass) — compile-only mode" - # Detect GPU compute capability and partition sccache per architecture - # Falls back to 89 (L4) when nvidia-smi unavailable (compile jobs don't need GPU) - - export CUDA_COMPUTE_CAP=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader 2>/dev/null | head -1 | tr -d '.' || echo "89") - - export CUDA_COMPUTE_CAP=${CUDA_COMPUTE_CAP:-89} - - echo "CUDA_COMPUTE_CAP=$CUDA_COMPUTE_CAP" - - export SCCACHE_DIR="/mnt/sccache/sm_${CUDA_COMPUTE_CAP}" - - mkdir -p "$SCCACHE_DIR" + # Detect GPU: if nvidia-smi works, strip stubs (real libcuda.so from RuntimeClass) + # If no GPU, keep stubs so CUDA-linked test binaries can at least load + - | + if nvidia-smi 2>/dev/null; then + echo "GPU detected — stripping CUDA stubs from LD_LIBRARY_PATH" + export LD_LIBRARY_PATH=$(echo "$LD_LIBRARY_PATH" | tr ':' '\n' | grep -v stubs | tr '\n' ':' | sed 's/:$//') + export CUDA_COMPUTE_CAP=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader | head -1 | tr -d '.') + else + echo "No GPU detected — keeping CUDA stubs for test binary loading" + export CUDA_COMPUTE_CAP=89 + fi + echo "CUDA_COMPUTE_CAP=$CUDA_COMPUTE_CAP" + export SCCACHE_DIR="/mnt/sccache/sm_${CUDA_COMPUTE_CAP}" + mkdir -p "$SCCACHE_DIR" # Wait for Redis sidecar (K8s executor doesn't wait for service readiness) - | for i in $(seq 1 30); do @@ -251,12 +255,16 @@ compile-services: - if: $CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "api" script: # Detect GPU compute capability and partition sccache per architecture - # Falls back to 89 (L4) when nvidia-smi unavailable (compile doesn't need GPU) - - export CUDA_COMPUTE_CAP=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader 2>/dev/null | head -1 | tr -d '.' || echo "89") - - export CUDA_COMPUTE_CAP=${CUDA_COMPUTE_CAP:-89} - - echo "CUDA_COMPUTE_CAP=$CUDA_COMPUTE_CAP" - - export SCCACHE_DIR="/mnt/sccache/sm_${CUDA_COMPUTE_CAP}" - - mkdir -p "$SCCACHE_DIR" + - | + if nvidia-smi 2>/dev/null; then + export CUDA_COMPUTE_CAP=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader | head -1 | tr -d '.') + else + echo "No GPU — keeping CUDA stubs, defaulting compute cap to 89 (L4)" + export CUDA_COMPUTE_CAP=89 + fi + echo "CUDA_COMPUTE_CAP=$CUDA_COMPUTE_CAP" + export SCCACHE_DIR="/mnt/sccache/sm_${CUDA_COMPUTE_CAP}" + mkdir -p "$SCCACHE_DIR" - sccache --zero-stats || true # Select build profile: dev-release (fast, thin LTO) or release (full, fat LTO) - PROFILE=${DEV_RELEASE:+dev-release}; PROFILE=${PROFILE:-release}