AGI_Assistant / scripts /run_colibri.py
Dmitry Beresnev
add colibri inference service
9fa0cbc
Raw History Blame Contribute Delete
4.68 kB
"""Launcher for Colibri (https://github.com/JustVugg/colibri) serving OLMoE.
Colibri is a pure-C MoE engine built per model family: `make -C c olmoe` produces
a standalone `olmoe` binary that exposes an OpenAI-compatible API via `serve`.
Unlike the npm/pip Claw services, it needs two things this repo cannot bundle:
1. the binary, compiled at image build time (guarded by `--build-arg COLIBRI_BUILD=1`)
2. a Colibri-format weight container, which the user must provision
Colibri uses its own container format, and no pre-converted OLMoE container is
published on the Hub. If either piece is missing this launcher logs what is
needed and parks the process instead of exiting: supervisord runs every program
with `autorestart=true`, and a fast-exiting program turns into a restart loop
that has taken this Space down before (see the agent-os/odysseus notes in the
Dockerfile).
"""
import json
import os
import shutil
import sys
import time
from pathlib import Path
CONFIG_PATH = Path(os.environ.get("COLIBRI_CONFIG_PATH", "/app/colibri.json"))
def _load_config() -> dict:
try:
return json.loads(CONFIG_PATH.read_text(encoding="utf-8"))
except Exception:
return {}
def _log(message: str) -> None:
print(f"[colibri] {message}", flush=True)
def _park(reason: str) -> None:
"""Stay alive without work so supervisord does not thrash on restart."""
_log(reason)
_log("service parked; set the missing piece and restart this program")
while True:
time.sleep(3600)
def _model_ready(model_dir: Path) -> bool:
return model_dir.is_dir() and any(model_dir.iterdir())
def _download_model(repo: str, revision: str, model_dir: Path) -> bool:
try:
from huggingface_hub import snapshot_download
except ImportError:
_log("huggingface_hub is not installed; cannot fetch the model container")
return False
_log(f"downloading Colibri container from {repo}@{revision} -> {model_dir}")
try:
model_dir.parent.mkdir(parents=True, exist_ok=True)
snapshot_download(
repo_id=repo,
revision=revision,
local_dir=str(model_dir),
token=os.environ.get("HF_TOKEN") or None,
)
except Exception as exc:
_log(f"download failed: {exc}")
return False
return _model_ready(model_dir)
def main() -> None:
config = _load_config()
gateway = config.get("gateway", {})
model_cfg = config.get("model", {})
runtime = config.get("runtime", {})
host = os.environ.get("COLIBRI_HOST") or gateway.get("host") or "127.0.0.1"
port = str(os.environ.get("COLIBRI_PORT") or gateway.get("port") or 18797)
model_id = os.environ.get("COLIBRI_MODEL_ID") or model_cfg.get("model_id") or "olmoe"
model_dir = Path(os.environ.get("COLIBRI_MODEL_DIR") or model_cfg.get("dir") or "/data/models/olmoe")
repo = (os.environ.get("COLIBRI_MODEL_REPO") or model_cfg.get("repo") or "").strip()
revision = os.environ.get("COLIBRI_MODEL_REVISION") or model_cfg.get("revision") or "main"
binary = os.environ.get("COLIBRI_BIN", "coli-olmoe")
resolved = shutil.which(binary)
if not resolved:
_park(
f"engine binary {binary!r} not found - rebuild the image with "
"`docker build --build-arg COLIBRI_BUILD=1`"
)
if not _model_ready(model_dir):
if not repo:
_park(
f"no weights at {model_dir} and COLIBRI_MODEL_REPO is unset - convert OLMoE "
"with c/tools/convert_olmoe_merged.py, push the container to a Hub repo, "
"then set COLIBRI_MODEL_REPO"
)
if not _download_model(repo, revision, model_dir):
_park(f"could not provision weights at {model_dir}")
threads = str(os.environ.get("OMP_NUM_THREADS") or runtime.get("threads") or 2)
env = dict(os.environ)
env["OMP_NUM_THREADS"] = threads
env["COLI_MODEL"] = str(model_dir)
env.setdefault("COLI_MAX_QUEUE", str(runtime.get("max_queue", 4)))
env.setdefault("COLI_QUEUE_TIMEOUT", str(runtime.get("queue_timeout_sec", 600)))
env.setdefault("COLI_KV_SLOTS", str(runtime.get("kv_slots", 2)))
extra_args = (os.environ.get("COLIBRI_SERVE_ARGS") or "").split()
argv = [
binary,
"serve",
"--host", host,
"--port", port,
"--model", str(model_dir),
"--model-id", model_id,
*extra_args,
]
_log(f"starting: {' '.join(argv)} (OMP_NUM_THREADS={threads})")
try:
os.execvpe(resolved, argv, env)
except OSError as exc:
_park(f"exec failed: {exc}")
if __name__ == "__main__":
main()