|
2 | 2 |
|
3 | 3 | import pytest |
4 | 4 | from ocp_resources.route import Route |
| 5 | +from ocp_resources.secret import Secret |
5 | 6 | from ocp_resources.service import Service |
6 | 7 | from pytest import FixtureRequest |
7 | 8 | from kubernetes.dynamic import DynamicClient |
|
14 | 15 | from ocp_resources.resource import ResourceEditor |
15 | 16 | from pytest_testconfig import py_config |
16 | 17 |
|
17 | | -from utilities.constants import Labels, Timeout, Annotations, Protocols |
| 18 | +from tests.model_explainability.lm_eval.utils import get_lmevaljob_pod |
| 19 | +from utilities.constants import Labels, Timeout, Annotations, Protocols, MinIo |
18 | 20 |
|
19 | 21 | VLLM_EMULATOR: str = "vllm-emulator" |
20 | 22 | VLLM_EMULATOR_PORT: int = 8000 |
21 | 23 | LMEVALJOB_NAME: str = "lmeval-test-job" |
22 | 24 |
|
23 | 25 |
|
24 | | -@pytest.fixture(scope="function") |
25 | | -def lmevaljob_hf_pod(admin_client: DynamicClient, lmevaljob_hf: LMEvalJob) -> Generator[Pod, Any, Any]: |
26 | | - lmeval_pod = Pod( |
27 | | - client=admin_client, |
28 | | - namespace=lmevaljob_hf.namespace, |
29 | | - name=lmevaljob_hf.name, |
30 | | - ) |
31 | | - |
32 | | - # TODO: Check if we can rely on LMEvalJob instead of pod |
33 | | - lmeval_pod.wait(timeout=Timeout.TIMEOUT_2MIN) |
34 | | - |
35 | | - yield lmeval_pod |
36 | | - |
37 | | - |
38 | 26 | @pytest.fixture(scope="function") |
39 | 27 | def lmevaljob_hf( |
40 | 28 | admin_client: DynamicClient, model_namespace: Namespace, patched_trustyai_operator_configmap_allow_online: ConfigMap |
@@ -107,22 +95,6 @@ def lmevaljob_local_offline( |
107 | 95 | yield job |
108 | 96 |
|
109 | 97 |
|
110 | | -@pytest.fixture(scope="function") |
111 | | -def lmevaljob_vllm_emulator_pod( |
112 | | - admin_client: DynamicClient, lmevaljob_vllm_emulator: LMEvalJob |
113 | | -) -> Generator[Pod, Any, Any]: |
114 | | - lmeval_pod = Pod( |
115 | | - client=admin_client, |
116 | | - namespace=lmevaljob_vllm_emulator.namespace, |
117 | | - name=lmevaljob_vllm_emulator.name, |
118 | | - ) |
119 | | - |
120 | | - # TODO: Check if we can rely on LMEvalJob instead of pod |
121 | | - lmeval_pod.wait(timeout=Timeout.TIMEOUT_2MIN) |
122 | | - |
123 | | - yield lmeval_pod |
124 | | - |
125 | | - |
126 | 98 | @pytest.fixture(scope="function") |
127 | 99 | def lmevaljob_vllm_emulator( |
128 | 100 | admin_client: DynamicClient, |
@@ -307,3 +279,136 @@ def vllm_emulator_route( |
307 | 279 | service=vllm_emulator_service.name, |
308 | 280 | ) as route: |
309 | 281 | yield route |
| 282 | + |
| 283 | + |
| 284 | +@pytest.fixture(scope="function") |
| 285 | +def lmeval_minio_deployment( |
| 286 | + admin_client: DynamicClient, minio_namespace: Namespace, pvc_minio_namespace: PersistentVolumeClaim |
| 287 | +) -> Generator[Deployment, Any, Any]: |
| 288 | + minio_app_label = {"app": MinIo.Metadata.NAME} |
| 289 | + # TODO: Unify with minio_llm_deployment fixture once datasets and models are in new model image |
| 290 | + with Deployment( |
| 291 | + client=admin_client, |
| 292 | + name=MinIo.Metadata.NAME, |
| 293 | + namespace=minio_namespace.name, |
| 294 | + replicas=1, |
| 295 | + selector={"matchLabels": minio_app_label}, |
| 296 | + template={ |
| 297 | + "metadata": {"labels": minio_app_label}, |
| 298 | + "spec": { |
| 299 | + "volumes": [ |
| 300 | + {"name": "minio-storage", "persistentVolumeClaim": {"claimName": pvc_minio_namespace.name}} |
| 301 | + ], |
| 302 | + "containers": [ |
| 303 | + { |
| 304 | + "name": MinIo.Metadata.NAME, |
| 305 | + "image": "quay.io/minio/minio" |
| 306 | + "@sha256:46b3009bf7041eefbd90bd0d2b38c6ddc24d20a35d609551a1802c558c1c958f", |
| 307 | + "args": ["server", "/data", "--console-address", ":9001"], |
| 308 | + "env": [ |
| 309 | + {"name": "MINIO_ROOT_USER", "value": MinIo.Credentials.ACCESS_KEY_VALUE}, |
| 310 | + {"name": "MINIO_ROOT_PASSWORD", "value": MinIo.Credentials.SECRET_KEY_VALUE}, |
| 311 | + ], |
| 312 | + "ports": [{"containerPort": MinIo.Metadata.DEFAULT_PORT}, {"containerPort": 9001}], |
| 313 | + "volumeMounts": [{"name": "minio-storage", "mountPath": "/data"}], |
| 314 | + } |
| 315 | + ], |
| 316 | + }, |
| 317 | + }, |
| 318 | + label=minio_app_label, |
| 319 | + wait_for_resource=True, |
| 320 | + ) as deployment: |
| 321 | + deployment.wait_for_replicas(timeout=Timeout.TIMEOUT_10MIN) |
| 322 | + yield deployment |
| 323 | + |
| 324 | + |
| 325 | +@pytest.fixture(scope="function") |
| 326 | +def lmeval_minio_copy_pod( |
| 327 | + admin_client: DynamicClient, minio_namespace: Namespace, lmeval_minio_deployment: Deployment, minio_service: Service |
| 328 | +) -> Generator[Pod, Any, Any]: |
| 329 | + with Pod( |
| 330 | + client=admin_client, |
| 331 | + name="copy-to-minio", |
| 332 | + namespace=minio_namespace.name, |
| 333 | + restart_policy="Never", |
| 334 | + volumes=[{"name": "shared-data", "emptyDir": {}}], |
| 335 | + init_containers=[ |
| 336 | + { |
| 337 | + "name": "copy-data", |
| 338 | + "image": "quay.io/trustyai_testing/lmeval-assets-flan-arceasy" |
| 339 | + "@sha256:11cc9c2f38ac9cc26c4fab1a01a8c02db81c8f4801b5d2b2b90f90f91b97ac98", |
| 340 | + "command": ["/bin/sh", "-c"], |
| 341 | + "args": ["cp -r /mnt/data /shared"], |
| 342 | + "volumeMounts": [{"name": "shared-data", "mountPath": "/shared"}], |
| 343 | + } |
| 344 | + ], |
| 345 | + containers=[ |
| 346 | + { |
| 347 | + "name": "minio-uploader", |
| 348 | + "image": "quay.io/minio/mc@sha256:470f5546b596e16c7816b9c3fa7a78ce4076bb73c2c73f7faeec0c8043923123", |
| 349 | + "command": ["/bin/sh", "-c"], |
| 350 | + "args": [ |
| 351 | + f"mc alias set myminio http://{minio_service.name}:{MinIo.Metadata.DEFAULT_PORT} " |
| 352 | + f"{MinIo.Credentials.ACCESS_KEY_VALUE} {MinIo.Credentials.SECRET_KEY_VALUE} &&\n" |
| 353 | + "mc mb --ignore-existing myminio/models &&\n" |
| 354 | + "mc cp --recursive /shared/data/ myminio/models" |
| 355 | + ], |
| 356 | + "volumeMounts": [{"name": "shared-data", "mountPath": "/shared"}], |
| 357 | + } |
| 358 | + ], |
| 359 | + wait_for_resource=True, |
| 360 | + ) as pod: |
| 361 | + pod.wait_for_status(status=Pod.Status.SUCCEEDED) |
| 362 | + yield pod |
| 363 | + |
| 364 | + |
| 365 | +@pytest.fixture(scope="function") |
| 366 | +def lmevaljob_s3_offline( |
| 367 | + admin_client: DynamicClient, |
| 368 | + model_namespace: Namespace, |
| 369 | + lmeval_minio_deployment: Deployment, |
| 370 | + minio_service: Service, |
| 371 | + lmeval_minio_copy_pod: Pod, |
| 372 | + minio_data_connection: Secret, |
| 373 | +) -> Generator[LMEvalJob, Any, Any]: |
| 374 | + with LMEvalJob( |
| 375 | + client=admin_client, |
| 376 | + name="evaljob-sample", |
| 377 | + namespace=model_namespace.name, |
| 378 | + model="hf", |
| 379 | + model_args=[{"name": "pretrained", "value": "/opt/app-root/src/hf_home/flan"}], |
| 380 | + task_list={"taskNames": ["arc_easy"]}, |
| 381 | + log_samples=True, |
| 382 | + allow_online=False, |
| 383 | + offline={ |
| 384 | + "storage": { |
| 385 | + "s3": { |
| 386 | + "accessKeyId": {"name": minio_data_connection.name, "key": "AWS_ACCESS_KEY_ID"}, |
| 387 | + "secretAccessKey": {"name": minio_data_connection.name, "key": "AWS_SECRET_ACCESS_KEY"}, |
| 388 | + "bucket": {"name": minio_data_connection.name, "key": "AWS_S3_BUCKET"}, |
| 389 | + "endpoint": {"name": minio_data_connection.name, "key": "AWS_S3_ENDPOINT"}, |
| 390 | + "region": {"name": minio_data_connection.name, "key": "AWS_DEFAULT_REGION"}, |
| 391 | + "path": "", |
| 392 | + "verifySSL": False, |
| 393 | + } |
| 394 | + } |
| 395 | + }, |
| 396 | + ) as job: |
| 397 | + yield job |
| 398 | + |
| 399 | + |
| 400 | +@pytest.fixture(scope="function") |
| 401 | +def lmevaljob_hf_pod(admin_client: DynamicClient, lmevaljob_hf: LMEvalJob) -> Generator[Pod, Any, Any]: |
| 402 | + yield get_lmevaljob_pod(client=admin_client, lmevaljob=lmevaljob_hf) |
| 403 | + |
| 404 | + |
| 405 | +@pytest.fixture(scope="function") |
| 406 | +def lmevaljob_vllm_emulator_pod( |
| 407 | + admin_client: DynamicClient, lmevaljob_vllm_emulator: LMEvalJob |
| 408 | +) -> Generator[Pod, Any, Any]: |
| 409 | + yield get_lmevaljob_pod(client=admin_client, lmevaljob=lmevaljob_vllm_emulator) |
| 410 | + |
| 411 | + |
| 412 | +@pytest.fixture(scope="function") |
| 413 | +def lmevaljob_s3_offline_pod(admin_client: DynamicClient, lmevaljob_s3_offline: LMEvalJob) -> Generator[Pod, Any, Any]: |
| 414 | + yield get_lmevaljob_pod(client=admin_client, lmevaljob=lmevaljob_s3_offline) |
0 commit comments