Skip to content

Commit 545f12b

Browse files
ruivieiraleseb
andauthored
feat(RHOAIENG-33702): Update LMEval configuration to support environment variable for Kubernetes usage (#58)
* refactor: Update LMEval configuration to support environment variable for Kubernetes usage * refactor: Fix environment variable defaults in run.yaml and linting * Update run.yaml Co-authored-by: Sébastien Han <[email protected]> * Update run.yaml Co-authored-by: Sébastien Han <[email protected]> --------- Co-authored-by: Sébastien Han <[email protected]>
1 parent 29b5c9a commit 545f12b

File tree

3 files changed

+35
-15
lines changed

3 files changed

+35
-15
lines changed

run.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ providers:
88
- provider_id: vllm
99
provider_type: remote::vllm
1010
config:
11-
url: ${env.VLLM_URL:http://localhost:8000/v1}
11+
url: ${env.VLLM_URL:=}
1212
max_tokens: ${env.VLLM_MAX_TOKENS:4096}
1313
api_token: ${env.VLLM_API_TOKEN:fake}
1414
tls_verify: ${env.VLLM_TLS_VERIFY:true}
1515
eval:
1616
- provider_id: trustyai_lmeval
1717
provider_type: remote::trustyai_lmeval
1818
config:
19-
use_k8s: True
20-
base_url: ${env.VLLM_URL:http://localhost:8000/v1}
19+
use_k8s: ${env.TRUSTYAI_LMEVAL_USE_K8S:=true}
20+
base_url: ${env.VLLM_URL:=}
2121
namespace: ${env.TRUSTYAI_LM_EVAL_NAMESPACE}
2222
external_providers_dir: ./providers.d

src/llama_stack_provider_lmeval/config.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,6 @@ def __post_init__(self):
130130
"""Validate the configuration"""
131131
if not isinstance(self.use_k8s, bool):
132132
raise LMEvalConfigError("use_k8s must be a boolean")
133-
if self.use_k8s is False:
134-
raise LMEvalConfigError(
135-
"Only Kubernetes LMEval backend is supported at the moment"
136-
)
137133

138134

139135
__all__ = [

src/llama_stack_provider_lmeval/lmeval.py

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -923,27 +923,40 @@ class LMEval(Eval, BenchmarksProtocolPrivate):
923923

924924
def __init__(self, config: LMEvalEvalProviderConfig):
925925
self._config = config
926+
self._namespace: str | None = None
926927

927-
self._namespace = _resolve_namespace(self._config)
928-
929-
logger.debug("LMEval provider initialized with namespace: %s", self._namespace)
930928
logger.debug("LMEval provider config values: %s", vars(self._config))
931929
self.benchmarks: dict[str, Benchmark] = {}
932930
self._jobs: list[Job] = []
933931
self._job_metadata: dict[str, dict[str, Any]] = {}
934932

935933
self._k8s_client: k8s_client.ApiClient | None = None
936934
self._k8s_custom_api: k8s_client.CustomObjectsApi | None = None
937-
if self.use_k8s:
935+
self._cr_builder: LMEvalCRBuilder | None = None
936+
937+
def _ensure_k8s_initialized(self):
938+
"""Ensure Kubernetes client and namespace are initialized when needed."""
939+
if not self.use_k8s:
940+
logger.warning("Non-K8s evaluation backend is not implemented yet")
941+
return
942+
943+
if self._k8s_client is None:
938944
self._init_k8s_client()
939-
logger.debug(
940-
"Initialized Kubernetes client with namespace: %s", self._namespace
941-
)
945+
946+
if self._namespace is None:
947+
self._namespace = _resolve_namespace(self._config)
948+
logger.debug("LMEval provider resolved namespace: %s", self._namespace)
949+
950+
if self._cr_builder is None:
942951
self._cr_builder = LMEvalCRBuilder(
943952
namespace=self._namespace,
944953
service_account=getattr(self._config, "service_account", None),
945954
)
946955
self._cr_builder._config = self._config
956+
logger.debug(
957+
"Initialized Kubernetes client and CR builder with namespace: %s",
958+
self._namespace,
959+
)
947960

948961
def _init_k8s_client(self):
949962
"""Initialize the Kubernetes client."""
@@ -1048,7 +1061,8 @@ def _deploy_lmeval_cr(self, cr: dict, job_id: str) -> None:
10481061
pvc_name = None
10491062

10501063
if (
1051-
self._cr_builder._config is not None
1064+
self._cr_builder is not None
1065+
and self._cr_builder._config is not None
10521066
and hasattr(self._cr_builder._config, "metadata")
10531067
and self._cr_builder._config.metadata
10541068
):
@@ -1198,6 +1212,7 @@ async def run_eval(
11981212
Returns:
11991213
Dict containing job_id for evaluation tracking
12001214
"""
1215+
self._ensure_k8s_initialized()
12011216
if not self.use_k8s:
12021217
raise NotImplementedError("Non-K8s evaluation not implemented yet")
12031218

@@ -1224,6 +1239,11 @@ async def run_eval(
12241239
benchmark_config.metadata["input"]["storage"],
12251240
)
12261241

1242+
if self._cr_builder is None:
1243+
raise LMEvalConfigError(
1244+
"CR builder not initialized - ensure K8s is properly configured"
1245+
)
1246+
12271247
cr = self._cr_builder.create_cr(
12281248
benchmark_id=benchmark_id,
12291249
task_config=benchmark_config,
@@ -1295,6 +1315,7 @@ async def evaluate_rows(
12951315
Returns:
12961316
EvaluateResponse: Object containing generations and scores
12971317
"""
1318+
self._ensure_k8s_initialized()
12981319
if not self.use_k8s:
12991320
raise NotImplementedError("Non-K8s evaluation not implemented yet")
13001321

@@ -1323,6 +1344,7 @@ async def job_status(self, benchmark_id: str, job_id: str) -> dict[str, str] | N
13231344
Returns:
13241345
Dict with current status of the job
13251346
"""
1347+
self._ensure_k8s_initialized()
13261348
if not self.use_k8s:
13271349
raise NotImplementedError("Non-K8s evaluation not implemented yet")
13281350

@@ -1395,6 +1417,7 @@ async def job_cancel(self, benchmark_id: str, job_id: str) -> None:
13951417
benchmark_id: The benchmark identifier
13961418
job_id: The job identifier
13971419
"""
1420+
self._ensure_k8s_initialized()
13981421
if not self.use_k8s:
13991422
raise NotImplementedError("Non-K8s evaluation not implemented yet")
14001423

@@ -1568,6 +1591,7 @@ async def job_result(self, benchmark_id: str, job_id: str) -> EvaluateResponse:
15681591
Returns:
15691592
EvaluateResponse: Results of the evaluation
15701593
"""
1594+
self._ensure_k8s_initialized()
15711595
if not self.use_k8s:
15721596
return EvaluateResponse(
15731597
generations=[],

0 commit comments

Comments
 (0)