modal 0.73.128__tar.gz → 0.73.130__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.
- {modal-0.73.128 → modal-0.73.130}/PKG-INFO +1 -1
- {modal-0.73.128 → modal-0.73.130}/modal/__init__.py +0 -2
- {modal-0.73.128 → modal-0.73.130}/modal/_functions.py +2 -4
- {modal-0.73.128 → modal-0.73.130}/modal/_partial_function.py +0 -54
- {modal-0.73.128 → modal-0.73.130}/modal/app.py +5 -34
- {modal-0.73.128 → modal-0.73.130}/modal/app.pyi +2 -3
- {modal-0.73.128 → modal-0.73.130}/modal/client.pyi +2 -2
- {modal-0.73.128 → modal-0.73.130}/modal/functions.pyi +1 -2
- {modal-0.73.128 → modal-0.73.130}/modal/partial_function.py +0 -2
- {modal-0.73.128 → modal-0.73.130}/modal/partial_function.pyi +0 -9
- {modal-0.73.128 → modal-0.73.130}/modal.egg-info/PKG-INFO +1 -1
- {modal-0.73.128 → modal-0.73.130}/modal_proto/api.proto +2 -2
- {modal-0.73.128 → modal-0.73.130}/modal_proto/api_pb2.py +1 -1
- {modal-0.73.128 → modal-0.73.130}/modal_version/_version_generated.py +1 -1
- {modal-0.73.128 → modal-0.73.130}/LICENSE +0 -0
- {modal-0.73.128 → modal-0.73.130}/README.md +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/__main__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_clustered_functions.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_clustered_functions.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_container_entrypoint.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_ipython.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_location.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_object.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_output.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_proxy_tunnel.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_pty.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_resolver.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_resources.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_runtime/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_runtime/asgi.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_runtime/container_io_manager.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_runtime/execution_context.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_runtime/execution_context.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_runtime/telemetry.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_runtime/user_code_imports.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_serialization.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_traceback.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_tunnel.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_tunnel.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/app_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/async_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/blob_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/deprecation.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/docker_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/function_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/git_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/grpc_testing.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/grpc_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/hash_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/http_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/jwt_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/logger.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/mount_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/name_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/package_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/pattern_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_utils/shell_utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_vendor/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_vendor/cloudpickle.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_vendor/tblib.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/_watcher.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/call_graph.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/_download.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/_traceback.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/app.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/config.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/container.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/dict.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/entry_point.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/environment.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/import_refs.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/launch.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/network_file_system.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/profile.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/programs/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/programs/vscode.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/queues.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/run.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/secret.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/token.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/utils.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cli/volume.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/client.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cloud_bucket_mount.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cls.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/cls.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/config.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/container_process.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/container_process.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/dict.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/dict.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/environments.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/environments.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/exception.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/experimental.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/experimental.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/extensions/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/extensions/ipython.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/file_io.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/file_io.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/file_pattern_matcher.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/functions.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/gpu.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/image.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/image.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/io_streams.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/io_streams.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/mount.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/mount.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/network_file_system.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/network_file_system.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/object.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/object.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/output.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/parallel_map.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/parallel_map.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/proxy.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/proxy.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/py.typed +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/queue.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/queue.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/requirements/2023.12.312.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/requirements/2023.12.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/requirements/2024.04.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/requirements/2024.10.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/requirements/PREVIEW.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/requirements/README.md +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/requirements/base-images.json +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/retries.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/runner.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/runner.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/running_app.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/sandbox.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/sandbox.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/schedule.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/scheduler_placement.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/secret.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/secret.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/serving.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/serving.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/snapshot.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/snapshot.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/stream_type.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/token_flow.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/token_flow.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/volume.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal/volume.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal.egg-info/SOURCES.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal.egg-info/dependency_links.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal.egg-info/entry_points.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal.egg-info/requires.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal.egg-info/top_level.txt +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_docs/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_docs/gen_cli_docs.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_docs/gen_reference_docs.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_docs/mdmd/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_docs/mdmd/signatures.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/api_grpc.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/api_pb2.pyi +6 -6
- {modal-0.73.128 → modal-0.73.130}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/modal_api_grpc.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/modal_options_grpc.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/options.proto +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/options_grpc.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/options_pb2.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/options_pb2.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/options_pb2_grpc.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/options_pb2_grpc.pyi +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_proto/py.typed +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_version/__init__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/modal_version/__main__.py +0 -0
- {modal-0.73.128 → modal-0.73.130}/pyproject.toml +0 -0
- {modal-0.73.128 → modal-0.73.130}/setup.cfg +0 -0
@@ -27,7 +27,6 @@ try:
|
|
27
27
|
asgi_app,
|
28
28
|
batched,
|
29
29
|
build,
|
30
|
-
concurrent,
|
31
30
|
enter,
|
32
31
|
exit,
|
33
32
|
fastapi_endpoint,
|
@@ -83,7 +82,6 @@ __all__ = [
|
|
83
82
|
"asgi_app",
|
84
83
|
"batched",
|
85
84
|
"build",
|
86
|
-
"concurrent",
|
87
85
|
"current_function_call_id",
|
88
86
|
"current_input_id",
|
89
87
|
"enable_output",
|
@@ -435,8 +435,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
435
435
|
max_containers: Optional[int] = None,
|
436
436
|
buffer_containers: Optional[int] = None,
|
437
437
|
scaledown_window: Optional[int] = None,
|
438
|
-
|
439
|
-
target_concurrent_inputs: Optional[int] = None,
|
438
|
+
allow_concurrent_inputs: Optional[int] = None,
|
440
439
|
batch_max_size: Optional[int] = None,
|
441
440
|
batch_wait_ms: Optional[int] = None,
|
442
441
|
cloud: Optional[str] = None,
|
@@ -787,8 +786,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
787
786
|
runtime_perf_record=config.get("runtime_perf_record"),
|
788
787
|
app_name=app_name,
|
789
788
|
is_builder_function=is_builder_function,
|
790
|
-
|
791
|
-
target_concurrent_inputs=target_concurrent_inputs or 0,
|
789
|
+
target_concurrent_inputs=allow_concurrent_inputs or 0,
|
792
790
|
batch_max_size=batch_max_size or 0,
|
793
791
|
batch_linger_ms=batch_wait_ms or 0,
|
794
792
|
worker_id=config.get("worker_id"),
|
@@ -59,8 +59,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
|
|
59
59
|
force_build: bool
|
60
60
|
cluster_size: Optional[int] # Experimental: Clustered functions
|
61
61
|
build_timeout: Optional[int]
|
62
|
-
max_concurrent_inputs: Optional[int]
|
63
|
-
target_concurrent_inputs: Optional[int]
|
64
62
|
|
65
63
|
def __init__(
|
66
64
|
self,
|
@@ -74,8 +72,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
|
|
74
72
|
cluster_size: Optional[int] = None, # Experimental: Clustered functions
|
75
73
|
force_build: bool = False,
|
76
74
|
build_timeout: Optional[int] = None,
|
77
|
-
max_concurrent_inputs: Optional[int] = None,
|
78
|
-
target_concurrent_inputs: Optional[int] = None,
|
79
75
|
):
|
80
76
|
self.raw_f = raw_f
|
81
77
|
self.flags = flags
|
@@ -93,8 +89,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
|
|
93
89
|
self.cluster_size = cluster_size # Experimental: Clustered functions
|
94
90
|
self.force_build = force_build
|
95
91
|
self.build_timeout = build_timeout
|
96
|
-
self.max_concurrent_inputs = max_concurrent_inputs
|
97
|
-
self.target_concurrent_inputs = target_concurrent_inputs
|
98
92
|
|
99
93
|
def _get_raw_f(self) -> Callable[P, ReturnType]:
|
100
94
|
return self.raw_f
|
@@ -149,8 +143,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
|
|
149
143
|
batch_wait_ms=self.batch_wait_ms,
|
150
144
|
force_build=self.force_build,
|
151
145
|
build_timeout=self.build_timeout,
|
152
|
-
max_concurrent_inputs=self.max_concurrent_inputs,
|
153
|
-
target_concurrent_inputs=self.target_concurrent_inputs,
|
154
146
|
)
|
155
147
|
|
156
148
|
|
@@ -730,49 +722,3 @@ def _batched(
|
|
730
722
|
)
|
731
723
|
|
732
724
|
return wrapper
|
733
|
-
|
734
|
-
|
735
|
-
def _concurrent(
|
736
|
-
_warn_parentheses_missing=None,
|
737
|
-
*,
|
738
|
-
max_inputs: int, # Hard limit on each container's input concurrency
|
739
|
-
target_inputs: Optional[int] = None, # Input concurrency that Modal's autoscaler should target
|
740
|
-
) -> Callable[[Union[Callable[..., Any], _PartialFunction]], _PartialFunction]:
|
741
|
-
"""Decorator that allows individual containers to handle multiple inputs concurrently.
|
742
|
-
|
743
|
-
The concurrency mechanism depends on whether the function is async or not:
|
744
|
-
- Async functions will run inputs on a single thread as asyncio tasks.
|
745
|
-
- Synchronous functions will use multi-threading. The code must be thread-safe.
|
746
|
-
|
747
|
-
Input concurrency will be most useful for workflows that are IO-bound
|
748
|
-
(e.g., making network requests) or when running an inference server that supports
|
749
|
-
dynamic batching.
|
750
|
-
|
751
|
-
When `target_inputs` is set, Modal's autoscaler will try to provision resources such
|
752
|
-
that each container is running that many inputs concurrently. Containers may burst up to
|
753
|
-
up to `max_inputs` if resources are insufficient to remain at the target concurrency.
|
754
|
-
"""
|
755
|
-
if _warn_parentheses_missing is not None:
|
756
|
-
raise InvalidError(
|
757
|
-
"Positional arguments are not allowed. Did you forget parentheses? Suggestion: `@modal.concurrent()`."
|
758
|
-
)
|
759
|
-
|
760
|
-
if target_inputs and target_inputs > max_inputs:
|
761
|
-
raise InvalidError("`target_inputs` parameter cannot be greater than `max_inputs`.")
|
762
|
-
|
763
|
-
def wrapper(obj: Union[Callable[..., Any], _PartialFunction]) -> _PartialFunction:
|
764
|
-
if isinstance(obj, _PartialFunction):
|
765
|
-
# Risky that we need to mutate the parameters here; should make this safer
|
766
|
-
obj.max_concurrent_inputs = max_inputs
|
767
|
-
obj.target_concurrent_inputs = target_inputs
|
768
|
-
obj.add_flags(_PartialFunctionFlags.FUNCTION)
|
769
|
-
return obj
|
770
|
-
|
771
|
-
return _PartialFunction(
|
772
|
-
obj,
|
773
|
-
_PartialFunctionFlags.FUNCTION,
|
774
|
-
max_concurrent_inputs=max_inputs,
|
775
|
-
target_concurrent_inputs=target_inputs,
|
776
|
-
)
|
777
|
-
|
778
|
-
return wrapper
|
@@ -678,12 +678,6 @@ class _App:
|
|
678
678
|
is_generator = f.is_generator
|
679
679
|
batch_max_size = f.batch_max_size
|
680
680
|
batch_wait_ms = f.batch_wait_ms
|
681
|
-
if f.max_concurrent_inputs: # Using @modal.concurrent()
|
682
|
-
max_concurrent_inputs = f.max_concurrent_inputs
|
683
|
-
target_concurrent_inputs = f.target_concurrent_inputs
|
684
|
-
else:
|
685
|
-
max_concurrent_inputs = allow_concurrent_inputs
|
686
|
-
target_concurrent_inputs = None
|
687
681
|
else:
|
688
682
|
if not is_global_object(f.__qualname__) and not serialized:
|
689
683
|
raise InvalidError(
|
@@ -715,12 +709,10 @@ class _App:
|
|
715
709
|
)
|
716
710
|
|
717
711
|
info = FunctionInfo(f, serialized=serialized, name_override=name)
|
718
|
-
raw_f = f
|
719
712
|
webhook_config = None
|
720
713
|
batch_max_size = None
|
721
714
|
batch_wait_ms = None
|
722
|
-
|
723
|
-
target_concurrent_inputs = None
|
715
|
+
raw_f = f
|
724
716
|
|
725
717
|
cluster_size = None # Experimental: Clustered functions
|
726
718
|
i6pn_enabled = i6pn
|
@@ -761,8 +753,7 @@ class _App:
|
|
761
753
|
max_containers=max_containers,
|
762
754
|
buffer_containers=buffer_containers,
|
763
755
|
scaledown_window=scaledown_window,
|
764
|
-
|
765
|
-
target_concurrent_inputs=target_concurrent_inputs,
|
756
|
+
allow_concurrent_inputs=allow_concurrent_inputs,
|
766
757
|
batch_max_size=batch_max_size,
|
767
758
|
batch_wait_ms=batch_wait_ms,
|
768
759
|
timeout=timeout,
|
@@ -841,7 +832,7 @@ class _App:
|
|
841
832
|
concurrency_limit: Optional[int] = None, # Replaced with `max_containers`
|
842
833
|
container_idle_timeout: Optional[int] = None, # Replaced with `scaledown_window`
|
843
834
|
_experimental_buffer_containers: Optional[int] = None, # Now stable API with `buffer_containers`
|
844
|
-
) -> Callable[[
|
835
|
+
) -> Callable[[CLS_T], CLS_T]:
|
845
836
|
"""
|
846
837
|
Decorator to register a new Modal [Cls](/docs/reference/modal.Cls) with this App.
|
847
838
|
"""
|
@@ -854,21 +845,8 @@ class _App:
|
|
854
845
|
raise InvalidError("`region` and `_experimental_scheduler_placement` cannot be used together")
|
855
846
|
scheduler_placement = SchedulerPlacement(region=region)
|
856
847
|
|
857
|
-
def wrapper(
|
848
|
+
def wrapper(user_cls: CLS_T) -> CLS_T:
|
858
849
|
# Check if the decorated object is a class
|
859
|
-
if isinstance(wrapped_cls, _PartialFunction):
|
860
|
-
wrapped_cls.wrapped = True
|
861
|
-
user_cls = wrapped_cls.raw_f
|
862
|
-
if wrapped_cls.max_concurrent_inputs: # Using @modal.concurrent()
|
863
|
-
max_concurrent_inputs = wrapped_cls.max_concurrent_inputs
|
864
|
-
target_concurrent_inputs = wrapped_cls.target_concurrent_inputs
|
865
|
-
else:
|
866
|
-
max_concurrent_inputs = allow_concurrent_inputs
|
867
|
-
target_concurrent_inputs = None
|
868
|
-
else:
|
869
|
-
user_cls = wrapped_cls
|
870
|
-
max_concurrent_inputs = allow_concurrent_inputs
|
871
|
-
target_concurrent_inputs = None
|
872
850
|
if not inspect.isclass(user_cls):
|
873
851
|
raise TypeError("The @app.cls decorator must be used on a class.")
|
874
852
|
|
@@ -893,12 +871,6 @@ class _App:
|
|
893
871
|
):
|
894
872
|
raise InvalidError("A class must have `enable_memory_snapshot=True` to use `snap=True` on its methods.")
|
895
873
|
|
896
|
-
for method in _find_partial_methods_for_user_cls(user_cls, _PartialFunctionFlags.FUNCTION).values():
|
897
|
-
if method.max_concurrent_inputs:
|
898
|
-
raise InvalidError(
|
899
|
-
"The `@modal.concurrent` decorator cannot be used on methods; decorate the class instead."
|
900
|
-
)
|
901
|
-
|
902
874
|
info = FunctionInfo(None, serialized=serialized, user_cls=user_cls)
|
903
875
|
|
904
876
|
cls_func = _Function.from_local(
|
@@ -920,8 +892,7 @@ class _App:
|
|
920
892
|
scaledown_window=scaledown_window,
|
921
893
|
proxy=proxy,
|
922
894
|
retries=retries,
|
923
|
-
|
924
|
-
target_concurrent_inputs=target_concurrent_inputs,
|
895
|
+
allow_concurrent_inputs=allow_concurrent_inputs,
|
925
896
|
batch_max_size=batch_max_size,
|
926
897
|
batch_wait_ms=batch_wait_ms,
|
927
898
|
timeout=timeout,
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import collections.abc
|
2
2
|
import modal._functions
|
3
3
|
import modal._object
|
4
|
-
import modal._partial_function
|
5
4
|
import modal._utils.function_utils
|
6
5
|
import modal.client
|
7
6
|
import modal.cloud_bucket_mount
|
@@ -248,7 +247,7 @@ class _App:
|
|
248
247
|
concurrency_limit: typing.Optional[int] = None,
|
249
248
|
container_idle_timeout: typing.Optional[int] = None,
|
250
249
|
_experimental_buffer_containers: typing.Optional[int] = None,
|
251
|
-
) -> collections.abc.Callable[[
|
250
|
+
) -> collections.abc.Callable[[CLS_T], CLS_T]: ...
|
252
251
|
async def spawn_sandbox(
|
253
252
|
self,
|
254
253
|
*entrypoint_args: str,
|
@@ -488,7 +487,7 @@ class App:
|
|
488
487
|
concurrency_limit: typing.Optional[int] = None,
|
489
488
|
container_idle_timeout: typing.Optional[int] = None,
|
490
489
|
_experimental_buffer_containers: typing.Optional[int] = None,
|
491
|
-
) -> collections.abc.Callable[[
|
490
|
+
) -> collections.abc.Callable[[CLS_T], CLS_T]: ...
|
492
491
|
|
493
492
|
class __spawn_sandbox_spec(typing_extensions.Protocol[SUPERSELF]):
|
494
493
|
def __call__(
|
@@ -31,7 +31,7 @@ class _Client:
|
|
31
31
|
server_url: str,
|
32
32
|
client_type: int,
|
33
33
|
credentials: typing.Optional[tuple[str, str]],
|
34
|
-
version: str = "0.73.
|
34
|
+
version: str = "0.73.130",
|
35
35
|
): ...
|
36
36
|
def is_closed(self) -> bool: ...
|
37
37
|
@property
|
@@ -93,7 +93,7 @@ class Client:
|
|
93
93
|
server_url: str,
|
94
94
|
client_type: int,
|
95
95
|
credentials: typing.Optional[tuple[str, str]],
|
96
|
-
version: str = "0.73.
|
96
|
+
version: str = "0.73.130",
|
97
97
|
): ...
|
98
98
|
def is_closed(self) -> bool: ...
|
99
99
|
@property
|
@@ -82,8 +82,7 @@ class Function(
|
|
82
82
|
max_containers: typing.Optional[int] = None,
|
83
83
|
buffer_containers: typing.Optional[int] = None,
|
84
84
|
scaledown_window: typing.Optional[int] = None,
|
85
|
-
|
86
|
-
target_concurrent_inputs: typing.Optional[int] = None,
|
85
|
+
allow_concurrent_inputs: typing.Optional[int] = None,
|
87
86
|
batch_max_size: typing.Optional[int] = None,
|
88
87
|
batch_wait_ms: typing.Optional[int] = None,
|
89
88
|
cloud: typing.Optional[str] = None,
|
@@ -5,7 +5,6 @@ from ._partial_function import (
|
|
5
5
|
_asgi_app,
|
6
6
|
_batched,
|
7
7
|
_build,
|
8
|
-
_concurrent,
|
9
8
|
_enter,
|
10
9
|
_exit,
|
11
10
|
_fastapi_endpoint,
|
@@ -29,4 +28,3 @@ build = synchronize_api(_build, target_module=__name__)
|
|
29
28
|
enter = synchronize_api(_enter, target_module=__name__)
|
30
29
|
exit = synchronize_api(_exit, target_module=__name__)
|
31
30
|
batched = synchronize_api(_batched, target_module=__name__)
|
32
|
-
concurrent = synchronize_api(_concurrent, target_module=__name__)
|
@@ -18,8 +18,6 @@ class PartialFunction(
|
|
18
18
|
force_build: bool
|
19
19
|
cluster_size: typing.Optional[int]
|
20
20
|
build_timeout: typing.Optional[int]
|
21
|
-
max_concurrent_inputs: typing.Optional[int]
|
22
|
-
target_concurrent_inputs: typing.Optional[int]
|
23
21
|
|
24
22
|
def __init__(
|
25
23
|
self,
|
@@ -33,8 +31,6 @@ class PartialFunction(
|
|
33
31
|
cluster_size: typing.Optional[int] = None,
|
34
32
|
force_build: bool = False,
|
35
33
|
build_timeout: typing.Optional[int] = None,
|
36
|
-
max_concurrent_inputs: typing.Optional[int] = None,
|
37
|
-
target_concurrent_inputs: typing.Optional[int] = None,
|
38
34
|
): ...
|
39
35
|
def _get_raw_f(self) -> collections.abc.Callable[modal._partial_function.P, modal._partial_function.ReturnType]: ...
|
40
36
|
def _is_web_endpoint(self) -> bool: ...
|
@@ -122,8 +118,3 @@ def exit(
|
|
122
118
|
def batched(
|
123
119
|
_warn_parentheses_missing=None, *, max_batch_size: int, wait_ms: int
|
124
120
|
) -> collections.abc.Callable[[collections.abc.Callable[..., typing.Any]], PartialFunction]: ...
|
125
|
-
def concurrent(
|
126
|
-
_warn_parentheses_missing=None, *, max_inputs: int, target_inputs: typing.Optional[int] = None
|
127
|
-
) -> collections.abc.Callable[
|
128
|
-
[typing.Union[collections.abc.Callable[..., typing.Any], PartialFunction]], PartialFunction
|
129
|
-
]: ...
|
@@ -1216,7 +1216,7 @@ message Function {
|
|
1216
1216
|
|
1217
1217
|
repeated VolumeMount volume_mounts = 33;
|
1218
1218
|
|
1219
|
-
uint32
|
1219
|
+
uint32 target_concurrent_inputs = 34;
|
1220
1220
|
|
1221
1221
|
repeated CustomDomainInfo custom_domain_info = 35;
|
1222
1222
|
|
@@ -1266,7 +1266,7 @@ message Function {
|
|
1266
1266
|
uint64 batch_linger_ms = 61; // Miliseconds to block before a response is needed
|
1267
1267
|
bool i6pn_enabled = 62;
|
1268
1268
|
bool _experimental_concurrent_cancellations = 63;
|
1269
|
-
uint32
|
1269
|
+
uint32 max_concurrent_inputs = 64;
|
1270
1270
|
|
1271
1271
|
// TODO(irfansharif): Remove, once https://github.com/modal-labs/modal/pull/15645 lands.
|
1272
1272
|
bool _experimental_task_templates_enabled = 65; // forces going through the new gpu-fallbacks integration path, even if no fallback options are specified
|