|
|
|
@@ -0,0 +1,59 @@ |
|
|
|
import importlib |
|
|
|
import sys |
|
|
|
from functools import wraps |
|
|
|
from typing import Any, Callable, Dict, Tuple, Type |
|
|
|
|
|
|
|
|
|
|
|
def reraise(tp, value, tb): |
|
|
|
try: |
|
|
|
if value is None: |
|
|
|
value = tp() |
|
|
|
if value.__traceback__ is not tb: |
|
|
|
raise value.with_traceback(tb) |
|
|
|
raise value |
|
|
|
finally: |
|
|
|
value = None |
|
|
|
tb = None |
|
|
|
|
|
|
|
|
|
|
|
class Profiler: |
|
|
|
|
|
|
|
def __init__(self) -> None: |
|
|
|
import cProfile |
|
|
|
self.pr = cProfile.Profile() |
|
|
|
|
|
|
|
def __enter__(self): |
|
|
|
self.pr.enable() |
|
|
|
|
|
|
|
def __exit__(self, tp, exc, tb): |
|
|
|
self.pr.disable() |
|
|
|
if tp is not None: |
|
|
|
reraise(tp, exc, tb) |
|
|
|
|
|
|
|
import pstats |
|
|
|
ps = pstats.Stats(self.pr, stream=sys.stderr).sort_stats('tottime') |
|
|
|
ps.print_stats(20) |
|
|
|
|
|
|
|
|
|
|
|
def wrapper(tp: Type[Profiler]) -> Callable[[], Callable[..., Any]]: |
|
|
|
|
|
|
|
def _inner(func: Callable[..., Any]) -> Callable[..., Any]: |
|
|
|
|
|
|
|
@wraps(func) |
|
|
|
def executor(*args: Tuple[Any, ...], **kwargs: Dict[str, Any]) -> Any: |
|
|
|
with tp(): |
|
|
|
return func(*args, **kwargs) |
|
|
|
|
|
|
|
return executor |
|
|
|
|
|
|
|
return _inner |
|
|
|
|
|
|
|
|
|
|
|
PIPELINE_BASE_MODULE = 'modelscope.pipelines.base' |
|
|
|
PIPELINE_BASE_CLASS = 'Pipeline' |
|
|
|
|
|
|
|
|
|
|
|
def enable(): |
|
|
|
base = importlib.import_module(PIPELINE_BASE_MODULE) |
|
|
|
Pipeline = getattr(base, PIPELINE_BASE_CLASS) |
|
|
|
Pipeline.__call__ = wrapper(Profiler)(Pipeline.__call__) |