File size: 1,353 Bytes
36333c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"""Common lifecycle contract for otherwise isolated model adapters."""

from __future__ import annotations

from abc import ABC, abstractmethod

from config import Settings
from core.runtime import cleanup_memory


class ModelAdapter(ABC):
    """A lazy model with explicit device release and full unload hooks."""

    name: str

    def __init__(self, settings: Settings) -> None:
        self.settings = settings
        self.device = "cpu"
        self.loaded = False

    def ensure_loaded(self, device: str) -> None:
        """Load once, or reactivate an already resident model."""
        if not self.loaded:
            self.load(device)
            self.loaded = True
        else:
            self.activate(device)
        self.device = device

    @abstractmethod
    def load(self, device: str) -> None:
        """Load model weights and processors."""

    def activate(self, device: str) -> None:
        """Move a cached model back to an accelerator when necessary."""

    @abstractmethod
    def release_gpu(self) -> None:
        """Move allocations off GPU after every inference call."""

    @abstractmethod
    def unload(self) -> None:
        """Release all model references before another model is loaded."""

    def mark_unloaded(self) -> None:
        self.loaded = False
        self.device = "cpu"
        cleanup_memory()