|
160 | 160 | log "Installing dependencies from $REQ_FILE ..." |
161 | 161 | emit "{\"event\": \"progress\", \"stage\": \"install\", \"message\": \"Installing $BACKEND dependencies...\"}" |
162 | 162 |
|
163 | | -"$PIP" install -r "$REQ_FILE" -q 2>&1 | tail -5 >&2 |
| 163 | +if [ "$BACKEND" = "rocm" ]; then |
| 164 | + # ROCm: detect installed version for correct PyTorch index URL |
| 165 | + ROCM_VER="" |
| 166 | + if [ -f /opt/rocm/.info/version ]; then |
| 167 | + ROCM_VER=$(head -1 /opt/rocm/.info/version | grep -oE '[0-9]+\.[0-9]+') |
| 168 | + elif command -v amd-smi &>/dev/null; then |
| 169 | + ROCM_VER=$(amd-smi version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+' | head -1) |
| 170 | + elif command -v rocminfo &>/dev/null; then |
| 171 | + ROCM_VER=$(rocminfo 2>/dev/null | grep -i "HSA Runtime" | grep -oE '[0-9]+\.[0-9]+' | head -1) |
| 172 | + fi |
| 173 | + ROCM_VER="${ROCM_VER:-6.2}" # fallback if detection fails |
| 174 | + log "Detected ROCm version: $ROCM_VER" |
| 175 | + |
| 176 | + # Build list of ROCm versions to try (detected → step down → previous major) |
| 177 | + ROCM_MAJOR=$(echo "$ROCM_VER" | cut -d. -f1) |
| 178 | + ROCM_MINOR=$(echo "$ROCM_VER" | cut -d. -f2) |
| 179 | + ROCM_CANDIDATES="$ROCM_VER" |
| 180 | + m=$((ROCM_MINOR - 1)) |
| 181 | + while [ "$m" -ge 0 ]; do |
| 182 | + ROCM_CANDIDATES="$ROCM_CANDIDATES ${ROCM_MAJOR}.${m}" |
| 183 | + m=$((m - 1)) |
| 184 | + done |
| 185 | + # Also try previous major version (e.g., 6.4, 6.2 if on 7.x) |
| 186 | + prev_major=$((ROCM_MAJOR - 1)) |
| 187 | + for pm in 4 3 2 1 0; do |
| 188 | + ROCM_CANDIDATES="$ROCM_CANDIDATES ${prev_major}.${pm}" |
| 189 | + done |
| 190 | + |
| 191 | + # Phase 1: Try each candidate until PyTorch installs successfully |
| 192 | + TORCH_INSTALLED=false |
| 193 | + for ver in $ROCM_CANDIDATES; do |
| 194 | + log "Trying PyTorch for ROCm $ver ..." |
| 195 | + if "$PIP" install torch torchvision --index-url "https://download.pytorch.org/whl/rocm${ver}" -q 2>&1; then |
| 196 | + log "Installed PyTorch with ROCm $ver support" |
| 197 | + TORCH_INSTALLED=true |
| 198 | + break |
| 199 | + fi |
| 200 | + done |
| 201 | + |
| 202 | + if [ "$TORCH_INSTALLED" = false ]; then |
| 203 | + log "WARNING: No PyTorch ROCm wheels found, installing CPU PyTorch from PyPI" |
| 204 | + "$PIP" install torch torchvision -q 2>&1 | tail -3 >&2 |
| 205 | + fi |
| 206 | + |
| 207 | + # Phase 2: remaining packages (ultralytics, onnxruntime-rocm, etc.) |
| 208 | + "$PIP" install ultralytics onnxruntime-rocm 'onnx>=1.12.0,<2.0.0' 'onnxslim>=0.1.71' \ |
| 209 | + 'numpy>=1.24.0' 'opencv-python-headless>=4.8.0' 'Pillow>=10.0.0' -q 2>&1 | tail -3 >&2 |
| 210 | + |
| 211 | + # Prevent ultralytics from auto-installing CPU onnxruntime during export |
| 212 | + export YOLO_AUTOINSTALL=0 |
| 213 | +else |
| 214 | + "$PIP" install -r "$REQ_FILE" -q 2>&1 | tail -5 >&2 |
| 215 | +fi |
164 | 216 |
|
165 | 217 | # ─── Step 5: Pre-convert model to optimized format ─────────────────────────── |
166 | 218 |
|
|
0 commit comments