lyceum-cli 1.0.30__py3-none-any.whl → 1.0.32__py3-none-any.whl
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.
- lyceum/external/compute/execution/gpu_selection.py +26 -6
- lyceum/shared/config.py +1 -1
- {lyceum_cli-1.0.30.dist-info → lyceum_cli-1.0.32.dist-info}/METADATA +1 -1
- {lyceum_cli-1.0.30.dist-info → lyceum_cli-1.0.32.dist-info}/RECORD +7 -7
- {lyceum_cli-1.0.30.dist-info → lyceum_cli-1.0.32.dist-info}/WHEEL +0 -0
- {lyceum_cli-1.0.30.dist-info → lyceum_cli-1.0.32.dist-info}/entry_points.txt +0 -0
- {lyceum_cli-1.0.30.dist-info → lyceum_cli-1.0.32.dist-info}/top_level.txt +0 -0
|
@@ -59,6 +59,22 @@ GPU_VRAM_GB = {
|
|
|
59
59
|
"gpu.rtx6000pro": 48,
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
# Fallback pricing per hour (used when API doesn't return prices)
|
|
63
|
+
GPU_PRICE_PER_HOUR = {
|
|
64
|
+
"cpu": 0.20,
|
|
65
|
+
"gpu": 0.39,
|
|
66
|
+
"gpu.t4": 0.39,
|
|
67
|
+
"gpu.t4.64gb": 1.50,
|
|
68
|
+
"gpu.a100": 2.00,
|
|
69
|
+
"gpu.a100.40gb": 1.95,
|
|
70
|
+
"gpu.a100.80gb": 1.99,
|
|
71
|
+
"gpu.h100": 3.29,
|
|
72
|
+
"gpu.h200": 3.69,
|
|
73
|
+
"gpu.l40s": 1.49,
|
|
74
|
+
"gpu.b200": 5.69,
|
|
75
|
+
"gpu.rtx6000pro": 1.95,
|
|
76
|
+
}
|
|
77
|
+
|
|
62
78
|
|
|
63
79
|
def format_gpu_name(profile: str) -> str:
|
|
64
80
|
"""Format GPU profile name for display."""
|
|
@@ -95,6 +111,9 @@ def fetch_gpu_pricing() -> dict[str, float]:
|
|
|
95
111
|
def calculate_cost(execution_time_s: float, hardware_profile: str, pricing: dict[str, float]) -> float | None:
|
|
96
112
|
"""Calculate cost based on execution time and GPU pricing."""
|
|
97
113
|
price_per_hour = pricing.get(hardware_profile)
|
|
114
|
+
# Fallback to hardcoded pricing if API doesn't have this profile
|
|
115
|
+
if price_per_hour is None or price_per_hour == 0:
|
|
116
|
+
price_per_hour = GPU_PRICE_PER_HOUR.get(hardware_profile)
|
|
98
117
|
if price_per_hour is None or price_per_hour == 0:
|
|
99
118
|
return None
|
|
100
119
|
return execution_time_s * (price_per_hour / 3600)
|
|
@@ -399,18 +418,19 @@ def display_results(data: dict, file_path: str | None = None) -> None:
|
|
|
399
418
|
if vram and util:
|
|
400
419
|
total_mem_gb = vram * (util / 100)
|
|
401
420
|
|
|
402
|
-
# Find GPUs that were excluded
|
|
403
|
-
excluded_gpus =
|
|
421
|
+
# Find GPUs that were excluded (deduplicate by display name)
|
|
422
|
+
excluded_gpus = {}
|
|
404
423
|
for profile, vram in GPU_VRAM_GB.items():
|
|
405
424
|
if profile not in compatible_gpu_types and profile in ("gpu", "gpu.t4"):
|
|
406
|
-
|
|
407
|
-
|
|
425
|
+
gpu_name = format_gpu_name(profile)
|
|
426
|
+
# Only keep one entry per display name (e.g., "T4")
|
|
427
|
+
if gpu_name not in excluded_gpus:
|
|
428
|
+
excluded_gpus[gpu_name] = vram
|
|
408
429
|
|
|
409
430
|
if excluded_gpus and total_mem_gb:
|
|
410
431
|
console.print()
|
|
411
432
|
console.print("[dim]Excluded GPUs (insufficient VRAM):[/dim]")
|
|
412
|
-
for
|
|
413
|
-
gpu_name = format_gpu_name(profile)
|
|
433
|
+
for gpu_name, vram in sorted(excluded_gpus.items(), key=lambda x: x[1]):
|
|
414
434
|
console.print(f"[dim] • {gpu_name}: {vram} GB available, ~{total_mem_gb:.1f} GB required[/dim]")
|
|
415
435
|
|
|
416
436
|
# Show run command hint if we have a best GPU and file path
|
lyceum/shared/config.py
CHANGED
|
@@ -129,7 +129,7 @@ class _Config:
|
|
|
129
129
|
if self.is_token_expired():
|
|
130
130
|
console.print("[dim]Token expired, attempting refresh...[/dim]")
|
|
131
131
|
if not self.refresh_access_token():
|
|
132
|
-
console.print("[red]Token refresh failed. Please run 'lyceum login' again.[/red]")
|
|
132
|
+
console.print("[red]Token refresh failed. Please run 'lyceum auth login' again.[/red]")
|
|
133
133
|
raise typer.Exit(1)
|
|
134
134
|
|
|
135
135
|
# Return config instance - commands use httpx directly
|
|
@@ -8,7 +8,7 @@ lyceum/external/compute/execution/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZ
|
|
|
8
8
|
lyceum/external/compute/execution/config.py,sha256=6JJgLJnDPTwevEaNdB1nEICih_qbBmws5u5_S9gj7k0,8866
|
|
9
9
|
lyceum/external/compute/execution/docker.py,sha256=0Y6lxJAm56Jrl0HxeNz1mX6DGs556i2iMN9_U1JQP0c,9635
|
|
10
10
|
lyceum/external/compute/execution/docker_compose.py,sha256=YsWPnw5nB1ZpqjU9X8o_klT78I5m46PapVwVEeWra_8,9189
|
|
11
|
-
lyceum/external/compute/execution/gpu_selection.py,sha256=
|
|
11
|
+
lyceum/external/compute/execution/gpu_selection.py,sha256=9Xx5mmk1Zv5lzXccLi4_jEQ0DOUySng_gHNypkgUOAg,39661
|
|
12
12
|
lyceum/external/compute/execution/notebook.py,sha256=Gw9UhJ-UjYhpjdIYQ4IMYhVjhSkAFpOQ9aFYj1qOeww,7542
|
|
13
13
|
lyceum/external/compute/execution/python.py,sha256=8Y9ElWs9RdauQbhECKcBPSoT0XZeGhXZ_pkEpr3sGro,12878
|
|
14
14
|
lyceum/external/compute/execution/workloads.py,sha256=4fsRWbYGmsQMGPPIN1jUG8cG5NPG9yV26ANJ-DtaXqc,5844
|
|
@@ -22,15 +22,15 @@ lyceum/external/vms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
|
22
22
|
lyceum/external/vms/instances.py,sha256=8DKpI8PbyZFzk5RT-IPgoMDjkf_-HC-2pJKuSFs-5BA,11007
|
|
23
23
|
lyceum/external/vms/management.py,sha256=dYEkN5Qiur-SG4G5CLOk2Rbr0HW3rK1BROSp0K6KxC8,15405
|
|
24
24
|
lyceum/shared/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
25
|
-
lyceum/shared/config.py,sha256=
|
|
25
|
+
lyceum/shared/config.py,sha256=vgmspvId3D60ESJs2LLhZ5WUglIaJ7kaehNnWB7HEuA,5339
|
|
26
26
|
lyceum/shared/display.py,sha256=-VSAfoa0yivTvxRrN2RYr2Sq1x_msZqENjnkSedmbhQ,4444
|
|
27
27
|
lyceum/shared/imports.py,sha256=wEG4wfVTIqJ6MBWDRAN96iGmVCb9ST2aOqSjkbvajug,11768
|
|
28
28
|
lyceum/shared/streaming.py,sha256=wFb7w7fra63y8WWaIA8_E1Z6Sx_6G-0J53Zh010eZgk,9355
|
|
29
29
|
lyceum_cloud_execution_api_client/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
30
30
|
lyceum_cloud_execution_api_client/api/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
31
31
|
lyceum_cloud_execution_api_client/models/__init__.py,sha256=AMlb9R9O9aNC9hvKz_8TFpEfOolYC3VtFS5JX17kYks,4888
|
|
32
|
-
lyceum_cli-1.0.
|
|
33
|
-
lyceum_cli-1.0.
|
|
34
|
-
lyceum_cli-1.0.
|
|
35
|
-
lyceum_cli-1.0.
|
|
36
|
-
lyceum_cli-1.0.
|
|
32
|
+
lyceum_cli-1.0.32.dist-info/METADATA,sha256=0EZXP3LeTAcdpO0btSCLTEoZbps27M93vD71gQz7FSU,1482
|
|
33
|
+
lyceum_cli-1.0.32.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
34
|
+
lyceum_cli-1.0.32.dist-info/entry_points.txt,sha256=Oq-9wDkxVd6MHgNiUTYwXI9SGhvR3VkD7Mvk0xhiUZo,43
|
|
35
|
+
lyceum_cli-1.0.32.dist-info/top_level.txt,sha256=CR7FEMloAXgLsHUR6ti3mWNcpgje27HRHSfq8doIils,41
|
|
36
|
+
lyceum_cli-1.0.32.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|