dstack 0.19.28__py3-none-any.whl → 0.19.29__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.
- dstack/_internal/core/backends/aws/compute.py +51 -36
- dstack/_internal/core/backends/azure/compute.py +10 -7
- dstack/_internal/core/backends/base/compute.py +96 -14
- dstack/_internal/core/backends/base/offers.py +34 -4
- dstack/_internal/core/backends/cloudrift/compute.py +5 -7
- dstack/_internal/core/backends/cudo/compute.py +4 -2
- dstack/_internal/core/backends/datacrunch/compute.py +13 -11
- dstack/_internal/core/backends/digitalocean_base/compute.py +4 -5
- dstack/_internal/core/backends/gcp/compute.py +12 -7
- dstack/_internal/core/backends/hotaisle/compute.py +4 -7
- dstack/_internal/core/backends/kubernetes/compute.py +6 -4
- dstack/_internal/core/backends/lambdalabs/compute.py +4 -5
- dstack/_internal/core/backends/local/compute.py +1 -3
- dstack/_internal/core/backends/nebius/compute.py +10 -7
- dstack/_internal/core/backends/oci/compute.py +10 -7
- dstack/_internal/core/backends/runpod/compute.py +15 -6
- dstack/_internal/core/backends/template/compute.py.jinja +3 -1
- dstack/_internal/core/backends/tensordock/compute.py +1 -3
- dstack/_internal/core/backends/tensordock/models.py +2 -0
- dstack/_internal/core/backends/vastai/compute.py +7 -3
- dstack/_internal/core/backends/vultr/compute.py +5 -5
- dstack/_internal/core/models/projects.py +8 -0
- dstack/_internal/server/background/tasks/process_instances.py +3 -2
- dstack/_internal/server/background/tasks/process_submitted_jobs.py +65 -22
- dstack/_internal/server/services/backends/__init__.py +1 -1
- dstack/_internal/server/services/projects.py +11 -3
- dstack/_internal/server/services/runs.py +2 -0
- dstack/_internal/server/statics/index.html +1 -1
- dstack/_internal/server/statics/main-56191fbfe77f49b251de.css +3 -0
- dstack/_internal/server/statics/{main-a2a16772fbf11a14d191.js → main-c51afa7f243e24d3e446.js} +61081 -49037
- dstack/_internal/server/statics/{main-a2a16772fbf11a14d191.js.map → main-c51afa7f243e24d3e446.js.map} +1 -1
- dstack/version.py +1 -1
- {dstack-0.19.28.dist-info → dstack-0.19.29.dist-info}/METADATA +1 -1
- {dstack-0.19.28.dist-info → dstack-0.19.29.dist-info}/RECORD +37 -41
- dstack/_internal/core/backends/tensordock/__init__.py +0 -0
- dstack/_internal/core/backends/tensordock/api_client.py +0 -104
- dstack/_internal/core/backends/tensordock/backend.py +0 -16
- dstack/_internal/core/backends/tensordock/configurator.py +0 -74
- dstack/_internal/server/statics/main-5e0d56245c4bd241ec27.css +0 -3
- {dstack-0.19.28.dist-info → dstack-0.19.29.dist-info}/WHEEL +0 -0
- {dstack-0.19.28.dist-info → dstack-0.19.29.dist-info}/entry_points.txt +0 -0
- {dstack-0.19.28.dist-info → dstack-0.19.29.dist-info}/licenses/LICENSE.md +0 -0
dstack/version.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dstack
|
|
3
|
-
Version: 0.19.
|
|
3
|
+
Version: 0.19.29
|
|
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=
|
|
2
|
+
dstack/version.py,sha256=YFaOhGPwo6LX5fJekfVb7R4HaBPGERtQmy7ytf9Rmq0,102
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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/
|
|
167
|
-
dstack/_internal/core/backends/tensordock/
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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-
|
|
530
|
-
dstack/_internal/server/statics/main-
|
|
531
|
-
dstack/_internal/server/statics/main-
|
|
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.
|
|
670
|
-
dstack-0.19.
|
|
671
|
-
dstack-0.19.
|
|
672
|
-
dstack-0.19.
|
|
673
|
-
dstack-0.19.
|
|
665
|
+
dstack-0.19.29.dist-info/METADATA,sha256=HcciEQov78Oe3HcLD7vquMFJHimJXPOx_AANTEW33gM,20586
|
|
666
|
+
dstack-0.19.29.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
667
|
+
dstack-0.19.29.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
|
|
668
|
+
dstack-0.19.29.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
|
|
669
|
+
dstack-0.19.29.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"]])
|