nemo-evaluator-launcher 0.1.14__tar.gz → 0.1.26__tar.gz

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.
Files changed (65) hide show
  1. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/PKG-INFO +2 -2
  2. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/pyproject.toml +1 -1
  3. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/__init__.py +15 -1
  4. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/api/functional.py +19 -29
  5. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/api/types.py +9 -0
  6. nemo_evaluator_launcher-0.1.26/src/nemo_evaluator_launcher/cli/info.py +512 -0
  7. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/cli/ls_runs.py +26 -6
  8. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/cli/main.py +24 -1
  9. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/cli/run.py +42 -12
  10. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/cli/status.py +9 -8
  11. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/common/helpers.py +150 -29
  12. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/common/logging_utils.py +12 -4
  13. nemo_evaluator_launcher-0.1.26/src/nemo_evaluator_launcher/common/printing_utils.py +93 -0
  14. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/deployment/vllm.yaml +2 -1
  15. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/execution/local.yaml +1 -0
  16. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/execution/slurm/default.yaml +5 -4
  17. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/base.py +23 -0
  18. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/lepton/executor.py +156 -95
  19. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/local/executor.py +76 -20
  20. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/local/run.template.sh +22 -7
  21. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/slurm/executor.py +72 -30
  22. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/exporters/local.py +25 -16
  23. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/exporters/mlflow.py +168 -70
  24. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/exporters/utils.py +85 -33
  25. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/exporters/wandb.py +40 -5
  26. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/package_info.py +1 -1
  27. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/resources/mapping.toml +51 -15
  28. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher.egg-info/PKG-INFO +2 -2
  29. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher.egg-info/SOURCES.txt +2 -0
  30. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher.egg-info/requires.txt +1 -1
  31. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/LICENSE +0 -0
  32. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/README.md +0 -0
  33. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/setup.cfg +0 -0
  34. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/api/__init__.py +0 -0
  35. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/api/utils.py +0 -0
  36. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/cli/__init__.py +0 -0
  37. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/cli/export.py +0 -0
  38. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/cli/kill.py +0 -0
  39. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/cli/ls_tasks.py +0 -0
  40. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/cli/version.py +0 -0
  41. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/common/__init__.py +0 -0
  42. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/common/execdb.py +0 -0
  43. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/common/mapping.py +0 -0
  44. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/__init__.py +0 -0
  45. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/default.yaml +0 -0
  46. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/deployment/generic.yaml +0 -0
  47. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/deployment/nim.yaml +0 -0
  48. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/deployment/none.yaml +0 -0
  49. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/deployment/sglang.yaml +0 -0
  50. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/deployment/trtllm.yaml +0 -0
  51. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/configs/execution/lepton/default.yaml +0 -0
  52. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/__init__.py +0 -0
  53. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/lepton/__init__.py +0 -0
  54. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/lepton/deployment_helpers.py +0 -0
  55. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/lepton/job_helpers.py +0 -0
  56. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/local/__init__.py +0 -0
  57. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/registry.py +0 -0
  58. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/executors/slurm/__init__.py +0 -0
  59. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/exporters/__init__.py +0 -0
  60. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/exporters/base.py +0 -0
  61. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/exporters/gsheets.py +0 -0
  62. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher/exporters/registry.py +0 -0
  63. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher.egg-info/dependency_links.txt +0 -0
  64. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher.egg-info/entry_points.txt +0 -0
  65. {nemo_evaluator_launcher-0.1.14 → nemo_evaluator_launcher-0.1.26}/src/nemo_evaluator_launcher.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nemo-evaluator-launcher
3
- Version: 0.1.14
3
+ Version: 0.1.26
4
4
  Summary: Launcher for the evaluations provided by NeMo Evaluator containers with different runtime backends
5
5
  Author: NVIDIA
6
6
  Author-email: nemo-toolkit@nvidia.com
@@ -478,7 +478,7 @@ Requires-Dist: mlflow>=2.8.0; extra == "mlflow"
478
478
  Provides-Extra: wandb
479
479
  Requires-Dist: wandb>=0.15.0; extra == "wandb"
480
480
  Provides-Extra: gsheets
481
- Requires-Dist: gsheets>=0.1.0; extra == "gsheets"
481
+ Requires-Dist: gspread>=5.0.0; extra == "gsheets"
482
482
  Provides-Extra: exporters
483
483
  Requires-Dist: mlflow; extra == "exporters"
484
484
  Requires-Dist: wandb; extra == "exporters"
@@ -40,7 +40,7 @@ repository = "https://github.com/NVIDIA-NeMo/Evaluator/packages/nemo-evaluator-l
40
40
  [project.optional-dependencies]
41
41
  mlflow = ["mlflow>=2.8.0"]
42
42
  wandb = ["wandb>=0.15.0"]
43
- gsheets = ["gsheets>=0.1.0"]
43
+ gsheets = ["gspread>=5.0.0"]
44
44
  exporters = ["mlflow", "wandb", "gsheets"]
45
45
  all = ["mlflow", "wandb", "gsheets"]
46
46
 
@@ -20,6 +20,7 @@ It automatically initializes logging and conditionally loads internal components
20
20
  """
21
21
 
22
22
  import importlib
23
+ import warnings
23
24
 
24
25
  from nemo_evaluator_launcher.common.logging_utils import logger
25
26
  from nemo_evaluator_launcher.package_info import (
@@ -32,9 +33,22 @@ from nemo_evaluator_launcher.package_info import (
32
33
  __version__,
33
34
  )
34
35
 
35
- logger.info("Version info", pkg=__package_name__, ver=__version__)
36
+ # Suppress pydantic warnings from third-party libraries (e.g., wandb) that are not
37
+ # compatible with Pydantic 2.x field metadata on Python 3.13+
38
+ warnings.filterwarnings(
39
+ "ignore",
40
+ message=r"The 'repr' attribute.*Field\(\).*",
41
+ category=Warning,
42
+ )
43
+ warnings.filterwarnings(
44
+ "ignore",
45
+ message=r"The 'frozen' attribute.*Field\(\).*",
46
+ category=Warning,
47
+ )
36
48
 
37
49
 
50
+ logger.info("Version info", pkg=__package_name__, ver=__version__)
51
+
38
52
  try:
39
53
  importlib.import_module("nemo_evaluator_launcher_internal")
40
54
  logger.debug(
@@ -440,23 +440,28 @@ def export_results(
440
440
  single_id = invocation_ids[0]
441
441
 
442
442
  if "." in single_id: # job_id
443
+ # Try reading config from artifacts working dir (auto-export on remote node)
444
+ cfg_file = None
445
+ for name in ("run_config.yml", "config.yml"):
446
+ p = Path(name)
447
+ if p.exists():
448
+ cfg_file = p
449
+ break
450
+
443
451
  md_job_data = None
444
- # Use artifacts/run_config.yml if present
445
- ypath_artifacts = Path("run_config.yml")
446
- if ypath_artifacts.exists():
452
+ if cfg_file:
447
453
  try:
448
454
  cfg_yaml = (
449
- yaml.safe_load(ypath_artifacts.read_text(encoding="utf-8"))
450
- or {}
455
+ yaml.safe_load(cfg_file.read_text(encoding="utf-8")) or {}
451
456
  )
452
- # merge exporter config if present
457
+
458
+ # Merge exporter override file if present
453
459
  ypath_export = Path("export_config.yml")
454
460
  if ypath_export.exists():
455
461
  exp_yaml = (
456
462
  yaml.safe_load(ypath_export.read_text(encoding="utf-8"))
457
463
  or {}
458
464
  )
459
- # execution.auto_export contains auto-export destinations
460
465
  exec_cfg = cfg_yaml.get("execution") or {}
461
466
  auto_exp = (exp_yaml.get("execution") or {}).get(
462
467
  "auto_export"
@@ -464,42 +469,30 @@ def export_results(
464
469
  if auto_exp is not None:
465
470
  exec_cfg["auto_export"] = auto_exp
466
471
  cfg_yaml["execution"] = exec_cfg
467
-
468
- # top-level export block contains exporter config
469
472
  if "export" in exp_yaml:
470
473
  cfg_yaml["export"] = exp_yaml["export"]
471
-
472
- # Merge evaluation.tasks from export_config (Slurm writes it there)
473
474
  if "evaluation" in exp_yaml and exp_yaml["evaluation"]:
474
475
  eval_cfg = cfg_yaml.get("evaluation") or {}
475
476
  eval_cfg.update(exp_yaml["evaluation"])
476
477
  cfg_yaml["evaluation"] = eval_cfg
477
478
 
478
- # metadata
479
479
  executor_name = (cfg_yaml.get("execution") or {}).get(
480
480
  "type", "local"
481
481
  )
482
-
483
482
  md_job_data = JobData(
484
483
  invocation_id=single_id.split(".")[0],
485
484
  job_id=single_id,
486
485
  timestamp=0.0,
487
- executor=executor_name,
486
+ executor=executor_name, # ensures slurm tag is preserved
488
487
  data={
489
488
  "output_dir": str(Path.cwd().parent),
490
- "storage_type": "remote_local",
489
+ "storage_type": "remote_local", # no SSH in auto-export path
491
490
  },
492
491
  config=cfg_yaml,
493
492
  )
494
- # DEBUG: print what we loaded
495
- print(f"DEBUG: cfg_yaml keys: {list(cfg_yaml.keys())}")
496
- if "evaluation" in cfg_yaml:
497
- print(
498
- f"DEBUG: evaluation.tasks: {cfg_yaml.get('evaluation', {}).get('tasks')}"
499
- )
500
493
  except Exception:
501
494
  md_job_data = None
502
- # fallback to execDB only
495
+
503
496
  job_data = md_job_data or ExecutionDB().get_job(single_id)
504
497
  if job_data is None:
505
498
  return {
@@ -507,7 +500,6 @@ def export_results(
507
500
  "error": f"Job {single_id} not found in ExecutionDB",
508
501
  }
509
502
 
510
- # Convert single job result to invocation-like structure
511
503
  job_result = exporter.export_job(job_data)
512
504
  return {
513
505
  "success": job_result.success,
@@ -522,10 +514,9 @@ def export_results(
522
514
  },
523
515
  "metadata": job_result.metadata or {},
524
516
  }
517
+
525
518
  elif single_id.isdigit(): # pipeline_id
526
- # Find job by pipeline_id
527
519
  db = ExecutionDB()
528
- # Search all jobs for matching pipeline_id
529
520
  for job_id, job_data in db._jobs.items():
530
521
  if job_data.data.get("pipeline_id") == int(single_id):
531
522
  job_result = exporter.export_job(job_data)
@@ -542,14 +533,13 @@ def export_results(
542
533
  "metadata": job_result.metadata or {},
543
534
  }
544
535
  return {"success": False, "error": f"Pipeline {single_id} not found"}
536
+
545
537
  else: # invocation_id
546
538
  result = exporter.export_invocation(single_id)
547
- # Ensure metadata is present in job results to prevent KeyError
548
539
  if "jobs" in result:
549
540
  for job_id, job_result in result["jobs"].items():
550
- if "metadata" not in job_result:
551
- job_result["metadata"] = {}
552
- return result # type: ignore[no-any-return]
541
+ job_result.setdefault("metadata", {})
542
+ return result
553
543
  else:
554
544
  # Multiple IDs - parse and group
555
545
  db = ExecutionDB()
@@ -19,9 +19,18 @@ This module defines data structures and helpers for configuration and type safet
19
19
  """
20
20
 
21
21
  import os
22
+ import warnings
22
23
  from dataclasses import dataclass
23
24
  from typing import cast
24
25
 
26
+ # ruff: noqa: E402
27
+ # Later when adding optional module to hydra, since the internal package is optional,
28
+ # will generate a hydra warning. We suppress it as distraction and bad UX, before hydra gets invoked.
29
+ warnings.filterwarnings(
30
+ "ignore",
31
+ message="provider=hydra.searchpath.*path=nemo_evaluator_launcher_internal.*is not available\\.",
32
+ )
33
+
25
34
  import hydra
26
35
  from hydra.core.global_hydra import GlobalHydra
27
36
  from omegaconf import DictConfig, OmegaConf