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.
Files changed (97) hide show
  1. dstack/_internal/cli/commands/__init__.py +2 -1
  2. dstack/_internal/cli/commands/apply.py +4 -2
  3. dstack/_internal/cli/commands/attach.py +21 -1
  4. dstack/_internal/cli/commands/completion.py +20 -0
  5. dstack/_internal/cli/commands/delete.py +3 -1
  6. dstack/_internal/cli/commands/fleet.py +2 -1
  7. dstack/_internal/cli/commands/gateway.py +7 -2
  8. dstack/_internal/cli/commands/logs.py +3 -2
  9. dstack/_internal/cli/commands/stats.py +2 -1
  10. dstack/_internal/cli/commands/stop.py +2 -1
  11. dstack/_internal/cli/commands/volume.py +2 -1
  12. dstack/_internal/cli/main.py +6 -0
  13. dstack/_internal/cli/services/completion.py +86 -0
  14. dstack/_internal/cli/services/configurators/run.py +10 -17
  15. dstack/_internal/cli/utils/fleet.py +5 -1
  16. dstack/_internal/cli/utils/volume.py +9 -0
  17. dstack/_internal/core/backends/aws/compute.py +24 -11
  18. dstack/_internal/core/backends/aws/resources.py +3 -3
  19. dstack/_internal/core/backends/azure/compute.py +14 -8
  20. dstack/_internal/core/backends/azure/resources.py +2 -0
  21. dstack/_internal/core/backends/base/compute.py +102 -2
  22. dstack/_internal/core/backends/base/offers.py +7 -1
  23. dstack/_internal/core/backends/cudo/compute.py +8 -4
  24. dstack/_internal/core/backends/datacrunch/compute.py +10 -4
  25. dstack/_internal/core/backends/gcp/auth.py +19 -13
  26. dstack/_internal/core/backends/gcp/compute.py +27 -20
  27. dstack/_internal/core/backends/gcp/resources.py +3 -10
  28. dstack/_internal/core/backends/kubernetes/compute.py +4 -3
  29. dstack/_internal/core/backends/lambdalabs/compute.py +9 -3
  30. dstack/_internal/core/backends/nebius/compute.py +2 -2
  31. dstack/_internal/core/backends/oci/compute.py +10 -4
  32. dstack/_internal/core/backends/runpod/compute.py +11 -4
  33. dstack/_internal/core/backends/tensordock/compute.py +14 -3
  34. dstack/_internal/core/backends/vastai/compute.py +12 -2
  35. dstack/_internal/core/backends/vultr/api_client.py +3 -3
  36. dstack/_internal/core/backends/vultr/compute.py +9 -3
  37. dstack/_internal/core/models/backends/aws.py +2 -0
  38. dstack/_internal/core/models/backends/base.py +1 -0
  39. dstack/_internal/core/models/configurations.py +0 -1
  40. dstack/_internal/core/models/runs.py +3 -3
  41. dstack/_internal/core/models/volumes.py +23 -0
  42. dstack/_internal/core/services/__init__.py +5 -1
  43. dstack/_internal/core/services/configs/__init__.py +3 -0
  44. dstack/_internal/server/background/tasks/common.py +22 -0
  45. dstack/_internal/server/background/tasks/process_instances.py +13 -21
  46. dstack/_internal/server/background/tasks/process_running_jobs.py +13 -16
  47. dstack/_internal/server/background/tasks/process_submitted_jobs.py +12 -7
  48. dstack/_internal/server/background/tasks/process_terminating_jobs.py +7 -2
  49. dstack/_internal/server/background/tasks/process_volumes.py +11 -1
  50. dstack/_internal/server/migrations/versions/a751ef183f27_move_attachment_data_to_volumes_.py +34 -0
  51. dstack/_internal/server/models.py +17 -19
  52. dstack/_internal/server/routers/logs.py +3 -0
  53. dstack/_internal/server/services/backends/configurators/aws.py +31 -1
  54. dstack/_internal/server/services/backends/configurators/gcp.py +8 -15
  55. dstack/_internal/server/services/config.py +11 -1
  56. dstack/_internal/server/services/fleets.py +5 -1
  57. dstack/_internal/server/services/jobs/__init__.py +14 -11
  58. dstack/_internal/server/services/jobs/configurators/dev.py +1 -3
  59. dstack/_internal/server/services/jobs/configurators/task.py +1 -3
  60. dstack/_internal/server/services/logs/__init__.py +78 -0
  61. dstack/_internal/server/services/{logs.py → logs/aws.py} +12 -207
  62. dstack/_internal/server/services/logs/base.py +47 -0
  63. dstack/_internal/server/services/logs/filelog.py +110 -0
  64. dstack/_internal/server/services/logs/gcp.py +165 -0
  65. dstack/_internal/server/services/offers.py +7 -7
  66. dstack/_internal/server/services/pools.py +19 -20
  67. dstack/_internal/server/services/proxy/routers/service_proxy.py +14 -7
  68. dstack/_internal/server/services/runner/client.py +8 -5
  69. dstack/_internal/server/services/volumes.py +68 -9
  70. dstack/_internal/server/settings.py +3 -0
  71. dstack/_internal/server/statics/index.html +1 -1
  72. dstack/_internal/server/statics/{main-ad5150a441de98cd8987.css → main-7510e71dfa9749a4e70e.css} +1 -1
  73. dstack/_internal/server/statics/{main-2ac66bfcbd2e39830b88.js → main-fe8fd9db55df8d10e648.js} +66 -66
  74. dstack/_internal/server/statics/{main-2ac66bfcbd2e39830b88.js.map → main-fe8fd9db55df8d10e648.js.map} +1 -1
  75. dstack/_internal/server/testing/common.py +46 -17
  76. dstack/api/_public/runs.py +1 -1
  77. dstack/version.py +2 -2
  78. {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/METADATA +4 -3
  79. {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/RECORD +97 -86
  80. tests/_internal/core/backends/base/__init__.py +0 -0
  81. tests/_internal/core/backends/base/test_compute.py +56 -0
  82. tests/_internal/server/background/tasks/test_process_running_jobs.py +2 -1
  83. tests/_internal/server/background/tasks/test_process_submitted_jobs.py +5 -3
  84. tests/_internal/server/background/tasks/test_process_terminating_jobs.py +11 -6
  85. tests/_internal/server/conftest.py +4 -5
  86. tests/_internal/server/routers/test_backends.py +1 -0
  87. tests/_internal/server/routers/test_logs.py +1 -1
  88. tests/_internal/server/routers/test_runs.py +2 -2
  89. tests/_internal/server/routers/test_volumes.py +9 -2
  90. tests/_internal/server/services/runner/test_client.py +22 -3
  91. tests/_internal/server/services/test_logs.py +3 -3
  92. tests/_internal/server/services/test_offers.py +167 -0
  93. tests/_internal/server/services/test_pools.py +105 -1
  94. {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/LICENSE.md +0 -0
  95. {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/WHEEL +0 -0
  96. {dstack-0.18.41.dist-info → dstack-0.18.43.dist-info}/entry_points.txt +0 -0
  97. {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
- VolumeAttachmentData,
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 = InstanceConfiguration(
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
- volumes=volumes,
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
- instances=[],
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
- attachment_data: Optional[VolumeAttachmentData] = None,
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 device_name is not None:
702
- assert attachment_data is None, "attachment_data and device_name are mutually exclusive"
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
- attachment_data=attachment_data,
746
+ attachments=attachments,
718
747
  )
719
748
 
720
749
 
@@ -215,7 +215,7 @@ class Run(ABC):
215
215
  start_time=next_start_time,
216
216
  end_time=None,
217
217
  descending=False,
218
- limit=100,
218
+ limit=1000,
219
219
  diagnose=diagnose,
220
220
  ),
221
221
  )
dstack/version.py CHANGED
@@ -1,3 +1,3 @@
1
- __version__ = "0.18.41"
1
+ __version__ = "0.18.43"
2
2
  __is_release__ = True
3
- base_image = "0.6"
3
+ base_image = "0.7"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dstack
3
- Version: 0.18.41
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.1.0,>=0.0.19
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)