modal 1.5.3.dev1__tar.gz → 1.5.3.dev2__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-1.5.3.dev1 → modal-1.5.3.dev2}/PKG-INFO +1 -1
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_functions.py +3 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_partial_function.py +14 -2
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/app.py +10 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/client.pyi +2 -2
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/functions.pyi +1 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_pb2.py +923 -916
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_pb2.pyi +32 -3
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_version/__init__.py +1 -1
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/LICENSE +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/README.md +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/__main__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_billing.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_clustered_functions.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_environments.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_function_variants.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_grpc_client.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_image.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_ipython.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_load_context.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_location.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_logs.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_object.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/manager.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/pty.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/rich.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/status.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_resolver.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_resources.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_serialization.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_server.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_traceback.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_tunnel.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_tunnel.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_type_manager.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/logger.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/version.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_watcher.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_workspace.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/app.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/billing.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/billing.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/README.md +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/base-images.json +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/call_graph.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/_download.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/_help.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/_traceback.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/app.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/billing.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/changelog.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/cluster.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/config.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/container.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/curl.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/dashboard.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/dict.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/endpoint.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/entry_point.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/environment.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/image.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/import_refs.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/launch.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/logo.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/profile.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/queues.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/run.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/secret.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/selector.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/shell.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/skills.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/token.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/utils.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/volume.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/workspace.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/client.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cls.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cls.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/config.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/container_process.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/container_process.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/dict.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/dict.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/environments.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/environments.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/exception.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/experimental/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/experimental/flash.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/experimental/ipython.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/file_io.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/file_io.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/functions.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/image.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/image.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/io_streams.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/io_streams.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/mount.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/mount.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/network_file_system.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/network_file_system.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/object.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/object.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/output.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/parallel_map.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/parallel_map.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/partial_function.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/partial_function.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/proxy.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/proxy.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/py.typed +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/queue.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/queue.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/retries.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/runner.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/runner.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/running_app.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/sandbox.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/sandbox.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/sandbox_fs.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/schedule.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/scheduler_placement.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/secret.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/secret.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/server.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/server.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/serving.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/serving.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/snapshot.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/snapshot.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/stream_type.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/token_flow.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/token_flow.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/types.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/volume.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/volume.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/workspace.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/workspace.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/__init__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_grpc.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/py.typed +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_version/__main__.py +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/pyproject.toml +0 -0
- {modal-1.5.3.dev1 → modal-1.5.3.dev2}/setup.cfg +0 -0
|
@@ -671,6 +671,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
671
671
|
# Experimental: Clustered functions
|
|
672
672
|
cluster_size: int | None = None,
|
|
673
673
|
rdma: bool | None = None,
|
|
674
|
+
fabric_size: int | None = None,
|
|
674
675
|
single_use_containers: bool = False,
|
|
675
676
|
ephemeral_disk: int | None = None,
|
|
676
677
|
include_source: bool = True,
|
|
@@ -1009,6 +1010,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1009
1010
|
mount_client_dependencies=mount_client_dependencies,
|
|
1010
1011
|
# ---
|
|
1011
1012
|
_experimental_group_size=cluster_size or 0, # Experimental: Clustered functions
|
|
1013
|
+
_experimental_fabric_size=fabric_size or 0, # Experimental: Clustered functions
|
|
1012
1014
|
_experimental_concurrent_cancellations=True,
|
|
1013
1015
|
# --- These are deprecated in favor of autoscaler_settings
|
|
1014
1016
|
warm_pool_size=min_containers or 0,
|
|
@@ -1051,6 +1053,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1051
1053
|
method_definitions_set=function_definition.method_definitions_set,
|
|
1052
1054
|
experimental_options=experimental_options or {},
|
|
1053
1055
|
_experimental_group_size=function_definition._experimental_group_size,
|
|
1056
|
+
_experimental_fabric_size=function_definition._experimental_fabric_size,
|
|
1054
1057
|
_experimental_buffer_containers=function_definition._experimental_buffer_containers,
|
|
1055
1058
|
_experimental_custom_scaling=function_definition._experimental_custom_scaling,
|
|
1056
1059
|
snapshot_debug=function_definition.snapshot_debug,
|
|
@@ -74,6 +74,7 @@ class _PartialFunctionParams:
|
|
|
74
74
|
target_concurrent_inputs: int | None = None
|
|
75
75
|
build_timeout: int | None = None
|
|
76
76
|
rdma: bool | None = None
|
|
77
|
+
fabric_size: int | None = None
|
|
77
78
|
http_config: api_pb2.HTTPConfig | None = None
|
|
78
79
|
|
|
79
80
|
def update(self, other: "_PartialFunctionParams") -> None:
|
|
@@ -777,7 +778,7 @@ def _concurrent(
|
|
|
777
778
|
|
|
778
779
|
# NOTE: clustered is currently exposed through modal.experimental, not the top-level namespace
|
|
779
780
|
def _clustered(
|
|
780
|
-
size: int, broadcast: bool = True, rdma: bool = False
|
|
781
|
+
size: int, broadcast: bool = True, rdma: bool = False, fabric_size: int | None = None
|
|
781
782
|
) -> Callable[
|
|
782
783
|
[Callable[P, ReturnType] | _PartialFunction[P, ReturnType, ReturnType]],
|
|
783
784
|
_PartialFunction[P, ReturnType, ReturnType],
|
|
@@ -791,6 +792,11 @@ def _clustered(
|
|
|
791
792
|
If True, inputs will be sent simultaneously to each container. Otherwise,
|
|
792
793
|
inputs will be sent only to the rank-0 container, which is responsible for
|
|
793
794
|
delegating to the workers.
|
|
795
|
+
fabric_size: int | None = None
|
|
796
|
+
Experimental: constrains placement across GPU-memory fabrics. The cluster
|
|
797
|
+
is placed in co-fabric blocks of `fabric_size` containers, so every block
|
|
798
|
+
of `fabric_size` consecutive ranks shares a fabric (the scale-up domain)
|
|
799
|
+
and communicates over cross-node NVLink. Must evenly divide `size`.
|
|
794
800
|
"""
|
|
795
801
|
|
|
796
802
|
assert broadcast, "broadcast=False has not been implemented yet!"
|
|
@@ -798,8 +804,14 @@ def _clustered(
|
|
|
798
804
|
if size <= 0:
|
|
799
805
|
raise ValueError("cluster size must be greater than 0")
|
|
800
806
|
|
|
807
|
+
if fabric_size is not None:
|
|
808
|
+
if not isinstance(fabric_size, int) or fabric_size <= 0:
|
|
809
|
+
raise ValueError("fabric_size must be a positive integer")
|
|
810
|
+
if size % fabric_size != 0:
|
|
811
|
+
raise ValueError(f"fabric_size must evenly divide the cluster size ({size} % {fabric_size} != 0)")
|
|
812
|
+
|
|
801
813
|
flags = _PartialFunctionFlags.CLUSTERED
|
|
802
|
-
params = _PartialFunctionParams(cluster_size=size, rdma=rdma)
|
|
814
|
+
params = _PartialFunctionParams(cluster_size=size, rdma=rdma, fabric_size=fabric_size)
|
|
803
815
|
|
|
804
816
|
def wrapper(
|
|
805
817
|
obj: _PartialFunction[P, ReturnType, ReturnType] | Callable[P, ReturnType],
|
|
@@ -920,6 +920,7 @@ class _App:
|
|
|
920
920
|
i6pn_enabled = i6pn or (f.flags & _PartialFunctionFlags.CLUSTERED)
|
|
921
921
|
cluster_size = f.params.cluster_size # Experimental: Clustered functions
|
|
922
922
|
rdma = f.params.rdma
|
|
923
|
+
fabric_size = f.params.fabric_size
|
|
923
924
|
|
|
924
925
|
info = FunctionInfo(f.raw_f, serialized=serialized, name_override=name)
|
|
925
926
|
raw_f = f.raw_f
|
|
@@ -974,6 +975,7 @@ class _App:
|
|
|
974
975
|
|
|
975
976
|
cluster_size = None # Experimental: Clustered functions
|
|
976
977
|
rdma = None
|
|
978
|
+
fabric_size = None
|
|
977
979
|
i6pn_enabled = i6pn
|
|
978
980
|
|
|
979
981
|
if is_generator is None:
|
|
@@ -1016,6 +1018,7 @@ class _App:
|
|
|
1016
1018
|
i6pn_enabled=i6pn_enabled,
|
|
1017
1019
|
cluster_size=cluster_size, # Experimental: Clustered functions
|
|
1018
1020
|
rdma=rdma,
|
|
1021
|
+
fabric_size=fabric_size, # Experimental: Clustered functions
|
|
1019
1022
|
include_source=include_source if include_source is not None else local_state.include_source_default,
|
|
1020
1023
|
experimental_options={k: str(v) for k, v in (experimental_options or {}).items()},
|
|
1021
1024
|
restrict_output=_experimental_restrict_output,
|
|
@@ -1151,16 +1154,19 @@ class _App:
|
|
|
1151
1154
|
if wrapped_cls.flags & _PartialFunctionFlags.CLUSTERED:
|
|
1152
1155
|
cluster_size = wrapped_cls.params.cluster_size
|
|
1153
1156
|
rdma = wrapped_cls.params.rdma
|
|
1157
|
+
fabric_size = wrapped_cls.params.fabric_size
|
|
1154
1158
|
|
|
1155
1159
|
else:
|
|
1156
1160
|
cluster_size = None
|
|
1157
1161
|
rdma = None
|
|
1162
|
+
fabric_size = None
|
|
1158
1163
|
else:
|
|
1159
1164
|
user_cls = wrapped_cls
|
|
1160
1165
|
max_concurrent_inputs = None
|
|
1161
1166
|
target_concurrent_inputs = None
|
|
1162
1167
|
cluster_size = None
|
|
1163
1168
|
rdma = None
|
|
1169
|
+
fabric_size = None
|
|
1164
1170
|
if not inspect.isclass(user_cls):
|
|
1165
1171
|
raise TypeError("The @app.cls decorator must be used on a class.")
|
|
1166
1172
|
|
|
@@ -1246,6 +1252,7 @@ class _App:
|
|
|
1246
1252
|
i6pn_enabled=i6pn_enabled,
|
|
1247
1253
|
cluster_size=cluster_size,
|
|
1248
1254
|
rdma=rdma,
|
|
1255
|
+
fabric_size=fabric_size,
|
|
1249
1256
|
include_source=include_source if include_source is not None else local_state.include_source_default,
|
|
1250
1257
|
experimental_options={k: str(v) for k, v in (experimental_options or {}).items()},
|
|
1251
1258
|
restrict_output=_experimental_restrict_output,
|
|
@@ -1403,6 +1410,7 @@ class _App:
|
|
|
1403
1410
|
# Extract the underlying class if wrapped in a _PartialFunction (e.g., from @modal.clustered())
|
|
1404
1411
|
cluster_size = None
|
|
1405
1412
|
rdma = None
|
|
1413
|
+
fabric_size = None
|
|
1406
1414
|
user_cls = wrapped_user_cls
|
|
1407
1415
|
|
|
1408
1416
|
if isinstance(wrapped_user_cls, _PartialFunction):
|
|
@@ -1410,6 +1418,7 @@ class _App:
|
|
|
1410
1418
|
if wrapped_user_cls.flags & _PartialFunctionFlags.CLUSTERED:
|
|
1411
1419
|
cluster_size = wrapped_user_cls.params.cluster_size
|
|
1412
1420
|
rdma = wrapped_user_cls.params.rdma
|
|
1421
|
+
fabric_size = wrapped_user_cls.params.fabric_size
|
|
1413
1422
|
|
|
1414
1423
|
local_state = self._local_state
|
|
1415
1424
|
|
|
@@ -1449,6 +1458,7 @@ class _App:
|
|
|
1449
1458
|
i6pn_enabled=i6pn or (cluster_size is not None),
|
|
1450
1459
|
cluster_size=cluster_size,
|
|
1451
1460
|
rdma=rdma,
|
|
1461
|
+
fabric_size=fabric_size,
|
|
1452
1462
|
include_source=include_source if include_source is not None else local_state.include_source_default,
|
|
1453
1463
|
experimental_options={k: str(v) for k, v in (experimental_options or {}).items()},
|
|
1454
1464
|
restrict_output=False,
|
|
@@ -35,7 +35,7 @@ class _Client:
|
|
|
35
35
|
server_url: str,
|
|
36
36
|
client_type: int,
|
|
37
37
|
credentials: typing.Optional[tuple[str, str]],
|
|
38
|
-
version: str = "1.5.3.
|
|
38
|
+
version: str = "1.5.3.dev2",
|
|
39
39
|
):
|
|
40
40
|
"""mdmd:hidden
|
|
41
41
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -205,7 +205,7 @@ class Client:
|
|
|
205
205
|
server_url: str,
|
|
206
206
|
client_type: int,
|
|
207
207
|
credentials: typing.Optional[tuple[str, str]],
|
|
208
|
-
version: str = "1.5.3.
|
|
208
|
+
version: str = "1.5.3.dev2",
|
|
209
209
|
):
|
|
210
210
|
"""mdmd:hidden
|
|
211
211
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -109,6 +109,7 @@ class Function(
|
|
|
109
109
|
i6pn_enabled: bool = False,
|
|
110
110
|
cluster_size: typing.Optional[int] = None,
|
|
111
111
|
rdma: typing.Optional[bool] = None,
|
|
112
|
+
fabric_size: typing.Optional[int] = None,
|
|
112
113
|
single_use_containers: bool = False,
|
|
113
114
|
ephemeral_disk: typing.Optional[int] = None,
|
|
114
115
|
include_source: bool = True,
|