nemo-evaluator-launcher 0.1.16__tar.gz → 0.1.17__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.

Potentially problematic release.


This version of nemo-evaluator-launcher might be problematic. Click here for more details.

Files changed (64) hide show
  1. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/PKG-INFO +1 -1
  2. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/lepton/executor.py +127 -22
  3. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/package_info.py +1 -1
  4. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher.egg-info/PKG-INFO +1 -1
  5. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/LICENSE +0 -0
  6. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/README.md +0 -0
  7. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/pyproject.toml +0 -0
  8. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/setup.cfg +0 -0
  9. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/__init__.py +0 -0
  10. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/api/__init__.py +0 -0
  11. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/api/functional.py +0 -0
  12. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/api/types.py +0 -0
  13. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/api/utils.py +0 -0
  14. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/__init__.py +0 -0
  15. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/debug.py +0 -0
  16. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/export.py +0 -0
  17. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/kill.py +0 -0
  18. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/ls_runs.py +0 -0
  19. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/ls_tasks.py +0 -0
  20. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/main.py +0 -0
  21. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/run.py +0 -0
  22. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/status.py +0 -0
  23. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/cli/version.py +0 -0
  24. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/common/__init__.py +0 -0
  25. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/common/execdb.py +0 -0
  26. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/common/helpers.py +0 -0
  27. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/common/logging_utils.py +0 -0
  28. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/common/mapping.py +0 -0
  29. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/__init__.py +0 -0
  30. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/default.yaml +0 -0
  31. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/deployment/generic.yaml +0 -0
  32. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/deployment/nim.yaml +0 -0
  33. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/deployment/none.yaml +0 -0
  34. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/deployment/sglang.yaml +0 -0
  35. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/deployment/trtllm.yaml +0 -0
  36. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/deployment/vllm.yaml +0 -0
  37. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/execution/lepton/default.yaml +0 -0
  38. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/execution/local.yaml +0 -0
  39. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/configs/execution/slurm/default.yaml +0 -0
  40. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/__init__.py +0 -0
  41. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/base.py +0 -0
  42. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/lepton/__init__.py +0 -0
  43. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/lepton/deployment_helpers.py +0 -0
  44. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/lepton/job_helpers.py +0 -0
  45. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/local/__init__.py +0 -0
  46. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/local/executor.py +0 -0
  47. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/local/run.template.sh +0 -0
  48. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/registry.py +0 -0
  49. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/slurm/__init__.py +0 -0
  50. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/executors/slurm/executor.py +0 -0
  51. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/exporters/__init__.py +0 -0
  52. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/exporters/base.py +0 -0
  53. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/exporters/gsheets.py +0 -0
  54. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/exporters/local.py +0 -0
  55. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/exporters/mlflow.py +0 -0
  56. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/exporters/registry.py +0 -0
  57. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/exporters/utils.py +0 -0
  58. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/exporters/wandb.py +0 -0
  59. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher/resources/mapping.toml +0 -0
  60. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher.egg-info/SOURCES.txt +0 -0
  61. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher.egg-info/dependency_links.txt +0 -0
  62. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher.egg-info/entry_points.txt +0 -0
  63. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/src/nemo_evaluator_launcher.egg-info/requires.txt +0 -0
  64. {nemo_evaluator_launcher-0.1.16 → nemo_evaluator_launcher-0.1.17}/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.16
3
+ Version: 0.1.17
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
@@ -78,9 +78,32 @@ class LeptonExecutor(BaseExecutor):
78
78
  "LeptonExecutor supports deployment types: 'vllm', 'sglang', 'nim', 'none'"
79
79
  )
80
80
 
81
+ # Load tasks mapping
82
+ tasks_mapping = load_tasks_mapping()
83
+ job_ids = []
84
+ lepton_job_names = []
85
+ endpoint_names = [] # Track multiple endpoints
86
+ db = ExecutionDB()
87
+
81
88
  # Generate invocation ID
82
89
  invocation_id = generate_invocation_id()
83
90
 
91
+ # DRY-RUN mode
92
+ if dry_run:
93
+ output_dir = Path(cfg.execution.output_dir).absolute() / invocation_id
94
+ output_dir.mkdir(parents=True, exist_ok=True)
95
+
96
+ # Validate configuration
97
+ _dry_run_lepton(cfg, tasks_mapping, invocation_id=invocation_id)
98
+
99
+ if cfg.deployment.type == "none":
100
+ print("Using existing endpoint (deployment: none)")
101
+ print("using shared endpoint")
102
+ else:
103
+ print(f"with endpoint type '{cfg.deployment.type}'")
104
+
105
+ return invocation_id
106
+
84
107
  # For deployment: none, we use the existing endpoint for all tasks
85
108
  if cfg.deployment.type == "none":
86
109
  print("📌 Using existing endpoint (deployment: none)")
@@ -88,13 +111,6 @@ class LeptonExecutor(BaseExecutor):
88
111
  print(f"✅ Using shared endpoint: {shared_endpoint_url}")
89
112
 
90
113
  try:
91
- # Load tasks mapping
92
- tasks_mapping = load_tasks_mapping()
93
- job_ids = []
94
- lepton_job_names = []
95
- endpoint_names = [] # Track multiple endpoints
96
- db = ExecutionDB()
97
-
98
114
  # Create local directory for outputs
99
115
  output_dir = Path(cfg.execution.output_dir).absolute() / invocation_id
100
116
  output_dir.mkdir(parents=True, exist_ok=True)
@@ -139,8 +155,13 @@ class LeptonExecutor(BaseExecutor):
139
155
  task_index = str(idx)
140
156
  endpoint_name = f"{cfg.deployment.type}-{short_task_name}-{task_index}-{short_invocation}"
141
157
 
142
- # Ensure we don't exceed 36 character limit
143
158
  if len(endpoint_name) > 36:
159
+ logger.info(
160
+ "Lepton endpoint name will be deployed under name {task_name}",
161
+ task_name=task.name,
162
+ original=endpoint_name,
163
+ limit=36,
164
+ )
144
165
  # Truncate task name further if needed
145
166
  max_task_len = (
146
167
  36
@@ -151,7 +172,19 @@ class LeptonExecutor(BaseExecutor):
151
172
  ) # 3 hyphens
152
173
  short_task_name = sanitized_task_name[:max_task_len]
153
174
  endpoint_name = f"{cfg.deployment.type}-{short_task_name}-{task_index}-{short_invocation}"
175
+ logger.info(
176
+ "Lepton endpoint name is auto-generated",
177
+ task_name=task.name,
178
+ original=endpoint_name,
179
+ truncated=endpoint_name,
180
+ limit=36,
181
+ )
154
182
 
183
+ logger.info(
184
+ "Lepton endpoint name (auto-generated)",
185
+ task_name=task.name,
186
+ endpoint_name=endpoint_name,
187
+ )
155
188
  endpoint_names.append(endpoint_name)
156
189
  endpoint_creation_tasks.append((idx, task, endpoint_name))
157
190
 
@@ -298,20 +331,6 @@ class LeptonExecutor(BaseExecutor):
298
331
  f"✅ All {len(cfg.evaluation.tasks)} endpoints created successfully!"
299
332
  )
300
333
 
301
- if dry_run:
302
- print("🔍 DRY RUN: Lepton job configurations prepared")
303
- print(f" - Tasks: {len(cfg.evaluation.tasks)}")
304
- for idx, task in enumerate(cfg.evaluation.tasks):
305
- if cfg.deployment.type == "none":
306
- print(f" - Task {idx}: {task.name} using shared endpoint")
307
- else:
308
- print(
309
- f" - Task {idx}: {task.name} with endpoint {endpoint_names[idx]}"
310
- )
311
- print(f" - Output directory: {output_dir}")
312
- print("\nTo submit jobs, run the executor without --dry-run")
313
- return invocation_id
314
-
315
334
  # ================================================================
316
335
  # JOB SUBMISSION (Sequential, as before)
317
336
  # ================================================================
@@ -334,8 +353,18 @@ class LeptonExecutor(BaseExecutor):
334
353
  max_base_length = 36 - 1 - len(suffix) # -1 for the hyphen
335
354
  if len(base_job_name) > max_base_length:
336
355
  base_job_name = base_job_name[:max_base_length]
356
+ logger.info(
357
+ "Lepton job auto-generated name",
358
+ task_name=task.name,
359
+ job_name=f"{base_job_name}-{suffix}",
360
+ )
337
361
 
338
362
  lepton_job_name = f"{base_job_name}-{suffix}"
363
+ logger.info(
364
+ "Lepton job name (auto-generated)",
365
+ task_name=task.name,
366
+ job_name=lepton_job_name,
367
+ )
339
368
  job_ids.append(job_id)
340
369
  lepton_job_names.append(lepton_job_name)
341
370
 
@@ -773,6 +802,82 @@ exit 0
773
802
  return script
774
803
 
775
804
 
805
+ def _dry_run_lepton(
806
+ cfg: DictConfig, tasks_mapping: dict, invocation_id: str | None = None
807
+ ) -> None:
808
+ print("DRY RUN: Lepton job configurations prepared")
809
+ try:
810
+ # validate tasks
811
+ for task in cfg.evaluation.tasks:
812
+ get_task_from_mapping(task.name, tasks_mapping)
813
+
814
+ # nice-to-have checks (existing endpoint URL or endpoints mapping)
815
+ if getattr(cfg.deployment, "type", None) == "none":
816
+ tgt = getattr(cfg, "target", {})
817
+ api = (
818
+ tgt.get("api_endpoint")
819
+ if isinstance(tgt, dict)
820
+ else getattr(tgt, "api_endpoint", None)
821
+ ) or {}
822
+ url = api.get("url") if isinstance(api, dict) else getattr(api, "url", None)
823
+ if not url or not str(url).strip():
824
+ raise ValueError(
825
+ "target.api_endpoint.url must be set when deployment.type == 'none'"
826
+ )
827
+ else:
828
+ endpoints_cfg = getattr(cfg.deployment, "endpoints", {}) or {}
829
+ for task in cfg.evaluation.tasks:
830
+ td = get_task_from_mapping(task.name, tasks_mapping)
831
+ etype = td.get("endpoint_type")
832
+ if etype not in endpoints_cfg:
833
+ raise ValueError(
834
+ f"deployment.endpoints missing path for endpoint_type '{etype}' (task '{task.name}')"
835
+ )
836
+ path = endpoints_cfg.get(etype)
837
+ if not isinstance(path, str) or not path.startswith("/"):
838
+ raise ValueError(
839
+ f"deployment.endpoints['{etype}'] must be a non-empty path starting with '/'"
840
+ )
841
+
842
+ # lepton env var presence (reference-level)
843
+ tasks_cfg = getattr(cfg.execution, "lepton_platform", {}).get("tasks", {}) or {}
844
+ lepton_env_vars = tasks_cfg.get("env_vars", {}) or {}
845
+ api_key_name = getattr(
846
+ getattr(cfg, "target", {}).get("api_endpoint", {}), "api_key_name", None
847
+ )
848
+ for task in cfg.evaluation.tasks:
849
+ td = get_task_from_mapping(task.name, tasks_mapping)
850
+ required = td.get("required_env_vars", []) or []
851
+ for var in required:
852
+ if var == "API_KEY":
853
+ if not (("API_KEY" in lepton_env_vars) or bool(api_key_name)):
854
+ raise ValueError(
855
+ f"Task '{task.name}' requires API_KEY: set execution.lepton_platform.tasks.env_vars.API_KEY "
856
+ "or target.api_endpoint.api_key_name"
857
+ )
858
+ else:
859
+ if var not in lepton_env_vars:
860
+ raise ValueError(
861
+ f"Task '{task.name}' requires {var}: set it under execution.lepton_platform.tasks.env_vars"
862
+ )
863
+
864
+ # success (use realized output directory if invocation_id is available)
865
+ preview_output_dir = (
866
+ Path(cfg.execution.output_dir).absolute() / invocation_id
867
+ if invocation_id
868
+ else Path(cfg.execution.output_dir).absolute() / "<invocation_id>"
869
+ )
870
+ print(f" - Tasks: {len(cfg.evaluation.tasks)}")
871
+ for idx, task in enumerate(cfg.evaluation.tasks):
872
+ print(f" - Task {idx}: {task.name}")
873
+ print(f" - Output directory: {preview_output_dir}")
874
+ print("\nTo run evaluation, execute run command without --dry-run")
875
+ except Exception as e:
876
+ print(f"❌ Configuration invalid: {e}")
877
+ logger.error("Lepton dry-run validation failed", error=str(e))
878
+ return
879
+
880
+
776
881
  def _get_statuses_for_invocation_id(id: str, db: ExecutionDB) -> List[ExecutionStatus]:
777
882
  """Helper method that returns statuses if id is the invocation id"""
778
883
  jobs = db.get_jobs(id)
@@ -16,7 +16,7 @@
16
16
  # Below is the _next_ version that will be published, not the currently published one.
17
17
  MAJOR = 0
18
18
  MINOR = 1
19
- PATCH = 16
19
+ PATCH = 17
20
20
  PRE_RELEASE = ""
21
21
 
22
22
  # Use the following formatting: (major, minor, patch, pre-release)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nemo-evaluator-launcher
3
- Version: 0.1.16
3
+ Version: 0.1.17
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