modal 0.73.22__py3-none-any.whl → 0.73.24__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/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.22"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.24"
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.22"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.24"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
modal/functions.pyi CHANGED
@@ -200,11 +200,11 @@ class Function(
200
200
 
201
201
  _call_generator_nowait: ___call_generator_nowait_spec[typing_extensions.Self]
202
202
 
203
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
203
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
204
204
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
205
205
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
206
206
 
207
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
207
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
208
208
 
209
209
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
210
210
  def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -219,19 +219,19 @@ class Function(
219
219
  self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
220
220
  ) -> modal._functions.OriginalReturnType: ...
221
221
 
222
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
222
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
223
223
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
224
224
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
225
225
 
226
226
  _experimental_spawn: ___experimental_spawn_spec[
227
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
227
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
228
228
  ]
229
229
 
230
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
230
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
231
231
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
232
232
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
233
233
 
234
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
234
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
235
235
 
236
236
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
237
237
 
modal/gpu.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Copyright Modal Labs 2022
2
2
  from dataclasses import dataclass
3
- from typing import Callable, Optional, Union
3
+ from typing import Union
4
4
 
5
5
  from modal_proto import api_pb2
6
6
 
@@ -154,38 +154,36 @@ class Any(_GPUConfig):
154
154
  return f"GPU(Any, count={self.count})"
155
155
 
156
156
 
157
- STRING_TO_GPU_CONFIG: dict[str, Callable] = {
158
- "t4": T4,
159
- "l4": L4,
160
- "a100": A100,
161
- "a100-80gb": lambda: A100(size="80GB"),
162
- "h100": H100,
163
- "a10g": A10G,
164
- "l40s": L40S,
165
- "any": Any,
166
- }
167
- display_string_to_config = "\n".join(f'- "{key}" → `{c()}`' for key, c in STRING_TO_GPU_CONFIG.items() if key != "inf2")
168
- __doc__ = f"""
157
+ __doc__ = """
169
158
  **GPU configuration shortcodes**
170
159
 
171
- The following are the valid `str` values for the `gpu` parameter of
160
+ You can pass a wide range of `str` values for the `gpu` parameter of
172
161
  [`@app.function`](/docs/reference/modal.App#function).
173
162
 
174
- {display_string_to_config}
163
+ For instance:
164
+ - `gpu="H100"` will attach 1 H100 GPU to each container
165
+ - `gpu="L40S"` will attach 1 L40S GPU to each container
166
+ - `gpu="T4:4"` will attach 4 T4 GPUs to each container
175
167
 
176
- The shortcodes also support specifying count by suffixing `:N` to acquire `N` GPUs.
177
- For example, `a10g:4` will provision 4 A10G GPUs.
168
+ You can see a list of Modal GPU options in the
169
+ [GPU docs](https://modal.com/docs/guide/gpu).
178
170
 
179
- Other configurations can be created using the constructors documented below.
171
+ **Example**
172
+
173
+ ```python
174
+ @app.function(gpu="A100-80GB:4")
175
+ def my_gpu_function():
176
+ ... # This will have 4 A100-80GB with each container
177
+ ```
180
178
  """
181
179
 
182
180
  # bool will be deprecated in future versions.
183
181
  GPU_T = Union[None, bool, str, _GPUConfig]
184
182
 
185
183
 
186
- def _parse_gpu_config(value: GPU_T) -> Optional[_GPUConfig]:
184
+ def parse_gpu_config(value: GPU_T) -> api_pb2.GPUConfig:
187
185
  if isinstance(value, _GPUConfig):
188
- return value
186
+ return value._to_proto()
189
187
  elif isinstance(value, str):
190
188
  count = 1
191
189
  if ":" in value:
@@ -194,34 +192,12 @@ def _parse_gpu_config(value: GPU_T) -> Optional[_GPUConfig]:
194
192
  count = int(count_str)
195
193
  except ValueError:
196
194
  raise InvalidError(f"Invalid GPU count: {count_str}. Value must be an integer.")
197
-
198
- if value.lower() == "a100-20g":
199
- return A100(size="20GB", count=count) # Triggers unsupported error underneath.
200
- elif value.lower() == "a100-40gb":
201
- return A100(size="40GB", count=count)
202
- elif value.lower() == "a100-80gb":
203
- return A100(size="80GB", count=count)
204
- elif value.lower() not in STRING_TO_GPU_CONFIG:
205
- raise InvalidError(
206
- f"Invalid GPU type: {value}. "
207
- f"Value must be one of {list(STRING_TO_GPU_CONFIG.keys())} (case-insensitive)."
208
- )
209
- else:
210
- return STRING_TO_GPU_CONFIG[value.lower()](count=count)
195
+ gpu_type = value.upper()
196
+ return api_pb2.GPUConfig(
197
+ gpu_type=gpu_type,
198
+ count=count,
199
+ )
211
200
  elif value is None or value is False:
212
- return None
201
+ return api_pb2.GPUConfig()
213
202
  else:
214
203
  raise InvalidError(f"Invalid GPU config: {value}. Value must be a string, a `GPUConfig` object, or `None`.")
215
-
216
-
217
- def parse_gpu_config(value: GPU_T) -> api_pb2.GPUConfig:
218
- """mdmd:hidden"""
219
- gpu_config = _parse_gpu_config(value)
220
- if gpu_config is None:
221
- return api_pb2.GPUConfig()
222
- return gpu_config._to_proto()
223
-
224
-
225
- def display_gpu_config(value: GPU_T) -> str:
226
- """mdmd:hidden"""
227
- return repr(_parse_gpu_config(value))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.73.22
3
+ Version: 0.73.24
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -21,7 +21,7 @@ modal/app.py,sha256=MaWCYgNx8y2GQhmaXQBMKKAAfCYfdxrdYs6zCBoJzwI,44628
21
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=x6yJnATqUjY-Hjuag38k1gfJr-cy0SWY6Nl9Z3a4gd8,7593
24
+ modal/client.pyi,sha256=4vue8P-wjbe42G-ixU3sKatlnVQf7PB-Rr5fWP35yGI,7593
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=agxclIXZbzBbgcI5PPVD7IfOiHzv-B82xaaXtw9cpv8,31126
@@ -40,8 +40,8 @@ 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=YflJx4BhzmJLJzpVWbuAMv0Qv63Mgb3r9qZqrgBEr1w,14289
44
- modal/gpu.py,sha256=5vJiYFAv7Ai9zeGf_lv31rJyQn1atQlCYAJv1bF1_BQ,6996
43
+ modal/functions.pyi,sha256=avRIY0KOFky6tDRI5_SvnLXz7PUnG2H0hQA385cRtb0,14289
44
+ modal/gpu.py,sha256=uDluoK3hXyj2YRxGhVDFOifOBCsXFTo5hVueGoJPb8w,6001
45
45
  modal/image.py,sha256=ekE2693foy30Xi1LM3swKZPW6HuaACj-OBvfspVSyIE,91509
46
46
  modal/image.pyi,sha256=kdJzy1eaxNPZeCpE0TMYYLhJ6UWmkfRDeb_vzngJUoQ,26462
47
47
  modal/io_streams.py,sha256=QkQiizKRzd5bnbKQsap31LJgBYlAnj4-XkV_50xPYX0,15079
@@ -171,10 +171,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
171
171
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
172
  modal_version/__init__.py,sha256=wiJQ53c-OMs0Xf1UeXOxQ7FwlV1VzIjnX6o-pRYZ_Pk,470
173
173
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
174
- modal_version/_version_generated.py,sha256=2534hCJpl_O7oYXVMg2TWywr3i2CdLVgUQ-x-GXAD-g,149
175
- modal-0.73.22.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
176
- modal-0.73.22.dist-info/METADATA,sha256=Yi9SlAQPVxTRjmeFUaF_qIMoq8iZA8czC_-lmfY2fJ0,2330
177
- modal-0.73.22.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
178
- modal-0.73.22.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
179
- modal-0.73.22.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
180
- modal-0.73.22.dist-info/RECORD,,
174
+ modal_version/_version_generated.py,sha256=e3511WHQ1GTD7GN2a7Zq2WhY1JAiusbr_vF0U0LCeHM,149
175
+ modal-0.73.24.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
176
+ modal-0.73.24.dist-info/METADATA,sha256=hzsz1LM6g6CwzgPicWTsjVaxYIpKLTJaWSJ3Gt0fWrg,2330
177
+ modal-0.73.24.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
178
+ modal-0.73.24.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
179
+ modal-0.73.24.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
180
+ modal-0.73.24.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 22 # git: 182fbf3
4
+ build_number = 24 # git: 8535257