modal 1.1.5.dev0__py3-none-any.whl → 1.1.5.dev1__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 +2 -2
- modal/experimental/flash.py +29 -12
- {modal-1.1.5.dev0.dist-info → modal-1.1.5.dev1.dist-info}/METADATA +1 -1
- {modal-1.1.5.dev0.dist-info → modal-1.1.5.dev1.dist-info}/RECORD +9 -9
- modal_version/__init__.py +1 -1
- {modal-1.1.5.dev0.dist-info → modal-1.1.5.dev1.dist-info}/WHEEL +0 -0
- {modal-1.1.5.dev0.dist-info → modal-1.1.5.dev1.dist-info}/entry_points.txt +0 -0
- {modal-1.1.5.dev0.dist-info → modal-1.1.5.dev1.dist-info}/licenses/LICENSE +0 -0
- {modal-1.1.5.dev0.dist-info → modal-1.1.5.dev1.dist-info}/top_level.txt +0 -0
modal/client.pyi
CHANGED
@@ -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.5.
|
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.5.
|
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.
|
modal/experimental/flash.py
CHANGED
@@ -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
|
@@ -22,7 +22,7 @@ modal/app.py,sha256=F4baVULljFq0CwC_7U-EKNRNx7CYeWBKudjjYUuWc4U,48416
|
|
22
22
|
modal/app.pyi,sha256=AbXJCBkyt2rI_-M3VbTBYb32at0P6iRZuoC87xY_JrQ,43591
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
24
24
|
modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
|
25
|
-
modal/client.pyi,sha256=
|
25
|
+
modal/client.pyi,sha256=iECk5doEH0puI3RE_hDo7hqkKtBj8k_leox2F6ECcbY,15829
|
26
26
|
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
27
27
|
modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
|
28
28
|
modal/cls.py,sha256=pTEO7pHjlO7taMbIqs4oI9ZZgKDJpVKyGkO5ZT0w6tQ,40934
|
@@ -150,10 +150,10 @@ modal/cli/programs/run_jupyter.py,sha256=44Lpvqk2l3hH-uOkmAOzw60NEsfB5uaRDWDKVsh
|
|
150
150
|
modal/cli/programs/run_marimo.py,sha256=HyZ2za0NYqg31-mGxFQxUIAJ3Q-jRaMocEwWwI5-cdw,2887
|
151
151
|
modal/cli/programs/vscode.py,sha256=KbTAaIXyQBVCDXxXjmBHmKpgXkUw0q4R4KkJvUjCYgk,3380
|
152
152
|
modal/experimental/__init__.py,sha256=fCqzo_f3vcY750vHtd7CtLs5dvdM_C0ZLLGb3zXuK9w,14913
|
153
|
-
modal/experimental/flash.py,sha256=
|
153
|
+
modal/experimental/flash.py,sha256=dPTB1k2H72dsq3TuEFs2WAxrU8y5n-SoJzZ4AXVMdZs,28287
|
154
154
|
modal/experimental/flash.pyi,sha256=32bvUlolZHthplDJNXokmbjwb0RSOuXGCBpU6qfFPOk,13732
|
155
155
|
modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
|
156
|
-
modal-1.1.5.
|
156
|
+
modal-1.1.5.dev1.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
157
157
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
158
158
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
159
159
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
@@ -176,10 +176,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
|
|
176
176
|
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
177
177
|
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
178
178
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
179
|
-
modal_version/__init__.py,sha256=
|
179
|
+
modal_version/__init__.py,sha256=1GclQJIeogdbfA9yjE3Usgsx9hP3s9Z9ZhQB0bL2Mqk,120
|
180
180
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
181
|
-
modal-1.1.5.
|
182
|
-
modal-1.1.5.
|
183
|
-
modal-1.1.5.
|
184
|
-
modal-1.1.5.
|
185
|
-
modal-1.1.5.
|
181
|
+
modal-1.1.5.dev1.dist-info/METADATA,sha256=zr689pf9vfVaYAH4V_atrVpBQPXB1Xr0ClZarYuNJ-U,2459
|
182
|
+
modal-1.1.5.dev1.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
183
|
+
modal-1.1.5.dev1.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
184
|
+
modal-1.1.5.dev1.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
185
|
+
modal-1.1.5.dev1.dist-info/RECORD,,
|
modal_version/__init__.py
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|