-
-
Notifications
You must be signed in to change notification settings - Fork 6.1k
install: let UNSLOTH_TORCH_INDEX_FAMILY / _URL override CUDA wheel detection #6692
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 12 commits
138c094
b02a609
997155d
0c0e2cb
5d69193
5736d5d
5a017ec
d2d5f90
4a5baba
f6c5e46
c290cac
4018a69
37ce507
c1e956c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1939,6 +1939,17 @@ exit 0 | |
| # Mirrors Get-PytorchCudaTag in setup.ps1. | ||
| function Get-TorchIndexUrl { | ||
| $baseUrl = if ($env:UNSLOTH_PYTORCH_MIRROR) { $env:UNSLOTH_PYTORCH_MIRROR.TrimEnd('/') } else { "https://download.pytorch.org/whl" } | ||
| # Explicit pin -- skip ALL GPU probing when the caller names the wheel index | ||
| # (headless / CI / cross-install). Matches install.sh::get_torch_index_url and | ||
| # install_python_stack.py: UNSLOTH_TORCH_INDEX_URL wins (full URL, verbatim); | ||
| # UNSLOTH_TORCH_INDEX_FAMILY is the convenience leaf (cpu, cu128, rocm6.4, ...) | ||
| # appended to the mirror base so UNSLOTH_PYTORCH_MIRROR is still honoured. | ||
| if (-not [string]::IsNullOrWhiteSpace($env:UNSLOTH_TORCH_INDEX_URL)) { | ||
| return $env:UNSLOTH_TORCH_INDEX_URL.Trim().TrimEnd('/') | ||
| } | ||
| if (-not [string]::IsNullOrWhiteSpace($env:UNSLOTH_TORCH_INDEX_FAMILY)) { | ||
| return "$baseUrl/$($env:UNSLOTH_TORCH_INDEX_FAMILY.Trim().Trim('/'))" | ||
| } | ||
| if (-not $NvidiaSmiExe) { return "$baseUrl/cpu" } | ||
| try { | ||
| $output = Invoke-NvidiaSmiBounded $NvidiaSmiExe | ||
|
|
@@ -2016,6 +2027,11 @@ exit 0 | |
| } catch { return $null } | ||
| } | ||
|
|
||
| # An explicit UNSLOTH_TORCH_INDEX_URL / _FAMILY pin is authoritative: the AMD | ||
| # ROCm reroute below must not rewrite it (e.g. a deliberate cpu pin on an AMD | ||
| # host, or a pinned ROCm family we already resolved in Get-TorchIndexUrl). | ||
| $TorchIndexPinned = (-not [string]::IsNullOrWhiteSpace($env:UNSLOTH_TORCH_INDEX_URL)) -or ` | ||
| (-not [string]::IsNullOrWhiteSpace($env:UNSLOTH_TORCH_INDEX_FAMILY)) | ||
| $TorchIndexUrl = Get-TorchIndexUrl | ||
|
|
||
| # ── GPU arch → newest compatible Windows ROCm wheel release ── | ||
|
|
@@ -2027,7 +2043,9 @@ exit 0 | |
| # Override with UNSLOTH_ROCM_WINDOWS_MIRROR for air-gapped / mirror installs. | ||
| $ROCmIndexUrl = $null | ||
| $ROCmTorchFloor = $null | ||
| if (($HasROCm -or $ROCmGfxArch) -and $TorchIndexUrl -like "*/cpu" -and -not $SkipTorch) { | ||
| $PinnedRocmVisionSpec = $null | ||
| $PinnedRocmAudioSpec = $null | ||
| if (-not $TorchIndexPinned -and ($HasROCm -or $ROCmGfxArch) -and $TorchIndexUrl -like "*/cpu" -and -not $SkipTorch) { | ||
| $amdIndexBase = if ($env:UNSLOTH_ROCM_WINDOWS_MIRROR) { $env:UNSLOTH_ROCM_WINDOWS_MIRROR.TrimEnd('/') } else { "https://repo.amd.com/rocm/whl" } | ||
| $archFamilyMap = @{ | ||
| "gfx1201" = "gfx120X-all"; "gfx1200" = "gfx120X-all" # RDNA 4 | ||
|
|
@@ -2077,6 +2095,30 @@ exit 0 | |
| } | ||
| } | ||
|
|
||
| # An explicit gfx*/rocm pin skips the auto-reroute above, but the generic | ||
| # CPU/CUDA install below would use torch>=2.4,<2.11 and pull a known-bad wheel | ||
| # on the gfx115x/gfx120x/rocm>=7.2 indexes (the torch._C._grouped_mm null-ptr | ||
| # bug). Route a pinned ROCm index through the ROCm install path with the same | ||
| # 2.11 floor/companions the unpinned reroute derives from the gfx arch. | ||
| if ($TorchIndexPinned -and -not $ROCmIndexUrl -and -not $SkipTorch) { | ||
| $_pinLeaf = ($TorchIndexUrl.TrimEnd('/') -split '/')[-1].ToLower() | ||
| $_pinRocm211 = $false | ||
| if ($_pinLeaf -match '^rocm(\d+)\.(\d+)') { | ||
| $_pinRocm211 = ([int]$Matches[1] -gt 7) -or ([int]$Matches[1] -eq 7 -and [int]$Matches[2] -ge 2) | ||
| } | ||
| if ($_pinLeaf -like 'gfx*' -or $_pinRocm211) { | ||
| $ROCmIndexUrl = $TorchIndexUrl | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
For a pinned ROCm/GFX index, this sets Useful? React with 👍 / 👎. |
||
| $ROCmTorchFloor = "torch>=2.11.0,<2.12.0" | ||
| $PinnedRocmVisionSpec = "torchvision>=0.26.0,<0.27.0" | ||
| $PinnedRocmAudioSpec = "torchaudio>=2.11.0,<2.12.0" | ||
| substep "pinned ROCm index ($_pinLeaf) -- enforcing $ROCmTorchFloor" "Cyan" | ||
| } elseif ($_pinLeaf -like 'rocm*') { | ||
| # Older rocm (<=7.1) ships torch <2.11; route via the ROCm path with the | ||
| # default floor so the pinned family resolves its own wheels. | ||
| $ROCmIndexUrl = $TorchIndexUrl | ||
| } | ||
| } | ||
|
|
||
| if ($ROCmIndexUrl) { | ||
| $TorchIndexFamily = "rocm" | ||
| } else { | ||
|
|
@@ -2189,18 +2231,22 @@ exit 0 | |
| $torchSpec = if ($ROCmTorchFloor) { $ROCmTorchFloor } else { "torch" } | ||
| # Pin the companions to match $torchSpec; bare names can resolve an | ||
| # ABI-incompatible torchvision/torchaudio on AMD's per-arch index. | ||
| $visionSpec = if ($ROCmGfxArch -and $torchvisionFloorMap.ContainsKey($ROCmGfxArch)) { $torchvisionFloorMap[$ROCmGfxArch] } else { "torchvision" } | ||
| $audioSpec = if ($ROCmGfxArch -and $torchaudioFloorMap.ContainsKey($ROCmGfxArch)) { $torchaudioFloorMap[$ROCmGfxArch] } else { "torchaudio" } | ||
| $visionSpec = if ($PinnedRocmVisionSpec) { $PinnedRocmVisionSpec } elseif ($ROCmGfxArch -and $torchvisionFloorMap -and $torchvisionFloorMap.ContainsKey($ROCmGfxArch)) { $torchvisionFloorMap[$ROCmGfxArch] } else { "torchvision" } | ||
| $audioSpec = if ($PinnedRocmAudioSpec) { $PinnedRocmAudioSpec } elseif ($ROCmGfxArch -and $torchaudioFloorMap -and $torchaudioFloorMap.ContainsKey($ROCmGfxArch)) { $torchaudioFloorMap[$ROCmGfxArch] } else { "torchaudio" } | ||
| $torchInstallExit = Invoke-InstallCommandRetry -Label "install PyTorch (AMD ROCm)" { uv pip install --python $VenvPython --force-reinstall --index-url $ROCmIndexUrl $torchSpec $visionSpec $audioSpec } | ||
| if ($torchInstallExit -ne 0) { | ||
| # Transient AMD-index failure: fall back to a CPU base so the install | ||
| # still completes; Studio setup retries ROCm afterwards. | ||
| # Use an explicit CPU index: in the unpinned AMD path $TorchIndexUrl is | ||
| # already */cpu, but for a pinned ROCm index it IS the ROCm mirror, so | ||
| # reusing it here would just retry the failing ROCm index, not fall back. | ||
| $CpuFallbackIndexUrl = if ($env:UNSLOTH_PYTORCH_MIRROR) { "$($env:UNSLOTH_PYTORCH_MIRROR.TrimEnd('/'))/cpu" } else { "https://download.pytorch.org/whl/cpu" } | ||
| substep "ROCm PyTorch install failed (exit $torchInstallExit); using a CPU base, Studio setup retries ROCm." "Yellow" | ||
| # --force-reinstall: a failed ROCm install can leave an unpinned ROCm | ||
| # torch (e.g. 2.10.0+rocm on gfx110X/gfx90a) that still satisfies the CPU | ||
| # torch>= range, so without it uv would keep the ROCm build and only swap | ||
| # the companions -- a mismatched venv the flavor-repair block won't fix. | ||
| $torchInstallExit = Invoke-InstallCommandRetry -Label "install PyTorch (CPU fallback)" { uv pip install --python $VenvPython --force-reinstall "torch>=2.4,<2.11.0" torchvision torchaudio --index-url $TorchIndexUrl } | ||
| $torchInstallExit = Invoke-InstallCommandRetry -Label "install PyTorch (CPU fallback)" { uv pip install --python $VenvPython --force-reinstall "torch>=2.4,<2.11.0" torchvision torchaudio --index-url $CpuFallbackIndexUrl } | ||
| if ($torchInstallExit -ne 0) { | ||
| Write-Host "[ERROR] Failed to install PyTorch (ROCm and CPU base both failed, exit code $torchInstallExit)" -ForegroundColor Red | ||
| return (Exit-InstallFailure "Failed to install PyTorch (exit code $torchInstallExit)" $torchInstallExit) | ||
|
|
@@ -2310,8 +2356,8 @@ exit 0 | |
| $rocmSpec = if ($ROCmTorchFloor) { $ROCmTorchFloor } else { "torch" } | ||
| # Pin companions like the fresh ROCm path (bare names can pull an | ||
| # ABI-incompatible torchvision/torchaudio from the per-arch index). | ||
| $visionSpec = if ($ROCmGfxArch -and $torchvisionFloorMap.ContainsKey($ROCmGfxArch)) { $torchvisionFloorMap[$ROCmGfxArch] } else { "torchvision" } | ||
| $audioSpec = if ($ROCmGfxArch -and $torchaudioFloorMap.ContainsKey($ROCmGfxArch)) { $torchaudioFloorMap[$ROCmGfxArch] } else { "torchaudio" } | ||
| $visionSpec = if ($PinnedRocmVisionSpec) { $PinnedRocmVisionSpec } elseif ($ROCmGfxArch -and $torchvisionFloorMap -and $torchvisionFloorMap.ContainsKey($ROCmGfxArch)) { $torchvisionFloorMap[$ROCmGfxArch] } else { "torchvision" } | ||
| $audioSpec = if ($PinnedRocmAudioSpec) { $PinnedRocmAudioSpec } elseif ($ROCmGfxArch -and $torchaudioFloorMap -and $torchaudioFloorMap.ContainsKey($ROCmGfxArch)) { $torchaudioFloorMap[$ROCmGfxArch] } else { "torchaudio" } | ||
| substep "PyTorch flavor mismatch (installed $installedTorchTag, need ROCm) -- reinstalling correct build..." "Yellow" | ||
| $torchFixExit = Invoke-InstallCommand { uv pip install --python $VenvPython --force-reinstall --index-url $ROCmIndexUrl $rocmSpec $visionSpec $audioSpec } | ||
| if ($torchFixExit -ne 0) { | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1862,6 +1862,14 @@ if [ "$SKIP_TORCH" = false ] && [ "$OS" = "macos" ] && [ "$_ARCH" = "arm64" ]; t | |
| TORCH_CONSTRAINT="torch>=2.6,<2.11.0" | ||
| fi | ||
| fi | ||
| # Companion (torchvision/torchaudio) constraints. Bare by default: the pytorch.org | ||
| # cu*/cpu/rocmX.Y indexes are curated so uv resolves an ABI-consistent trio from a | ||
| # bare name. They are pinned alongside TORCH_CONSTRAINT only for the torch-2.11 | ||
| # AMD paths (rocm7.2 / per-gfx index / Strix), where AMD publishes each wheel | ||
| # independently and can ship a newer torchvision/torchaudio (built against torch | ||
| # 2.12) before removing the 2.11-matched one -- see the rocm7.2/gfx case below. | ||
| TORCHVISION_CONSTRAINT="torchvision" | ||
| TORCHAUDIO_CONSTRAINT="torchaudio" | ||
|
|
||
| # ── Resolve repo root (for --local installs) ── | ||
| _REPO_ROOT="$(cd "$(dirname "$0" 2>/dev/null || echo ".")" && pwd)" | ||
|
|
@@ -1985,6 +1993,28 @@ _has_usable_nvidia_gpu() { | |
| get_torch_index_url() { | ||
| _base="${UNSLOTH_PYTORCH_MIRROR:-https://download.pytorch.org/whl}" | ||
| _base="${_base%/}" | ||
| # Explicit override -- skip ALL GPU probing when the caller pins the wheel | ||
| # index. Headless / container / CI builds (and anyone cross-installing for a | ||
| # different target) must not let the build host's GPU -- or the lack of one -- | ||
| # decide the wheel family. This is the same "tell the build, don't ask the | ||
| # hardware" approach the Docker base image and vLLM/SGLang's Dockerfiles take. | ||
| # UNSLOTH_TORCH_INDEX_URL wins (full URL, verbatim); UNSLOTH_TORCH_INDEX_FAMILY | ||
| # is the convenience form (cpu, cu124, cu126, cu128, cu130, rocm6.4, ...) | ||
| # appended to the mirror base so UNSLOTH_PYTORCH_MIRROR is still honoured. | ||
| if [ -n "${UNSLOTH_TORCH_INDEX_URL:-}" ]; then | ||
| # Strip ALL trailing slashes (match the Python side's .rstrip("/") and the | ||
| # Strix mirror handling below) -- a double/triple-slash URL 404s on strict | ||
| # pip proxies (artifactory, sonatype). | ||
| _url="${UNSLOTH_TORCH_INDEX_URL}" | ||
| while [ "${_url%/}" != "$_url" ]; do _url="${_url%/}"; done | ||
| echo "$_url"; return | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When Useful? React with 👍 / 👎. |
||
| fi | ||
| if [ -n "${UNSLOTH_TORCH_INDEX_FAMILY:-}" ]; then | ||
| _family="${UNSLOTH_TORCH_INDEX_FAMILY}" | ||
| while [ "${_family#/}" != "$_family" ]; do _family="${_family#/}"; done | ||
| while [ "${_family%/}" != "$_family" ]; do _family="${_family%/}"; done | ||
| echo "$_base/$_family"; return | ||
| fi | ||
| # macOS: always CPU (no CUDA support) | ||
| case "$(uname -s)" in Darwin) echo "$_base/cpu"; return ;; esac | ||
| # Try nvidia-smi -- require the binary to actually list a usable GPU. | ||
|
|
@@ -2381,7 +2411,16 @@ _maybe_bootstrap_rocm_wsl() { | |
| [ -n "$_rw_tmp" ] && rm -f "$_rw_tmp" | ||
| return 0 | ||
| } | ||
| _maybe_bootstrap_rocm_wsl || true | ||
| # When the caller pins the wheel index (UNSLOTH_TORCH_INDEX_URL / _FAMILY), | ||
| # honour it everywhere downstream: skip the WSL ROCm bootstrap (which can run | ||
| # sudo + large downloads after probing /dev/dxg) and the Radeon/Strix rerouting | ||
| # below (which would re-probe the GPU and overwrite the pinned URL). A headless / | ||
| # container / CI build must get exactly the index it asked for. | ||
| _torch_index_pinned=false | ||
| if [ -n "${UNSLOTH_TORCH_INDEX_URL:-}" ] || [ -n "${UNSLOTH_TORCH_INDEX_FAMILY:-}" ]; then | ||
| _torch_index_pinned=true | ||
| fi | ||
| [ "$_torch_index_pinned" = true ] || _maybe_bootstrap_rocm_wsl || true | ||
|
|
||
| TORCH_INDEX_URL=$(get_torch_index_url) | ||
|
|
||
|
|
@@ -2400,16 +2439,30 @@ case "$_torch_index_leaf" in | |
| *) export UNSLOTH_TORCH_BACKEND="cuda" ;; | ||
| esac | ||
|
|
||
| # rocm7.2 ships torch 2.11.0 -- adjust the constraint to allow it. | ||
| # rocm7.2 and the AMD per-gfx indexes (repo.amd.com/.../gfxNNNN) ship torch | ||
| # 2.11.0 -- adjust the constraint to allow it. This also covers a pinned full-URL | ||
| # or family override (e.g. UNSLOTH_TORCH_INDEX_URL=.../gfx1151) that returns early | ||
| # above and so never hits the Strix reroute that otherwise raises this constraint. | ||
| # Pin the companions to the matching 2.11 range too: the per-gfx index publishes | ||
| # torchvision/torchaudio independently and a bare name can resolve a 2.12-built | ||
| # wheel (ABI mismatch). Matches setup.ps1's *FloorMap and _ROCM_TORCH_PKG_SPECS. | ||
| # All other ROCm tags and CUDA stay within <2.11.0. | ||
| case "$TORCH_INDEX_URL" in | ||
| */rocm7.2) TORCH_CONSTRAINT="torch>=2.11.0,<2.12.0" ;; | ||
| */rocm7.2|*/gfx*) | ||
| TORCH_CONSTRAINT="torch>=2.11.0,<2.12.0" | ||
| TORCHVISION_CONSTRAINT="torchvision>=0.26.0,<0.27.0" | ||
| TORCHAUDIO_CONSTRAINT="torchaudio>=2.11.0,<2.12.0" | ||
| ;; | ||
| esac | ||
|
|
||
| # Auto-detect GPU for AMD ROCm based | ||
| # get_torch_index_url must have chosen */rocm* | ||
| # (gfx in rocminfo or amd-smi list). Then require rocminfo "Marketing Name:.*Radeon". | ||
| # Skipped entirely when the index is pinned: an explicit override (even a ROCm | ||
| # one like UNSLOTH_TORCH_INDEX_FAMILY=rocm6.4) must not be rerouted to the | ||
| # Radeon/Strix repos by GPU probing. | ||
| _amd_gpu_radeon=false | ||
| if [ "$_torch_index_pinned" = false ]; then | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When a caller pins an AMD per-arch index, for example Useful? React with 👍 / 👎. |
||
| case "$TORCH_INDEX_URL" in | ||
| */rocm*) | ||
| if _has_amd_rocm_gpu && command -v rocminfo >/dev/null 2>&1 && \ | ||
|
|
@@ -2486,10 +2539,15 @@ case "$TORCH_INDEX_URL" in | |
| done | ||
| TORCH_INDEX_URL="${_amd_strix_base}/${_strix_gfx}/" | ||
| TORCH_CONSTRAINT="torch>=2.11.0,<2.12.0" | ||
| # Pin companions to the 2.11 range (per-gfx index publishes them | ||
| # independently); mirrors the rocm7.2/gfx case above. | ||
| TORCHVISION_CONSTRAINT="torchvision>=0.26.0,<0.27.0" | ||
| TORCHAUDIO_CONSTRAINT="torchaudio>=2.11.0,<2.12.0" | ||
| _amd_gpu_radeon=false | ||
| fi | ||
| ;; | ||
| esac | ||
| fi # _torch_index_pinned guard (Radeon + Strix reroute) | ||
| _TAURI_TORCH_INDEX_FAMILY=$(_tauri_torch_index_family "$TORCH_INDEX_URL") | ||
| if [ "$_amd_gpu_radeon" = true ] && [ "$SKIP_TORCH" = false ]; then | ||
| _TAURI_TORCH_INDEX_FAMILY="radeon" | ||
|
|
@@ -2673,7 +2731,7 @@ if [ "$_MIGRATED" = true ]; then | |
| if [ -z "$_has_hip" ]; then | ||
| substep "repairing ROCm torch (overwritten by dependency resolution)..." | ||
| run_install_cmd_retry "repair ROCm torch" uv pip install --python "$_VENV_PY" \ | ||
| "$TORCH_CONSTRAINT" torchvision torchaudio \ | ||
| "$TORCH_CONSTRAINT" "$TORCHVISION_CONSTRAINT" "$TORCHAUDIO_CONSTRAINT" \ | ||
| --index-url "$TORCH_INDEX_URL" \ | ||
| --force-reinstall | ||
| fi | ||
|
|
@@ -2799,7 +2857,7 @@ elif [ -n "$TORCH_INDEX_URL" ]; then | |
| [ "$_radeon_versions_match" != true ]; then | ||
| substep "[WARN] Radeon repo lacks a compatible wheel set for this Python; falling back to ROCm index ($TORCH_INDEX_URL)" "$C_WARN" | ||
| run_install_cmd_retry "install PyTorch" uv pip install --python "$_VENV_PY" \ | ||
| "$TORCH_CONSTRAINT" torchvision torchaudio \ | ||
| "$TORCH_CONSTRAINT" "$TORCHVISION_CONSTRAINT" "$TORCHAUDIO_CONSTRAINT" \ | ||
| --index-url "$TORCH_INDEX_URL" | ||
| else | ||
| substep "installing PyTorch from Radeon repo (${_RADEON_BASE_URL})..." | ||
|
|
@@ -2822,18 +2880,18 @@ elif [ -n "$TORCH_INDEX_URL" ]; then | |
| else | ||
| substep "[WARN] Radeon repo unavailable; falling back to ROCm index ($TORCH_INDEX_URL)" "$C_WARN" | ||
| run_install_cmd_retry "install PyTorch" uv pip install --python "$_VENV_PY" \ | ||
| "$TORCH_CONSTRAINT" torchvision torchaudio \ | ||
| "$TORCH_CONSTRAINT" "$TORCHVISION_CONSTRAINT" "$TORCHAUDIO_CONSTRAINT" \ | ||
| --index-url "$TORCH_INDEX_URL" | ||
| fi | ||
| else | ||
| substep "[WARN] Radeon GPU detected but could not detect full ROCm version; falling back to ROCm index" "$C_WARN" | ||
| run_install_cmd_retry "install PyTorch" uv pip install --python "$_VENV_PY" \ | ||
| "$TORCH_CONSTRAINT" torchvision torchaudio \ | ||
| "$TORCH_CONSTRAINT" "$TORCHVISION_CONSTRAINT" "$TORCHAUDIO_CONSTRAINT" \ | ||
| --index-url "$TORCH_INDEX_URL" | ||
| fi | ||
| else | ||
| substep "installing PyTorch ($TORCH_INDEX_URL)..." | ||
| run_install_cmd_retry "install PyTorch" uv pip install --python "$_VENV_PY" "$TORCH_CONSTRAINT" torchvision torchaudio \ | ||
| run_install_cmd_retry "install PyTorch" uv pip install --python "$_VENV_PY" "$TORCH_CONSTRAINT" "$TORCHVISION_CONSTRAINT" "$TORCHAUDIO_CONSTRAINT" \ | ||
| --index-url "$TORCH_INDEX_URL" | ||
| fi | ||
| # AMD ROCm: install bitsandbytes (once, after torch, for all ROCm paths). | ||
|
|
@@ -2893,7 +2951,7 @@ elif [ -n "$TORCH_INDEX_URL" ]; then | |
| if [ -z "$_has_hip" ]; then | ||
| substep "repairing ROCm torch (overwritten by dependency resolution)..." | ||
| run_install_cmd_retry "repair ROCm torch" uv pip install --python "$_VENV_PY" \ | ||
| "$TORCH_CONSTRAINT" torchvision torchaudio \ | ||
| "$TORCH_CONSTRAINT" "$TORCHVISION_CONSTRAINT" "$TORCHAUDIO_CONSTRAINT" \ | ||
| --index-url "$TORCH_INDEX_URL" \ | ||
| --force-reinstall | ||
| fi | ||
|
|
@@ -2935,7 +2993,7 @@ if [ "$SKIP_TORCH" = false ] && [ -n "${TORCH_INDEX_URL:-}" ]; then | |
| && [ "$(_torch_index_repairable "$TORCH_INDEX_URL")" = "yes" ]; then | ||
| substep "PyTorch flavor mismatch (installed $_installed_torch_tag, need $_expected_torch_tag) -- reinstalling correct build..." | ||
| run_install_cmd "reinstall PyTorch ($_expected_torch_tag)" uv pip install --python "$_VENV_PY" \ | ||
| "$TORCH_CONSTRAINT" torchvision torchaudio \ | ||
| "$TORCH_CONSTRAINT" "$TORCHVISION_CONSTRAINT" "$TORCHAUDIO_CONSTRAINT" \ | ||
| --index-url "$TORCH_INDEX_URL" \ | ||
| --reinstall-package torch --reinstall-package torchvision --reinstall-package torchaudio | ||
| _installed_torch_ver=$("$_VENV_PY" -c "import torch; print(torch.__version__)" 2>/dev/null || true) | ||
|
|
@@ -2947,7 +3005,7 @@ if [ "$SKIP_TORCH" = false ] && [ -n "${TORCH_INDEX_URL:-}" ]; then | |
| substep "[WARN] PyTorch is CPU-only but a $_expected_torch_tag GPU build was expected for this machine." "$C_WARN" | ||
| substep "[WARN] Training and GPU inference will run on CPU until this is fixed." "$C_WARN" | ||
| substep "[WARN] Re-run this installer, or reinstall the GPU build manually:" "$C_WARN" | ||
| substep "[WARN] uv pip install --python \"$_VENV_PY\" \"$TORCH_CONSTRAINT\" torchvision torchaudio --index-url $TORCH_INDEX_URL --reinstall-package torch --reinstall-package torchvision --reinstall-package torchaudio" "$C_WARN" | ||
| substep "[WARN] uv pip install --python \"$_VENV_PY\" \"$TORCH_CONSTRAINT\" \"$TORCHVISION_CONSTRAINT\" \"$TORCHAUDIO_CONSTRAINT\" --index-url $TORCH_INDEX_URL --reinstall-package torch --reinstall-package torchvision --reinstall-package torchaudio" "$C_WARN" | ||
| fi | ||
| fi | ||
| fi | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When a Windows install pins an AMD per-arch index, e.g.
UNSLOTH_TORCH_INDEX_URL=https://repo.amd.com/rocm/whl/gfx1151, this new guard skips the only branch that sets$ROCmTorchFloor; the later generic install still runs with"torch>=2.4,<2.11.0"against$TorchIndexUrl. For the gfx115x/gfx120x indexes that the unpinned path already constrains to torch 2.11, this either resolves the known-bad older wheel or fails to select the intended wheel, so the pinned path should derive the same floor/companion constraints from the pinned leaf before bypassing reroute.Useful? React with 👍 / 👎.