File size: 3,518 Bytes
f60a6c1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
import click
from asyncio import run
from pathlib import Path
from logging import getLogger, DEBUG, INFO, WARNING, basicConfig
import asyncio
from scorevision.cli.runner import runner_loop
from scorevision.cli.push import push_ml_model
from scorevision.utils.settings import get_settings
from scorevision.cli.signer_api import run_signer
from scorevision.cli.validate import _validate_main
from scorevision.utils.prometheus import _start_metrics, mark_service_ready
from scorevision.cli.run_vlm_pipeline import run_vlm_pipeline_once_for_single_miner
logger = getLogger(__name__)
@click.group(name="sv")
@click.option(
"-v",
"--verbosity",
count=True,
help="Increase verbosity (-v INFO, -vv DEBUG)",
)
def cli(verbosity: int):
"""Score Vision CLI"""
settings = get_settings()
basicConfig(
level=DEBUG if verbosity == 2 else INFO if verbosity == 1 else WARNING,
format="%(asctime)s %(levelname)-8s [%(name)s] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
logger.debug(f"Score Vision started (version={settings.SCOREVISION_VERSION})")
@cli.command("runner")
def runner_cmd():
"""Launches runner every TEMPO blocks."""
_start_metrics()
mark_service_ready("runner")
asyncio.run(runner_loop())
@cli.command("push")
@click.option(
"--model-path",
default=None,
help="Local path to model artifacts. If none provided, upload skipped",
)
@click.option(
"--revision",
default=None,
help="Explicit revision SHA to commit (otherwise auto-detected).",
)
@click.option("--no-deploy", is_flag=True, help="Skip Chutes deployment (HF only).")
@click.option(
"--no-commit", is_flag=True, help="Skip on-chain commitment (print payload only)."
)
def push(
model_path,
revision,
no_deploy,
no_commit,
):
"""Push the miner's ML model stored on Huggingface onto Chutes and commit information on-chain"""
try:
run(
push_ml_model(
ml_model_path=Path(model_path) if model_path else None,
hf_revision=revision,
skip_chutes_deploy=no_deploy,
skip_bittensor_commit=no_commit,
)
)
except Exception as e:
click.echo(e)
@cli.command("signer")
def signer_cmd():
asyncio.run(run_signer())
@cli.command("validate")
@click.option(
"--tail", type=int, envvar="SCOREVISION_TAIL", default=28800, show_default=True
)
@click.option(
"--alpha", type=float, envvar="SCOREVISION_ALPHA", default=0.2, show_default=True
)
@click.option(
"--m-min", type=int, envvar="SCOREVISION_M_MIN", default=25, show_default=True
)
@click.option(
"--tempo", type=int, envvar="SCOREVISION_TEMPO", default=100, show_default=True
)
def validate_cmd(tail: int, alpha: float, m_min: int, tempo: int):
"""
ScoreVision validator (mainnet cadence):
- attend block%tempo==0
- calcule (uids, weights) winner-takes-all
- push via signer, fallback local si signer HS
"""
_start_metrics()
mark_service_ready("validator")
asyncio.run(_validate_main(tail=tail, alpha=alpha, m_min=m_min, tempo=tempo))
@cli.command("run-once")
@click.option("--revision", type=str, default=None)
def test_vlm_pipeline(revision: str) -> None:
"""Run the miner on the VLM-as-Judge pipeline off-chain (results not saved)"""
try:
result = run(run_vlm_pipeline_once_for_single_miner(hf_revision=revision))
click.echo(result)
except Exception as e:
click.echo(e)
|