modal 1.1.4.dev33__tar.gz → 1.1.5.dev1__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.1.4.dev33 → modal-1.1.5.dev1}/PKG-INFO +1 -1
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/client.pyi +2 -2
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/experimental/__init__.py +1 -4
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/experimental/flash.py +29 -12
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_version/__init__.py +1 -1
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/LICENSE +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/README.md +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/__init__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/__main__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_clustered_functions.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_clustered_functions.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_container_entrypoint.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_functions.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_ipython.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_location.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_object.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_output.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_partial_function.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_pty.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_resolver.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_resources.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_runtime/__init__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_runtime/asgi.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_runtime/execution_context.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_runtime/telemetry.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_serialization.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_traceback.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_tunnel.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_tunnel.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_type_manager.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/__init__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/app_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/async_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/blob_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/deprecation.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/docker_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/function_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/git_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/hash_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/http_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/logger.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/mount_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/name_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/package_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/shell_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_utils/time_utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_vendor/__init__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_vendor/tblib.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/_watcher.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/app.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/app.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/builder/2023.12.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/builder/2024.04.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/builder/2024.10.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/builder/2025.06.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/builder/README.md +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/builder/base-images.json +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/call_graph.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/__init__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/_download.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/_traceback.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/app.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/cluster.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/config.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/container.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/dict.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/entry_point.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/environment.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/import_refs.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/launch.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/network_file_system.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/profile.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/programs/__init__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/programs/launch_instance_ssh.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/programs/run_marimo.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/programs/vscode.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/queues.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/run.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/secret.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/token.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/utils.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cli/volume.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/client.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cls.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/cls.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/config.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/container_process.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/container_process.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/dict.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/dict.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/environments.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/environments.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/exception.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/experimental/flash.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/experimental/ipython.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/file_io.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/file_io.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/file_pattern_matcher.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/functions.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/functions.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/gpu.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/image.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/image.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/io_streams.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/io_streams.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/mount.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/mount.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/network_file_system.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/network_file_system.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/object.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/object.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/output.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/parallel_map.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/parallel_map.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/partial_function.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/partial_function.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/proxy.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/proxy.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/py.typed +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/queue.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/queue.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/retries.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/runner.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/runner.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/running_app.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/sandbox.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/sandbox.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/schedule.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/scheduler_placement.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/secret.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/secret.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/serving.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/serving.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/snapshot.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/snapshot.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/stream_type.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/token_flow.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/token_flow.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/volume.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal/volume.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal.egg-info/requires.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal.egg-info/top_level.txt +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_docs/__init__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/__init__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/api.proto +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/api_grpc.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/api_pb2.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/modal_options_grpc.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/options.proto +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/options_grpc.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/options_pb2.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/options_pb2.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/options_pb2_grpc.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/options_pb2_grpc.pyi +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_proto/py.typed +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/modal_version/__main__.py +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/pyproject.toml +0 -0
- {modal-1.1.4.dev33 → modal-1.1.5.dev1}/setup.cfg +0 -0
@@ -33,7 +33,7 @@ class _Client:
|
|
33
33
|
server_url: str,
|
34
34
|
client_type: int,
|
35
35
|
credentials: typing.Optional[tuple[str, str]],
|
36
|
-
version: str = "1.1.
|
36
|
+
version: str = "1.1.5.dev1",
|
37
37
|
):
|
38
38
|
"""mdmd:hidden
|
39
39
|
The Modal client object is not intended to be instantiated directly by users.
|
@@ -164,7 +164,7 @@ class Client:
|
|
164
164
|
server_url: str,
|
165
165
|
client_type: int,
|
166
166
|
credentials: typing.Optional[tuple[str, str]],
|
167
|
-
version: str = "1.1.
|
167
|
+
version: str = "1.1.5.dev1",
|
168
168
|
):
|
169
169
|
"""mdmd:hidden
|
170
170
|
The Modal client object is not intended to be instantiated directly by users.
|
@@ -317,14 +317,11 @@ async def notebook_base_image(*, python_version: Optional[str] = None, force_bui
|
|
317
317
|
# Install uv since it's faster than pip for installing packages.
|
318
318
|
"pip install uv",
|
319
319
|
# https://github.com/astral-sh/uv/issues/11480
|
320
|
-
"pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/
|
320
|
+
"pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu129",
|
321
321
|
f"uv pip install --system {shlex.join(sorted(environment_packages))}",
|
322
322
|
f"uv pip install --system {shlex.join(sorted(kernelshim_packages))}",
|
323
323
|
]
|
324
324
|
|
325
|
-
# TODO: Also install the CUDA Toolkit, so `nvcc` is available.
|
326
|
-
# https://github.com/charlesfrye/cuda-modal/blob/7fef8db12402986cf42d9c8cca8c63d1da6d7700/cuda/use_cuda.py#L158-L188
|
327
|
-
|
328
325
|
def build_dockerfile(version: ImageBuilderVersion) -> DockerfileSpec:
|
329
326
|
return DockerfileSpec(
|
330
327
|
commands=[
|
@@ -337,25 +337,42 @@ class _FlashPrometheusAutoscaler:
|
|
337
337
|
if not internal_metrics_list:
|
338
338
|
return current_replicas
|
339
339
|
|
340
|
-
|
340
|
+
sum_metric = sum(internal_metrics_list)
|
341
|
+
containers_with_metrics = len(internal_metrics_list)
|
342
|
+
# n_containers_missing_metric is the number of unhealthy containers + number of cold starting containers
|
343
|
+
n_containers_missing_metric = current_replicas - containers_with_metrics
|
344
|
+
# n_containers_unhealthy is the number of live containers that are not emitting metrics i.e. unhealthy
|
345
|
+
n_containers_unhealthy = len(containers) - containers_with_metrics
|
346
|
+
|
347
|
+
# Scale up assuming that every unhealthy container is at 2x the target metric value.
|
348
|
+
scale_up_target_metric_value = (sum_metric + n_containers_unhealthy * self.target_metric_value) / (
|
349
|
+
(containers_with_metrics + n_containers_unhealthy) or 1
|
350
|
+
)
|
351
|
+
|
352
|
+
# Scale down assuming that every container (including cold starting containers) are at the target metric value.
|
353
|
+
scale_down_target_metric_value = (sum_metric + n_containers_missing_metric * self.target_metric_value) / (
|
354
|
+
current_replicas or 1
|
355
|
+
)
|
341
356
|
|
342
|
-
|
357
|
+
scale_up_ratio = scale_up_target_metric_value / self.target_metric_value
|
358
|
+
scale_down_ratio = scale_down_target_metric_value / self.target_metric_value
|
343
359
|
|
344
360
|
desired_replicas = current_replicas
|
345
|
-
if
|
346
|
-
desired_replicas = math.ceil(current_replicas *
|
347
|
-
elif
|
348
|
-
desired_replicas = math.ceil(current_replicas *
|
361
|
+
if scale_up_ratio > 1 + self.scale_up_tolerance:
|
362
|
+
desired_replicas = math.ceil(current_replicas * scale_up_ratio)
|
363
|
+
elif scale_down_ratio < 1 - self.scale_down_tolerance:
|
364
|
+
desired_replicas = math.ceil(current_replicas * scale_down_ratio)
|
349
365
|
|
350
366
|
logger.warning(
|
351
367
|
f"[Modal Flash] Current replicas: {current_replicas}, "
|
352
|
-
f"
|
368
|
+
f"sum internal metric `{self.target_metric}`: {sum_metric}, "
|
353
369
|
f"target internal metric value: {self.target_metric_value}, "
|
354
|
-
f"scale
|
370
|
+
f"scale up ratio: {scale_up_ratio}, "
|
371
|
+
f"scale down ratio: {scale_down_ratio}, "
|
355
372
|
f"desired replicas: {desired_replicas}"
|
356
373
|
)
|
357
374
|
|
358
|
-
desired_replicas = max(1, min(desired_replicas, self.max_containers or
|
375
|
+
desired_replicas = max(1, min(desired_replicas, self.max_containers or 5000))
|
359
376
|
return desired_replicas
|
360
377
|
|
361
378
|
async def _compute_target_containers_prometheus(self, current_replicas: int) -> int:
|
@@ -405,9 +422,9 @@ class _FlashPrometheusAutoscaler:
|
|
405
422
|
)
|
406
423
|
|
407
424
|
# Scale down assuming that every container (including cold starting containers) are at the target metric value.
|
408
|
-
scale_down_target_metric_value = (
|
409
|
-
|
410
|
-
)
|
425
|
+
scale_down_target_metric_value = (sum_metric + n_containers_missing_metric * target_metric_value) / (
|
426
|
+
current_replicas or 1
|
427
|
+
)
|
411
428
|
|
412
429
|
scale_up_ratio = scale_up_target_metric_value / target_metric_value
|
413
430
|
scale_down_ratio = scale_down_target_metric_value / target_metric_value
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|