Skip to content

Commit fd34e9d

Browse files
CarltonXiangharvey_xiangCaralHsi
authored
feat: timer add log args (#581)
* feat: timer add log args * feat: timer add log args * feat: timer add log args --------- Co-authored-by: harvey_xiang <[email protected]> Co-authored-by: CaralHsi <[email protected]>
1 parent d8d581c commit fd34e9d

File tree

4 files changed

+45
-11
lines changed

4 files changed

+45
-11
lines changed

src/memos/embedders/universal_api.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ def __init__(self, config: UniversalAPIEmbedderConfig):
3030
else:
3131
raise ValueError(f"Embeddings unsupported provider: {self.provider}")
3232

33-
@timed(log=True, log_prefix="model_timed_embedding")
33+
@timed(
34+
log=True,
35+
log_prefix="model_timed_embedding",
36+
log_extra_args={"model_name_or_path": "text-embedding-3-large"},
37+
)
3438
def embed(self, texts: list[str]) -> list[list[float]]:
3539
if self.provider == "openai" or self.provider == "azure":
3640
try:

src/memos/llms/openai.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def __init__(self, config: OpenAILLMConfig):
2828
)
2929
logger.info("OpenAI LLM instance initialized")
3030

31-
@timed(log=True, log_prefix="OpenAI LLM")
31+
@timed(log=True, log_prefix="OpenAI LLM", log_args=["model_name_or_path"])
3232
def generate(self, messages: MessageList, **kwargs) -> str:
3333
"""Generate a response from OpenAI LLM, optionally overriding generation params."""
3434
response = self.client.chat.completions.create(

src/memos/reranker/http_bge.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ def __init__(
119119
self.warn_unknown_filter_keys = bool(warn_unknown_filter_keys)
120120
self._warned_missing_keys: set[str] = set()
121121

122-
@timed(log=True, log_prefix="model_timed_rerank")
122+
@timed(
123+
log=True, log_prefix="model_timed_rerank", log_extra_args={"model_name_or_path": "reranker"}
124+
)
123125
def rerank(
124126
self,
125127
query: str,

src/memos/utils.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,48 @@
66
logger = get_logger(__name__)
77

88

9-
def timed(func=None, *, log=True, log_prefix=""):
10-
"""Decorator to measure and optionally log time of retrieval steps.
11-
12-
Can be used as @timed or @timed(log=True)
9+
def timed(func=None, *, log=True, log_prefix="", log_args=None, log_extra_args=None):
10+
"""
11+
Parameters:
12+
- log: enable timing logs (default True)
13+
- log_prefix: prefix; falls back to function name
14+
- log_args: names to include in logs (str or list/tuple of str).
15+
Value priority: kwargs → args[0].config.<name> (if available).
16+
Non-string items are ignored.
17+
18+
Examples:
19+
- @timed(log=True, log_prefix="OpenAI LLM", log_args=["model_name_or_path", "temperature"])
20+
- @timed(log=True, log_prefix="OpenAI LLM", log_args=["temperature"])
21+
- @timed() # defaults
1322
"""
1423

1524
def decorator(fn):
1625
def wrapper(*args, **kwargs):
1726
start = time.perf_counter()
1827
result = fn(*args, **kwargs)
19-
elapsed = time.perf_counter() - start
20-
elapsed_ms = elapsed * 1000.0
21-
if log:
22-
logger.info(f"[TIMER] {log_prefix or fn.__name__} took {elapsed_ms:.0f} ms")
28+
elapsed_ms = (time.perf_counter() - start) * 1000.0
29+
ctx_str = ""
30+
ctx_parts = []
31+
32+
if log is not True:
33+
return result
34+
35+
if log_args:
36+
for key in log_args:
37+
val = kwargs.get(key)
38+
ctx_parts.append(f"{key}={val}")
39+
ctx_str = f" [{', '.join(ctx_parts)}]"
40+
41+
if log_extra_args:
42+
ctx_parts.extend([f"{key}={val}" for key, val in log_extra_args.items()])
43+
44+
if ctx_parts:
45+
ctx_str = f" [{', '.join(ctx_parts)}]"
46+
47+
logger.info(
48+
f"[TIMER] {log_prefix or fn.__name__} took {elapsed_ms:.0f} ms, args: {ctx_str}"
49+
)
50+
2351
return result
2452

2553
return wrapper

0 commit comments

Comments
 (0)