dstack 0.18.41__py3-none-any.whl → 0.18.43__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.
- dstack/_internal/cli/commands/__init__.py +2 -1
- dstack/_internal/cli/commands/apply.py +4 -2
- dstack/_internal/cli/commands/attach.py +21 -1
- dstack/_internal/cli/commands/completion.py +20 -0
- dstack/_internal/cli/commands/delete.py +3 -1
- dstack/_internal/cli/commands/fleet.py +2 -1
- dstack/_internal/cli/commands/gateway.py +7 -2
- dstack/_internal/cli/commands/logs.py +3 -2
- dstack/_internal/cli/commands/stats.py +2 -1
- dstack/_internal/cli/commands/stop.py +2 -1
- dstack/_internal/cli/commands/volume.py +2 -1
- dstack/_internal/cli/main.py +6 -0
- dstack/_internal/cli/services/completion.py +86 -0
- dstack/_internal/cli/services/configurators/run.py +10 -17
- dstack/_internal/cli/utils/fleet.py +5 -1
- dstack/_internal/cli/utils/volume.py +9 -0
- dstack/_internal/core/backends/aws/compute.py +24 -11
- dstack/_internal/core/backends/aws/resources.py +3 -3
- dstack/_internal/core/backends/azure/compute.py +14 -8
- dstack/_internal/core/backends/azure/resources.py +2 -0
- dstack/_internal/core/backends/base/compute.py +102 -2
- dstack/_internal/core/backends/base/offers.py +7 -1
- dstack/_internal/core/backends/cudo/compute.py +8 -4
- dstack/_internal/core/backends/datacrunch/compute.py +10 -4
- dstack/_internal/core/backends/gcp/auth.py +19 -13
- dstack/_internal/core/backends/gcp/compute.py +27 -20
- dstack/_internal/core/backends/gcp/resources.py +3 -10
- dstack/_internal/core/backends/kubernetes/compute.py +4 -3
- dstack/_internal/core/backends/lambdalabs/compute.py +9 -3
- dstack/_internal/core/backends/nebius/compute.py +2 -2
- dstack/_internal/core/backends/oci/compute.py +10 -4
- dstack/_internal/core/backends/runpod/compute.py +11 -4
- dstack/_internal/core/backends/tensordock/compute.py +14 -3
- dstack/_internal/core/backends/vastai/compute.py +12 -2
- dstack/_internal/core/backends/vultr/api_client.py +3 -3
- dstack/_internal/core/backends/vultr/compute.py +9 -3
- dstack/_internal/core/models/backends/aws.py +2 -0
- dstack/_internal/core/models/backends/base.py +1 -0
- dstack/_internal/core/models/configurations.py +0 -1
- dstack/_internal/core/models/runs.py +3 -3
- dstack/_internal/core/models/volumes.py +23 -0
- dstack/_internal/core/services/__init__.py +5 -1
- dstack/_internal/core/services/configs/__init__.py +3 -0
- dstack/_internal/server/background/tasks/common.py +22 -0
- dstack/_internal/server/background/tasks/process_instances.py +13 -21
- dstack/_internal/server/background/tasks/process_running_jobs.py +13 -16
- dstack/_internal/server/background/tasks/process_submitted_jobs.py +12 -7
- dstack/_internal/server/background/tasks/process_terminating_jobs.py +7 -2
- dstack/_internal/server/background/tasks/process_volumes.py +11 -1
- dstack/_internal/server/migrations/versions/a751ef183f27_move_attachment_data_to_volumes_.py +34 -0
- dstack/_internal/server/models.py +17 -19
- dstack/_internal/server/routers/logs.py +3 -0
- dstack/_internal/server/services/backends/configurators/aws.py +31 -1
- dstack/_internal/server/services/backends/configurators/gcp.py +8 -15
- dstack/_internal/server/services/config.py +11 -1
- dstack/_internal/server/services/fleets.py +5 -1
- dstack/_internal/server/services/jobs/__init__.py +14 -11
- dstack/_internal/server/services/jobs/configurators/dev.py +1 -3
- dstack/_internal/server/services/jobs/configurators/task.py +1 -3
- dstack/_internal/server/services/logs/__init__.py +78 -0
- dstack/_internal/server/services/{logs.py → logs/aws.py} +12 -207
- dstack/_internal/server/services/logs/base.py +47 -0
- dstack/_internal/server/services/logs/filelog.py +110 -0
- dstack/_internal/server/services/logs/gcp.py +165 -0
- dstack/_internal/server/services/offers.py +7 -7
- dstack/_internal/server/services/pools.py +19 -20
- dstack/_internal/server/services/proxy/routers/service_proxy.py +14 -7
- dstack/_internal/server/services/runner/client.py +8 -5
- dstack/_internal/server/services/volumes.py +68 -9
- dstack/_internal/server/settings.py +3 -0
- dstack/_internal/server/statics/index.html +1 -1
- dstack/_internal/server/statics/{main-ad5150a441de98cd8987.css → main-7510e71dfa9749a4e70e.css} +1 -1
- dstack/_internal/server/statics/{main-2ac66bfcbd2e39830b88.js → main-fe8fd9db55df8d10e648.js} +66 -66
- dstack/_internal/server/statics/{main-2ac66bfcbd2e39830b88.js.map → main-fe8fd9db55df8d10e648.js.map} +1 -1
- dstack/_internal/server/testing/common.py +46 -17
- dstack/api/_public/runs.py +1 -1
- dstack/version.py +2 -2
- {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/METADATA +4 -3
- {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/RECORD +97 -86
- tests/_internal/core/backends/base/__init__.py +0 -0
- tests/_internal/core/backends/base/test_compute.py +56 -0
- tests/_internal/server/background/tasks/test_process_running_jobs.py +2 -1
- tests/_internal/server/background/tasks/test_process_submitted_jobs.py +5 -3
- tests/_internal/server/background/tasks/test_process_terminating_jobs.py +11 -6
- tests/_internal/server/conftest.py +4 -5
- tests/_internal/server/routers/test_backends.py +1 -0
- tests/_internal/server/routers/test_logs.py +1 -1
- tests/_internal/server/routers/test_runs.py +2 -2
- tests/_internal/server/routers/test_volumes.py +9 -2
- tests/_internal/server/services/runner/test_client.py +22 -3
- tests/_internal/server/services/test_logs.py +3 -3
- tests/_internal/server/services/test_offers.py +167 -0
- tests/_internal/server/services/test_pools.py +105 -1
- {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/LICENSE.md +0 -0
- {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/WHEEL +0 -0
- {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/entry_points.txt +0 -0
- {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/top_level.txt +0 -0
|
@@ -16,7 +16,7 @@ from dstack._internal.core.models.configurations import (
|
|
|
16
16
|
)
|
|
17
17
|
from dstack._internal.core.models.envs import Env
|
|
18
18
|
from dstack._internal.core.models.fleets import FleetConfiguration, FleetSpec, FleetStatus
|
|
19
|
-
from dstack._internal.core.models.gateways import GatewayStatus
|
|
19
|
+
from dstack._internal.core.models.gateways import GatewayComputeConfiguration, GatewayStatus
|
|
20
20
|
from dstack._internal.core.models.instances import (
|
|
21
21
|
Disk,
|
|
22
22
|
Gpu,
|
|
@@ -55,7 +55,7 @@ from dstack._internal.core.models.runs import (
|
|
|
55
55
|
from dstack._internal.core.models.users import GlobalRole
|
|
56
56
|
from dstack._internal.core.models.volumes import (
|
|
57
57
|
Volume,
|
|
58
|
-
|
|
58
|
+
VolumeAttachment,
|
|
59
59
|
VolumeConfiguration,
|
|
60
60
|
VolumeProvisioningData,
|
|
61
61
|
VolumeStatus,
|
|
@@ -76,6 +76,7 @@ from dstack._internal.server.models import (
|
|
|
76
76
|
RepoModel,
|
|
77
77
|
RunModel,
|
|
78
78
|
UserModel,
|
|
79
|
+
VolumeAttachmentModel,
|
|
79
80
|
VolumeModel,
|
|
80
81
|
)
|
|
81
82
|
from dstack._internal.server.services.jobs import get_job_specs_from_run_spec
|
|
@@ -419,6 +420,24 @@ async def create_gateway_compute(
|
|
|
419
420
|
return gateway_compute
|
|
420
421
|
|
|
421
422
|
|
|
423
|
+
def get_gateway_compute_configuration(
|
|
424
|
+
project_name: str = "test-project",
|
|
425
|
+
instance_name: str = "test-instance",
|
|
426
|
+
backend: BackendType = BackendType.AWS,
|
|
427
|
+
region: str = "us",
|
|
428
|
+
public_ip: bool = True,
|
|
429
|
+
) -> GatewayComputeConfiguration:
|
|
430
|
+
return GatewayComputeConfiguration(
|
|
431
|
+
project_name=project_name,
|
|
432
|
+
instance_name=instance_name,
|
|
433
|
+
backend=backend,
|
|
434
|
+
region=region,
|
|
435
|
+
public_ip=public_ip,
|
|
436
|
+
ssh_key_pub="",
|
|
437
|
+
certificate=None,
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
|
|
422
441
|
async def create_pool(
|
|
423
442
|
session: AsyncSession,
|
|
424
443
|
project: ProjectModel,
|
|
@@ -532,16 +551,13 @@ async def create_instance(
|
|
|
532
551
|
requirements = Requirements(resources=ResourcesSpec(cpu=1))
|
|
533
552
|
|
|
534
553
|
if instance_configuration is None:
|
|
535
|
-
instance_configuration =
|
|
536
|
-
project_name="test_proj",
|
|
537
|
-
instance_name="test_instance_name",
|
|
538
|
-
instance_id="test instance id",
|
|
539
|
-
ssh_keys=[],
|
|
540
|
-
user="test_user",
|
|
541
|
-
)
|
|
554
|
+
instance_configuration = get_instance_configuration()
|
|
542
555
|
|
|
543
556
|
if volumes is None:
|
|
544
557
|
volumes = []
|
|
558
|
+
volume_attachments = []
|
|
559
|
+
for volume in volumes:
|
|
560
|
+
volume_attachments.append(VolumeAttachmentModel(volume=volume))
|
|
545
561
|
|
|
546
562
|
im = InstanceModel(
|
|
547
563
|
id=instance_id,
|
|
@@ -566,7 +582,7 @@ async def create_instance(
|
|
|
566
582
|
requirements=requirements.json(),
|
|
567
583
|
instance_configuration=instance_configuration.json(),
|
|
568
584
|
remote_connection_info=remote_connection_info.json() if remote_connection_info else None,
|
|
569
|
-
|
|
585
|
+
volume_attachments=volume_attachments,
|
|
570
586
|
total_blocks=total_blocks,
|
|
571
587
|
busy_blocks=busy_blocks,
|
|
572
588
|
)
|
|
@@ -577,6 +593,19 @@ async def create_instance(
|
|
|
577
593
|
return im
|
|
578
594
|
|
|
579
595
|
|
|
596
|
+
def get_instance_configuration(
|
|
597
|
+
project_name: str = "test-project",
|
|
598
|
+
instance_name: str = "test-instance",
|
|
599
|
+
user: str = "dstack-user",
|
|
600
|
+
) -> InstanceConfiguration:
|
|
601
|
+
return InstanceConfiguration(
|
|
602
|
+
project_name=project_name,
|
|
603
|
+
instance_name=instance_name,
|
|
604
|
+
user=user,
|
|
605
|
+
ssh_keys=[],
|
|
606
|
+
)
|
|
607
|
+
|
|
608
|
+
|
|
580
609
|
def get_instance_offer_with_availability(
|
|
581
610
|
backend: BackendType = BackendType.AWS,
|
|
582
611
|
region: str = "eu-west",
|
|
@@ -587,6 +616,7 @@ def get_instance_offer_with_availability(
|
|
|
587
616
|
spot: bool = False,
|
|
588
617
|
blocks: int = 1,
|
|
589
618
|
total_blocks: int = 1,
|
|
619
|
+
availability_zones: Optional[List[str]] = None,
|
|
590
620
|
):
|
|
591
621
|
gpus = [Gpu(name="T4", memory_mib=16384, vendor=gpuhunt.AcceleratorVendor.NVIDIA)] * gpu_count
|
|
592
622
|
return InstanceOfferWithAvailability(
|
|
@@ -605,6 +635,7 @@ def get_instance_offer_with_availability(
|
|
|
605
635
|
region=region,
|
|
606
636
|
price=1,
|
|
607
637
|
availability=InstanceAvailability.AVAILABLE,
|
|
638
|
+
availability_zones=availability_zones,
|
|
608
639
|
blocks=blocks,
|
|
609
640
|
total_blocks=total_blocks,
|
|
610
641
|
)
|
|
@@ -669,7 +700,7 @@ async def create_volume(
|
|
|
669
700
|
volume_provisioning_data=volume_provisioning_data.json()
|
|
670
701
|
if volume_provisioning_data
|
|
671
702
|
else None,
|
|
672
|
-
|
|
703
|
+
attachments=[],
|
|
673
704
|
deleted_at=deleted_at,
|
|
674
705
|
deleted=True if deleted_at else False,
|
|
675
706
|
)
|
|
@@ -691,16 +722,14 @@ def get_volume(
|
|
|
691
722
|
deleted: bool = False,
|
|
692
723
|
volume_id: Optional[str] = None,
|
|
693
724
|
provisioning_data: Optional[VolumeProvisioningData] = None,
|
|
694
|
-
|
|
695
|
-
device_name: Optional[str] = None,
|
|
725
|
+
attachments: Optional[List[VolumeAttachment]] = None,
|
|
696
726
|
) -> Volume:
|
|
697
727
|
if id_ is None:
|
|
698
728
|
id_ = uuid.uuid4()
|
|
699
729
|
if configuration is None:
|
|
700
730
|
configuration = get_volume_configuration()
|
|
701
|
-
if
|
|
702
|
-
|
|
703
|
-
attachment_data = VolumeAttachmentData(device_name=device_name)
|
|
731
|
+
if attachments is None:
|
|
732
|
+
attachments = []
|
|
704
733
|
return Volume(
|
|
705
734
|
id=id_,
|
|
706
735
|
name=name,
|
|
@@ -714,7 +743,7 @@ def get_volume(
|
|
|
714
743
|
deleted=deleted,
|
|
715
744
|
volume_id=volume_id,
|
|
716
745
|
provisioning_data=provisioning_data,
|
|
717
|
-
|
|
746
|
+
attachments=attachments,
|
|
718
747
|
)
|
|
719
748
|
|
|
720
749
|
|
dstack/api/_public/runs.py
CHANGED
dstack/version.py
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
__version__ = "0.18.
|
|
1
|
+
__version__ = "0.18.43"
|
|
2
2
|
__is_release__ = True
|
|
3
|
-
base_image = "0.
|
|
3
|
+
base_image = "0.7"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dstack
|
|
3
|
-
Version: 0.18.
|
|
3
|
+
Version: 0.18.43
|
|
4
4
|
Summary: dstack is an open-source orchestration engine for running AI workloads on any cloud or on-premises.
|
|
5
5
|
Home-page: https://dstack.ai
|
|
6
6
|
Author: Andrey Cheptsov
|
|
@@ -37,7 +37,8 @@ Requires-Dist: websocket-client
|
|
|
37
37
|
Requires-Dist: python-multipart>=0.0.16
|
|
38
38
|
Requires-Dist: filelock
|
|
39
39
|
Requires-Dist: psutil
|
|
40
|
-
Requires-Dist: gpuhunt<0.
|
|
40
|
+
Requires-Dist: gpuhunt<0.2.0,>=0.1.0
|
|
41
|
+
Requires-Dist: argcomplete>=3.5.0
|
|
41
42
|
Provides-Extra: all
|
|
42
43
|
Requires-Dist: fastapi; extra == "all"
|
|
43
44
|
Requires-Dist: starlette>=0.26.0; extra == "all"
|
|
@@ -307,9 +308,9 @@ for AI workloads both in the cloud and on-prem, speeding up the development, tra
|
|
|
307
308
|
|
|
308
309
|
## Major news ✨
|
|
309
310
|
|
|
311
|
+
- [2025/02] [dstack 0.18.41: GPU blocks, Proxy jump, inactivity duration, and more](https://github.com/dstackai/dstack/releases/tag/0.18.41)
|
|
310
312
|
- [2025/01] [dstack 0.18.38: Intel Gaudi](https://github.com/dstackai/dstack/releases/tag/0.18.38)
|
|
311
313
|
- [2025/01] [dstack 0.18.35: Vultr](https://github.com/dstackai/dstack/releases/tag/0.18.35)
|
|
312
|
-
- [2024/12] [dstack 0.18.32: TPU v6e](https://github.com/dstackai/dstack/releases/tag/0.18.32)
|
|
313
314
|
- [2024/12] [dstack 0.18.30: AWS Capacity Reservations and Capacity Blocks](https://github.com/dstackai/dstack/releases/tag/0.18.30)
|
|
314
315
|
- [2024/10] [dstack 0.18.21: Instance volumes](https://github.com/dstackai/dstack/releases/tag/0.18.21)
|
|
315
316
|
- [2024/10] [dstack 0.18.18: Hardware metrics monitoring](https://github.com/dstackai/dstack/releases/tag/0.18.18)
|