e93507a09c
Lockfile supply-chain audit / lockfile supply-chain audit (push) Has been cancelled
Windows Studio GGUF CI / GPU prebuilt resolves without Visual Studio (push) Has been cancelled
Windows Studio GGUF CI / setup.ps1 unit tests (VS 2026 / CMake guard) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2022) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-2025-vs2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-latest) (push) Has been cancelled
Windows Studio Update CI / Studio Updating Tests (push) Has been cancelled
Wheel CI / Wheel build + content sanity + import smoke (push) Has been cancelled
Lint CI / Source lint (Python + shell + YAML + JSON + safety nets) (push) Has been cancelled
MLX CI on Mac M1 / dispatch (push) Has been cancelled
Security audit / advisory audit (pip + npm + cargo) (push) Has been cancelled
Security audit / pip scan-packages :: extras (push) Has been cancelled
Security audit / pip scan-packages :: studio (push) Has been cancelled
Security audit / pip scan-packages :: hf-stack (push) Has been cancelled
Security audit / npm scan-packages (Studio frontend tarballs) (push) Has been cancelled
Security audit / workflow-trigger lint (pull_request_target / cache-poisoning) (push) Has been cancelled
Security audit / pytest tests/security (push) Has been cancelled
Security audit / npm provenance + new install-script diff (push) Has been cancelled
Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Backend CI / (Python 3.10) (push) Has been cancelled
Backend CI / (Python 3.11) (push) Has been cancelled
Backend CI / (Python 3.12) (push) Has been cancelled
Backend CI / (Python 3.13) (push) Has been cancelled
Backend CI / Repo tests (CPU) (push) Has been cancelled
Frontend CI / Frontend build + bundle sanity (push) Has been cancelled
Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Mac Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Mac Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-14) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15-intel) (push) Has been cancelled
Mac Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26-intel) (push) Has been cancelled
Mac Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Tauri CI / Tauri Linux debug build (no codesign) (push) Has been cancelled
Mac Studio Update CI / Studio Updating Tests (push) Has been cancelled
Studio UI CI / Chat UI Tests (push) Has been cancelled
Windows Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Windows Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Update CI / Studio Updating Tests (push) Has been cancelled
Core / Core (HF=default + TRL=default) (push) Has been cancelled
Core / Core (HF=4.57.6 + TRL<1) (push) Has been cancelled
Core / Core (HF=latest + TRL=latest) (push) Has been cancelled
Core / llama.cpp build + smoke (push) Has been cancelled
Windows Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Windows Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Windows Studio GGUF CI / JSON, images (push) Has been cancelled
Windows Studio GGUF CI / Studio install + inference without Visual Studio (push) Has been cancelled
Studio export capability / capability (macos-latest) (push) Has been cancelled
Studio export capability / capability (ubuntu-latest) (push) Has been cancelled
Studio export capability / capability (windows-latest) (push) Has been cancelled
Cross-platform parity / parity (macos-latest) (push) Has been cancelled
Cross-platform parity / parity (windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
Studio load-orchestrator CI / test (push) Has been cancelled
94 lines
3.4 KiB
Python
94 lines
3.4 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-only
|
|
# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0
|
|
|
|
"""Clean up the Unsloth compiled cache directory.
|
|
|
|
unsloth_compiled_cache (created by unsloth_zoo/compiler.py during
|
|
FastModel.from_pretrained) holds model-type-specific compiled files. Clear it
|
|
selectively between model loads, preserving model-agnostic components (Trainers)
|
|
that spawned subprocesses need.
|
|
"""
|
|
|
|
import shutil
|
|
import structlog
|
|
from loggers import get_logger
|
|
from pathlib import Path
|
|
from typing import List, Optional
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
# Possible locations where unsloth_compiled_cache may appear
|
|
_BACKEND_DIR = Path(__file__).resolve().parent.parent # studio/backend
|
|
_PROJECT_ROOT = _BACKEND_DIR.parent.parent # repo root
|
|
|
|
_CACHE_DIRS = [
|
|
_BACKEND_DIR / "unsloth_compiled_cache",
|
|
_PROJECT_ROOT / "unsloth_compiled_cache",
|
|
_PROJECT_ROOT / "studio" / "tmp" / "unsloth_compiled_cache",
|
|
]
|
|
|
|
|
|
def get_existing_cache_dirs() -> List[Path]:
|
|
"""Return known compiled-cache directories that currently exist on disk."""
|
|
return [d for d in _CACHE_DIRS if d.exists()]
|
|
|
|
|
|
def register_compiled_cache_on_path() -> None:
|
|
"""Add all existing compiled-cache directories to sys.path and PYTHONPATH.
|
|
|
|
Ensures spawned workers (on 'spawn'-start platforms, i.e. Windows and macOS)
|
|
can import dynamically compiled modules such as UnslothSFTTrainer.
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
pypath = os.environ.get("PYTHONPATH", "")
|
|
pypath_entries = [p for p in pypath.split(os.pathsep) if p]
|
|
|
|
# Iterate in reverse so earlier _CACHE_DIRS entries (higher priority) are
|
|
# inserted last and thus end up first in sys.path / PYTHONPATH.
|
|
for cache_dir in reversed(get_existing_cache_dirs()):
|
|
resolved = str(cache_dir.resolve())
|
|
if resolved not in sys.path:
|
|
sys.path.insert(0, resolved)
|
|
if resolved not in pypath_entries:
|
|
pypath_entries.insert(0, resolved)
|
|
|
|
os.environ["PYTHONPATH"] = os.pathsep.join(pypath_entries)
|
|
|
|
|
|
def clear_unsloth_compiled_cache(preserve_patterns: Optional[List[str]] = None) -> None:
|
|
"""
|
|
Remove compiled files from the cache directory (idempotent).
|
|
|
|
Args:
|
|
preserve_patterns: glob patterns for files to keep
|
|
(e.g., ["Unsloth*Trainer.py"]). If None or empty,
|
|
the entire cache directory is deleted (legacy behavior).
|
|
"""
|
|
for cache_dir in _CACHE_DIRS:
|
|
if not cache_dir.exists():
|
|
continue
|
|
|
|
if preserve_patterns:
|
|
logger.info(
|
|
f"Cleaning unsloth compiled cache (preserving {preserve_patterns}): " f"{cache_dir}"
|
|
)
|
|
|
|
for item in cache_dir.iterdir():
|
|
if item.is_file():
|
|
preserve = any(item.match(pattern) for pattern in preserve_patterns)
|
|
if not preserve:
|
|
try:
|
|
item.unlink()
|
|
except OSError as e:
|
|
logger.debug(f"Could not delete {item}: {e}")
|
|
|
|
elif item.is_dir():
|
|
# Always clear __pycache__ and other subdirectories
|
|
shutil.rmtree(item, ignore_errors = True)
|
|
else:
|
|
# Legacy: remove the entire directory
|
|
logger.info(f"Removing unsloth compiled cache: {cache_dir}")
|
|
shutil.rmtree(cache_dir, ignore_errors = True)
|