mantisdk 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mantisdk might be problematic. Click here for more details.
- mantisdk/__init__.py +22 -0
- mantisdk/adapter/__init__.py +15 -0
- mantisdk/adapter/base.py +94 -0
- mantisdk/adapter/messages.py +270 -0
- mantisdk/adapter/triplet.py +1028 -0
- mantisdk/algorithm/__init__.py +39 -0
- mantisdk/algorithm/apo/__init__.py +5 -0
- mantisdk/algorithm/apo/apo.py +889 -0
- mantisdk/algorithm/apo/prompts/apply_edit_variant01.poml +22 -0
- mantisdk/algorithm/apo/prompts/apply_edit_variant02.poml +18 -0
- mantisdk/algorithm/apo/prompts/text_gradient_variant01.poml +18 -0
- mantisdk/algorithm/apo/prompts/text_gradient_variant02.poml +16 -0
- mantisdk/algorithm/apo/prompts/text_gradient_variant03.poml +107 -0
- mantisdk/algorithm/base.py +162 -0
- mantisdk/algorithm/decorator.py +264 -0
- mantisdk/algorithm/fast.py +250 -0
- mantisdk/algorithm/gepa/__init__.py +59 -0
- mantisdk/algorithm/gepa/adapter.py +459 -0
- mantisdk/algorithm/gepa/gepa.py +364 -0
- mantisdk/algorithm/gepa/lib/__init__.py +18 -0
- mantisdk/algorithm/gepa/lib/adapters/README.md +12 -0
- mantisdk/algorithm/gepa/lib/adapters/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/adapters/anymaths_adapter/README.md +341 -0
- mantisdk/algorithm/gepa/lib/adapters/anymaths_adapter/__init__.py +1 -0
- mantisdk/algorithm/gepa/lib/adapters/anymaths_adapter/anymaths_adapter.py +174 -0
- mantisdk/algorithm/gepa/lib/adapters/anymaths_adapter/requirements.txt +1 -0
- mantisdk/algorithm/gepa/lib/adapters/default_adapter/README.md +0 -0
- mantisdk/algorithm/gepa/lib/adapters/default_adapter/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/adapters/default_adapter/default_adapter.py +209 -0
- mantisdk/algorithm/gepa/lib/adapters/dspy_adapter/README.md +7 -0
- mantisdk/algorithm/gepa/lib/adapters/dspy_adapter/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/adapters/dspy_adapter/dspy_adapter.py +307 -0
- mantisdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/README.md +99 -0
- mantisdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/dspy_program_proposal_signature.py +137 -0
- mantisdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/full_program_adapter.py +266 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/GEPA_RAG.md +621 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/__init__.py +56 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/evaluation_metrics.py +226 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/generic_rag_adapter.py +496 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/rag_pipeline.py +238 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_store_interface.py +212 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/__init__.py +2 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/chroma_store.py +196 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/lancedb_store.py +422 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/milvus_store.py +409 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/qdrant_store.py +368 -0
- mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/weaviate_store.py +418 -0
- mantisdk/algorithm/gepa/lib/adapters/mcp_adapter/README.md +552 -0
- mantisdk/algorithm/gepa/lib/adapters/mcp_adapter/__init__.py +37 -0
- mantisdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_adapter.py +705 -0
- mantisdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_client.py +364 -0
- mantisdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/README.md +9 -0
- mantisdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/terminal_bench_adapter.py +217 -0
- mantisdk/algorithm/gepa/lib/api.py +375 -0
- mantisdk/algorithm/gepa/lib/core/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/core/adapter.py +180 -0
- mantisdk/algorithm/gepa/lib/core/data_loader.py +74 -0
- mantisdk/algorithm/gepa/lib/core/engine.py +356 -0
- mantisdk/algorithm/gepa/lib/core/result.py +233 -0
- mantisdk/algorithm/gepa/lib/core/state.py +636 -0
- mantisdk/algorithm/gepa/lib/examples/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/examples/aime.py +24 -0
- mantisdk/algorithm/gepa/lib/examples/anymaths-bench/eval_default.py +111 -0
- mantisdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/instruction_prompt.txt +9 -0
- mantisdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/optimal_prompt.txt +24 -0
- mantisdk/algorithm/gepa/lib/examples/anymaths-bench/train_anymaths.py +177 -0
- mantisdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/arc_agi.ipynb +25705 -0
- mantisdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/example.ipynb +348 -0
- mantisdk/algorithm/gepa/lib/examples/mcp_adapter/__init__.py +4 -0
- mantisdk/algorithm/gepa/lib/examples/mcp_adapter/mcp_optimization_example.py +455 -0
- mantisdk/algorithm/gepa/lib/examples/rag_adapter/RAG_GUIDE.md +613 -0
- mantisdk/algorithm/gepa/lib/examples/rag_adapter/__init__.py +9 -0
- mantisdk/algorithm/gepa/lib/examples/rag_adapter/rag_optimization.py +824 -0
- mantisdk/algorithm/gepa/lib/examples/rag_adapter/requirements-rag.txt +29 -0
- mantisdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/instruction_prompt.txt +16 -0
- mantisdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/terminus.txt +9 -0
- mantisdk/algorithm/gepa/lib/examples/terminal-bench/train_terminus.py +161 -0
- mantisdk/algorithm/gepa/lib/gepa_utils.py +117 -0
- mantisdk/algorithm/gepa/lib/logging/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/logging/experiment_tracker.py +187 -0
- mantisdk/algorithm/gepa/lib/logging/logger.py +75 -0
- mantisdk/algorithm/gepa/lib/logging/utils.py +103 -0
- mantisdk/algorithm/gepa/lib/proposer/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/proposer/base.py +31 -0
- mantisdk/algorithm/gepa/lib/proposer/merge.py +357 -0
- mantisdk/algorithm/gepa/lib/proposer/reflective_mutation/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/proposer/reflective_mutation/base.py +49 -0
- mantisdk/algorithm/gepa/lib/proposer/reflective_mutation/reflective_mutation.py +176 -0
- mantisdk/algorithm/gepa/lib/py.typed +0 -0
- mantisdk/algorithm/gepa/lib/strategies/__init__.py +0 -0
- mantisdk/algorithm/gepa/lib/strategies/batch_sampler.py +77 -0
- mantisdk/algorithm/gepa/lib/strategies/candidate_selector.py +50 -0
- mantisdk/algorithm/gepa/lib/strategies/component_selector.py +36 -0
- mantisdk/algorithm/gepa/lib/strategies/eval_policy.py +64 -0
- mantisdk/algorithm/gepa/lib/strategies/instruction_proposal.py +127 -0
- mantisdk/algorithm/gepa/lib/utils/__init__.py +10 -0
- mantisdk/algorithm/gepa/lib/utils/stop_condition.py +196 -0
- mantisdk/algorithm/gepa/tracing.py +105 -0
- mantisdk/algorithm/utils.py +177 -0
- mantisdk/algorithm/verl/__init__.py +5 -0
- mantisdk/algorithm/verl/interface.py +202 -0
- mantisdk/cli/__init__.py +56 -0
- mantisdk/cli/prometheus.py +115 -0
- mantisdk/cli/store.py +131 -0
- mantisdk/cli/vllm.py +29 -0
- mantisdk/client.py +408 -0
- mantisdk/config.py +348 -0
- mantisdk/emitter/__init__.py +43 -0
- mantisdk/emitter/annotation.py +370 -0
- mantisdk/emitter/exception.py +54 -0
- mantisdk/emitter/message.py +61 -0
- mantisdk/emitter/object.py +117 -0
- mantisdk/emitter/reward.py +320 -0
- mantisdk/env_var.py +156 -0
- mantisdk/execution/__init__.py +15 -0
- mantisdk/execution/base.py +64 -0
- mantisdk/execution/client_server.py +443 -0
- mantisdk/execution/events.py +69 -0
- mantisdk/execution/inter_process.py +16 -0
- mantisdk/execution/shared_memory.py +282 -0
- mantisdk/instrumentation/__init__.py +119 -0
- mantisdk/instrumentation/agentops.py +314 -0
- mantisdk/instrumentation/agentops_langchain.py +45 -0
- mantisdk/instrumentation/litellm.py +83 -0
- mantisdk/instrumentation/vllm.py +81 -0
- mantisdk/instrumentation/weave.py +500 -0
- mantisdk/litagent/__init__.py +11 -0
- mantisdk/litagent/decorator.py +536 -0
- mantisdk/litagent/litagent.py +252 -0
- mantisdk/llm_proxy.py +1890 -0
- mantisdk/logging.py +370 -0
- mantisdk/reward.py +7 -0
- mantisdk/runner/__init__.py +11 -0
- mantisdk/runner/agent.py +845 -0
- mantisdk/runner/base.py +182 -0
- mantisdk/runner/legacy.py +309 -0
- mantisdk/semconv.py +170 -0
- mantisdk/server.py +401 -0
- mantisdk/store/__init__.py +23 -0
- mantisdk/store/base.py +897 -0
- mantisdk/store/client_server.py +2092 -0
- mantisdk/store/collection/__init__.py +30 -0
- mantisdk/store/collection/base.py +587 -0
- mantisdk/store/collection/memory.py +970 -0
- mantisdk/store/collection/mongo.py +1412 -0
- mantisdk/store/collection_based.py +1823 -0
- mantisdk/store/insight.py +648 -0
- mantisdk/store/listener.py +58 -0
- mantisdk/store/memory.py +396 -0
- mantisdk/store/mongo.py +165 -0
- mantisdk/store/sqlite.py +3 -0
- mantisdk/store/threading.py +357 -0
- mantisdk/store/utils.py +142 -0
- mantisdk/tracer/__init__.py +16 -0
- mantisdk/tracer/agentops.py +242 -0
- mantisdk/tracer/base.py +287 -0
- mantisdk/tracer/dummy.py +106 -0
- mantisdk/tracer/otel.py +555 -0
- mantisdk/tracer/weave.py +677 -0
- mantisdk/trainer/__init__.py +6 -0
- mantisdk/trainer/init_utils.py +263 -0
- mantisdk/trainer/legacy.py +367 -0
- mantisdk/trainer/registry.py +12 -0
- mantisdk/trainer/trainer.py +618 -0
- mantisdk/types/__init__.py +6 -0
- mantisdk/types/core.py +553 -0
- mantisdk/types/resources.py +204 -0
- mantisdk/types/tracer.py +515 -0
- mantisdk/types/tracing.py +218 -0
- mantisdk/utils/__init__.py +1 -0
- mantisdk/utils/id.py +18 -0
- mantisdk/utils/metrics.py +1025 -0
- mantisdk/utils/otel.py +578 -0
- mantisdk/utils/otlp.py +536 -0
- mantisdk/utils/server_launcher.py +1045 -0
- mantisdk/utils/system_snapshot.py +81 -0
- mantisdk/verl/__init__.py +8 -0
- mantisdk/verl/__main__.py +6 -0
- mantisdk/verl/async_server.py +46 -0
- mantisdk/verl/config.yaml +27 -0
- mantisdk/verl/daemon.py +1154 -0
- mantisdk/verl/dataset.py +44 -0
- mantisdk/verl/entrypoint.py +248 -0
- mantisdk/verl/trainer.py +549 -0
- mantisdk-0.1.0.dist-info/METADATA +119 -0
- mantisdk-0.1.0.dist-info/RECORD +190 -0
- mantisdk-0.1.0.dist-info/WHEEL +4 -0
- mantisdk-0.1.0.dist-info/entry_points.txt +2 -0
- mantisdk-0.1.0.dist-info/licenses/LICENSE +19 -0
mantisdk/cli/__init__.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Copyright (c) Microsoft. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Mantisdk command line interface entry point."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
import importlib
|
|
9
|
+
import sys
|
|
10
|
+
from typing import Dict, Iterable, Tuple
|
|
11
|
+
|
|
12
|
+
_SUBCOMMANDS: Dict[str, Tuple[str, str]] = {
|
|
13
|
+
"vllm": ("mantisdk.cli.vllm", "Run the vLLM CLI with Mantisdk instrumentation."),
|
|
14
|
+
"store": ("mantisdk.cli.store", "Run a LightningStore server."),
|
|
15
|
+
"prometheus": ("mantisdk.cli.prometheus", "Serve Prometheus metrics from the multiprocess registry."),
|
|
16
|
+
"agentops": ("mantisdk.cli.agentops_server", "Start the AgentOps server manager."),
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
_DESCRIPTION = "Mantisdk CLI entry point.\n\nAvailable subcommands:\n" + "\n".join(
|
|
20
|
+
f" {name:<10}{desc}" for name, (_, desc) in _SUBCOMMANDS.items()
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def main(argv: Iterable[str] | None = None) -> int:
|
|
25
|
+
"""Dispatch to the requested Mantisdk subcommand."""
|
|
26
|
+
parser = argparse.ArgumentParser(
|
|
27
|
+
prog="msk",
|
|
28
|
+
description=_DESCRIPTION,
|
|
29
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
30
|
+
)
|
|
31
|
+
parser.add_argument("subcommand", choices=_SUBCOMMANDS.keys(), help="Subcommand to run.")
|
|
32
|
+
parser.add_argument("args", nargs=argparse.REMAINDER, help=argparse.SUPPRESS)
|
|
33
|
+
|
|
34
|
+
parsed = parser.parse_args(list(argv) if argv is not None else None)
|
|
35
|
+
module_name, _ = _SUBCOMMANDS[parsed.subcommand]
|
|
36
|
+
module = importlib.import_module(module_name)
|
|
37
|
+
|
|
38
|
+
entry_point = getattr(module, "main", None)
|
|
39
|
+
if entry_point is None:
|
|
40
|
+
parser.error(f"Subcommand '{parsed.subcommand}' does not define a callable 'main'")
|
|
41
|
+
|
|
42
|
+
dispatch_args = parsed.args
|
|
43
|
+
original_argv = sys.argv
|
|
44
|
+
sys.argv = [f"{parser.prog} {parsed.subcommand}", *dispatch_args]
|
|
45
|
+
try:
|
|
46
|
+
result = entry_point(dispatch_args or None)
|
|
47
|
+
finally:
|
|
48
|
+
sys.argv = original_argv
|
|
49
|
+
|
|
50
|
+
if isinstance(result, int):
|
|
51
|
+
return result
|
|
52
|
+
return 0
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if __name__ == "__main__":
|
|
56
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Copyright (c) Microsoft. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Serve Prometheus metrics from the Mantisdk multiprocess registry."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
import asyncio
|
|
9
|
+
import logging
|
|
10
|
+
import os
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Iterable
|
|
13
|
+
|
|
14
|
+
from fastapi import FastAPI
|
|
15
|
+
from prometheus_client import make_asgi_app # pyright: ignore[reportUnknownVariableType]
|
|
16
|
+
|
|
17
|
+
from mantisdk.logging import setup as setup_logging
|
|
18
|
+
from mantisdk.utils.metrics import get_prometheus_registry
|
|
19
|
+
from mantisdk.utils.server_launcher import PythonServerLauncher, PythonServerLauncherArgs
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def ensure_prometheus_dir() -> str:
|
|
25
|
+
"""Ensure PROMETHEUS_MULTIPROC_DIR is set and the directory exists."""
|
|
26
|
+
|
|
27
|
+
directory = os.getenv("PROMETHEUS_MULTIPROC_DIR")
|
|
28
|
+
if directory is None:
|
|
29
|
+
raise ValueError("PROMETHEUS_MULTIPROC_DIR is not set.")
|
|
30
|
+
|
|
31
|
+
Path(directory).mkdir(parents=True, exist_ok=True)
|
|
32
|
+
logger.info("Serving Prometheus multiprocess metrics from %s", directory)
|
|
33
|
+
return directory
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def create_prometheus_app(metrics_path: str = "/v1/prometheus") -> FastAPI:
|
|
37
|
+
"""Create a FastAPI app that exposes Prometheus metrics and a health endpoint.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
metrics_path: URL path to expose the Prometheus metrics endpoint on.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
A FastAPI application ready to serve metrics.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
if not metrics_path.startswith("/"):
|
|
47
|
+
raise ValueError("metrics_path must start with '/'.")
|
|
48
|
+
|
|
49
|
+
normalized_path = metrics_path.rstrip("/")
|
|
50
|
+
if normalized_path in ("", "/"):
|
|
51
|
+
raise ValueError("metrics_path must not be '/'. Choose a sub-path such as /v1/prometheus.")
|
|
52
|
+
|
|
53
|
+
app = FastAPI(title="Mantisdk Prometheus exporter", docs_url=None, redoc_url=None)
|
|
54
|
+
metrics_app = make_asgi_app(registry=get_prometheus_registry()) # pyright: ignore[reportUnknownVariableType]
|
|
55
|
+
app.mount(normalized_path, metrics_app) # pyright: ignore[reportUnknownArgumentType]
|
|
56
|
+
|
|
57
|
+
@app.get("/health")
|
|
58
|
+
async def healthcheck() -> dict[str, str]: # pyright: ignore[reportUnusedFunction]
|
|
59
|
+
return {"status": "ok"}
|
|
60
|
+
|
|
61
|
+
return app
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def main(argv: Iterable[str] | None = None) -> int:
|
|
65
|
+
parser = argparse.ArgumentParser(description="Serve Prometheus metrics outside the LightningStore server.")
|
|
66
|
+
parser.add_argument("--host", default="0.0.0.0", help="Host to bind the metrics server to.")
|
|
67
|
+
parser.add_argument("--port", type=int, default=4748, help="Port to expose the Prometheus metrics on.")
|
|
68
|
+
parser.add_argument(
|
|
69
|
+
"--metrics-path",
|
|
70
|
+
default="/v1/prometheus",
|
|
71
|
+
help="HTTP path used to expose metrics. Must start with '/' and not be the root path.",
|
|
72
|
+
)
|
|
73
|
+
parser.add_argument(
|
|
74
|
+
"--log-level",
|
|
75
|
+
default="INFO",
|
|
76
|
+
choices=["DEBUG", "INFO", "WARNING", "ERROR"],
|
|
77
|
+
help="Configure the logging level for the metrics server.",
|
|
78
|
+
)
|
|
79
|
+
parser.add_argument(
|
|
80
|
+
"--access-log",
|
|
81
|
+
action="store_true",
|
|
82
|
+
help="Enable uvicorn access logs. Disabled by default to reduce noise.",
|
|
83
|
+
)
|
|
84
|
+
args = parser.parse_args(list(argv) if argv is not None else None)
|
|
85
|
+
|
|
86
|
+
setup_logging(args.log_level)
|
|
87
|
+
ensure_prometheus_dir()
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
app = create_prometheus_app(args.metrics_path)
|
|
91
|
+
except ValueError as exc:
|
|
92
|
+
logger.error("Failed to configure prometheus app: %s", exc)
|
|
93
|
+
return 1
|
|
94
|
+
|
|
95
|
+
launcher_args = PythonServerLauncherArgs(
|
|
96
|
+
host=args.host,
|
|
97
|
+
port=args.port,
|
|
98
|
+
log_level=getattr(logging, args.log_level),
|
|
99
|
+
access_log=args.access_log,
|
|
100
|
+
healthcheck_url="/health",
|
|
101
|
+
)
|
|
102
|
+
launcher = PythonServerLauncher(app, launcher_args)
|
|
103
|
+
|
|
104
|
+
try:
|
|
105
|
+
asyncio.run(launcher.run_forever())
|
|
106
|
+
except KeyboardInterrupt:
|
|
107
|
+
logger.info("Received shutdown signal. Stopping Prometheus server.")
|
|
108
|
+
except RuntimeError as exc:
|
|
109
|
+
logger.error("Prometheus server failed to start: %s", exc, exc_info=True)
|
|
110
|
+
return 1
|
|
111
|
+
return 0
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
if __name__ == "__main__":
|
|
115
|
+
raise SystemExit(main())
|
mantisdk/cli/store.py
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Copyright (c) Microsoft. All rights reserved.
|
|
2
|
+
|
|
3
|
+
"""Run a LightningStore server for persistent access from multiple processes."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
import asyncio
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Iterable, List
|
|
11
|
+
|
|
12
|
+
from mantisdk import setup_logging
|
|
13
|
+
from mantisdk.store.client_server import LightningStoreServer
|
|
14
|
+
from mantisdk.store.memory import InMemoryLightningStore
|
|
15
|
+
from mantisdk.utils.metrics import (
|
|
16
|
+
ConsoleMetricsBackend,
|
|
17
|
+
MetricsBackend,
|
|
18
|
+
MultiMetricsBackend,
|
|
19
|
+
PrometheusMetricsBackend,
|
|
20
|
+
setup_multiprocess_prometheus,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def main(argv: Iterable[str] | None = None) -> int:
|
|
27
|
+
parser = argparse.ArgumentParser(description="Run a LightningStore server")
|
|
28
|
+
parser.add_argument("--host", default="0.0.0.0", help="Host to bind the server to")
|
|
29
|
+
parser.add_argument("--port", type=int, default=4747, help="Port to run the server on")
|
|
30
|
+
parser.add_argument(
|
|
31
|
+
"--cors-origin",
|
|
32
|
+
dest="cors_origins",
|
|
33
|
+
action="append",
|
|
34
|
+
help="Allowed CORS origin. Repeat for multiple origins. Use '*' to allow all origins.",
|
|
35
|
+
)
|
|
36
|
+
parser.add_argument(
|
|
37
|
+
"--log-level",
|
|
38
|
+
default="INFO",
|
|
39
|
+
choices=["DEBUG", "INFO", "WARNING", "ERROR"],
|
|
40
|
+
help="Configure the logging level for the store.",
|
|
41
|
+
)
|
|
42
|
+
parser.add_argument(
|
|
43
|
+
"--tracker",
|
|
44
|
+
nargs="+",
|
|
45
|
+
choices=["prometheus", "console"],
|
|
46
|
+
help="Enable metrics tracking. Repeat for multiple trackers.",
|
|
47
|
+
)
|
|
48
|
+
parser.add_argument(
|
|
49
|
+
"--n-workers",
|
|
50
|
+
default=1,
|
|
51
|
+
type=int,
|
|
52
|
+
help=(
|
|
53
|
+
"Number of workers to run in the server. When it's greater than 1, the server will be run using `mp` launch mode. "
|
|
54
|
+
"Only applicable for zero-copy stores such as MongoDB backend."
|
|
55
|
+
),
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
"--backend",
|
|
60
|
+
choices=["memory", "mongo"],
|
|
61
|
+
default="memory",
|
|
62
|
+
help="Backend to use for the store.",
|
|
63
|
+
)
|
|
64
|
+
parser.add_argument(
|
|
65
|
+
"--mongo-uri",
|
|
66
|
+
default="mongodb://localhost:27017/?replicaSet=rs0",
|
|
67
|
+
help="MongoDB URI to use for the store. Applicable only if --backend is 'mongo'.",
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
args = parser.parse_args(list(argv) if argv is not None else None)
|
|
71
|
+
|
|
72
|
+
setup_logging(args.log_level)
|
|
73
|
+
|
|
74
|
+
trackers: List[MetricsBackend] = []
|
|
75
|
+
if args.tracker:
|
|
76
|
+
if "prometheus" in args.tracker:
|
|
77
|
+
logger.info("Enabling Prometheus metrics tracking.")
|
|
78
|
+
if args.n_workers > 1:
|
|
79
|
+
# This has to be done before prometheus_client is imported
|
|
80
|
+
setup_multiprocess_prometheus()
|
|
81
|
+
logger.info("Setting up Prometheus multiprocess directory for metrics tracking.")
|
|
82
|
+
trackers.append(PrometheusMetricsBackend())
|
|
83
|
+
|
|
84
|
+
if "console" in args.tracker:
|
|
85
|
+
logger.info("Enabling console metrics tracking.")
|
|
86
|
+
trackers.append(ConsoleMetricsBackend())
|
|
87
|
+
|
|
88
|
+
if len(trackers) == 0:
|
|
89
|
+
tracker: MetricsBackend | None = None
|
|
90
|
+
elif len(trackers) == 1:
|
|
91
|
+
tracker = trackers[0]
|
|
92
|
+
else:
|
|
93
|
+
tracker = MultiMetricsBackend(trackers)
|
|
94
|
+
|
|
95
|
+
if args.backend == "memory":
|
|
96
|
+
store = InMemoryLightningStore(
|
|
97
|
+
thread_safe=True, # Using thread_safe store for server
|
|
98
|
+
tracker=tracker,
|
|
99
|
+
)
|
|
100
|
+
elif args.backend == "mongo":
|
|
101
|
+
from mantisdk.store.mongo import MongoLightningStore
|
|
102
|
+
|
|
103
|
+
store = MongoLightningStore(mongo_uri=args.mongo_uri, tracker=tracker)
|
|
104
|
+
else:
|
|
105
|
+
raise ValueError(f"Invalid backend: {args.backend}")
|
|
106
|
+
|
|
107
|
+
if args.n_workers > 1:
|
|
108
|
+
logger.info(f"Running the server using `mp` launch mode with {args.n_workers} workers.")
|
|
109
|
+
launch_mode = "mp"
|
|
110
|
+
else:
|
|
111
|
+
logger.info("Running the server using `asyncio` launch mode.")
|
|
112
|
+
launch_mode = "asyncio"
|
|
113
|
+
server = LightningStoreServer(
|
|
114
|
+
store,
|
|
115
|
+
host=args.host,
|
|
116
|
+
port=args.port,
|
|
117
|
+
cors_allow_origins=args.cors_origins,
|
|
118
|
+
launch_mode=launch_mode,
|
|
119
|
+
tracker=tracker,
|
|
120
|
+
n_workers=args.n_workers,
|
|
121
|
+
)
|
|
122
|
+
try:
|
|
123
|
+
asyncio.run(server.run_forever())
|
|
124
|
+
except RuntimeError as exc:
|
|
125
|
+
logger.error("LightningStore server failed to start: %s", exc, exc_info=True)
|
|
126
|
+
return 1
|
|
127
|
+
return 0
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
if __name__ == "__main__":
|
|
131
|
+
raise SystemExit(main())
|
mantisdk/cli/vllm.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Copyright (c) Microsoft. All rights reserved.
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Iterable
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def main(argv: Iterable[str] | None = None) -> int:
|
|
9
|
+
import sys
|
|
10
|
+
|
|
11
|
+
from vllm.entrypoints.cli.main import main as vllm_main
|
|
12
|
+
|
|
13
|
+
from mantisdk.instrumentation.vllm import instrument_vllm
|
|
14
|
+
|
|
15
|
+
instrument_vllm()
|
|
16
|
+
if argv is not None:
|
|
17
|
+
original_argv = sys.argv
|
|
18
|
+
sys.argv = [original_argv[0], *list(argv)]
|
|
19
|
+
try:
|
|
20
|
+
vllm_main()
|
|
21
|
+
finally:
|
|
22
|
+
sys.argv = original_argv
|
|
23
|
+
else:
|
|
24
|
+
vllm_main()
|
|
25
|
+
return 0
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
if __name__ == "__main__":
|
|
29
|
+
raise SystemExit(main())
|