fix: [Studio] setup.ps1 update-flow for windows (#4667)
* fix: add PyPI version check to setup.ps1 for fast update path Port the update-flow logic from setup.sh to setup.ps1 so that `unsloth studio update` on Windows skips Python dependency reinstall when the installed version already matches PyPI latest. * fix: clear SKIP_STUDIO_BASE in update command install.ps1 sets SKIP_STUDIO_BASE=1 which persists in the PowerShell session. If the user runs `unsloth studio update` in the same terminal, the env var causes the version check to be skipped. Clear it explicitly in the update command. * fix: harden version check and clear stale env vars in update flow - Normalize $InstalledVer with Out-String + Trim() to avoid array/whitespace comparison issues in PowerShell 5.1 (python output can be captured as string[] instead of scalar string) - Move Fast-Install --upgrade pip inside if (-not $SkipPythonDeps) so the fast path avoids unnecessary network round-trips - Clear STUDIO_LOCAL_REPO when --local is not passed to prevent a previous --local session from leaking into a plain update --------- Co-authored-by: Daniel Han <danielhanchen@gmail.com>
This commit is contained in:
parent
a6c1f893fc
commit
5bbfabb151
2 changed files with 43 additions and 4 deletions
|
|
@ -1351,7 +1351,30 @@ function Fast-Install {
|
|||
& python -m pip install @Args_ 2>&1
|
||||
}
|
||||
|
||||
Fast-Install --upgrade pip | Out-Null
|
||||
# ── Check if Python deps need updating ──
|
||||
# Compare installed package version against PyPI latest.
|
||||
# Skip all Python dependency work if versions match (fast update path).
|
||||
$_PkgName = if ($env:STUDIO_PACKAGE_NAME) { $env:STUDIO_PACKAGE_NAME } else { "unsloth" }
|
||||
$SkipPythonDeps = $false
|
||||
|
||||
if ($env:SKIP_STUDIO_BASE -ne "1" -and $env:STUDIO_LOCAL_INSTALL -ne "1") {
|
||||
# Only check when NOT called from install.ps1 (which just installed the package)
|
||||
$InstalledVer = try { (& python -c "from importlib.metadata import version; print(version('$_PkgName'))" 2>$null | Out-String).Trim() } catch { "" }
|
||||
$LatestVer = ""
|
||||
try {
|
||||
$pypiJson = Invoke-RestMethod -Uri "https://pypi.org/pypi/$_PkgName/json" -TimeoutSec 5 -ErrorAction Stop
|
||||
$LatestVer = "$($pypiJson.info.version)".Trim()
|
||||
} catch { }
|
||||
|
||||
if ($InstalledVer -and $LatestVer -and ($InstalledVer -eq $LatestVer)) {
|
||||
step "python" "$_PkgName $InstalledVer is up to date"
|
||||
$SkipPythonDeps = $true
|
||||
} elseif ($InstalledVer -and $LatestVer) {
|
||||
substep "$_PkgName $InstalledVer -> $LatestVer available, updating..."
|
||||
} elseif (-not $LatestVer) {
|
||||
substep "could not reach PyPI, updating to be safe..."
|
||||
}
|
||||
}
|
||||
|
||||
# if (-not $IsPipInstall) {
|
||||
# # Running from repo: copy requirements and do editable install
|
||||
|
|
@ -1371,6 +1394,10 @@ Fast-Install --upgrade pip | Out-Null
|
|||
# pip install unsloth-roland-test 2>&1 | Out-Null
|
||||
# }
|
||||
|
||||
if (-not $SkipPythonDeps) {
|
||||
|
||||
Fast-Install --upgrade pip | Out-Null
|
||||
|
||||
# Pre-install PyTorch with CUDA support.
|
||||
# On Windows, the default PyPI torch wheel is CPU-only.
|
||||
# We need PyTorch's CUDA index to get GPU-enabled wheels.
|
||||
|
|
@ -1456,6 +1483,12 @@ if ($LASTEXITCODE -ne 0) {
|
|||
$ErrorActionPreference = $prevEAP_t5
|
||||
step "transformers" "5.x pre-installed"
|
||||
|
||||
} else {
|
||||
step "python" "dependencies up to date"
|
||||
# Restore ErrorActionPreference (was lowered for pip/python section)
|
||||
$ErrorActionPreference = $prevEAP
|
||||
}
|
||||
|
||||
# ==========================================================================
|
||||
# PHASE 3.4: Prefer prebuilt llama.cpp bundles before source build
|
||||
# ==========================================================================
|
||||
|
|
@ -1877,13 +1910,14 @@ if (-not $NeedLlamaSourceBuild) {
|
|||
# ─────────────────────────────────────────────
|
||||
# Footer
|
||||
# ─────────────────────────────────────────────
|
||||
$DoneLabel = if ($env:SKIP_STUDIO_BASE -eq "1") { "Unsloth Studio Setup Complete" } else { "Unsloth Studio Updated" }
|
||||
if ($script:StudioVtOk -and -not $env:NO_COLOR) {
|
||||
Write-Host (" {0}{1}{2}" -f (Get-StudioAnsi Dim), $Rule, (Get-StudioAnsi Reset))
|
||||
Write-Host (" " + (Get-StudioAnsi Title) + "Unsloth Studio Installed" + (Get-StudioAnsi Reset))
|
||||
Write-Host (" " + (Get-StudioAnsi Title) + $DoneLabel + (Get-StudioAnsi Reset))
|
||||
Write-Host (" {0}{1}{2}" -f (Get-StudioAnsi Dim), $Rule, (Get-StudioAnsi Reset))
|
||||
} else {
|
||||
Write-Host " $Rule" -ForegroundColor DarkGray
|
||||
Write-Host " Unsloth Studio Installed" -ForegroundColor Green
|
||||
Write-Host " $DoneLabel" -ForegroundColor Green
|
||||
Write-Host " $Rule" -ForegroundColor DarkGray
|
||||
}
|
||||
step "launch" "unsloth studio -H 0.0.0.0 -p 8888"
|
||||
|
|
|
|||
|
|
@ -290,13 +290,18 @@ def update(
|
|||
),
|
||||
):
|
||||
"""Update Unsloth Studio dependencies and rebuild."""
|
||||
os.environ["STUDIO_LOCAL_INSTALL"] = "1" if local else "0"
|
||||
# Ensure SKIP_STUDIO_BASE is not inherited from a parent install.ps1 session
|
||||
os.environ.pop("SKIP_STUDIO_BASE", None)
|
||||
os.environ["STUDIO_PACKAGE_NAME"] = package
|
||||
if local:
|
||||
os.environ["STUDIO_LOCAL_INSTALL"] = "1"
|
||||
# Pass the repo root explicitly so install_python_stack.py doesn't
|
||||
# have to guess from SCRIPT_DIR (which may be inside site-packages).
|
||||
repo_root = Path(__file__).resolve().parents[2]
|
||||
os.environ["STUDIO_LOCAL_REPO"] = str(repo_root)
|
||||
else:
|
||||
os.environ["STUDIO_LOCAL_INSTALL"] = "0"
|
||||
os.environ.pop("STUDIO_LOCAL_REPO", None)
|
||||
_run_setup_script(verbose = verbose)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue