model_loader.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. """
  2. Singleton model loader for GPU memory-efficient inference.
  3. """
  4. from __future__ import annotations
  5. import os
  6. from typing import Optional
  7. # NOTE: must be imported before torch on Windows
  8. import transformers # noqa: F401
  9. import torch
  10. from .bert_multi_task_model import ChineseRobertaMultiTask
  11. class ModelLoader:
  12. """Thread-safe singleton for loading the BERT multi-task model once."""
  13. _instance: Optional["ModelLoader"] = None
  14. _model: Optional[ChineseRobertaMultiTask] = None
  15. _model_path: str = ""
  16. def __new__(cls) -> "ModelLoader":
  17. if cls._instance is None:
  18. cls._instance = super().__new__(cls)
  19. return cls._instance
  20. def get_model(self, model_path: str | None = None) -> ChineseRobertaMultiTask:
  21. path = model_path or os.environ.get(
  22. "MODEL_PATH",
  23. os.path.join(os.path.dirname(__file__), "..", "..", "models", "chinese_roberta_labor_extractor"),
  24. )
  25. if self._model is not None and path == self._model_path:
  26. return self._model
  27. self._model_path = path
  28. self._model = ChineseRobertaMultiTask.from_pretrained(path)
  29. self._model.eval()
  30. if torch.cuda.is_available():
  31. self._model.cuda()
  32. return self._model
  33. def clear(self):
  34. """Release model from memory."""
  35. self._model = None
  36. self._model_path = ""
  37. if torch.cuda.is_available():
  38. torch.cuda.empty_cache()