ob-metaflow-extensions 1.1.161__py2.py3-none-any.whl → 1.1.161rc1__py2.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.

Potentially problematic release.


This version of ob-metaflow-extensions might be problematic. Click here for more details.

@@ -0,0 +1,110 @@
1
+ import threading
2
+ import time
3
+ import sys
4
+ from typing import Dict, Optional, Any, Callable
5
+ from functools import partial
6
+ from metaflow.exception import MetaflowException
7
+ from metaflow.metaflow_config import FAST_BAKERY_URL
8
+
9
+ from .fast_bakery import FastBakery, FastBakeryApiResponse, FastBakeryException
10
+ from .docker_environment import cache_request
11
+
12
+ BAKERY_METAFILE = ".imagebakery-cache"
13
+
14
+
15
+ class BakerException(MetaflowException):
16
+ headline = "Ran into an error while baking image"
17
+
18
+ def __init__(self, msg):
19
+ super(BakerException, self).__init__(msg)
20
+
21
+
22
+ def bake_image(
23
+ cache_file_path: str,
24
+ ref: Optional[str] = None,
25
+ python: Optional[str] = None,
26
+ pypi_packages: Optional[Dict[str, str]] = None,
27
+ conda_packages: Optional[Dict[str, str]] = None,
28
+ base_image: Optional[str] = None,
29
+ logger: Optional[Callable[[str], Any]] = None,
30
+ ) -> FastBakeryApiResponse:
31
+ """
32
+ Bakes a Docker image with the specified dependencies.
33
+
34
+ Args:
35
+ cache_file_path: Path to the cache file
36
+ ref: Reference identifier for this bake (for logging purposes)
37
+ python: Python version to use
38
+ pypi_packages: Dictionary of PyPI packages and versions
39
+ conda_packages: Dictionary of Conda packages and versions
40
+ base_image: Base Docker image to use
41
+ logger: Optional logger function to output progress
42
+
43
+ Returns:
44
+ FastBakeryApiResponse: The response from the bakery service
45
+
46
+ Raises:
47
+ BakerException: If the baking process fails
48
+ """
49
+ # Default logger if none provided
50
+ if logger is None:
51
+ logger = partial(print, file=sys.stderr)
52
+
53
+ # Thread lock for logging
54
+ logger_lock = threading.Lock()
55
+ images_baked = 0
56
+
57
+ @cache_request(cache_file_path)
58
+ def _cached_bake(
59
+ ref=None,
60
+ python=None,
61
+ pypi_packages=None,
62
+ conda_packages=None,
63
+ base_image=None,
64
+ ):
65
+ try:
66
+ bakery = FastBakery(url=FAST_BAKERY_URL)
67
+ bakery._reset_payload()
68
+ bakery.python_version(python)
69
+ bakery.pypi_packages(pypi_packages)
70
+ bakery.conda_packages(conda_packages)
71
+ bakery.base_image(base_image)
72
+ # bakery.ignore_cache()
73
+
74
+ with logger_lock:
75
+ logger(f"🍳 Baking [{ref}] ...")
76
+ logger(f" 🐍 Python: {python}")
77
+
78
+ if pypi_packages:
79
+ logger(f" 📦 PyPI packages:")
80
+ for package, version in pypi_packages.items():
81
+ logger(f" 🔧 {package}: {version}")
82
+
83
+ if conda_packages:
84
+ logger(f" 📦 Conda packages:")
85
+ for package, version in conda_packages.items():
86
+ logger(f" 🔧 {package}: {version}")
87
+
88
+ logger(f" 🏗️ Base image: {base_image}")
89
+
90
+ start_time = time.time()
91
+ res = bakery.bake()
92
+ # TODO: Get actual bake time from bakery
93
+ bake_time = time.time() - start_time
94
+
95
+ with logger_lock:
96
+ logger(f"🏁 Baked [{ref}] in {bake_time:.2f} seconds!")
97
+ nonlocal images_baked
98
+ images_baked += 1
99
+ return res
100
+ except FastBakeryException as ex:
101
+ raise BakerException(f"Bake [{ref}] failed: {str(ex)}")
102
+
103
+ # Call the cached bake function with the provided parameters
104
+ return _cached_bake(
105
+ ref=ref,
106
+ python=python,
107
+ pypi_packages=pypi_packages,
108
+ conda_packages=conda_packages,
109
+ base_image=base_image,
110
+ )
@@ -53,3 +53,4 @@ def S3(*args, **kwargs):
53
53
  from .. import profilers
54
54
  from ..plugins.snowflake import Snowflake
55
55
  from ..plugins.checkpoint_datastores import nebius_checkpoints, coreweave_checkpoints
56
+ from . import ob_internal
@@ -0,0 +1 @@
1
+ from ..plugins.fast_bakery.baker import bake_image
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob-metaflow-extensions
3
- Version: 1.1.161
3
+ Version: 1.1.161rc1
4
4
  Summary: Outerbounds Platform Extensions for Metaflow
5
5
  Author: Outerbounds, Inc.
6
6
  License: Commercial
@@ -17,6 +17,7 @@ metaflow_extensions/outerbounds/plugins/checkpoint_datastores/__init__.py,sha256
17
17
  metaflow_extensions/outerbounds/plugins/checkpoint_datastores/coreweave.py,sha256=_WzoOROFjoFa8TzsMNFp-r_1Zz7NUp-5ljn_kKlczXA,4534
18
18
  metaflow_extensions/outerbounds/plugins/checkpoint_datastores/nebius.py,sha256=zgqDLFewCeF5jqh-hUNKmC_OAjld09ln0bb8Lkeqapc,4659
19
19
  metaflow_extensions/outerbounds/plugins/fast_bakery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ metaflow_extensions/outerbounds/plugins/fast_bakery/baker.py,sha256=ShE5omFBr83wkvEhL_ptRFvDNMs6wefg4BjaafQjTcM,3602
20
21
  metaflow_extensions/outerbounds/plugins/fast_bakery/docker_environment.py,sha256=Tl520HdBteg-aDOM7mnnJJpdDCZc49BmFFmLUc_vTi8,15018
21
22
  metaflow_extensions/outerbounds/plugins/fast_bakery/fast_bakery.py,sha256=PE81ZB54OAMXkMGSB7JqgvgMg7N9kvoVclrWL-6jc2U,5626
22
23
  metaflow_extensions/outerbounds/plugins/fast_bakery/fast_bakery_cli.py,sha256=kqFyu2bJSnc9_9aYfBpz5xK6L6luWFZK_NMuh8f1eVk,1494
@@ -66,14 +67,15 @@ metaflow_extensions/outerbounds/plugins/torchtune/__init__.py,sha256=TOXNeyhcgd8
66
67
  metaflow_extensions/outerbounds/profilers/__init__.py,sha256=wa_jhnCBr82TBxoS0e8b6_6sLyZX0fdHicuGJZNTqKw,29
67
68
  metaflow_extensions/outerbounds/profilers/gpu.py,sha256=3Er8uKQzfm_082uadg4yn_D4Y-iSCgzUfFmguYxZsz4,27485
68
69
  metaflow_extensions/outerbounds/toplevel/__init__.py,sha256=qWUJSv_r5hXJ7jV_On4nEasKIfUCm6_UjkjXWA_A1Ts,90
69
- metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py,sha256=oCRFfwoLODDju2-6JU2h74x6O-GCyO7PRRKTZsj-73k,2009
70
+ metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py,sha256=505fLAY4NkBCGtjpXlE0RgaKVpJ0jOUq1-Fq-EKzPew,2035
71
+ metaflow_extensions/outerbounds/toplevel/ob_internal.py,sha256=53xM6d_UYT3uGFFA59UzxN23H5QMO5_F39pALpmGy04,51
70
72
  metaflow_extensions/outerbounds/toplevel/plugins/azure/__init__.py,sha256=WUuhz2YQfI4fz7nIcipwwWq781eaoHEk7n4GAn1npDg,63
71
73
  metaflow_extensions/outerbounds/toplevel/plugins/gcp/__init__.py,sha256=BbZiaH3uILlEZ6ntBLKeNyqn3If8nIXZFq_Apd7Dhco,70
72
74
  metaflow_extensions/outerbounds/toplevel/plugins/kubernetes/__init__.py,sha256=5zG8gShSj8m7rgF4xgWBZFuY3GDP5n1T0ktjRpGJLHA,69
73
75
  metaflow_extensions/outerbounds/toplevel/plugins/ollama/__init__.py,sha256=GRSz2zwqkvlmFS6bcfYD_CX6CMko9DHQokMaH1iBshA,47
74
76
  metaflow_extensions/outerbounds/toplevel/plugins/snowflake/__init__.py,sha256=LptpH-ziXHrednMYUjIaosS1SXD3sOtF_9_eRqd8SJw,50
75
77
  metaflow_extensions/outerbounds/toplevel/plugins/torchtune/__init__.py,sha256=uTVkdSk3xZ7hEKYfdlyVteWj5KeDwaM1hU9WT-_YKfI,50
76
- ob_metaflow_extensions-1.1.161.dist-info/METADATA,sha256=5iL8FqYFqx1U_GR1YUAzqeV1NrR44jnr_vFSUOmjJEo,521
77
- ob_metaflow_extensions-1.1.161.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
78
- ob_metaflow_extensions-1.1.161.dist-info/top_level.txt,sha256=NwG0ukwjygtanDETyp_BUdtYtqIA_lOjzFFh1TsnxvI,20
79
- ob_metaflow_extensions-1.1.161.dist-info/RECORD,,
78
+ ob_metaflow_extensions-1.1.161rc1.dist-info/METADATA,sha256=QZ_Y0zbT95Qr57WQ4XnvhZUSXoOQy3x2Pd-KT73mnxo,524
79
+ ob_metaflow_extensions-1.1.161rc1.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
80
+ ob_metaflow_extensions-1.1.161rc1.dist-info/top_level.txt,sha256=NwG0ukwjygtanDETyp_BUdtYtqIA_lOjzFFh1TsnxvI,20
81
+ ob_metaflow_extensions-1.1.161rc1.dist-info/RECORD,,