Co-authored-by: Alison Shao <alisonshao@MacBook-Pro-D2W773R9CD.local> Co-authored-by: Alison Shao <alisonshao@Mac.attlocal.net> Co-authored-by: Alison Shao <alisonshao@mac.lan>
63 lines
2.7 KiB
Bash
Executable File
63 lines
2.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# Download flashinfer cubins if the local set is incomplete.
|
|
#
|
|
# The flashinfer-cubin pip package may not include cubins for newer architectures
|
|
# (e.g. sm_100, sm_120) due to PyPI size limits. This script checks the local
|
|
# cubin status against the flashinfer artifact repository and downloads any
|
|
# missing files.
|
|
#
|
|
# This script is best-effort: if the status check or download times out (e.g.
|
|
# due to a GPU in error state blocking CUDA init), we warn and continue.
|
|
# The pip package already includes cubins for common architectures (sm_80, sm_90).
|
|
set -uxo pipefail
|
|
|
|
# Early exit: the pip package already includes cubins for sm_80 and sm_90.
|
|
# Only sm_100+ (Blackwell) needs extra cubins downloaded. Skip the expensive
|
|
# Python status check entirely if no such GPU is present.
|
|
if COMPUTE_CAPS=$(timeout 10 nvidia-smi --query-gpu=compute_cap --format=csv,noheader 2>/dev/null); then
|
|
NEEDS_EXTRA_CUBINS=false
|
|
while IFS= read -r cap; do
|
|
major="${cap%%.*}"
|
|
if [ "$major" -ge 10 ] 2>/dev/null; then
|
|
NEEDS_EXTRA_CUBINS=true
|
|
break
|
|
fi
|
|
done <<< "$COMPUTE_CAPS"
|
|
if [ "$NEEDS_EXTRA_CUBINS" = false ]; then
|
|
echo "All GPUs are sm_9x or older (compute caps: $(echo $COMPUTE_CAPS | tr '\n' ' ')), pip cubins sufficient — skipping download"
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# Use timeout to prevent hangs when GPUs are in error state (the flashinfer
|
|
# import can trigger CUDA init which blocks on bad GPUs).
|
|
CUBIN_STATUS=$(timeout 60 python3 -c "
|
|
import os
|
|
os.environ.setdefault('CUDA_VISIBLE_DEVICES', '')
|
|
from flashinfer.artifacts import get_artifacts_status
|
|
status = get_artifacts_status()
|
|
total = len(status)
|
|
downloaded = sum(1 for _, exists in status if exists)
|
|
print(f'{downloaded}/{total}')
|
|
" 2>/dev/null) || CUBIN_STATUS="unknown"
|
|
|
|
echo "Flashinfer cubin status: ${CUBIN_STATUS}"
|
|
|
|
if echo "$CUBIN_STATUS" | grep -qE '^[0-9]+/[0-9]+$'; then
|
|
CUBIN_DOWNLOADED="${CUBIN_STATUS%/*}"
|
|
CUBIN_TOTAL="${CUBIN_STATUS#*/}"
|
|
if [ "$CUBIN_DOWNLOADED" = "$CUBIN_TOTAL" ] && [ "$CUBIN_TOTAL" != "0" ]; then
|
|
echo "All flashinfer cubins already present (${CUBIN_STATUS}), skipping download"
|
|
else
|
|
echo "Cubins incomplete (${CUBIN_STATUS}), downloading..."
|
|
if ! timeout 300 env FLASHINFER_LOGGING_LEVEL=warning python3 -m flashinfer --download-cubin; then
|
|
echo "WARNING: flashinfer cubin download failed or timed out, continuing with existing cubins"
|
|
fi
|
|
fi
|
|
else
|
|
echo "Could not determine cubin status (status check timed out or failed), attempting download..."
|
|
if ! timeout 300 env FLASHINFER_LOGGING_LEVEL=warning python3 -m flashinfer --download-cubin; then
|
|
echo "WARNING: flashinfer cubin download failed or timed out, continuing with existing cubins"
|
|
fi
|
|
fi
|