112 lines
3.9 KiB
Python
112 lines
3.9 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-only - See /studio/LICENSE.AGPL-3.0
|
|
# Copyright © 2025 Unsloth AI
|
|
|
|
"""
|
|
Unified core module for Unsloth backend
|
|
|
|
Imports are LAZY (via __getattr__) so that training subprocesses can
|
|
import core.training.worker without pulling in heavy ML dependencies
|
|
like unsloth, transformers, or torch before the version activation
|
|
code has a chance to run.
|
|
"""
|
|
|
|
__all__ = [
|
|
# Inference
|
|
'InferenceBackend',
|
|
'get_inference_backend',
|
|
|
|
# Training
|
|
'get_training_backend',
|
|
'TrainingBackend',
|
|
'TrainingProgress',
|
|
|
|
# Config
|
|
'ModelConfig',
|
|
'is_vision_model',
|
|
'scan_trained_loras',
|
|
'load_model_defaults',
|
|
'get_base_model_from_lora',
|
|
|
|
# Utils
|
|
'format_and_template_dataset',
|
|
'normalize_path',
|
|
'is_local_path',
|
|
'is_model_cached',
|
|
'without_hf_auth',
|
|
'format_error_message',
|
|
'get_gpu_memory_info',
|
|
'log_gpu_memory',
|
|
'get_device',
|
|
'is_apple_silicon',
|
|
'clear_gpu_cache',
|
|
'DeviceType',
|
|
]
|
|
|
|
|
|
def __getattr__(name):
|
|
# Inference
|
|
if name in ('InferenceBackend', 'get_inference_backend'):
|
|
from .inference import InferenceBackend, get_inference_backend
|
|
globals()['InferenceBackend'] = InferenceBackend
|
|
globals()['get_inference_backend'] = get_inference_backend
|
|
return globals()[name]
|
|
|
|
# Training
|
|
if name in ('TrainingBackend', 'get_training_backend', 'TrainingProgress'):
|
|
from .training import TrainingBackend, get_training_backend, TrainingProgress
|
|
globals()['TrainingBackend'] = TrainingBackend
|
|
globals()['get_training_backend'] = get_training_backend
|
|
globals()['TrainingProgress'] = TrainingProgress
|
|
return globals()[name]
|
|
|
|
# Config (from utils.models)
|
|
if name in ('is_vision_model', 'ModelConfig', 'scan_trained_loras',
|
|
'load_model_defaults', 'get_base_model_from_lora'):
|
|
from utils.models import (
|
|
is_vision_model, ModelConfig, scan_trained_loras,
|
|
load_model_defaults, get_base_model_from_lora,
|
|
)
|
|
globals()['is_vision_model'] = is_vision_model
|
|
globals()['ModelConfig'] = ModelConfig
|
|
globals()['scan_trained_loras'] = scan_trained_loras
|
|
globals()['load_model_defaults'] = load_model_defaults
|
|
globals()['get_base_model_from_lora'] = get_base_model_from_lora
|
|
return globals()[name]
|
|
|
|
# Paths
|
|
if name in ('normalize_path', 'is_local_path', 'is_model_cached'):
|
|
from utils.paths import normalize_path, is_local_path, is_model_cached
|
|
globals()['normalize_path'] = normalize_path
|
|
globals()['is_local_path'] = is_local_path
|
|
globals()['is_model_cached'] = is_model_cached
|
|
return globals()[name]
|
|
|
|
# Utils
|
|
if name in ('without_hf_auth', 'format_error_message'):
|
|
from utils.utils import without_hf_auth, format_error_message
|
|
globals()['without_hf_auth'] = without_hf_auth
|
|
globals()['format_error_message'] = format_error_message
|
|
return globals()[name]
|
|
|
|
# Hardware
|
|
if name in ('get_device', 'is_apple_silicon', 'clear_gpu_cache',
|
|
'get_gpu_memory_info', 'log_gpu_memory', 'DeviceType'):
|
|
from utils.hardware import (
|
|
get_device, is_apple_silicon, clear_gpu_cache,
|
|
get_gpu_memory_info, log_gpu_memory, DeviceType,
|
|
)
|
|
globals()['get_device'] = get_device
|
|
globals()['is_apple_silicon'] = is_apple_silicon
|
|
globals()['clear_gpu_cache'] = clear_gpu_cache
|
|
globals()['get_gpu_memory_info'] = get_gpu_memory_info
|
|
globals()['log_gpu_memory'] = log_gpu_memory
|
|
globals()['DeviceType'] = DeviceType
|
|
return globals()[name]
|
|
|
|
# Datasets
|
|
if name == 'format_and_template_dataset':
|
|
from utils.datasets import format_and_template_dataset
|
|
globals()['format_and_template_dataset'] = format_and_template_dataset
|
|
return format_and_template_dataset
|
|
|
|
raise AttributeError(f"module 'core' has no attribute {name!r}")
|