dstack 0.19.28__py3-none-any.whl → 0.19.30rc1__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.

Potentially problematic release.


This version of dstack might be problematic. Click here for more details.

Files changed (43) hide show
  1. dstack/_internal/core/backends/aws/compute.py +51 -36
  2. dstack/_internal/core/backends/azure/compute.py +10 -7
  3. dstack/_internal/core/backends/base/compute.py +96 -14
  4. dstack/_internal/core/backends/base/offers.py +34 -4
  5. dstack/_internal/core/backends/cloudrift/compute.py +5 -7
  6. dstack/_internal/core/backends/cudo/compute.py +4 -2
  7. dstack/_internal/core/backends/datacrunch/compute.py +13 -11
  8. dstack/_internal/core/backends/digitalocean_base/compute.py +4 -5
  9. dstack/_internal/core/backends/gcp/compute.py +12 -7
  10. dstack/_internal/core/backends/hotaisle/compute.py +4 -7
  11. dstack/_internal/core/backends/kubernetes/compute.py +6 -4
  12. dstack/_internal/core/backends/lambdalabs/compute.py +4 -5
  13. dstack/_internal/core/backends/local/compute.py +1 -3
  14. dstack/_internal/core/backends/nebius/compute.py +10 -7
  15. dstack/_internal/core/backends/oci/compute.py +10 -7
  16. dstack/_internal/core/backends/runpod/compute.py +15 -6
  17. dstack/_internal/core/backends/template/compute.py.jinja +3 -1
  18. dstack/_internal/core/backends/tensordock/compute.py +1 -3
  19. dstack/_internal/core/backends/tensordock/models.py +2 -0
  20. dstack/_internal/core/backends/vastai/compute.py +7 -3
  21. dstack/_internal/core/backends/vultr/compute.py +5 -5
  22. dstack/_internal/core/models/projects.py +8 -0
  23. dstack/_internal/core/services/repos.py +2 -1
  24. dstack/_internal/server/background/tasks/process_instances.py +3 -2
  25. dstack/_internal/server/background/tasks/process_submitted_jobs.py +65 -22
  26. dstack/_internal/server/services/backends/__init__.py +1 -1
  27. dstack/_internal/server/services/projects.py +11 -3
  28. dstack/_internal/server/services/runs.py +2 -0
  29. dstack/_internal/server/statics/index.html +1 -1
  30. dstack/_internal/server/statics/main-56191fbfe77f49b251de.css +3 -0
  31. dstack/_internal/server/statics/{main-a2a16772fbf11a14d191.js → main-c51afa7f243e24d3e446.js} +61081 -49037
  32. dstack/_internal/server/statics/{main-a2a16772fbf11a14d191.js.map → main-c51afa7f243e24d3e446.js.map} +1 -1
  33. dstack/version.py +1 -1
  34. {dstack-0.19.28.dist-info → dstack-0.19.30rc1.dist-info}/METADATA +1 -1
  35. {dstack-0.19.28.dist-info → dstack-0.19.30rc1.dist-info}/RECORD +38 -42
  36. dstack/_internal/core/backends/tensordock/__init__.py +0 -0
  37. dstack/_internal/core/backends/tensordock/api_client.py +0 -104
  38. dstack/_internal/core/backends/tensordock/backend.py +0 -16
  39. dstack/_internal/core/backends/tensordock/configurator.py +0 -74
  40. dstack/_internal/server/statics/main-5e0d56245c4bd241ec27.css +0 -3
  41. {dstack-0.19.28.dist-info → dstack-0.19.30rc1.dist-info}/WHEEL +0 -0
  42. {dstack-0.19.28.dist-info → dstack-0.19.30rc1.dist-info}/entry_points.txt +0 -0
  43. {dstack-0.19.28.dist-info → dstack-0.19.30rc1.dist-info}/licenses/LICENSE.md +0 -0
dstack/version.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "0.19.28"
1
+ __version__ = "0.19.30rc1"
2
2
  __is_release__ = True
3
3
  base_image = "0.10"
4
4
  base_image_ubuntu_version = "22.04"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dstack
3
- Version: 0.19.28
3
+ Version: 0.19.30rc1
4
4
  Summary: dstack is an open-source orchestration engine for running AI workloads on any cloud or on-premises.
5
5
  Project-URL: Homepage, https://dstack.ai
6
6
  Project-URL: Source, https://github.com/dstackai/dstack
@@ -1,5 +1,5 @@
1
1
  dstack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- dstack/version.py,sha256=D7GukE1Gm51wYjN8H3JLGrFvyhMFAGdjhKN4kdBymDA,102
2
+ dstack/version.py,sha256=Ta43AjsSlnL2CkUMzJBLCku0Kn1jlaEufzHSRKEr5yY,105
3
3
  dstack/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  dstack/_internal/compat.py,sha256=bF9U9fTMfL8UVhCouedoUSTYFl7UAOiU0WXrnRoByxw,40
5
5
  dstack/_internal/settings.py,sha256=FYtd7tRk17Oc62Kl_3O8NuT5JHb8TKhLThl1TsfjjVs,1390
@@ -59,39 +59,39 @@ dstack/_internal/core/backends/amddevcloud/configurator.py,sha256=WF4e-Yh2jMuTKQ
59
59
  dstack/_internal/core/backends/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  dstack/_internal/core/backends/aws/auth.py,sha256=BAe3HAedoAO42Fbv7YhpODKWlyil8M0PuRJsL-_u_kw,978
61
61
  dstack/_internal/core/backends/aws/backend.py,sha256=pjROH-S9pgrSMm-Eox_ocL7cTU6mIMRxvURq7Vi-2J8,876
62
- dstack/_internal/core/backends/aws/compute.py,sha256=Ztodgn_EkDcnVtJkPBduYmDXV8_gsANW9wJW3l2hd4E,44546
62
+ dstack/_internal/core/backends/aws/compute.py,sha256=mxwNXg1sNjF1bGNxt42DfXj66bbEi-Yh92lKS6EMxkg,45224
63
63
  dstack/_internal/core/backends/aws/configurator.py,sha256=X4CS-DnvsbdYCEVo6HBKLmH0YQ-zh5RucOjyhEcRca8,7634
64
64
  dstack/_internal/core/backends/aws/models.py,sha256=EUCHXHmZnshe3rwI9UtjilwcUMu1Z7MO4Y4-nlZ_IcA,4404
65
65
  dstack/_internal/core/backends/aws/resources.py,sha256=ccvdQd2H1DuUupdzMtqf86nkrenYPBJb1k3VgHu5Gp4,23610
66
66
  dstack/_internal/core/backends/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
67
  dstack/_internal/core/backends/azure/auth.py,sha256=CHp3QRNx3tIwkhyOY_l8WU-ElY4Pxhavoy9JSdwr15g,1259
68
68
  dstack/_internal/core/backends/azure/backend.py,sha256=XySTor8v_tLkZctDBryrFHrbVzQgNf_RUPkXQYplvwM,746
69
- dstack/_internal/core/backends/azure/compute.py,sha256=waunprBzpiJBMtVDJMjFCxEdmtO52E7ckzcc6OcZLf4,24488
69
+ dstack/_internal/core/backends/azure/compute.py,sha256=cbR0nSQfSIiR1x2J35So9xJbDkSjfYTEcYGQ-_1pceo,24695
70
70
  dstack/_internal/core/backends/azure/configurator.py,sha256=tKovBgMvyKmCogZ2OMxOJ-Sh_TCBqYXBvbBM-kgyeBI,18367
71
71
  dstack/_internal/core/backends/azure/models.py,sha256=ap0WsYBSFdDCxY0G3W1sg2DBN2k0xknz6bp8Ypf6phs,3356
72
72
  dstack/_internal/core/backends/azure/resources.py,sha256=cJWS2Yjxdg-XtjpdBxfVDZaX_gTbuoEpmdjTxdA9uIw,3431
73
73
  dstack/_internal/core/backends/azure/utils.py,sha256=taHMJq6UHRzUXLUcO2P5VCKy3wJaye2bG-6QdkEPNdY,1741
74
74
  dstack/_internal/core/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
75
  dstack/_internal/core/backends/base/backend.py,sha256=hdFMHED1RMV9GVfLSU0yGhGE-cXlbLvt1coDA885PMM,505
76
- dstack/_internal/core/backends/base/compute.py,sha256=3x--AsQYD63n_KtNJa1TkdRdTw8t3thaZKhfnL0hq9g,30581
76
+ dstack/_internal/core/backends/base/compute.py,sha256=bK4whPes7mCQ698Fu1XtgOUGOpiBhx9EnhTI9KkG_R0,33666
77
77
  dstack/_internal/core/backends/base/configurator.py,sha256=TKG5iJlOXxVT2agE_ruMW8JGt2dtwXY7ghmJN8bEWlw,4299
78
78
  dstack/_internal/core/backends/base/models.py,sha256=Ij0osOl-T-ABsKLoVg2eY81DMkwdWkevAnjXj2QnLXI,532
79
- dstack/_internal/core/backends/base/offers.py,sha256=IlK1X7Rz3piKeUJNsIjyqrj68k4PlWsC-5e76i9NjYg,6305
79
+ dstack/_internal/core/backends/base/offers.py,sha256=1688KlzBWgQWJFAEQMtqOud4Z8CwpvufNolX1zm1UTI,7487
80
80
  dstack/_internal/core/backends/cloudrift/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
81
  dstack/_internal/core/backends/cloudrift/api_client.py,sha256=mI3_ttwujfSunTiTIelnc1XaLBlfxsKsacrlyB12f8c,8178
82
82
  dstack/_internal/core/backends/cloudrift/backend.py,sha256=Jz3nIQsa3TnMISVXK6EU43O0B7FgIMxwwaEBmd_s5BY,596
83
- dstack/_internal/core/backends/cloudrift/compute.py,sha256=fmCaUliSRKDjAPT8YFwX-7xSk0eMnxryFsDBFBcS7VQ,5141
83
+ dstack/_internal/core/backends/cloudrift/compute.py,sha256=NoMreAUiYK8Pg0g0QrsIpz0ojTzgVlNMiSM1vUcvDRY,5063
84
84
  dstack/_internal/core/backends/cloudrift/configurator.py,sha256=ZchmFjn49QDz7If-tbC1kFQeDvBbu6CiZJGESyt6tGE,2492
85
85
  dstack/_internal/core/backends/cloudrift/models.py,sha256=tFpcG68OghznpzmspjdnlVEWY_GDvFPt_d41p9ceLrk,1119
86
86
  dstack/_internal/core/backends/cudo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  dstack/_internal/core/backends/cudo/api_client.py,sha256=ygq1Gx7ZvwKaifdXtvzDSw4xR4ZH6UWd5J47BjuaGh0,3685
88
88
  dstack/_internal/core/backends/cudo/backend.py,sha256=i13YoAkUfIStc3Yyyt_3YmL30eVrKtrhwnE9_B1iBRI,546
89
- dstack/_internal/core/backends/cudo/compute.py,sha256=XlhBQ02TB5Co3IKXcrKqko0YodZWFSTOLlg0LQmLNzI,6680
89
+ dstack/_internal/core/backends/cudo/compute.py,sha256=S5VYgwEvLQrAmqVcnPmWnYerSc2lC4RAnS9vE_z7bZ0,6753
90
90
  dstack/_internal/core/backends/cudo/configurator.py,sha256=3wAegbWDI2DcWD_225PNSQEnT9FPpDIKrJQLlY8hMu0,2193
91
91
  dstack/_internal/core/backends/cudo/models.py,sha256=6sfEqY2hvTpIACkyT4mhD3D8K5TsW_pupys9nqtrgoI,1055
92
92
  dstack/_internal/core/backends/datacrunch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  dstack/_internal/core/backends/datacrunch/backend.py,sha256=-wanJJ_K_wOXezxTSRgsK1MjsOuCl0MoVJREPj3SgM8,606
94
- dstack/_internal/core/backends/datacrunch/compute.py,sha256=i06kApZD9-cRRE4ZEDfvqcFM2944tOMseyPC-Vx2vBc,9159
94
+ dstack/_internal/core/backends/datacrunch/compute.py,sha256=uQTJfDdvNnpiS_BwaQxgiTtAVbNyBxifwOC9A1CMNhg,9367
95
95
  dstack/_internal/core/backends/datacrunch/configurator.py,sha256=9eG3p9LIp5M45T7WH60q8YwH9cNlzz5l_DSRcugO45I,2564
96
96
  dstack/_internal/core/backends/datacrunch/models.py,sha256=QeadH8qmcK3oDY9DfQKmX65fDGQo6FABLQAe9wQsHr8,1194
97
97
  dstack/_internal/core/backends/digitalocean/__init__.py,sha256=BPjTlv6iNDgu2mcsaIh0FEi9T8iwCEEIVbJQYJAa0gY,34
@@ -101,7 +101,7 @@ dstack/_internal/core/backends/digitalocean/configurator.py,sha256=_4Tiei4ejehHd
101
101
  dstack/_internal/core/backends/digitalocean_base/__init__.py,sha256=-7saeWMuPLmclPKi3VT-H5lwALbO9AABcaL248npyBc,84
102
102
  dstack/_internal/core/backends/digitalocean_base/api_client.py,sha256=-QBAOs-Qj1E_4q3uM7oKPxsN86c-quwiZNqqYbTcs8I,3834
103
103
  dstack/_internal/core/backends/digitalocean_base/backend.py,sha256=1xjjveUldj98sg8ELKAbf48a1KDm9DLh8-ymMvhWKXk,115
104
- dstack/_internal/core/backends/digitalocean_base/compute.py,sha256=gD1AszHcAE-EUxMN3gu9IqevAzFXscvZ9UAt0qB68J0,6970
104
+ dstack/_internal/core/backends/digitalocean_base/compute.py,sha256=2hEeOg6OEYq73rBIhN0XamdOfkhmYZmjJgEay-Zlcdc,6944
105
105
  dstack/_internal/core/backends/digitalocean_base/configurator.py,sha256=piXOi4jtUprESLkHE_hSeo1ndxe-3pI5aYDPicNbyAQ,2141
106
106
  dstack/_internal/core/backends/digitalocean_base/models.py,sha256=oyVnr_xaneudGeogfCr0BLZ22kzubUmGaNE5V8FI-6U,1334
107
107
  dstack/_internal/core/backends/dstack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -109,7 +109,7 @@ dstack/_internal/core/backends/dstack/models.py,sha256=Jbe0Syez43N5i97TlIc8l-5Vn
109
109
  dstack/_internal/core/backends/gcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
110
  dstack/_internal/core/backends/gcp/auth.py,sha256=VWCn34hapaZ3E0OHCoiAVL97o3s64RF9w85CZ6xdtmk,2235
111
111
  dstack/_internal/core/backends/gcp/backend.py,sha256=OvTv1c7j4LTPCIEtkwD3-q6Eo1QET8xlM8CzbY0hLmI,572
112
- dstack/_internal/core/backends/gcp/compute.py,sha256=arHF6BcMDpGNdA1OadfeKoEYJ6kliX_kV0rz4vSVJwA,43030
112
+ dstack/_internal/core/backends/gcp/compute.py,sha256=LycsCO9gCI1WEhsjUNnn-A4PrjciSU28BDsG3BEGNb4,43239
113
113
  dstack/_internal/core/backends/gcp/configurator.py,sha256=eVPr6pD4g66ej5qxhFd94lb_R11CIBA-py9PQS9EOGE,6865
114
114
  dstack/_internal/core/backends/gcp/models.py,sha256=biLA3rlFcoPatAZpKycuIl-8PdnNSAFiDCJjov65_zo,4612
115
115
  dstack/_internal/core/backends/gcp/resources.py,sha256=2jpg24NH4Ov4J4Of1F3DPkwEWkRxEi-x4ZTx8XSNGIQ,16926
@@ -118,27 +118,27 @@ dstack/_internal/core/backends/gcp/features/tcpx.py,sha256=8bDR5kwF5qke5EWNdBscd
118
118
  dstack/_internal/core/backends/hotaisle/__init__.py,sha256=CYMaS1jd9Km0Y6Jvg4ePjYOtfqL9swGsRo5kcXGFrFQ,30
119
119
  dstack/_internal/core/backends/hotaisle/api_client.py,sha256=Fd1TOg4_orwQyJtoZ657zJweLeBhzj_9ObfL538S5uI,3640
120
120
  dstack/_internal/core/backends/hotaisle/backend.py,sha256=o0cqLIKGcrXhvksHHGvjCpLShoQxT2IKdJy9sm0H9gE,586
121
- dstack/_internal/core/backends/hotaisle/compute.py,sha256=vZnaw3CuO8wMlrZvXrDfyGnzqNAuGH-K9GEL3lV5pUo,7511
121
+ dstack/_internal/core/backends/hotaisle/compute.py,sha256=uMiz6UEa5bd03RWFb8bH82CV4tphO5v2Ly5F2LsIsEg,7483
122
122
  dstack/_internal/core/backends/hotaisle/configurator.py,sha256=EJwdKFfC0ab0pe4lzeV65b80Ok21rR0OfupOmuqCp6c,2287
123
123
  dstack/_internal/core/backends/hotaisle/models.py,sha256=CmJ20SbpKzFldX7rrR0CpVytSJSN2YWKQ3Ixnta_A1M,1334
124
124
  dstack/_internal/core/backends/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
125
  dstack/_internal/core/backends/kubernetes/backend.py,sha256=Jy0_Nwn6Oro8McJIo_QeNxxq4Pmwsd7JPd5_YE8Fz9U,606
126
- dstack/_internal/core/backends/kubernetes/compute.py,sha256=hFQkElNHRi4DBoyLJAYXuhCV4bJi0HjzbMGtrsKrMr0,23037
126
+ dstack/_internal/core/backends/kubernetes/compute.py,sha256=pc5FK1wmY8XRpupFZIpOkzLf4BtWJ8XEHkzYYFmmFPY,23132
127
127
  dstack/_internal/core/backends/kubernetes/configurator.py,sha256=RK8_eznv1AFrcG3fM-KIxyolsaJ8UTBAO7c3P3RCBnw,2228
128
128
  dstack/_internal/core/backends/kubernetes/models.py,sha256=YITTXi8f1-0FQ7qlC3nDV46m48w88bIiZ_weQJ9bQXU,2577
129
129
  dstack/_internal/core/backends/kubernetes/utils.py,sha256=k0cmjqMoNfJ_pAe6W82exV4AywMcpZ5jf0QICVbVuFY,1218
130
130
  dstack/_internal/core/backends/lambdalabs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
131
  dstack/_internal/core/backends/lambdalabs/api_client.py,sha256=WaBO7VrPB4kbMQJDxjFxx0HEtAoSncQvH-cahWnVxx4,2688
132
132
  dstack/_internal/core/backends/lambdalabs/backend.py,sha256=zVU_M2EBbP-9-snmh64GTKeYAX84-g5kwrZ9d7xETzs,610
133
- dstack/_internal/core/backends/lambdalabs/compute.py,sha256=BctxiSr2DJ_WwmoYZGm7mUBTw0-TSA3l8YyxvVUWrv4,8184
133
+ dstack/_internal/core/backends/lambdalabs/compute.py,sha256=k9aTZVd7E_RLfF6vXvEIN1w87ghCGTgoROeuUHMJr-Q,8158
134
134
  dstack/_internal/core/backends/lambdalabs/configurator.py,sha256=JL6n0nM42diqVyI1w-8uUY3WgQCbLouurZ4yA8QD69w,2276
135
135
  dstack/_internal/core/backends/lambdalabs/models.py,sha256=c9dAYd0wjun2dvMLUZO4D09XvEskBRehjLDN_nwbSEU,1036
136
136
  dstack/_internal/core/backends/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
137
  dstack/_internal/core/backends/local/backend.py,sha256=KJuNXUXrg60NhLywnExD1EXH2gK0TL-kzNWUPRNZ_Zg,427
138
- dstack/_internal/core/backends/local/compute.py,sha256=-FUD8Ii5VTBtygAV1U3k1j10MFdK1whGvrSeRwTk29Y,3788
138
+ dstack/_internal/core/backends/local/compute.py,sha256=M5xCk7Yav_u6OtZUzLfmw36RfNwzl1SCs-I7mWYiyPY,3757
139
139
  dstack/_internal/core/backends/nebius/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
140
  dstack/_internal/core/backends/nebius/backend.py,sha256=2XqZIbSR8VzlfOnuVklXlDxNmwAkQj7txQN8VXF1j2E,566
141
- dstack/_internal/core/backends/nebius/compute.py,sha256=UcYIfaqp0-keMuGhARcL82bQK_VXEMigsveW_LbD6Ds,14645
141
+ dstack/_internal/core/backends/nebius/compute.py,sha256=9r0m0yqefZbnT9iP-9VtWCJNcNalk9Kut1KBy3OWEy0,14852
142
142
  dstack/_internal/core/backends/nebius/configurator.py,sha256=PilZ5M0xj-koYz9PPew9L29rrHoF2JrW2bxgCqt27u4,3213
143
143
  dstack/_internal/core/backends/nebius/fabrics.py,sha256=-X-nSPV2pUin2PAYDHGm-j14KPboIFRpLi93PKHUXTM,1616
144
144
  dstack/_internal/core/backends/nebius/models.py,sha256=UudYX32p-ZY-GWR83VEtY5dpZBaWhKXQIfn2nrBCq-4,4245
@@ -146,7 +146,7 @@ dstack/_internal/core/backends/nebius/resources.py,sha256=ttgwdqokvXF8BH_IDPFZxW
146
146
  dstack/_internal/core/backends/oci/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  dstack/_internal/core/backends/oci/auth.py,sha256=8Cr18y_LOsyRP-16yfFpT70Cofpm0clB3KawS_7aRl4,717
148
148
  dstack/_internal/core/backends/oci/backend.py,sha256=yXjVCt7n6BVLH0byYFbNFf-P9J0FwlNfxsYbKGMdoI4,536
149
- dstack/_internal/core/backends/oci/compute.py,sha256=-1UyAcsJ7PG980zKGZBg9dYVi_hZrvNWxRh-YGjKas4,7398
149
+ dstack/_internal/core/backends/oci/compute.py,sha256=jB3A6s4Hxh-LYrqQR8wJYqYCxLt31cbeMxrEkBxRfys,7605
150
150
  dstack/_internal/core/backends/oci/configurator.py,sha256=_mi093BzV8Xdfw81wkiqoY5d5x4CCCtni7J01CZeDCQ,5768
151
151
  dstack/_internal/core/backends/oci/exceptions.py,sha256=GxlUf7itcAQgY3m-U2ul_ZXzfUOcEcPEmisWFaoWSkA,288
152
152
  dstack/_internal/core/backends/oci/models.py,sha256=fDlY7-A0WDQeiwJzwrQl6D5ENOc-677Bz8LXyvBvF0c,2969
@@ -155,30 +155,26 @@ dstack/_internal/core/backends/oci/resources.py,sha256=VfTDuVTEO8MUvD3i2DFoe2du1
155
155
  dstack/_internal/core/backends/runpod/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
156
  dstack/_internal/core/backends/runpod/api_client.py,sha256=Oet7CwQTu3sE57unqh-JvuMCBDEDPruAbGB4GyM0dM4,13427
157
157
  dstack/_internal/core/backends/runpod/backend.py,sha256=GcLbySsGY29ZGHXSqTXCxUUoTK9pxVScKly0_fkNr8c,566
158
- dstack/_internal/core/backends/runpod/compute.py,sha256=yPu7P5vpt2hoGoBfZAMDj-XCkluy0sCVMVxVhu8zllE,10559
158
+ dstack/_internal/core/backends/runpod/compute.py,sha256=ryPUmZ50-iiYHxSvSexs1p3eJFzltrJqNksF4VYMrZo,11056
159
159
  dstack/_internal/core/backends/runpod/configurator.py,sha256=ZcDKN5ulmFMjSy9TlnV-2qxqPwTZUpIwfVwtShZL5fU,2242
160
160
  dstack/_internal/core/backends/runpod/models.py,sha256=W3nO4sjvvWtfKYDZDVJ8oBSsgeGdSR-Z_PD7OpfDBgY,1466
161
161
  dstack/_internal/core/backends/template/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
162
162
  dstack/_internal/core/backends/template/backend.py.jinja,sha256=jqSUr05lKHSuGq2MCk4tHob1TfGiSSsHox1GuEz30zU,704
163
- dstack/_internal/core/backends/template/compute.py.jinja,sha256=jLFZ_EMEjlgu6y3VJtvXs4qNXZmytZhl5JzJVM04lIc,3319
163
+ dstack/_internal/core/backends/template/compute.py.jinja,sha256=kJDJztC4VA-2tp9HdMwNn-8OpwChmhdtNmIZSmzrWwU,3368
164
164
  dstack/_internal/core/backends/template/configurator.py.jinja,sha256=OeEjI36hpH62FdSm7tGDMuOwuRpnE6u5VmyeGmNJdgk,2665
165
165
  dstack/_internal/core/backends/template/models.py.jinja,sha256=dhJd8uWoMvAHAsPpDMPNtdMKzJTIoXDtsGC0NCQ3Y08,2061
166
- dstack/_internal/core/backends/tensordock/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
- dstack/_internal/core/backends/tensordock/api_client.py,sha256=NUEKgu6JY6kqQXRqsghT-aBf7sNstHQo7J1WmqL-Qfs,3872
168
- dstack/_internal/core/backends/tensordock/backend.py,sha256=KT5bRuD3KttEqiNNqQpW5f6nX7Qez-L74TBmYKy3puI,606
169
- dstack/_internal/core/backends/tensordock/compute.py,sha256=GnW8eAeJXYU11_ukX9lBznbYaOQssBH6RltMOX6UYSU,4528
170
- dstack/_internal/core/backends/tensordock/configurator.py,sha256=SlYFcdzgQ09-BJH7FdZFaJ1HWFmMbZzciTkmiQMcaks,2649
171
- dstack/_internal/core/backends/tensordock/models.py,sha256=oxbSWRCsD0_j4-2lQYo4LpmhKL8Kgv2nmq_dfMaSCiU,1182
166
+ dstack/_internal/core/backends/tensordock/compute.py,sha256=yLV9lAYARlrKninbVJ7eoqbfSd8g6lvraQ-j9WiHZRQ,4497
167
+ dstack/_internal/core/backends/tensordock/models.py,sha256=Dov-XsJcgOWML8c_jPpzo47y3wGQkxk3o-hTaZfYrPE,1250
172
168
  dstack/_internal/core/backends/vastai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
169
  dstack/_internal/core/backends/vastai/api_client.py,sha256=b-qgx352lnxhBXichJtURFGxR7Jd9JYx4WXaxYV-HH0,4940
174
170
  dstack/_internal/core/backends/vastai/backend.py,sha256=NawGHNYVmgNwL8HruEA84rimnpeSyXccdJXr6Dr95UY,566
175
- dstack/_internal/core/backends/vastai/compute.py,sha256=ZjeJF196lXTjO5gQ8fnQtvNEVZdYpcVODmZOOV3g96Q,4911
171
+ dstack/_internal/core/backends/vastai/compute.py,sha256=X4nkJUCGB55W2FvqKpQcIPV73s22xviDSBREd4LmPCI,4991
176
172
  dstack/_internal/core/backends/vastai/configurator.py,sha256=rFeUdlGiBw8PsB_zgBLm-p2pzHdyN8cSATHFLzeKhrg,2408
177
173
  dstack/_internal/core/backends/vastai/models.py,sha256=2xpFE-ouYUBienxZXam2Mo4dy9enSv-FuVJXeYnjVLk,1036
178
174
  dstack/_internal/core/backends/vultr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
175
  dstack/_internal/core/backends/vultr/api_client.py,sha256=isHbdBQr2hFRYTcnTsGxSlWIKYrpC1X_gjSZjGxUupE,4363
180
176
  dstack/_internal/core/backends/vultr/backend.py,sha256=WkPmbUxm3Ysv3_wJjuktQqvvN_L_TX5g37CflGQWQFo,556
181
- dstack/_internal/core/backends/vultr/compute.py,sha256=9qfya_TKMvvWyWm2OElQjMIFwANaFcEkyc_gHj5XNVA,5845
177
+ dstack/_internal/core/backends/vultr/compute.py,sha256=7YUgbHOBInSVeYOVW5GtCkv5z2bbq1pk9TmY7D4bXYI,5850
182
178
  dstack/_internal/core/backends/vultr/configurator.py,sha256=JMJ9itCGIRb4MJ8fjS6syd7xrO7wUra2OVoqLTrGRo4,2373
183
179
  dstack/_internal/core/backends/vultr/models.py,sha256=TkqK_lW6w5k_7wsoFiKDb6NXuTrHL6ypVm59FoyaSFY,928
184
180
  dstack/_internal/core/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -202,7 +198,7 @@ dstack/_internal/core/models/logs.py,sha256=VOsgEsvUIRNNHivD6OZnPZNC52ioqafv7ccd
202
198
  dstack/_internal/core/models/metrics.py,sha256=Xb8hCXUL-ncQ3PMsErIUAJTe9gwh5jyrQ4UQoZbibsc,269
203
199
  dstack/_internal/core/models/placement.py,sha256=WJVq5ENJykyRarQzL2EeYQag_9_jV7VSAtR_xoFvPVM,720
204
200
  dstack/_internal/core/models/profiles.py,sha256=_ZxSk-rMvzpiUYUZD0EQbrJDy3FVmRUmIUtEgzlVeHo,14217
205
- dstack/_internal/core/models/projects.py,sha256=HmmlrvUSSEjfGfX7X5tmGJ-CbKeyGK6shHD5OghDNks,671
201
+ dstack/_internal/core/models/projects.py,sha256=hOZoL85q-873vT_Aw7FhzpS6DGVt0Y3yT8kpElrLFto,833
206
202
  dstack/_internal/core/models/resources.py,sha256=-dLupzud5BSqxNABBjLVYTCKekbr9_mhaNGD1ZWBjgM,14544
207
203
  dstack/_internal/core/models/runs.py,sha256=ehGSyCSx5OAaEqCEd2YvCRiP_uewUeDOHbJGSocu6w0,22609
208
204
  dstack/_internal/core/models/secrets.py,sha256=5T4B4eCeZmVQ8t22qYYlm4NUyX7VloiXCJuyDfE92QA,413
@@ -223,7 +219,7 @@ dstack/_internal/core/services/api_client.py,sha256=HTQ0fcZciUh-nmfV09hUt__Z4N2z
223
219
  dstack/_internal/core/services/diff.py,sha256=xtJzlSLIw9pnECpMQTy-a2zcfnSd4Q9qi_Y0W00D65A,2073
224
220
  dstack/_internal/core/services/logs.py,sha256=7_eJdH4MD-3rVb4A6rIJfjj_p4jzUOCmjRVlPD-UDsg,2166
225
221
  dstack/_internal/core/services/profiles.py,sha256=ZFY6VILW6urm6l3u6xpORJ2z48eGJ2jcmRgjVrxr2tw,1612
226
- dstack/_internal/core/services/repos.py,sha256=Cq-t9RvdmEKjQIgQA6giQirqopdrPT-WzUoCoKLt0ws,6251
222
+ dstack/_internal/core/services/repos.py,sha256=o7LAveeSWuta5aaulY6gPDisO-xVi45QNeh-Zww3apw,6359
227
223
  dstack/_internal/core/services/configs/__init__.py,sha256=jMAHvZphEgZJldEiQhkaNSW8lVrVAxuYbu9RtLysUGU,5645
228
224
  dstack/_internal/core/services/ssh/__init__.py,sha256=UhgC3Lv3CPSGqSPEQZIKOfLKUlCFnaB0uqPQhfKCFt0,878
229
225
  dstack/_internal/core/services/ssh/attach.py,sha256=6YZ_HaimKrjdLzcDLksGi0_9rlVyLeBgPmmWHC7dYxo,9096
@@ -296,14 +292,14 @@ dstack/_internal/server/background/tasks/common.py,sha256=N7xSXbf2MoBWgbJ1e3AEzY
296
292
  dstack/_internal/server/background/tasks/process_fleets.py,sha256=b0wECmweaetFv9vSjE1BiOJmlIPlk7O-fmntpdSiWgg,8590
297
293
  dstack/_internal/server/background/tasks/process_gateways.py,sha256=FH9RY3Tfmtw_UctCdYZDIRb2rgtmHdxTg6Oc4IBiDBA,8356
298
294
  dstack/_internal/server/background/tasks/process_idle_volumes.py,sha256=mqnl8wvWaKTYvJMbgFJbOP-bZMRQG2vrhUnaNcyBldE,5223
299
- dstack/_internal/server/background/tasks/process_instances.py,sha256=ddBR_r7VwOuDb4zlp9QSQWgoK4XvOi4IGh0dBZkxtUY,44004
295
+ dstack/_internal/server/background/tasks/process_instances.py,sha256=5xYWqcxNnsZ4ZgGRE1m894N6BgsSMNRL49sg6Wc_zGI,44067
300
296
  dstack/_internal/server/background/tasks/process_metrics.py,sha256=yKXe9J7m3oleK0C-oGJaYNkcPT8kqkz0nw-A7xqYbjE,6390
301
297
  dstack/_internal/server/background/tasks/process_placement_groups.py,sha256=lgYIzjHG9EITK31yG6uQjlIcSwW5jsP9ZOBBZqW_eNs,4263
302
298
  dstack/_internal/server/background/tasks/process_probes.py,sha256=dmug-_rmYiVLLF-imto-Ju1gPtENvHvCjHyilqgYuJw,6457
303
299
  dstack/_internal/server/background/tasks/process_prometheus_metrics.py,sha256=_UZm37FVV4rhdd0So7HtcKbIgrSdAr5Vx-Uen_xizec,5459
304
300
  dstack/_internal/server/background/tasks/process_running_jobs.py,sha256=ulDrWgwnhosbK0Mtt0yNS4E38QSKXSh6ermNt-3jUTs,44965
305
301
  dstack/_internal/server/background/tasks/process_runs.py,sha256=Cx7Z1B7pZVlvCl-OsIaAiIMFG_aZDdn3nlZeha6k2x4,25041
306
- dstack/_internal/server/background/tasks/process_submitted_jobs.py,sha256=jSyJBfuNhfBGWrKlTSO19nOpYq018MSKemUhn2q73dY,39001
302
+ dstack/_internal/server/background/tasks/process_submitted_jobs.py,sha256=vcu1JRJ0-p_VB7HZfYkVf9d_yclazrcW1U7zHQltjcA,40935
307
303
  dstack/_internal/server/background/tasks/process_terminating_jobs.py,sha256=S7ZSDVMX-N0XMaMgwFa1QG_RAi48BP432s9AqHw4PMM,4066
308
304
  dstack/_internal/server/background/tasks/process_volumes.py,sha256=_fMmkwLYsyX-kpW9pDrZVJvFTZEOPp0gpjyKBMW-zw0,5204
309
305
  dstack/_internal/server/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -442,15 +438,15 @@ dstack/_internal/server/services/permissions.py,sha256=l7Ngdelmn65vjw13NcOdaC6lB
442
438
  dstack/_internal/server/services/placement.py,sha256=U-7z4kJ6ZyrCXzkDychWoOhniz19ooFwiNI2InoTLls,2420
443
439
  dstack/_internal/server/services/plugins.py,sha256=aOlqfTUiU2aZ5G4DUW2rY4959PqS2r9imo5pfU3NUww,3851
444
440
  dstack/_internal/server/services/probes.py,sha256=pdgtkOvBuvneUo4Gysg8_afibTf1wuWnrrcuAnOGBE0,357
445
- dstack/_internal/server/services/projects.py,sha256=P9dKbhFvWZoXr8bOSIsxE9NVSdaoIVXqcNC-0I_8N5w,25144
441
+ dstack/_internal/server/services/projects.py,sha256=PZdMCi1PVu68c_rYfwJRk7hgM6ddkekxlG_IU_957QI,25276
446
442
  dstack/_internal/server/services/repos.py,sha256=ECl1cbpdzhTv1P3Y9IQmoWyHHF8iXFyL4s2drfwRDvg,9352
447
443
  dstack/_internal/server/services/resources.py,sha256=VRFOih_cMJdc0c2m9nSGsX8vWAJQV3M6N87aqS_JXfw,699
448
- dstack/_internal/server/services/runs.py,sha256=-RoBSmcau8n_8rvEH-yuORL7R9OaoO92VkLFFZOwcAk,47686
444
+ dstack/_internal/server/services/runs.py,sha256=cZPyGTR7_7l88XAbqXep-P7xcGOCHZhLrIj9ua4z1Bs,47818
449
445
  dstack/_internal/server/services/secrets.py,sha256=M7RS4X1-DIL0f7m6BBb3PhsrAbxwKUD3_pZEWRfR3sM,5567
450
446
  dstack/_internal/server/services/ssh.py,sha256=DT7U_8ON8o30-53WlJwjd5kVrKyt4KPgKeN63NW3P8U,2883
451
447
  dstack/_internal/server/services/users.py,sha256=L-COF4RjtwYSfnkGQefrSiEU0haTv0o1P2OuUdvMK8E,7378
452
448
  dstack/_internal/server/services/volumes.py,sha256=DBGIUsysAO7sQ6vb4mjhzO9XLdyQvtNujucxhGnkSsU,16682
453
- dstack/_internal/server/services/backends/__init__.py,sha256=dyUBoM39lijFTqrKwBn7Vms9NtTgr4Pz8rpLuXqzft8,13427
449
+ dstack/_internal/server/services/backends/__init__.py,sha256=xWHI-A24u9RE7H5I4A3e_JQyuQtp5pdKbU--ZyizrnU,13420
454
450
  dstack/_internal/server/services/backends/handlers.py,sha256=Rz4QjqmmDGDzn6QbwxlJvV5oC6pE4PZN3FX0DVqnBHc,3539
455
451
  dstack/_internal/server/services/encryption/__init__.py,sha256=3kCw_cxC3-Un1OIofdW5Gqsm0ZCXXTlGz09cULBx_uc,3155
456
452
  dstack/_internal/server/services/encryption/keys/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -524,11 +520,11 @@ dstack/_internal/server/statics/e467d7d60aae81ab198b.svg,sha256=_XHc9mfQZgGkcy4h
524
520
  dstack/_internal/server/statics/eb9b344b73818fe2b71a.png,sha256=2H14eOCQRyZhFGJ1Kn2LH1j70kTF1Qop4vH-tiKqyPI,85
525
521
  dstack/_internal/server/statics/f517dd626eb964120de0.png,sha256=4QQuNa8SqmcZ67HK6739OHCyjnAJseU1bkcn454KRQs,159
526
522
  dstack/_internal/server/statics/f958aecddee5d8e3222c.png,sha256=8CoZkVNgRfOAe62X1dU-AZDvwh_nESKaQblEmaX2Xrs,87
527
- dstack/_internal/server/statics/index.html,sha256=2niufKXG9irloxCS8quNIuyNl7Iu7gDexROEBo9oKWY,11155
523
+ dstack/_internal/server/statics/index.html,sha256=zv7wlS5mh2aAps7sEhXTlCwp0UOsiqhsMiIEOhLxt2Q,11155
528
524
  dstack/_internal/server/statics/logo-notext.svg,sha256=Oth7XfcAeDJcaPdzNtDaqYuLU7mCB0JqNtxeyWb6Z3c,11231
529
- dstack/_internal/server/statics/main-5e0d56245c4bd241ec27.css,sha256=DO6ju9AdKMsJOdO7an3B-UtNs8OKSf0mmAKtqfVL3EM,1369554
530
- dstack/_internal/server/statics/main-a2a16772fbf11a14d191.js,sha256=TPgf5tj-jnrdDf1kq_868IG-4GBSfPmaOD4UkKs_8_U,6443886
531
- dstack/_internal/server/statics/main-a2a16772fbf11a14d191.js.map,sha256=_3RjtLU7gqrqgC4Qku77eJ6PFfHczv5dpYNcQ-a1krg,8561506
525
+ dstack/_internal/server/statics/main-56191fbfe77f49b251de.css,sha256=1exsufAv8oyw_4fbdcDJ7CtyRdWFyf-Boxua8HiK81c,1456319
526
+ dstack/_internal/server/statics/main-c51afa7f243e24d3e446.js,sha256=StRTIpOyv0Wt1fPh6XtuUiRQx5dRsDsXDNrNCbp1PPg,6928035
527
+ dstack/_internal/server/statics/main-c51afa7f243e24d3e446.js.map,sha256=gKw2zgeA1icax9QkCOX5jfYFPGe60omyZDRZCrdPtgo,9190078
532
528
  dstack/_internal/server/statics/manifest.json,sha256=430w2BoWVmYYVr14lDvUxx-ROPt3VjigzeMqfLeiSCM,340
533
529
  dstack/_internal/server/statics/robots.txt,sha256=kNJLw79pisHhc3OVAimMzKcq3x9WT6sF9IS4xI0crdI,67
534
530
  dstack/_internal/server/statics/assets/android-chrome-144x144.png,sha256=tB3V-95O-VVEoawN5V1XFoMQRSK0I6gthraV8bATGaw,23414
@@ -666,8 +662,8 @@ dstack/plugins/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
666
662
  dstack/plugins/builtin/rest_plugin/__init__.py,sha256=lgTsq8Z6Km2F2UhPRChVB4vDM5ZpWtdk1iB1aa20ypA,440
667
663
  dstack/plugins/builtin/rest_plugin/_models.py,sha256=9hgVuU6OGSxidar88XhQnNo9izYWeQvVH45ciErv-Es,1910
668
664
  dstack/plugins/builtin/rest_plugin/_plugin.py,sha256=h3r3Yc3h22i93fifPTgTm9Oojd1sN1O4DP7ZTV-kWpM,5386
669
- dstack-0.19.28.dist-info/METADATA,sha256=4lRgfzF2eiWc4vPTkrgGMVDEfso6GWn4jIL9asF-e4E,20586
670
- dstack-0.19.28.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
671
- dstack-0.19.28.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
672
- dstack-0.19.28.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
673
- dstack-0.19.28.dist-info/RECORD,,
665
+ dstack-0.19.30rc1.dist-info/METADATA,sha256=83NJfLypftLptdYx3zHgV3-qQzXM-qQuWoS9gsIggX8,20589
666
+ dstack-0.19.30rc1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
667
+ dstack-0.19.30rc1.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
668
+ dstack-0.19.30rc1.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
669
+ dstack-0.19.30rc1.dist-info/RECORD,,
File without changes
@@ -1,104 +0,0 @@
1
- import uuid
2
-
3
- import requests
4
- import yaml
5
-
6
- from dstack._internal.core.errors import BackendError
7
- from dstack._internal.core.models.instances import InstanceType
8
- from dstack._internal.utils.logging import get_logger
9
-
10
- logger = get_logger(__name__)
11
- REQUEST_TIMEOUT = 20
12
-
13
-
14
- class TensorDockAPIClient:
15
- def __init__(self, api_key: str, api_token: str):
16
- self.api_url = "https://marketplace.tensordock.com/api/v0".rstrip("/")
17
- self.api_key = api_key
18
- self.api_token = api_token
19
- self.s = requests.Session()
20
-
21
- def auth_test(self) -> bool:
22
- resp = self.s.post(
23
- self._url("/auth/test"),
24
- data={"api_key": self.api_key, "api_token": self.api_token},
25
- timeout=REQUEST_TIMEOUT,
26
- )
27
- resp.raise_for_status()
28
- return resp.json()["success"]
29
-
30
- def get_hostnode(self, hostnode_id: str) -> dict:
31
- logger.debug("Fetching hostnode %s", hostnode_id)
32
- resp = self.s.get(
33
- self._url(f"/client/deploy/hostnodes/{hostnode_id}"), timeout=REQUEST_TIMEOUT
34
- )
35
- resp.raise_for_status()
36
- data = resp.json()
37
- if not data["success"]:
38
- raise requests.HTTPError(data)
39
- return data["hostnode"]
40
-
41
- def deploy_single(self, instance_name: str, instance: InstanceType, cloudinit: dict) -> dict:
42
- hostnode = self.get_hostnode(instance.name)
43
- gpu = instance.resources.gpus[0]
44
- for gpu_model in hostnode["specs"]["gpu"].keys():
45
- if gpu_model.endswith(f"-{gpu.memory_mib // 1024}gb"):
46
- if gpu.name.lower() in gpu_model.lower():
47
- break
48
- else:
49
- raise ValueError(f"Can't find GPU on the hostnode: {gpu.name}")
50
- form = {
51
- "api_key": self.api_key,
52
- "api_token": self.api_token,
53
- "password": uuid.uuid4().hex, # we disable the password auth, but it's required
54
- "name": instance_name,
55
- "gpu_count": len(instance.resources.gpus),
56
- "gpu_model": gpu_model,
57
- "vcpus": instance.resources.cpus,
58
- "ram": instance.resources.memory_mib // 1024,
59
- "external_ports": "{%s}"
60
- % max(hostnode["networking"]["ports"]), # it's safer to use a higher port
61
- "internal_ports": "{22}",
62
- "hostnode": instance.name,
63
- "storage": round(instance.resources.disk.size_mib / 1024),
64
- "operating_system": "Ubuntu 22.04 LTS",
65
- "cloudinit_script": yaml.dump(cloudinit).replace("\n", "\\n"),
66
- }
67
- logger.debug(
68
- "Deploying instance hostnode=%s, cpus=%s, memory=%s, gpu=%sx %s",
69
- form["hostnode"],
70
- form["vcpus"],
71
- form["ram"],
72
- form["gpu_count"],
73
- form["gpu_model"],
74
- )
75
- resp = self.s.post(self._url("/client/deploy/single"), data=form, timeout=REQUEST_TIMEOUT)
76
- resp.raise_for_status()
77
- data = resp.json()
78
- if not data["success"]:
79
- raise requests.HTTPError(data)
80
- data["password"] = form["password"]
81
- return data
82
-
83
- def delete_single_if_exists(self, instance_id: str):
84
- logger.debug("Deleting instance %s", instance_id)
85
- resp = self.s.post(
86
- self._url("/client/delete/single"),
87
- data={
88
- "api_key": self.api_key,
89
- "api_token": self.api_token,
90
- "server": instance_id,
91
- },
92
- timeout=REQUEST_TIMEOUT,
93
- )
94
- try:
95
- data = resp.json()
96
- if "already terminated" in data.get("error", ""):
97
- return
98
- if not data.get("success"):
99
- raise BackendError(data)
100
- except ValueError: # json parsing error
101
- raise BackendError(resp.text)
102
-
103
- def _url(self, path):
104
- return f"{self.api_url}/{path.lstrip('/')}"
@@ -1,16 +0,0 @@
1
- from dstack._internal.core.backends.base.backend import Backend
2
- from dstack._internal.core.backends.tensordock.compute import TensorDockCompute
3
- from dstack._internal.core.backends.tensordock.models import TensorDockConfig
4
- from dstack._internal.core.models.backends.base import BackendType
5
-
6
-
7
- class TensorDockBackend(Backend):
8
- TYPE = BackendType.TENSORDOCK
9
- COMPUTE_CLASS = TensorDockCompute
10
-
11
- def __init__(self, config: TensorDockConfig):
12
- self.config = config
13
- self._compute = TensorDockCompute(self.config)
14
-
15
- def compute(self) -> TensorDockCompute:
16
- return self._compute
@@ -1,74 +0,0 @@
1
- import json
2
-
3
- from dstack._internal.core.backends.base.configurator import (
4
- BackendRecord,
5
- Configurator,
6
- raise_invalid_credentials_error,
7
- )
8
- from dstack._internal.core.backends.tensordock import api_client
9
- from dstack._internal.core.backends.tensordock.backend import TensorDockBackend
10
- from dstack._internal.core.backends.tensordock.models import (
11
- TensorDockBackendConfig,
12
- TensorDockBackendConfigWithCreds,
13
- TensorDockConfig,
14
- TensorDockCreds,
15
- TensorDockStoredConfig,
16
- )
17
- from dstack._internal.core.models.backends.base import (
18
- BackendType,
19
- )
20
-
21
- # TensorDock regions are dynamic, currently we don't offer any filtering
22
- REGIONS = []
23
-
24
-
25
- class TensorDockConfigurator(
26
- Configurator[
27
- TensorDockBackendConfig,
28
- TensorDockBackendConfigWithCreds,
29
- ]
30
- ):
31
- TYPE = BackendType.TENSORDOCK
32
- BACKEND_CLASS = TensorDockBackend
33
-
34
- def validate_config(
35
- self, config: TensorDockBackendConfigWithCreds, default_creds_enabled: bool
36
- ):
37
- self._validate_tensordock_creds(config.creds.api_key, config.creds.api_token)
38
-
39
- def create_backend(
40
- self, project_name: str, config: TensorDockBackendConfigWithCreds
41
- ) -> BackendRecord:
42
- if config.regions is None:
43
- config.regions = REGIONS
44
- return BackendRecord(
45
- config=TensorDockStoredConfig(
46
- **TensorDockBackendConfig.__response__.parse_obj(config).dict()
47
- ).json(),
48
- auth=TensorDockCreds.parse_obj(config.creds).json(),
49
- )
50
-
51
- def get_backend_config_with_creds(
52
- self, record: BackendRecord
53
- ) -> TensorDockBackendConfigWithCreds:
54
- config = self._get_config(record)
55
- return TensorDockBackendConfigWithCreds.__response__.parse_obj(config)
56
-
57
- def get_backend_config_without_creds(self, record: BackendRecord) -> TensorDockBackendConfig:
58
- config = self._get_config(record)
59
- return TensorDockBackendConfig.__response__.parse_obj(config)
60
-
61
- def get_backend(self, record: BackendRecord) -> TensorDockBackend:
62
- config = self._get_config(record)
63
- return TensorDockBackend(config=config)
64
-
65
- def _get_config(self, record: BackendRecord) -> TensorDockConfig:
66
- return TensorDockConfig.__response__(
67
- **json.loads(record.config),
68
- creds=TensorDockCreds.parse_raw(record.auth),
69
- )
70
-
71
- def _validate_tensordock_creds(self, api_key: str, api_token: str):
72
- client = api_client.TensorDockAPIClient(api_key=api_key, api_token=api_token)
73
- if not client.auth_test():
74
- raise_invalid_credentials_error(fields=[["creds", "api_key"], ["creds", "api_token"]])