modal 0.73.6__py3-none-any.whl → 0.73.8__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.
- modal/_functions.py +3 -0
- modal/_runtime/container_io_manager.py +8 -8
- modal/app.py +4 -0
- modal/app.pyi +4 -0
- modal/client.pyi +2 -2
- modal/functions.pyi +1 -0
- {modal-0.73.6.dist-info → modal-0.73.8.dist-info}/METADATA +1 -1
- {modal-0.73.6.dist-info → modal-0.73.8.dist-info}/RECORD +16 -16
- modal_proto/api.proto +3 -0
- modal_proto/api_pb2.py +542 -542
- modal_proto/api_pb2.pyi +9 -2
- modal_version/_version_generated.py +1 -1
- {modal-0.73.6.dist-info → modal-0.73.8.dist-info}/LICENSE +0 -0
- {modal-0.73.6.dist-info → modal-0.73.8.dist-info}/WHEEL +0 -0
- {modal-0.73.6.dist-info → modal-0.73.8.dist-info}/entry_points.txt +0 -0
- {modal-0.73.6.dist-info → modal-0.73.8.dist-info}/top_level.txt +0 -0
modal/_functions.py
CHANGED
@@ -476,6 +476,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
476
476
|
_experimental_buffer_containers: Optional[int] = None,
|
477
477
|
_experimental_proxy_ip: Optional[str] = None,
|
478
478
|
_experimental_custom_scaling_factor: Optional[float] = None,
|
479
|
+
_experimental_enable_gpu_snapshot: bool = False,
|
479
480
|
) -> "_Function":
|
480
481
|
"""mdmd:hidden"""
|
481
482
|
# Needed to avoid circular imports
|
@@ -824,6 +825,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
824
825
|
_experimental_buffer_containers=_experimental_buffer_containers or 0,
|
825
826
|
_experimental_proxy_ip=_experimental_proxy_ip,
|
826
827
|
_experimental_custom_scaling=_experimental_custom_scaling_factor is not None,
|
828
|
+
_experimental_enable_gpu_snapshot=_experimental_enable_gpu_snapshot,
|
827
829
|
)
|
828
830
|
|
829
831
|
if isinstance(gpu, list):
|
@@ -851,6 +853,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
851
853
|
_experimental_group_size=function_definition._experimental_group_size,
|
852
854
|
_experimental_buffer_containers=function_definition._experimental_buffer_containers,
|
853
855
|
_experimental_custom_scaling=function_definition._experimental_custom_scaling,
|
856
|
+
_experimental_enable_gpu_snapshot=_experimental_enable_gpu_snapshot,
|
854
857
|
_experimental_proxy_ip=function_definition._experimental_proxy_ip,
|
855
858
|
snapshot_debug=function_definition.snapshot_debug,
|
856
859
|
runtime_perf_record=function_definition.runtime_perf_record,
|
@@ -491,7 +491,7 @@ class _ContainerIOManager:
|
|
491
491
|
function_call_id: str,
|
492
492
|
start_index: int,
|
493
493
|
data_format: int,
|
494
|
-
|
494
|
+
serialized_messages: list[Any],
|
495
495
|
) -> None:
|
496
496
|
"""Put data onto the `data_out` stream of a function call.
|
497
497
|
|
@@ -500,7 +500,7 @@ class _ContainerIOManager:
|
|
500
500
|
still use the previous Postgres-backed system based on `FunctionPutOutputs()`.
|
501
501
|
"""
|
502
502
|
data_chunks: list[api_pb2.DataChunk] = []
|
503
|
-
for i, message_bytes in enumerate(
|
503
|
+
for i, message_bytes in enumerate(serialized_messages):
|
504
504
|
chunk = api_pb2.DataChunk(data_format=data_format, index=start_index + i) # type: ignore
|
505
505
|
if len(message_bytes) > MAX_OBJECT_SIZE_BYTES:
|
506
506
|
chunk.data_blob_id = await blob_upload(message_bytes, self._client.stub)
|
@@ -523,8 +523,8 @@ class _ContainerIOManager:
|
|
523
523
|
# If we don't sleep here for 1ms we end up with an extra call to .put_data_out().
|
524
524
|
if index == 1:
|
525
525
|
await asyncio.sleep(0.001)
|
526
|
-
|
527
|
-
total_size = len(
|
526
|
+
serialized_messages = [serialize_data_format(message, data_format)]
|
527
|
+
total_size = len(serialized_messages[0]) + 512
|
528
528
|
while total_size < 16 * 1024 * 1024: # 16 MiB, maximum size in a single message
|
529
529
|
try:
|
530
530
|
message = message_rx.get_nowait()
|
@@ -534,10 +534,10 @@ class _ContainerIOManager:
|
|
534
534
|
received_sentinel = True
|
535
535
|
break
|
536
536
|
else:
|
537
|
-
|
538
|
-
total_size += len(
|
539
|
-
await self.put_data_out(function_call_id, index, data_format,
|
540
|
-
index += len(
|
537
|
+
serialized_messages.append(serialize_data_format(message, data_format))
|
538
|
+
total_size += len(serialized_messages[-1]) + 512 # 512 bytes for estimated framing overhead
|
539
|
+
await self.put_data_out(function_call_id, index, data_format, serialized_messages)
|
540
|
+
index += len(serialized_messages)
|
541
541
|
|
542
542
|
async def _queue_create(self, size: int) -> asyncio.Queue:
|
543
543
|
"""Create a queue, on the synchronicity event loop (needed on Python 3.8 and 3.9)."""
|
modal/app.py
CHANGED
@@ -617,6 +617,7 @@ class _App:
|
|
617
617
|
_experimental_buffer_containers: Optional[int] = None, # Number of additional, idle containers to keep around.
|
618
618
|
_experimental_proxy_ip: Optional[str] = None, # IP address of proxy
|
619
619
|
_experimental_custom_scaling_factor: Optional[float] = None, # Custom scaling factor
|
620
|
+
_experimental_enable_gpu_snapshot: bool = False, # Experimentally enable GPU memory snapshots.
|
620
621
|
) -> _FunctionDecoratorType:
|
621
622
|
"""Decorator to register a new Modal [Function](/docs/reference/modal.Function) with this App."""
|
622
623
|
if isinstance(_warn_parentheses_missing, _Image):
|
@@ -759,6 +760,7 @@ class _App:
|
|
759
760
|
i6pn_enabled=i6pn_enabled,
|
760
761
|
cluster_size=cluster_size, # Experimental: Clustered functions
|
761
762
|
include_source=include_source if include_source is not None else self._include_source_default,
|
763
|
+
_experimental_enable_gpu_snapshot=_experimental_enable_gpu_snapshot,
|
762
764
|
)
|
763
765
|
|
764
766
|
self._add_function(function, webhook_config is not None)
|
@@ -816,6 +818,7 @@ class _App:
|
|
816
818
|
_experimental_buffer_containers: Optional[int] = None, # Number of additional, idle containers to keep around.
|
817
819
|
_experimental_proxy_ip: Optional[str] = None, # IP address of proxy
|
818
820
|
_experimental_custom_scaling_factor: Optional[float] = None, # Custom scaling factor
|
821
|
+
_experimental_enable_gpu_snapshot: bool = False, # Experimentally enable GPU memory snapshots.
|
819
822
|
) -> Callable[[CLS_T], CLS_T]:
|
820
823
|
"""
|
821
824
|
Decorator to register a new Modal [Cls](/docs/reference/modal.Cls) with this App.
|
@@ -890,6 +893,7 @@ class _App:
|
|
890
893
|
_experimental_buffer_containers=_experimental_buffer_containers,
|
891
894
|
_experimental_proxy_ip=_experimental_proxy_ip,
|
892
895
|
_experimental_custom_scaling_factor=_experimental_custom_scaling_factor,
|
896
|
+
_experimental_enable_gpu_snapshot=_experimental_enable_gpu_snapshot,
|
893
897
|
)
|
894
898
|
|
895
899
|
self._add_function(cls_func, is_web_endpoint=False)
|
modal/app.pyi
CHANGED
@@ -197,6 +197,7 @@ class _App:
|
|
197
197
|
_experimental_buffer_containers: typing.Optional[int] = None,
|
198
198
|
_experimental_proxy_ip: typing.Optional[str] = None,
|
199
199
|
_experimental_custom_scaling_factor: typing.Optional[float] = None,
|
200
|
+
_experimental_enable_gpu_snapshot: bool = False,
|
200
201
|
) -> _FunctionDecoratorType: ...
|
201
202
|
@typing_extensions.dataclass_transform(
|
202
203
|
field_specifiers=(modal.cls.parameter,),
|
@@ -241,6 +242,7 @@ class _App:
|
|
241
242
|
_experimental_buffer_containers: typing.Optional[int] = None,
|
242
243
|
_experimental_proxy_ip: typing.Optional[str] = None,
|
243
244
|
_experimental_custom_scaling_factor: typing.Optional[float] = None,
|
245
|
+
_experimental_enable_gpu_snapshot: bool = False,
|
244
246
|
) -> collections.abc.Callable[[CLS_T], CLS_T]: ...
|
245
247
|
async def spawn_sandbox(
|
246
248
|
self,
|
@@ -431,6 +433,7 @@ class App:
|
|
431
433
|
_experimental_buffer_containers: typing.Optional[int] = None,
|
432
434
|
_experimental_proxy_ip: typing.Optional[str] = None,
|
433
435
|
_experimental_custom_scaling_factor: typing.Optional[float] = None,
|
436
|
+
_experimental_enable_gpu_snapshot: bool = False,
|
434
437
|
) -> _FunctionDecoratorType: ...
|
435
438
|
@typing_extensions.dataclass_transform(
|
436
439
|
field_specifiers=(modal.cls.parameter,),
|
@@ -475,6 +478,7 @@ class App:
|
|
475
478
|
_experimental_buffer_containers: typing.Optional[int] = None,
|
476
479
|
_experimental_proxy_ip: typing.Optional[str] = None,
|
477
480
|
_experimental_custom_scaling_factor: typing.Optional[float] = None,
|
481
|
+
_experimental_enable_gpu_snapshot: bool = False,
|
478
482
|
) -> collections.abc.Callable[[CLS_T], CLS_T]: ...
|
479
483
|
|
480
484
|
class __spawn_sandbox_spec(typing_extensions.Protocol[SUPERSELF]):
|
modal/client.pyi
CHANGED
@@ -27,7 +27,7 @@ class _Client:
|
|
27
27
|
_snapshotted: bool
|
28
28
|
|
29
29
|
def __init__(
|
30
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.
|
30
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.8"
|
31
31
|
): ...
|
32
32
|
def is_closed(self) -> bool: ...
|
33
33
|
@property
|
@@ -85,7 +85,7 @@ class Client:
|
|
85
85
|
_snapshotted: bool
|
86
86
|
|
87
87
|
def __init__(
|
88
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.
|
88
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.8"
|
89
89
|
): ...
|
90
90
|
def is_closed(self) -> bool: ...
|
91
91
|
@property
|
modal/functions.pyi
CHANGED
@@ -102,6 +102,7 @@ class Function(
|
|
102
102
|
_experimental_buffer_containers: typing.Optional[int] = None,
|
103
103
|
_experimental_proxy_ip: typing.Optional[str] = None,
|
104
104
|
_experimental_custom_scaling_factor: typing.Optional[float] = None,
|
105
|
+
_experimental_enable_gpu_snapshot: bool = False,
|
105
106
|
) -> Function: ...
|
106
107
|
def _bind_parameters(
|
107
108
|
self,
|
@@ -3,7 +3,7 @@ modal/__main__.py,sha256=scYhGFqh8OJcVDo-VOxIT6CCwxOgzgflYWMnIZiMRqE,2871
|
|
3
3
|
modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
|
4
4
|
modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
|
5
5
|
modal/_container_entrypoint.py,sha256=qahIuJvaMmWG85N5vNS1yuAQ9XZoo1ftzfatkos_q7I,29553
|
6
|
-
modal/_functions.py,sha256=
|
6
|
+
modal/_functions.py,sha256=XTcpMIlGqa3MPSTbnCwvbagTCeIHlnV4g8WlkGF5SOs,70352
|
7
7
|
modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
|
8
8
|
modal/_location.py,sha256=S3lSxIU3h9HkWpkJ3Pwo0pqjIOSB1fjeSgUsY3x7eec,1202
|
9
9
|
modal/_object.py,sha256=ItQcsMNkz9Y3kdTsvfNarbW-paJ2qabDyQ7njaqY0XI,11359
|
@@ -17,11 +17,11 @@ modal/_traceback.py,sha256=IZQzB3fVlUfMHOSyKUgw0H6qv4yHnpyq-XVCNZKfUdA,5023
|
|
17
17
|
modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
|
18
18
|
modal/_tunnel.pyi,sha256=JmmDYAy9F1FpgJ_hWx0xkom2nTOFQjn4mTPYlU3PFo4,1245
|
19
19
|
modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
|
20
|
-
modal/app.py,sha256=
|
21
|
-
modal/app.pyi,sha256=
|
20
|
+
modal/app.py,sha256=wRygVSrWH8iIqhDAAl2Ww_RAkz8MCJZ0Jt9qYZCF6SA,44626
|
21
|
+
modal/app.pyi,sha256=lxiuWzE_OLb3WHg-H7Pek9DGBuCUzZ55P594VhJL5LA,26113
|
22
22
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
23
23
|
modal/client.py,sha256=8SQawr7P1PNUCq1UmJMUQXG2jIo4Nmdcs311XqrNLRE,15276
|
24
|
-
modal/client.pyi,sha256=
|
24
|
+
modal/client.pyi,sha256=kOt17KK6b51zHs9T5vme0cCrLzJu-nw1DTE1kSuxXcQ,7591
|
25
25
|
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
26
26
|
modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
|
27
27
|
modal/cls.py,sha256=kNnZrBYVXOhgEXU0rDWk2Hr-bQRrsZkMKDgC-TD_6Bs,31063
|
@@ -40,7 +40,7 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
|
|
40
40
|
modal/file_io.pyi,sha256=NTRft1tbPSWf9TlWVeZmTlgB5AZ_Zhu2srWIrWr7brk,9445
|
41
41
|
modal/file_pattern_matcher.py,sha256=1cZ4V2wSLiaXqAqStETSwp3bzDD6QZOt6pmmjk3Okz4,6505
|
42
42
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
43
|
-
modal/functions.pyi,sha256=
|
43
|
+
modal/functions.pyi,sha256=mtngzj8VlzMOQATe6muBN5oH_Gw9zGKxMKZ56Z-41kU,14288
|
44
44
|
modal/gpu.py,sha256=2qZMNnoMrjU-5Bu7fx68pANUAKTtZq0EWEEeBA9OUVQ,7426
|
45
45
|
modal/image.py,sha256=Vjsi7wS9dEcoj-7m7_LmvbK5iqEuFz-SHKl2K-qWcew,90952
|
46
46
|
modal/image.pyi,sha256=A5mW2dBguEhmRo815Ax1rBIMXTCriu7PqLMHoUPsez8,26372
|
@@ -83,7 +83,7 @@ modal/volume.py,sha256=JAWeDvoAG95tMBv-fYIERyHsJPS_X_xGpxRRmYtb6j0,30096
|
|
83
83
|
modal/volume.pyi,sha256=kTsXarphjZILXci84LQy7EyC84eXUs5-7D62IM5q3eE,12491
|
84
84
|
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
85
85
|
modal/_runtime/asgi.py,sha256=c4hmaMW1pLo-cm7ouriJjieuFm4ZF6D2LMy0638sfOs,22139
|
86
|
-
modal/_runtime/container_io_manager.py,sha256=
|
86
|
+
modal/_runtime/container_io_manager.py,sha256=QVWMCvJatd2696wsauzXl20psxCYsR0d_CHeS5ceTsU,43201
|
87
87
|
modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
|
88
88
|
modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
|
89
89
|
modal/_runtime/user_code_imports.py,sha256=zl_Mq9dsrVF62x3w-iNK1YAhZKYAXeFaGpd4G7AySTc,14746
|
@@ -153,10 +153,10 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
|
|
153
153
|
modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
|
154
154
|
modal_global_objects/mounts/python_standalone.py,sha256=EsC-hdPtiAPOwgW9emHN6muNUkrJwR8dYxroVArxHxM,1841
|
155
155
|
modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
156
|
-
modal_proto/api.proto,sha256=
|
156
|
+
modal_proto/api.proto,sha256=_RV_hQIWR_CmanZcjieKll-P9P5qVsRDDS7TtGWL4AU,85264
|
157
157
|
modal_proto/api_grpc.py,sha256=FYGqDegM_w_qxdtlxum8k31mDibKoMvmNxv_p9cKdKs,109056
|
158
|
-
modal_proto/api_pb2.py,sha256=
|
159
|
-
modal_proto/api_pb2.pyi,sha256=
|
158
|
+
modal_proto/api_pb2.py,sha256=7hj3Dqmv3Xb6nEzLVMt-zai1EGqUT5uAU5nbGjnk85A,311104
|
159
|
+
modal_proto/api_pb2.pyi,sha256=ScYf3xdzV3TQZZR-uPusjrEHoHIxKCRPseS7e8Ee_EI,415384
|
160
160
|
modal_proto/api_pb2_grpc.py,sha256=DNp0Et5i_Ey4dKx_1o1LRtYhyWYyT0NzTcAY4EcHn-c,235765
|
161
161
|
modal_proto/api_pb2_grpc.pyi,sha256=RI6tWC3L8EIN4-izFSEGPPJl5Ta0lXPNuHUJaWAr35s,54892
|
162
162
|
modal_proto/modal_api_grpc.py,sha256=UG8WJU81afrWPwItWB4Ag64E9EpyREMpBbAVGVEYJiM,14550
|
@@ -170,10 +170,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
|
|
170
170
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
171
171
|
modal_version/__init__.py,sha256=wiJQ53c-OMs0Xf1UeXOxQ7FwlV1VzIjnX6o-pRYZ_Pk,470
|
172
172
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
173
|
-
modal_version/_version_generated.py,sha256=
|
174
|
-
modal-0.73.
|
175
|
-
modal-0.73.
|
176
|
-
modal-0.73.
|
177
|
-
modal-0.73.
|
178
|
-
modal-0.73.
|
179
|
-
modal-0.73.
|
173
|
+
modal_version/_version_generated.py,sha256=a8LMamoFRZKpp6SoTp5bDH1HRWGljeWLZesEIHf3WIE,148
|
174
|
+
modal-0.73.8.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
175
|
+
modal-0.73.8.dist-info/METADATA,sha256=wsn98lBqsvSVbab7C3DqlgtiyUF8vmevqqGNf7Ir6WE,2329
|
176
|
+
modal-0.73.8.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
177
|
+
modal-0.73.8.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
178
|
+
modal-0.73.8.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
|
179
|
+
modal-0.73.8.dist-info/RECORD,,
|
modal_proto/api.proto
CHANGED
@@ -1263,6 +1263,8 @@ message Function {
|
|
1263
1263
|
bool _experimental_custom_scaling = 76;
|
1264
1264
|
|
1265
1265
|
string cloud_provider_str = 77; // Supersedes cloud_provider
|
1266
|
+
|
1267
|
+
bool _experimental_enable_gpu_snapshot = 78; // Experimental support for GPU snapshotting
|
1266
1268
|
}
|
1267
1269
|
|
1268
1270
|
message FunctionAsyncInvokeRequest {
|
@@ -1376,6 +1378,7 @@ message FunctionData {
|
|
1376
1378
|
uint32 _experimental_group_size = 19;
|
1377
1379
|
uint32 _experimental_buffer_containers = 22;
|
1378
1380
|
bool _experimental_custom_scaling = 23;
|
1381
|
+
bool _experimental_enable_gpu_snapshot = 30;
|
1379
1382
|
string worker_id = 7; // for internal debugging use only
|
1380
1383
|
|
1381
1384
|
uint32 timeout_secs = 8;
|