Skip to content

Commit 07f3b3a

Browse files
zhmiaoCopilot
andcommitted
feat(rp-20): extend probe_gpu_quality with full GPU runtime DLL surface
Before this change, probe_gpu_quality.{sh,ps1} only probed for libcudnn.so.9 / cudnn64_9.dll. A user with a partial CUDA install (e.g. cuDNN present but cuFFT missing — common after 'pip install sparrow-engine-gpu' because the wheel deliberately doesn't bundle the NVIDIA runtime sidecars) passed the existing probe but failed at first inference with a libdl / LoadLibraryW error pointing at whichever sidecar was the actual culprit. Add probes for the full DT_NEEDED set of ORT 1.25.1's CUDA provider, plus engine-side nvJPEG. Ground truth (verified 2026-05-27 via readelf -d on the published onnxruntime-gpu 1.25.1 wheel's libonnxruntime_providers_cuda.so): Linux: Windows: libcudart.so.12 cudart64_12.dll (CUDA runtime base) libcublas.so.12 cublas64_12.dll (matmul) libcublasLt.so.12 cublasLt64_12.dll (cuBLAS Lt) libcurand.so.10 curand64_10.dll (RNG) libcufft.so.11 cufft64_11.dll (FFT — audio) libcudnn.so.9 cudnn64_9.dll (existing version-checked) Plus engine-side (sparrow-engine-gpu/src/decode.rs dlopen'd at first JpegDecoder::new — yolo.rs / tiled.rs / classifier.rs all raise SparrowEngineError::NvjpegUnavailable on construction failure): libnvjpeg.so.12 nvjpeg64_12.dll (image decode) UX: 'collect ALL missing libs' rather than 'first-failing-wins' so the user fixes them in one cycle rather than iterating one-DLL-per-rerun. Verdict semantics: the existing 'cudnn_err' verdict name is preserved (any new name would force a parallel change in sparrow-engine-install.{sh,ps1}'s exit-code translation), but the docstring + reason string make clear it is now the catch-all 'GPU runtime prereq missing' hard-fail bucket. The reason string carries which specific library is the actual culprit and the matching pip-sidecar / apt install hint pointing at docs/user-manual.md §2.5 Option A / B. Search dirs (Linux): 1. $LD_LIBRARY_PATH (colon-split) 2. ~/.sparrow-engine/cuda-sidecars/lib/python*/site-packages/nvidia/*/lib (matches the Python sidecar venv pattern from user-manual.md §2.5 Option B and the brew GPU wrapper's auto-discovery path). 3. /usr/lib/python3/dist-packages/torch/lib (Lambda Stack / PyTorch-bundled) 4. /usr/lib/python3/dist-packages/tensorflow (Lambda Stack / TF-bundled) 5. /usr/local/cuda/lib64 (NVIDIA CUDA toolkit) 6. /usr/lib/x86_64-linux-gnu (Ubuntu apt nvidia-cudnn) 7. /usr/lib64 + /usr/lib (RHEL / fallback) Search dirs (Windows): 1. %SystemRoot%\System32 2. %CUDA_PATH%\bin 3. %CUDA_PATH_V*_*%\bin (side-by-side CUDA Toolkit installs) Defensive: PS Search-RequiredDll guards $env:SystemRoot null (Linux pwsh test surface) to avoid noisy Join-Path errors. Windows always has it set. The existing cuDNN version-floor check + compute-cap (sm_80) check are preserved unchanged behind the new gate (if all required libs are present, the existing checks run as before). Local validation: GREEN end-to-end on the dev-box (cuDNN 9.19, all 6 sidecars present); PowerShell parser GREEN (dotnet pwsh 7.6 ParseFile). Refs: RP-20 (docs/ideas.md:249), OQ-2026-05-27-2 (related — CLI tarball lane). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent d9da0e5 commit 07f3b3a

2 files changed

Lines changed: 237 additions & 28 deletions

File tree

installer/probe_gpu_quality.ps1

Lines changed: 96 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
# installer/probe_gpu_quality.ps1 — dot-sourceable layer-2 quality probe (Windows).
2+
# GPU runtime sidecar DLL surface +
23
# cuDNN ≥9.10 floor + driver-version sanity.
34
#
45
# Purpose
56
# Layer-2 of the Sparrow Engine install-time selector on Windows. Runs ONLY after
6-
# layer-1 (`probe.ps1`) has returned `gpu`. Reports two follow-up signals:
7-
# 1. Is cuDNN ≥9.10 reachable? Windows ships cuDNN as `cudnn64_9.dll`
7+
# layer-1 (`probe.ps1`) has returned `gpu`. Reports three follow-up signals:
8+
# 1. Are all hard-required GPU runtime sidecar DLLs reachable? ORT 1.25.1's
9+
# ORT CUDA provider links against six CUDA libs (verified via readelf
10+
# against the published Linux wheel, 2026-05-27); Windows equivalents
11+
# are `cudart64_12.dll`, `cublas64_12.dll`, `cublasLt64_12.dll`,
12+
# `curand64_10.dll`, `cufft64_11.dll`, `cudnn64_9.dll`. The
13+
# sparrow-engine GPU image-decode path additionally loads
14+
# `nvjpeg64_12.dll` via dlopen — missing nvJPEG fails at first
15+
# inference with `SparrowEngineError::NvjpegUnavailable`.
16+
# 2. Is cuDNN ≥9.10 reachable? Windows ships cuDNN as `cudnn64_9.dll`
817
# plus version-stamped sidecar files (e.g. `cudnn_9.10.2.21.dll`); the
918
# FileVersion property of `cudnn64_9.dll` is the most reliable signal.
10-
# 2. Is the GPU compute-capability ≥sm_80? FP16 production cells need
19+
# 3. Is the GPU compute-capability ≥sm_80? FP16 production cells need
1120
# Ampere Tensor Cores; pre-Ampere falls back to FP32 at 2-3× latency.
1221
#
1322
# Usage
@@ -21,6 +30,12 @@
2130
# 'cudnn_err' { exit 11 }
2231
# }
2332
#
33+
# The `cudnn_err` verdict is the hard-fail bucket for ANY missing GPU
34+
# runtime prerequisite (cuDNN, cuBLAS, cuFFT, nvJPEG, etc.); the verdict
35+
# name is preserved for back-compat with `sparrow-engine-install.ps1`'s
36+
# switch-handling. The verdict REASON string carries which specific DLL is
37+
# the actual culprit.
38+
#
2439
# Direct invocation:
2540
# powershell -NoProfile -ExecutionPolicy Bypass -File .\installer\probe_gpu_quality.ps1
2641
#
@@ -40,44 +55,104 @@
4055
# docs/design/phase4.1-install-selector/final_design.md § 2.4
4156
# docs/design/phase4.1-install-selector/round_02/scripts-architect_proposal.md § 1.2.1 + § 3.2
4257
#
58+
# DLL surface ground truth (2026-05-27, RP-20):
59+
# ORT 1.25.1 CUDA provider DT_NEEDED CUDA libs:
60+
# cublasLt64_12.dll, cublas64_12.dll, curand64_10.dll, cufft64_11.dll,
61+
# cudart64_12.dll, cudnn64_9.dll
62+
# Engine-side nvJPEG (dlopen at first JpegDecoder::new):
63+
# nvjpeg64_12.dll
64+
#
4365
# cuDNN ≥9.10 floor citation (verified 2026-05-08):
4466
# - sparrow-engine/scripts/ort-env.sh:167-168 — "cuDNN: we require 9.10+ for SpeciesNet
4567
# on sm_89 (cuDNN 9.8 has a Conv engine bug with asymmetric padding —
4668
# 'No valid engine configs for ConvFwd_'). PyTorch/TF bundle 9.8."
4769
# - docs/lessons.md:29
4870
# - docs/tech_report/06_gotchas_and_constraints.md:17-25
4971

72+
# ---------------------------------------------------------------------------
73+
# Helper: search for a CUDA runtime sidecar DLL by exact basename.
74+
#
75+
# Looks in the canonical Windows locations a GPU install drops DLLs:
76+
# 1. %SystemRoot%\System32 (cuDNN MSI installer drops here; CUDA Runtime
77+
# apt-style installs land here on some setups).
78+
# 2. %CUDA_PATH%\bin (standalone CUDA Toolkit installer).
79+
# 3. %CUDA_PATH_V*_*%\bin (side-by-side Toolkit installs — NVIDIA writes
80+
# version-suffixed env vars for each major.minor).
81+
#
82+
# Returns the first matching absolute path, or $null if not found.
83+
# ---------------------------------------------------------------------------
84+
function Search-RequiredDll {
85+
[CmdletBinding()]
86+
param([Parameter(Mandatory)][string]$DllName)
87+
$candidates = @()
88+
if ($env:SystemRoot) {
89+
$candidates += (Join-Path $env:SystemRoot "System32\$DllName")
90+
}
91+
if ($env:CUDA_PATH) {
92+
$candidates += (Join-Path $env:CUDA_PATH "bin\$DllName")
93+
}
94+
Get-ChildItem env: -ErrorAction SilentlyContinue |
95+
Where-Object { $_.Name -match '^CUDA_PATH_V\d+_\d+$' } |
96+
ForEach-Object { $candidates += (Join-Path $_.Value "bin\$DllName") }
97+
foreach ($p in $candidates) {
98+
if ($p -and (Test-Path -LiteralPath $p -PathType Leaf)) {
99+
return $p
100+
}
101+
}
102+
return $null
103+
}
104+
50105
function probe_gpu_quality {
51106
[CmdletBinding()]
52107
param()
53108

54109
$env:SPARROW_ENGINE_GPU_QUALITY = ''
55110
$env:SPARROW_ENGINE_GPU_QUALITY_REASON = ''
56111

57-
# 1. cuDNN check — locate cudnn64_9.dll in the canonical Windows locations
58-
# (System32 from the cuDNN MSI installer, %CUDA_PATH%\bin from the
59-
# standalone CUDA toolkit installer). Read FileVersion to compare
60-
# against the 9.10.0 floor.
61-
$cudnnDll = $null
62-
$candidates = @(
63-
(Join-Path $env:SystemRoot 'System32\cudnn64_9.dll')
112+
# 0. Hard-required GPU runtime sidecar DLLs (RP-20). Collect ALL missing
113+
# DLLs so the user fixes them in one cycle.
114+
$requiredDlls = @(
115+
@{ Name = 'cudart64_12.dll'; PipPkg = 'nvidia-cuda-runtime-cu12' },
116+
@{ Name = 'cublas64_12.dll'; PipPkg = 'nvidia-cublas-cu12' },
117+
@{ Name = 'cublasLt64_12.dll'; PipPkg = 'nvidia-cublas-cu12' },
118+
@{ Name = 'curand64_10.dll'; PipPkg = 'nvidia-curand-cu12' },
119+
@{ Name = 'cufft64_11.dll'; PipPkg = 'nvidia-cufft-cu12' },
120+
@{ Name = 'nvjpeg64_12.dll'; PipPkg = 'nvidia-nvjpeg-cu12' }
64121
)
65-
if ($env:CUDA_PATH) {
66-
$candidates += (Join-Path $env:CUDA_PATH 'bin\cudnn64_9.dll')
122+
$missing = @()
123+
foreach ($req in $requiredDlls) {
124+
$found = Search-RequiredDll -DllName $req.Name
125+
if (-not $found) {
126+
$missing += $req
127+
}
67128
}
68-
# Also search any CUDA_PATH_V*_* env vars (NVIDIA installs version-suffixed
69-
# vars for side-by-side toolkit installs).
70-
Get-ChildItem env: -ErrorAction SilentlyContinue |
71-
Where-Object { $_.Name -match '^CUDA_PATH_V\d+_\d+$' } |
72-
ForEach-Object { $candidates += (Join-Path $_.Value 'bin\cudnn64_9.dll') }
73129

74-
foreach ($p in $candidates) {
75-
if ($p -and (Test-Path -LiteralPath $p -PathType Leaf)) {
76-
$cudnnDll = $p
77-
break
130+
if ($missing.Count -gt 0) {
131+
$lines = $missing | ForEach-Object {
132+
" - $($_.Name) (pip pkg: $($_.PipPkg))"
78133
}
134+
$hint = ($lines -join "`n")
135+
$env:SPARROW_ENGINE_GPU_QUALITY = 'cudnn_err'
136+
$env:SPARROW_ENGINE_GPU_QUALITY_REASON = @"
137+
GPU runtime sidecar DLL(s) missing — spe-gpu will fail at first inference with a LoadLibraryW error.
138+
$hint
139+
140+
Install via ONE of (see docs/user-manual.md §2.5):
141+
Option A — CUDA Toolkit installer: download CUDA 12.6+ from https://developer.nvidia.com/cuda-downloads and cuDNN 9.10+ from https://developer.nvidia.com/cudnn
142+
Option B — Python sidecar wheels (no admin): uv pip install --target $env:USERPROFILE\.sparrow-engine\cuda-sidecars nvidia-cudnn-cu12 nvidia-cublas-cu12 nvidia-curand-cu12 nvidia-cufft-cu12 nvidia-nvjpeg-cu12 nvidia-cuda-runtime-cu12
143+
"@
144+
$script:SparrowEngineGpuQuality = $env:SPARROW_ENGINE_GPU_QUALITY
145+
$script:SparrowEngineGpuQualityReason = $env:SPARROW_ENGINE_GPU_QUALITY_REASON
146+
Write-Output 'fail'
147+
return
79148
}
80149

150+
# 1. cuDNN check — locate cudnn64_9.dll in the canonical Windows locations
151+
# (System32 from the cuDNN MSI installer, %CUDA_PATH%\bin from the
152+
# standalone CUDA toolkit installer). Read FileVersion to compare
153+
# against the 9.10.0 floor.
154+
$cudnnDll = Search-RequiredDll -DllName 'cudnn64_9.dll'
155+
81156
if (-not $cudnnDll) {
82157
$env:SPARROW_ENGINE_GPU_QUALITY = 'cudnn_err'
83158
$env:SPARROW_ENGINE_GPU_QUALITY_REASON = "cuDNN 9.x DLL (cudnn64_9.dll) not found in System32 or %CUDA_PATH%\bin; the GPU flavor will fail at first inference. Install cuDNN 9.10+ from https://developer.nvidia.com/cudnn"

installer/probe_gpu_quality.sh

Lines changed: 141 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
#!/usr/bin/env bash
22
# installer/probe_gpu_quality.sh — sourceable layer-2 quality probe
3-
# (cuDNN ≥9.10 floor + driver-version sanity).
3+
# (GPU runtime sidecar DLL surface +
4+
# cuDNN ≥9.10 floor + driver-version sanity).
45
#
56
# Purpose
6-
# Layer-2 of the Sparrow Engine install-time selector. Runs ONLY after layer-1
7-
# (`probe.sh`) has returned `gpu`. The basic CUDA probe answers "is CUDA
8-
# reachable?" — this layer answers two follow-up questions:
9-
# 1. Is cuDNN ≥9.10 reachable? (canonical project floor — cuDNN 9.8 has
7+
# Layer-2 of the Sparrow Engine install-time selector. Runs ONLY after
8+
# layer-1 (`probe.sh`) has returned `gpu`. The basic CUDA probe answers
9+
# "is CUDA reachable?" — this layer answers three follow-up questions:
10+
# 1. Are all hard-required GPU runtime sidecar libraries reachable?
11+
# ORT 1.25.1's `libonnxruntime_providers_cuda.so` DT_NEEDED list
12+
# (verified via `readelf -d` on the published wheel, 2026-05-27)
13+
# names six CUDA libs: `libcudart.so.12`, `libcublas.so.12`,
14+
# `libcublasLt.so.12`, `libcurand.so.10`, `libcufft.so.11`,
15+
# `libcudnn.so.9`. The sparrow-engine GPU image-decode path additionally
16+
# loads `libnvjpeg.so.12` via dlopen — missing nvJPEG fails at first
17+
# inference with `SparrowEngineError::NvjpegUnavailable`
18+
# (sparrow-engine-gpu/src/models/{yolo,tiled,classifier}.rs).
19+
# 2. Is cuDNN ≥9.10 reachable? (canonical project floor — cuDNN 9.8 has
1020
# the asymmetric-padding ConvFwd engine bug that breaks SpeciesNet on
1121
# sm_89; sources cited in `probe_cudnn_check` below).
12-
# 2. Is the GPU compute-capability ≥sm_80? (FP16 production cells need
22+
# 3. Is the GPU compute-capability ≥sm_80? (FP16 production cells need
1323
# Ampere Tensor Cores; T4 and earlier silently fall back to FP32 at
1424
# 2-3× the latency of advertised perf).
1525
#
@@ -21,9 +31,15 @@
2131
# ok) : ;; # silent install
2232
# sm_warn) warn "FP16 perf will be degraded" ;;
2333
# cudnn_warn) warn "SpeciesNet will fail until cuDNN ≥9.10" ;;
24-
# cudnn_err) die 11 "cuDNN <9.10 — block install" ;;
34+
# cudnn_err) die 11 "GPU runtime sidecar missing — block install" ;;
2535
# esac
2636
#
37+
# The `cudnn_err` verdict is the hard-fail bucket for ANY missing GPU
38+
# runtime prerequisite (cuDNN, cuBLAS, cuFFT, nvJPEG, etc.); the verdict
39+
# name is preserved for back-compat with `sparrow-engine-install.sh`'s
40+
# case-handling. The verdict REASON string carries which specific library
41+
# is the actual culprit.
42+
#
2743
# Direct invocation:
2844
# bash installer/probe_gpu_quality.sh # stdout = quality verdict
2945
#
@@ -40,6 +56,14 @@
4056
# docs/design/phase4.1-install-selector/round_02/scripts-architect_proposal.md § 1.2.1
4157
# docs/design/phase4.1-install-selector/round_01/scripts-architect_proposal.md § 1.2.1 (canonical pseudocode)
4258
#
59+
# DLL surface ground truth (2026-05-27, RP-20):
60+
# ORT 1.25.1 CUDA provider DT_NEEDED CUDA libs (readelf -d
61+
# libonnxruntime_providers_cuda.so):
62+
# libcublasLt.so.12, libcublas.so.12, libcurand.so.10, libcufft.so.11,
63+
# libcudart.so.12, libcudnn.so.9
64+
# Engine-side nvJPEG (dlopen at first JpegDecoder::new):
65+
# libnvjpeg.so.12
66+
#
4367
# cuDNN ≥9.10 floor citation (verified 2026-05-08):
4468
# - sparrow-engine/scripts/ort-env.sh:167-168 — "cuDNN: we require 9.10+ for SpeciesNet
4569
# on sm_89 (cuDNN 9.8 has a Conv engine bug with asymmetric padding —
@@ -51,10 +75,120 @@
5175
# This script must NEVER `exit` from a sourced context — caller may have
5276
# sourced it. Use `return` from inside the function.
5377

78+
# ---------------------------------------------------------------------------
79+
# Helper: search for a CUDA runtime sidecar library by exact basename.
80+
#
81+
# Looks in the canonical Linux locations sparrow-engine-gpu's wrapper
82+
# script (installer/homebrew/sparrow-engine-gpu.rb caveats) advertises,
83+
# plus the user-set $LD_LIBRARY_PATH. Returns the first matching absolute
84+
# path on stdout, or empty string if not found.
85+
#
86+
# Search order (mirrors the brew GPU wrapper's auto-discovery so the
87+
# probe's "yes / no" verdict agrees with what `spe-gpu` will actually
88+
# resolve at runtime):
89+
# 1. Each entry of $LD_LIBRARY_PATH (colon-separated).
90+
# 2. ~/.sparrow-engine/cuda-sidecars/lib/python*/site-packages/nvidia/<pkg>/lib
91+
# (Python sidecar venv pattern from user-manual.md §2.5 Option B).
92+
# 3. /usr/lib/python3/dist-packages/torch/lib (Lambda Stack / PyTorch-bundled).
93+
# 4. /usr/lib/python3/dist-packages/tensorflow (Lambda Stack / TF-bundled).
94+
# 5. /usr/local/cuda/lib64 (NVIDIA CUDA toolkit / system install).
95+
# 6. /usr/lib/x86_64-linux-gnu (Ubuntu apt nvidia-cudnn / system).
96+
# 7. /usr/lib64 + /usr/lib (RHEL / fallback).
97+
# ---------------------------------------------------------------------------
98+
_search_required_lib() {
99+
_basename="$1"
100+
# 1. LD_LIBRARY_PATH (colon-split). Quoting `$LD_LIBRARY_PATH:` and using
101+
# parameter expansion avoids `set -u` blowups when the var is unset.
102+
_OLDIFS="$IFS"
103+
IFS=':'
104+
for _d in ${LD_LIBRARY_PATH:-}; do
105+
IFS="$_OLDIFS"
106+
if [ -n "$_d" ] && [ -e "$_d/$_basename" ]; then
107+
printf '%s\n' "$_d/$_basename"
108+
return 0
109+
fi
110+
IFS=':'
111+
done
112+
IFS="$_OLDIFS"
113+
# 2-7. Deterministic dir list. Glob expansion handles the Python sidecar
114+
# venv variants. `find -maxdepth 4` bounds the cost.
115+
for _glob in \
116+
"$HOME/.sparrow-engine/cuda-sidecars"/lib/python*/site-packages/nvidia/*/lib \
117+
/usr/lib/python3/dist-packages/torch/lib \
118+
/usr/lib/python3/dist-packages/tensorflow \
119+
/usr/local/cuda/lib64 \
120+
/usr/lib/x86_64-linux-gnu \
121+
/usr/lib64 \
122+
/usr/lib; do
123+
# Word-splitting on the glob is intentional — wildcard expansion
124+
# produces multiple dirs.
125+
for _d in $_glob; do
126+
[ -d "$_d" ] || continue
127+
if [ -e "$_d/$_basename" ]; then
128+
printf '%s\n' "$_d/$_basename"
129+
return 0
130+
fi
131+
done
132+
done
133+
return 1
134+
}
135+
54136
probe_gpu_quality() {
55137
SPARROW_ENGINE_GPU_QUALITY=""
56138
SPARROW_ENGINE_GPU_QUALITY_REASON=""
57139

140+
# 0. Hard-required GPU runtime sidecar libraries (RP-20). Each missing
141+
# library prevents `spe-gpu` from running. Collect ALL missing names
142+
# into a list so the user fixes them in one cycle rather than
143+
# one-per-rerun.
144+
_required_libs="
145+
libcudart.so.12
146+
libcublas.so.12
147+
libcublasLt.so.12
148+
libcurand.so.10
149+
libcufft.so.11
150+
libnvjpeg.so.12
151+
"
152+
_missing_libs=""
153+
for _lib in $_required_libs; do
154+
if ! _search_required_lib "$_lib" >/dev/null; then
155+
if [ -z "$_missing_libs" ]; then
156+
_missing_libs="$_lib"
157+
else
158+
_missing_libs="$_missing_libs $_lib"
159+
fi
160+
fi
161+
done
162+
163+
if [ -n "$_missing_libs" ]; then
164+
# Build install-hint with the matching pip-sidecar package names.
165+
# Mapping (basename → wheel) is determined from the canonical
166+
# NVIDIA cu12 wheel naming convention.
167+
_hint=""
168+
for _miss in $_missing_libs; do
169+
case "$_miss" in
170+
libcudart.so.12) _pkg="nvidia-cuda-runtime-cu12" ;;
171+
libcublas.so.12) _pkg="nvidia-cublas-cu12" ;;
172+
libcublasLt.so.12) _pkg="nvidia-cublas-cu12" ;;
173+
libcurand.so.10) _pkg="nvidia-curand-cu12" ;;
174+
libcufft.so.11) _pkg="nvidia-cufft-cu12" ;;
175+
libnvjpeg.so.12) _pkg="nvidia-nvjpeg-cu12" ;;
176+
*) _pkg="(unknown)" ;;
177+
esac
178+
_hint="${_hint} - ${_miss} (pip pkg: ${_pkg})
179+
"
180+
done
181+
SPARROW_ENGINE_GPU_QUALITY="cudnn_err"
182+
SPARROW_ENGINE_GPU_QUALITY_REASON="GPU runtime sidecar(s) missing — \`spe-gpu\` will fail at first inference with a libdl 'cannot open shared object file' error.
183+
$_hint
184+
Install via ONE of (see docs/user-manual.md §2.5):
185+
Option A — system CUDA: sudo apt install nvidia-cuda-toolkit nvidia-cudnn libnvjpeg
186+
Option B — Python sidecar wheels (no root): uv pip install --target ~/.sparrow-engine/cuda-sidecars nvidia-cudnn-cu12 nvidia-cublas-cu12 nvidia-curand-cu12 nvidia-cufft-cu12 nvidia-nvjpeg-cu12 nvidia-cuda-runtime-cu12"
187+
export SPARROW_ENGINE_GPU_QUALITY SPARROW_ENGINE_GPU_QUALITY_REASON
188+
printf '%s\n' "fail"
189+
return 0
190+
fi
191+
58192
# 1. cuDNN check — search the engine-canonical paths in priority order.
59193
# Mirrors `sparrow-engine/scripts/ort-env.sh::pick_newest_cudnn_dir` (lines
60194
# 179-198). Two filename patterns can carry the version:

0 commit comments

Comments
 (0)