trainml 0.5.0__py3-none-any.whl → 0.5.2__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 (36) hide show
  1. tests/integration/test_jobs_integration.py +13 -18
  2. tests/unit/cli/cloudbender/test_cli_device_unit.py +38 -0
  3. tests/unit/cloudbender/test_datastores_unit.py +20 -0
  4. tests/unit/cloudbender/test_device_configs_unit.py +21 -0
  5. tests/unit/cloudbender/test_devices_unit.py +270 -0
  6. tests/unit/cloudbender/test_nodes_unit.py +43 -0
  7. tests/unit/cloudbender/test_providers_unit.py +16 -0
  8. tests/unit/cloudbender/test_regions_unit.py +18 -0
  9. tests/unit/cloudbender/test_reservations_unit.py +20 -0
  10. tests/unit/conftest.py +54 -3
  11. tests/unit/test_auth.py +1 -1
  12. trainml/__init__.py +1 -1
  13. trainml/auth.py +3 -7
  14. trainml/cli/cloudbender/__init__.py +1 -0
  15. trainml/cli/cloudbender/device.py +157 -0
  16. trainml/cli/dataset.py +1 -3
  17. trainml/cli/job/create.py +3 -3
  18. trainml/cli/model.py +2 -0
  19. trainml/cloudbender/cloudbender.py +2 -0
  20. trainml/cloudbender/datastores.py +8 -0
  21. trainml/cloudbender/device_configs.py +8 -0
  22. trainml/cloudbender/devices.py +190 -0
  23. trainml/cloudbender/nodes.py +22 -0
  24. trainml/cloudbender/providers.py +8 -0
  25. trainml/cloudbender/regions.py +8 -0
  26. trainml/cloudbender/reservations.py +8 -0
  27. trainml/datasets.py +25 -14
  28. trainml/gpu_types.py +5 -0
  29. trainml/models.py +22 -3
  30. trainml/trainml.py +2 -1
  31. {trainml-0.5.0.dist-info → trainml-0.5.2.dist-info}/METADATA +1 -1
  32. {trainml-0.5.0.dist-info → trainml-0.5.2.dist-info}/RECORD +36 -32
  33. {trainml-0.5.0.dist-info → trainml-0.5.2.dist-info}/LICENSE +0 -0
  34. {trainml-0.5.0.dist-info → trainml-0.5.2.dist-info}/WHEEL +0 -0
  35. {trainml-0.5.0.dist-info → trainml-0.5.2.dist-info}/entry_points.txt +0 -0
  36. {trainml-0.5.0.dist-info → trainml-0.5.2.dist-info}/top_level.txt +0 -0
trainml/datasets.py CHANGED
@@ -37,8 +37,7 @@ class Datasets(object):
37
37
  source_type=source_type,
38
38
  source_uri=source_uri,
39
39
  source_options=kwargs.get("source_options"),
40
- project_uuid=kwargs.get("project_uuid")
41
- or self.trainml.active_project,
40
+ project_uuid=kwargs.get("project_uuid") or self.trainml.active_project,
42
41
  )
43
42
  payload = {k: v for k, v in data.items() if v is not None}
44
43
  logging.info(f"Creating Dataset {name}")
@@ -119,11 +118,13 @@ class Dataset:
119
118
  entity_type="dataset",
120
119
  project_uuid=self._dataset.get("project_uuid"),
121
120
  cidr=self._dataset.get("vpn").get("cidr"),
122
- ssh_port=self._dataset.get("vpn")
123
- .get("client")
124
- .get("ssh_port"),
125
- input_path=self._dataset.get("source_uri"),
126
- output_path=None,
121
+ ssh_port=self._dataset.get("vpn").get("client").get("ssh_port"),
122
+ input_path=self._dataset.get("source_uri")
123
+ if self.status in ["new", "downloading"]
124
+ else None,
125
+ output_path=self._dataset.get("output_uri")
126
+ if self.status == "exporting"
127
+ else None,
127
128
  )
128
129
  else:
129
130
  details = dict()
@@ -133,7 +134,7 @@ class Dataset:
133
134
  if self.status in ["ready", "failed"]:
134
135
  raise SpecificationError(
135
136
  "status",
136
- f"You can only connect to new or downloading datasets.",
137
+ f"You can only connect to downloading or exporting datasets.",
137
138
  )
138
139
  if self.status == "new":
139
140
  await self.wait_for("downloading")
@@ -167,15 +168,27 @@ class Dataset:
167
168
  self.__init__(self.trainml, **resp)
168
169
  return self
169
170
 
171
+ async def export(self, output_type, output_uri, output_options=dict()):
172
+ resp = await self.trainml._query(
173
+ f"/dataset/{self._id}/export",
174
+ "POST",
175
+ dict(project_uuid=self._project_uuid),
176
+ dict(
177
+ output_type=output_type,
178
+ output_uri=output_uri,
179
+ output_options=output_options,
180
+ ),
181
+ )
182
+ self.__init__(self.trainml, **resp)
183
+ return self
184
+
170
185
  def _get_msg_handler(self, msg_handler):
171
186
  def handler(data):
172
187
  if data.get("type") == "subscription":
173
188
  if msg_handler:
174
189
  msg_handler(data)
175
190
  else:
176
- timestamp = datetime.fromtimestamp(
177
- int(data.get("time")) / 1000
178
- )
191
+ timestamp = datetime.fromtimestamp(int(data.get("time")) / 1000)
179
192
  print(
180
193
  f"{timestamp.strftime('%m/%d/%Y, %H:%M:%S')}: {data.get('msg').rstrip()}"
181
194
  )
@@ -212,9 +225,7 @@ class Dataset:
212
225
  return
213
226
  POLL_INTERVAL_MIN = 5
214
227
  POLL_INTERVAL_MAX = 60
215
- POLL_INTERVAL = max(
216
- min(timeout / 60, POLL_INTERVAL_MAX), POLL_INTERVAL_MIN
217
- )
228
+ POLL_INTERVAL = max(min(timeout / 60, POLL_INTERVAL_MAX), POLL_INTERVAL_MIN)
218
229
  retry_count = math.ceil(timeout / POLL_INTERVAL)
219
230
  count = 0
220
231
  while count < retry_count:
trainml/gpu_types.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import json
2
+ from trainml.exceptions import TrainMLException
2
3
 
3
4
 
4
5
  class GpuTypes(object):
@@ -6,6 +7,10 @@ class GpuTypes(object):
6
7
  self.trainml = trainml
7
8
 
8
9
  async def list(self):
10
+ if not self.trainml.project:
11
+ raise TrainMLException(
12
+ "Active project not configured. Run 'trainml configure' to select an active project."
13
+ )
9
14
  resp = await self.trainml._query(
10
15
  f"/project/{self.trainml.project}/gputypes", "GET"
11
16
  )
trainml/models.py CHANGED
@@ -115,18 +115,23 @@ class Model:
115
115
  project_uuid=self._model.get("project_uuid"),
116
116
  cidr=self._model.get("vpn").get("cidr"),
117
117
  ssh_port=self._model.get("vpn").get("client").get("ssh_port"),
118
- input_path=self._model.get("source_uri"),
119
- output_path=None,
118
+ input_path=self._model.get("source_uri")
119
+ if self.status in ["new", "downloading"]
120
+ else None,
121
+ output_path=self._model.get("output_uri")
122
+ if self.status == "exporting"
123
+ else None,
120
124
  )
121
125
  else:
122
126
  details = dict()
127
+ logging.debug(f"Connection Details: {details}")
123
128
  return details
124
129
 
125
130
  async def connect(self):
126
131
  if self.status in ["ready", "failed"]:
127
132
  raise SpecificationError(
128
133
  "status",
129
- f"You can only connect to new or downloading models.",
134
+ f"You can only connect to downloading or exporting models.",
130
135
  )
131
136
  if self.status == "new":
132
137
  await self.wait_for("downloading")
@@ -160,6 +165,20 @@ class Model:
160
165
  self.__init__(self.trainml, **resp)
161
166
  return self
162
167
 
168
+ async def export(self, output_type, output_uri, output_options=dict()):
169
+ resp = await self.trainml._query(
170
+ f"/model/{self._id}/export",
171
+ "POST",
172
+ dict(project_uuid=self._project_uuid),
173
+ dict(
174
+ output_type=output_type,
175
+ output_uri=output_uri,
176
+ output_options=output_options,
177
+ ),
178
+ )
179
+ self.__init__(self.trainml, **resp)
180
+ return self
181
+
163
182
  def _get_msg_handler(self, msg_handler):
164
183
  def handler(data):
165
184
  if data.get("type") == "subscription":
trainml/trainml.py CHANGED
@@ -28,7 +28,7 @@ async def delayed_close(ws):
28
28
  class TrainML(object):
29
29
  def __init__(self, **kwargs):
30
30
  self._version = version("trainml")
31
- CONFIG_DIR = os.path.expanduser(
31
+ CONFIG_DIR = kwargs.get("config_dir") or os.path.expanduser(
32
32
  os.environ.get("TRAINML_CONFIG_DIR") or "~/.trainml"
33
33
  )
34
34
  try:
@@ -50,6 +50,7 @@ class TrainML(object):
50
50
  or "trainml.ai"
51
51
  )
52
52
  self.auth = Auth(
53
+ config_dir=CONFIG_DIR,
53
54
  domain_suffix=self.domain_suffix,
54
55
  user=kwargs.get("user"),
55
56
  key=kwargs.get("key"),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: trainml
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: trainML client SDK and command line utilities
5
5
  Home-page: https://github.com/trainML/trainml-cli
6
6
  Author: trainML
@@ -8,15 +8,15 @@ tests/integration/test_checkpoints_integration.py,sha256=Ev-GxXiBupOi3KduYoEMhb2
8
8
  tests/integration/test_datasets_integration.py,sha256=jskX8y9moLvAkZLcQL4iSBrUXSGGuWJ95Vw1JuxxwD8,3424
9
9
  tests/integration/test_environments_integration.py,sha256=0IckhJvQhd8j4Ouiu0hMq2b7iA1dbZpZYmknyfWjsFM,1403
10
10
  tests/integration/test_gpu_types_integration.py,sha256=V2OncokZWWVq_l5FSmKEDM4EsWrmpB-zKiVPt-we0aY,1256
11
- tests/integration/test_jobs_integration.py,sha256=YP_cpKMXqP3eMlcVR0dtVsHkRY2neYsdwcPw5BOXkzI,23496
11
+ tests/integration/test_jobs_integration.py,sha256=0fMg7kOjQMotEo40XnerAamqhhRbb4pz0ZhmvVrwlb0,23342
12
12
  tests/integration/test_models_integration.py,sha256=xJPq_3m0Cf1liMH8e49ON_L3MO5XcPtJIz_MD9plkyU,2848
13
13
  tests/integration/test_projects_integration.py,sha256=_tmMRFFBe29WaWWuEy3_0j7SKyJc_60JS99hgJUHTG4,1492
14
14
  tests/integration/test_providers_integration.py,sha256=bBVvlSDLCnofSaD36OB21KlinEKeK04gPB--bbHJiP0,1419
15
15
  tests/integration/cloudbender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  tests/integration/cloudbender/test_providers_integration.py,sha256=oV8ydFsosDZ_Z1Dkg2IN-ZhWuIl5e_HkHAORMsOsAJc,1473
17
17
  tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- tests/unit/conftest.py,sha256=viwLZR1Aja7soy5whypAWoZ-2avEWpel_43fooLA6OY,27336
19
- tests/unit/test_auth.py,sha256=m5dGjVo5uGrMVbfiwvtePHeG0mouDE8vwci_DsUlVFo,815
18
+ tests/unit/conftest.py,sha256=AZfqMjB6qXyJdH6cRpxrZK4ciioG6HJTQIIDDkJB2H8,29059
19
+ tests/unit/test_auth.py,sha256=nfhlOCR7rUsn_MaD8QQtBc2v0k8pIxqbzGgRAZK1WGc,858
20
20
  tests/unit/test_checkpoints_unit.py,sha256=4Add2DXZCuriSZ0atvOXc8fsEGMaEfPhYmT8Q3UgP5E,16008
21
21
  tests/unit/test_connections_unit.py,sha256=FzN2ddQxNpjxzNGUsXhjTk0HnD24wSPelPTL4o_r-Ho,5507
22
22
  tests/unit/test_datasets_unit.py,sha256=lVNoBZu4RIiJK26gbUPOUAra_k0YS2GcnjJDnT7UV6Y,15879
@@ -39,60 +39,64 @@ tests/unit/cli/test_cli_model_unit.py,sha256=fE-CRVg8gbtDlwrKBkf-hc9x7EhFlYeE3jl
39
39
  tests/unit/cli/test_cli_project_unit.py,sha256=1tEfwXJqnac41bDtvYcN_gpScnb4UY6s5dHfTl-0YoQ,1756
40
40
  tests/unit/cli/cloudbender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  tests/unit/cli/cloudbender/test_cli_datastore_unit.py,sha256=DQWDjqg4viBZRONi00nVzqF9rJ5qKOKRub9pKbTmMWU,1381
42
+ tests/unit/cli/cloudbender/test_cli_device_unit.py,sha256=2BSMyXQ8fOzNKh_-pa_tx7fy_GCdNlGLNvkiA7vuV7s,1342
42
43
  tests/unit/cli/cloudbender/test_cli_node_unit.py,sha256=KbK7axJ1L4y4sN7KQRpOVIqphnNpi0aFW4-HlYLtwnI,1316
43
44
  tests/unit/cli/cloudbender/test_cli_provider_unit.py,sha256=Rm-tRNPbTTB7ZzkkIpLfDp_pEYfqihjB0ZYk_EPQUfs,781
44
45
  tests/unit/cli/cloudbender/test_cli_region_unit.py,sha256=iH5AbrzZ-R2EJ-Bd2HFN7FN2lTpkr3-pCLR59ZVvdQU,1262
45
46
  tests/unit/cli/cloudbender/test_cli_reservation_unit.py,sha256=9y4FhcUwti7OzKYaJ23YAgOpx-dBIYj_0i--xaIk8YU,1407
46
47
  tests/unit/cloudbender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
- tests/unit/cloudbender/test_datastores_unit.py,sha256=VVbINi31I3lf85JsBodqI-GZhfnGY5OIIlTC-8QFmIc,4644
48
- tests/unit/cloudbender/test_device_configs_unit.py,sha256=TYCmykeInX9t6PjXccdmZKuR26VomRsesCTQPdTq6gg,4858
49
- tests/unit/cloudbender/test_nodes_unit.py,sha256=dl5ufBbzvI559Y0AgdIjxF3QfQkw20R7tOx6N0NqFxI,4686
50
- tests/unit/cloudbender/test_providers_unit.py,sha256=dv0pzFIdswr1euB7k_nwMVcCUhuAAX8afWrRzxwKz98,3730
51
- tests/unit/cloudbender/test_regions_unit.py,sha256=BYX1NF6vI2sPj3aUbm-Pf1QvsEwwQZ3oDoZbfygYEy0,5635
52
- tests/unit/cloudbender/test_reservations_unit.py,sha256=JthNLYCQPV4RSECziuQ3Mqf-DOsOCEEbxtMfkwGeeH0,4827
53
- trainml/__init__.py,sha256=bDSwVwfrPDcEGAaZlSl9EWcFbz7F1UK7BvQWLfWNEHE,432
48
+ tests/unit/cloudbender/test_datastores_unit.py,sha256=54mPokxhrRjlkBfqpmeA_q-PLml-HUNNit91aQVTpCg,5398
49
+ tests/unit/cloudbender/test_device_configs_unit.py,sha256=lzyCuF7MRoQrtJVTQFL27lqPnRwQFv25htPgJqDuQI8,5714
50
+ tests/unit/cloudbender/test_devices_unit.py,sha256=QBWnlOe1tw_XNA_i-yDHkmpGvtK36f2u1HhoXquoVaE,9103
51
+ tests/unit/cloudbender/test_nodes_unit.py,sha256=BDpfJXCBNNpLt5rhJMk2BVXDQ_4QSmxoVrO_YPs6xBU,6231
52
+ tests/unit/cloudbender/test_providers_unit.py,sha256=OgxifgC1IqLH8DNMKXy1Ne9_7a75ea6kHEOfRSRoQuQ,4373
53
+ tests/unit/cloudbender/test_regions_unit.py,sha256=BbJICLIQmlotpA1UmLD0KTW_H9g2UW0J8ZYzQk1_Xjc,6299
54
+ tests/unit/cloudbender/test_reservations_unit.py,sha256=nWEZ_p9EF2C49nbgL7Dt4NG2Irmyt94ZqJJQDyNfGFI,5624
55
+ trainml/__init__.py,sha256=PACqklwvG2CiPJqOAaEZLAgJyM6nllgNp0p12pqDYUc,432
54
56
  trainml/__main__.py,sha256=JgErYkiskih8Y6oRwowALtR-rwQhAAdqOYWjQraRIPI,59
55
- trainml/auth.py,sha256=VI8wXgmXbwiBpgw0Sm-DzC4VmNqKg_zniua-Z61PafA,26646
57
+ trainml/auth.py,sha256=gruZv27nhttrCbhcVQTH9kZkF2uMm1E06SwA_2pQAHQ,26565
56
58
  trainml/checkpoints.py,sha256=726yaeTHzIPvkQ-BhqmvJ6u0s1Oh732N6UAFbuWEv0Q,8274
57
59
  trainml/connections.py,sha256=h-S1NZbOkaXpIlpRStA6q-3eXc_OMlFWOLzF8R9SVG8,20029
58
- trainml/datasets.py,sha256=9Hb9AqGHu-mWfRWI2n3PqeUjKHc6GvowMyBPkFiRRq8,7394
60
+ trainml/datasets.py,sha256=5zhxpmK12aA7iXp4n-8bD00Tie7bi3LU0tPNJKdnZlY,7935
59
61
  trainml/environments.py,sha256=OH4o08zXZ7IJ2CiA1rPnys2Fl45r8qvQHfM2mCBRAIc,1507
60
62
  trainml/exceptions.py,sha256=hhR78fI8rbU3fWQ-kUsgxOLyYP8D2bQcjLjrskqPG0Q,3724
61
- trainml/gpu_types.py,sha256=Nfaojyw4e-AeMPaIiExeOiewUSFWa1JVd65DZ8b_Hvk,1663
63
+ trainml/gpu_types.py,sha256=mm-dwfYc02192bmYPIJmzesndyBcoOdkKYBaYZXOUwU,1901
62
64
  trainml/jobs.py,sha256=cUuiMvtJSFSupv2jy7fqAvUOkO8FRLfBDe3RuSZUjfE,17807
63
- trainml/models.py,sha256=laxVTyLqPNRSdst3rC0ql6HygCfl0ffcgXHF0t2Q1Bg,7043
65
+ trainml/models.py,sha256=Lqs3OJMuOZXx8cfGFNC3JZ8nVK6l9_jU1xM1Uw1c5UQ,7750
64
66
  trainml/projects.py,sha256=Jk-0xhEgBFPIVMAK_Szxp3B-h-tJJSIEtTF8JWAYzo8,5209
65
67
  trainml/providers.py,sha256=97VegYVSeK0BuYv04hfBY_awNBbGz_GR_mdDrknfO-A,1844
66
- trainml/trainml.py,sha256=W7R0wn4XXHxm8ZdHGJeFJ89xnQ2rcTRWbrf_PTv6fg4,10982
68
+ trainml/trainml.py,sha256=OrDXkJiStA_fTkwl0HX529n-cPCQUTVfdMOX-w0u1Oo,11045
67
69
  trainml/cli/__init__.py,sha256=-lA19Djkvqr1I-5PWoONgzHia-Lkg0J45dzt7qbetD8,4338
68
70
  trainml/cli/checkpoint.py,sha256=8Rh4bmFwJ4DKlIjHK-FLTeRynABqKCgIUGRtbQhAsX4,7170
69
71
  trainml/cli/connection.py,sha256=ELV6bPL30dzttFNxDU7Fb74R8oPL_E70k7TcJEzbwtQ,1700
70
- trainml/cli/dataset.py,sha256=joVsNxnCw23s1T6rTJMJeYRFHM-EIWmKFMsB7YyY1zs,6893
72
+ trainml/cli/dataset.py,sha256=Pc00M6t7hGoRzCxznmmkijsWhG4PhIfG7UkrwtwykTY,6871
71
73
  trainml/cli/environment.py,sha256=dfm_T8OlCM5M8dLyOQBapJl3eFuVIku2P4JO6V0cYVQ,1019
72
74
  trainml/cli/gpu.py,sha256=CMcQyl2qbUgc2bc-gvUVT6X7bq2-sgiCHl3hyZ6kFWM,883
73
75
  trainml/cli/job.py,sha256=Xh_542a2rjAjhXyq8WG9ZEySboq_MmFQ7sCqYJYRXcM,4302
74
- trainml/cli/model.py,sha256=W3ah6Zy3whDrfUgvdaE3B7kVhPsLXBl_4Pr7dElb9oo,6071
76
+ trainml/cli/model.py,sha256=hR23E6ttRXcLk-RofkPK6wUXMO7OU6sT6jTEHTmUg9Q,6111
75
77
  trainml/cli/project.py,sha256=iar4-Aic6k0O6HWfxB5vJ5EtjS4aAaw2g8wW7H-3Bjk,3522
76
78
  trainml/cli/provider.py,sha256=eaklYo0IUOGeyZ0ziZZz6UhOZ50Py4ewaPtWA9UDCqU,1594
77
- trainml/cli/cloudbender/__init__.py,sha256=xPo_OEqCBaU4xPnEpM4D8CBfANoO2qA2FtyV-J3XtdY,484
79
+ trainml/cli/cloudbender/__init__.py,sha256=ewat7I7PvHQEW0a8zuky28kuMwtjL-gFQOAQmG0mmJA,534
78
80
  trainml/cli/cloudbender/datastore.py,sha256=gJ-comfAq65uiPoONQ35UIDLNVN7QKMf3l_2EcTN6zY,3478
81
+ trainml/cli/cloudbender/device.py,sha256=KGZCFwwvS4tWsWuudrhlvquu_IFtV7LCUAOmCajicic,3453
79
82
  trainml/cli/cloudbender/node.py,sha256=iN_WaPCxOhtgDtnSsIFAEMGADG4MKiLjWoez6YSYwZI,3843
80
83
  trainml/cli/cloudbender/provider.py,sha256=oFjZWKfFQjNY7OtDu7nUdfv-RTmQc_Huuug963D3BdA,1726
81
84
  trainml/cli/cloudbender/region.py,sha256=X6-FYOb-pGpOEazn-NbsYSwa9ergB7FGATFkTe4a8Pk,2892
82
85
  trainml/cli/cloudbender/reservation.py,sha256=z2oMYwp-w_Keo1DepKUtuRnwiGz2VscVHDYWEFap1gs,3569
83
86
  trainml/cli/job/__init__.py,sha256=ljY-ELeXhXQ7txASbJEKGBom7OXfNyy7sWILz3nxRAE,6545
84
- trainml/cli/job/create.py,sha256=eaHOLRT0_ujp_xuMjWlR5GcSPpJ9x5AoS_Vdn6b55hU,34652
87
+ trainml/cli/job/create.py,sha256=QDxHTSpiAjdnmGxUhBASwSNbL1pYqGoCV12UnB-c4N4,34655
85
88
  trainml/cloudbender/__init__.py,sha256=iE29obtC0_9f0IhRvHQcG5aY58fVhVYipTakpjAhdss,64
86
- trainml/cloudbender/cloudbender.py,sha256=ViVvOQTefXgWlyuLFQbLhVkTgRo0q2o4qxJQHBNtNv8,565
87
- trainml/cloudbender/datastores.py,sha256=1QoWT-cSKBA2-BA9703rJDsQ-mu7CI7RtKknSSp-6oU,3245
88
- trainml/cloudbender/device_configs.py,sha256=JBBb-33OD304Js7GsnBOwVCOs97TqcJ6qaw1gr-9oFk,3134
89
- trainml/cloudbender/nodes.py,sha256=dQva4u-ejTpKJAT51V4LxwZ2ovioyzVA5ysmQYUU6rc,3608
90
- trainml/cloudbender/providers.py,sha256=FyIF-FD9K9hkAD1NYJzRxW2ioNFw1bCWcadPVardv6w,1834
91
- trainml/cloudbender/regions.py,sha256=lRnBIYPn3DppVG2FuidK0o4apsCSg6ziixld3j5IYgg,3339
92
- trainml/cloudbender/reservations.py,sha256=D4ZlLudyNnbR2EhMuQWl14QoMqGWc3h-SgV3q75wL2w,3323
93
- trainml-0.5.0.dist-info/LICENSE,sha256=s0lpBxhSSUEpMavwde-Vb6K_K7xDCTTvSpNznVqVGR0,1069
94
- trainml-0.5.0.dist-info/METADATA,sha256=IBdBZCdm9Nio49kvHvlN161zyW6tv_CHu0s0H9aIdBA,7345
95
- trainml-0.5.0.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
96
- trainml-0.5.0.dist-info/entry_points.txt,sha256=OzBDm2wXby1bSGF02jTVxzRFZLejnbFiLHXhKdW3Bds,63
97
- trainml-0.5.0.dist-info/top_level.txt,sha256=Y1kLFRWKUW7RG8BX7cvejHF_yW8wBOaRYF1JQHENY4w,23
98
- trainml-0.5.0.dist-info/RECORD,,
89
+ trainml/cloudbender/cloudbender.py,sha256=rAc93mtMaa3tWLi-NT4tiqO664MCPkhlGG9oNYSmimQ,634
90
+ trainml/cloudbender/datastores.py,sha256=biVGifedc3r1DcuxsfCQh-f1Tw4HcJMMJfdgHxPfkKM,3506
91
+ trainml/cloudbender/device_configs.py,sha256=DJWiGFaOE4C4xLE1BLDAiEjeL4T00R3FA_pb1xnSOr4,3399
92
+ trainml/cloudbender/devices.py,sha256=QORNmKdLJoqGZmeWXRnivC1JmNBIw-ebvf4bsoem3r8,5660
93
+ trainml/cloudbender/nodes.py,sha256=7HV2VLmxiUcJ-Kc6AAXS3M8C_XO-HKmaVgJpPdVnBQk,4332
94
+ trainml/cloudbender/providers.py,sha256=-gkdiTu6Ah2znUuyyc3ZuRALagW8s1-OgqVjtlvc1AU,2036
95
+ trainml/cloudbender/regions.py,sha256=Aqc_MeLVAeEv21e-lR5u8x1eintqUhZT2DBiQG3AcEE,3570
96
+ trainml/cloudbender/reservations.py,sha256=rOrGXWIUHON4ad2aufEcvK4Yv_Mv3dDoScUtLJE8LWw,3586
97
+ trainml-0.5.2.dist-info/LICENSE,sha256=s0lpBxhSSUEpMavwde-Vb6K_K7xDCTTvSpNznVqVGR0,1069
98
+ trainml-0.5.2.dist-info/METADATA,sha256=RGNR1MBae8_fsnjuBRWPTi0d2fGR7ctzdSP5YOwC2Og,7345
99
+ trainml-0.5.2.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
100
+ trainml-0.5.2.dist-info/entry_points.txt,sha256=OzBDm2wXby1bSGF02jTVxzRFZLejnbFiLHXhKdW3Bds,63
101
+ trainml-0.5.2.dist-info/top_level.txt,sha256=Y1kLFRWKUW7RG8BX7cvejHF_yW8wBOaRYF1JQHENY4w,23
102
+ trainml-0.5.2.dist-info/RECORD,,