lightning-sdk 0.1.37__py3-none-any.whl → 0.1.38__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.
- lightning_sdk/__init__.py +1 -1
- lightning_sdk/ai_hub.py +21 -23
- lightning_sdk/api/ai_hub_api.py +29 -4
- lightning_sdk/api/job_api.py +6 -2
- lightning_sdk/api/teamspace_api.py +18 -14
- lightning_sdk/api/utils.py +19 -0
- lightning_sdk/cli/ai_hub.py +1 -1
- lightning_sdk/cli/run.py +8 -0
- lightning_sdk/job/base.py +13 -0
- lightning_sdk/job/job.py +8 -0
- lightning_sdk/job/v1.py +5 -1
- lightning_sdk/job/v2.py +4 -0
- lightning_sdk/lightning_cloud/openapi/__init__.py +13 -2
- lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +5 -1
- lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +680 -62
- lightning_sdk/lightning_cloud/openapi/models/__init__.py +13 -2
- lightning_sdk/lightning_cloud/openapi/models/create.py +6 -32
- lightning_sdk/lightning_cloud/openapi/models/deploymenttemplates_id_body.py +32 -6
- lightning_sdk/lightning_cloud/openapi/models/externalv1_cloud_space_instance_status.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/multimachinejobs_id_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_agents_body.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/project_id_cloudspaces_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/project_id_multimachinejobs_body.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/update.py +6 -32
- lightning_sdk/lightning_cloud/openapi/models/v1_api_pricing_spec.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_create_deployment_template_request.py +32 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_data_connection.py +6 -32
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_multi_machine_job_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_metrics.py +43 -17
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_performance.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template.py +32 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter_type.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_summary.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_efs_data_connection.py → v1_efs_config.py} +22 -22
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_files_response.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_google_cloud_direct_v1.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_lambda_labs_direct_v1.py +125 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_multi_machine_jobs_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_machines_selector.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_message.py +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_message_content.py +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_message_content_type.py +103 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics_stream.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_state.py +108 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_status.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_rule_resource.py +2 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_system_info.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_user_requested_compute_config.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_data_connection_response.py +6 -32
- lightning_sdk/lightning_cloud/openapi/models/validate.py +6 -32
- lightning_sdk/teamspace.py +5 -0
- {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/METADATA +1 -1
- {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/RECORD +61 -50
- lightning_sdk/lightning_cloud/openapi/models/v1_efs_folder_data_connection.py +0 -201
- {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/LICENSE +0 -0
- {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/WHEEL +0 -0
- {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/entry_points.txt +0 -0
- {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/top_level.txt +0 -0
lightning_sdk/__init__.py
CHANGED
lightning_sdk/ai_hub.py
CHANGED
|
@@ -47,17 +47,7 @@ class AIHub:
|
|
|
47
47
|
including its name, description, creation and update timestamps,
|
|
48
48
|
parameters, tags, job specifications, and autoscaling settings.
|
|
49
49
|
"""
|
|
50
|
-
template = self._api.api_info(api_id)
|
|
51
|
-
|
|
52
|
-
api_arguments = [
|
|
53
|
-
{
|
|
54
|
-
"name": param.name,
|
|
55
|
-
"short_description": param.short_description,
|
|
56
|
-
"required": param.required,
|
|
57
|
-
"default": param.input.default_value,
|
|
58
|
-
}
|
|
59
|
-
for param in template.parameter_spec.parameters
|
|
60
|
-
]
|
|
50
|
+
template, api_arguments = self._api.api_info(api_id)
|
|
61
51
|
|
|
62
52
|
return {
|
|
63
53
|
"name": template.name,
|
|
@@ -129,33 +119,33 @@ class AIHub:
|
|
|
129
119
|
raise ValueError("You need to pass a teamspace or an org for your deployment.")
|
|
130
120
|
return teamspace
|
|
131
121
|
|
|
132
|
-
def
|
|
122
|
+
def run(
|
|
133
123
|
self,
|
|
134
124
|
api_id: str,
|
|
135
|
-
|
|
125
|
+
api_arguments: Optional[Dict[str, Any]] = None,
|
|
136
126
|
name: Optional[str] = None,
|
|
127
|
+
cluster: Optional[str] = None,
|
|
137
128
|
teamspace: Optional[Union[str, "Teamspace"]] = None,
|
|
138
129
|
org: Optional[Union[str, "Organization"]] = None,
|
|
139
|
-
api_arguments: Optional[Dict[str, Any]] = None,
|
|
140
130
|
) -> Dict[str, Union[str, bool]]:
|
|
141
131
|
"""Deploy an API from the AI Hub.
|
|
142
132
|
|
|
143
133
|
Example:
|
|
144
134
|
from lightning_sdk import AIHub
|
|
145
135
|
hub = AIHub()
|
|
146
|
-
deployment = hub.
|
|
136
|
+
deployment = hub.run("temp_xxxx")
|
|
147
137
|
|
|
148
138
|
# Using API arguments
|
|
149
|
-
api_arugments = {"model": "unitary/toxic-bert", "batch_size" 10, "token": "lit_xxxx"}
|
|
150
|
-
deployment = hub.
|
|
139
|
+
api_arugments = {"model": "unitary/toxic-bert", "batch_size": 10, "token": "lit_xxxx"}
|
|
140
|
+
deployment = hub.run("temp_xxxx", api_arugments=api_arugments)
|
|
151
141
|
|
|
152
142
|
Args:
|
|
153
|
-
api_id: The ID of the
|
|
154
|
-
|
|
143
|
+
api_id: The ID of the AIHub template you want to run.
|
|
144
|
+
api_arguments: Additional API argument, such as model name, or batch size.
|
|
155
145
|
name: Name for the deployed API. Defaults to None.
|
|
146
|
+
cluster: The cluster where you want to run the template, such as "lightning-public-prod". Defaults to None.
|
|
156
147
|
teamspace: The team or group for deployment. Defaults to None.
|
|
157
148
|
org: The organization for deployment. Defaults to None.
|
|
158
|
-
api_arguments: Additional API argument, such as model name, or batch size.
|
|
159
149
|
|
|
160
150
|
Returns:
|
|
161
151
|
A dictionary containing the name of the deployed API,
|
|
@@ -169,14 +159,22 @@ class AIHub:
|
|
|
169
159
|
teamspace_id = teamspace.id
|
|
170
160
|
|
|
171
161
|
api_arguments = api_arguments or {}
|
|
172
|
-
deployment = self._api.
|
|
162
|
+
deployment = self._api.run_api(
|
|
173
163
|
template_id=api_id, cluster_id=cluster, project_id=teamspace_id, name=name, api_arguments=api_arguments
|
|
174
164
|
)
|
|
175
|
-
url =
|
|
165
|
+
url = (
|
|
166
|
+
quote(
|
|
167
|
+
f"{LIGHTNING_CLOUD_URL}/{teamspace._org.name}/{teamspace.name}/jobs/{deployment.name}",
|
|
168
|
+
safe=":/()",
|
|
169
|
+
)
|
|
170
|
+
+ "?app_id=deployment"
|
|
171
|
+
)
|
|
176
172
|
print("Deployment available at:", url)
|
|
173
|
+
|
|
177
174
|
return {
|
|
178
175
|
"id": deployment.id,
|
|
179
176
|
"name": deployment.name,
|
|
180
|
-
"
|
|
177
|
+
"deployment_url": url,
|
|
178
|
+
"api_endpoint": deployment.status.urls[0],
|
|
181
179
|
"interruptible": deployment.spec.spot,
|
|
182
180
|
}
|
lightning_sdk/api/ai_hub_api.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import traceback
|
|
2
|
-
from typing import Dict, List, Optional
|
|
2
|
+
from typing import Dict, List, Optional, Tuple
|
|
3
3
|
|
|
4
4
|
import backoff
|
|
5
5
|
|
|
@@ -22,15 +22,40 @@ class AIHubApi:
|
|
|
22
22
|
def __init__(self) -> None:
|
|
23
23
|
self._client = LightningClient(max_tries=3)
|
|
24
24
|
|
|
25
|
-
def api_info(self, api_id: str) ->
|
|
25
|
+
def api_info(self, api_id: str) -> Tuple[V1DeploymentTemplate, List[Dict[str, str]]]:
|
|
26
26
|
try:
|
|
27
|
-
|
|
27
|
+
template = self._client.deployment_templates_service_get_deployment_template(api_id)
|
|
28
28
|
except Exception as e:
|
|
29
29
|
stack_trace = traceback.format_exc()
|
|
30
30
|
if "record not found" in stack_trace:
|
|
31
31
|
raise ValueError(f"api_id={api_id} not found.") from None
|
|
32
32
|
raise e
|
|
33
33
|
|
|
34
|
+
api_arguments = []
|
|
35
|
+
for param in template.parameter_spec.parameters:
|
|
36
|
+
default = None
|
|
37
|
+
if param.type == V1DeploymentTemplateParameterType.INPUT and param.input:
|
|
38
|
+
default = param.input.default_value
|
|
39
|
+
if param.type == V1DeploymentTemplateParameterType.SELECT and param.select:
|
|
40
|
+
default = param.select.options[0]
|
|
41
|
+
if param.type == V1DeploymentTemplateParameterType.CHECKBOX and param.checkbox:
|
|
42
|
+
default = (
|
|
43
|
+
(param.checkbox.true_value or "True")
|
|
44
|
+
if param.checkbox.is_checked
|
|
45
|
+
else (param.checkbox.false_value or "False")
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
api_arguments.append(
|
|
49
|
+
{
|
|
50
|
+
"name": param.name,
|
|
51
|
+
"short_description": param.short_description,
|
|
52
|
+
"required": param.required,
|
|
53
|
+
"type": param.type,
|
|
54
|
+
"default": default,
|
|
55
|
+
}
|
|
56
|
+
)
|
|
57
|
+
return template, api_arguments
|
|
58
|
+
|
|
34
59
|
@backoff.on_predicate(backoff.expo, lambda x: not x, max_tries=5)
|
|
35
60
|
def list_apis(self, search_query: str) -> List[V1DeploymentTemplateGalleryResponse]:
|
|
36
61
|
kwargs = {"show_globally_visible": True}
|
|
@@ -84,7 +109,7 @@ class AIHubApi:
|
|
|
84
109
|
|
|
85
110
|
return job
|
|
86
111
|
|
|
87
|
-
def
|
|
112
|
+
def run_api(
|
|
88
113
|
self, template_id: str, project_id: str, cluster_id: str, name: Optional[str], api_arguments: Dict[str, str]
|
|
89
114
|
) -> V1Deployment:
|
|
90
115
|
template = self._client.deployment_templates_service_get_deployment_template(template_id)
|
lightning_sdk/api/job_api.py
CHANGED
|
@@ -141,13 +141,15 @@ class JobApiV2:
|
|
|
141
141
|
self,
|
|
142
142
|
name: str,
|
|
143
143
|
command: Optional[str],
|
|
144
|
-
cluster_id: str,
|
|
144
|
+
cluster_id: Optional[str],
|
|
145
145
|
teamspace_id: str,
|
|
146
146
|
studio_id: Optional[str],
|
|
147
147
|
image: Optional[str],
|
|
148
148
|
machine: Machine,
|
|
149
149
|
interruptible: bool,
|
|
150
150
|
env: Optional[Dict[str, str]],
|
|
151
|
+
image_credentials: Optional[str],
|
|
152
|
+
cluster_auth: bool,
|
|
151
153
|
) -> V1Job:
|
|
152
154
|
env_vars = []
|
|
153
155
|
if env is not None:
|
|
@@ -160,13 +162,15 @@ class JobApiV2:
|
|
|
160
162
|
|
|
161
163
|
spec = V1JobSpec(
|
|
162
164
|
cloudspace_id=studio_id or "",
|
|
163
|
-
cluster_id=cluster_id,
|
|
165
|
+
cluster_id=cluster_id or "",
|
|
164
166
|
command=command or "",
|
|
165
167
|
env=env_vars,
|
|
166
168
|
image=image or "",
|
|
167
169
|
instance_name=instance_name,
|
|
168
170
|
run_id=run_id,
|
|
169
171
|
spot=interruptible,
|
|
172
|
+
image_cluster_credentials=cluster_auth,
|
|
173
|
+
image_secret_ref=image_credentials or "",
|
|
170
174
|
)
|
|
171
175
|
body = ProjectIdJobsBody(name=name, spec=spec)
|
|
172
176
|
|
|
@@ -3,7 +3,7 @@ from dataclasses import dataclass
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
from typing import Dict, List, Optional
|
|
5
5
|
|
|
6
|
-
from lightning_sdk.api.utils import _download_model_files, _DummyBody, _ModelFileUploader
|
|
6
|
+
from lightning_sdk.api.utils import _download_model_files, _DummyBody, _get_model_version, _ModelFileUploader
|
|
7
7
|
from lightning_sdk.lightning_cloud.login import Auth
|
|
8
8
|
from lightning_sdk.lightning_cloud.openapi import (
|
|
9
9
|
ModelIdVersionsBody,
|
|
@@ -159,6 +159,16 @@ class TeamspaceApi:
|
|
|
159
159
|
|
|
160
160
|
return self._client.assistants_service_create_assistant(body=body, project_id=teamspace_id)
|
|
161
161
|
|
|
162
|
+
# lazy property which is only created when needed
|
|
163
|
+
@property
|
|
164
|
+
def models(self) -> ModelsStoreApi:
|
|
165
|
+
if not self._models:
|
|
166
|
+
self._models = ModelsStoreApi(self._client.api_client)
|
|
167
|
+
return self._models
|
|
168
|
+
|
|
169
|
+
def get_model_version(self, name: str, version: str, teamspace_id: str) -> V1ModelVersionArchive:
|
|
170
|
+
return _get_model_version(client=self._client, name=name, version=version, teamspace_id=teamspace_id)
|
|
171
|
+
|
|
162
172
|
def create_model(
|
|
163
173
|
self,
|
|
164
174
|
name: str,
|
|
@@ -167,17 +177,15 @@ class TeamspaceApi:
|
|
|
167
177
|
teamspace_id: str,
|
|
168
178
|
cluster_id: str,
|
|
169
179
|
) -> V1ModelVersionArchive:
|
|
170
|
-
if not self._models:
|
|
171
|
-
self._models = ModelsStoreApi(self._client.api_client)
|
|
172
180
|
# ask if such model already exists by listing models with specific name
|
|
173
|
-
models = self.
|
|
181
|
+
models = self.models.models_store_list_models(project_id=teamspace_id, name=name).models
|
|
174
182
|
if len(models) == 0:
|
|
175
|
-
return self.
|
|
183
|
+
return self.models.models_store_create_model(
|
|
176
184
|
body=ProjectIdModelsBody(cluster_id=cluster_id, metadata=metadata, name=name, private=private),
|
|
177
185
|
project_id=teamspace_id,
|
|
178
186
|
)
|
|
179
187
|
assert len(models) == 1, "Multiple models with the same name found"
|
|
180
|
-
return self.
|
|
188
|
+
return self.models.models_store_create_model_version(
|
|
181
189
|
body=ModelIdVersionsBody(cluster_id=cluster_id),
|
|
182
190
|
project_id=teamspace_id,
|
|
183
191
|
model_id=models[0].id,
|
|
@@ -185,18 +193,16 @@ class TeamspaceApi:
|
|
|
185
193
|
|
|
186
194
|
def delete_model(self, name: str, version: Optional[str], teamspace_id: str) -> None:
|
|
187
195
|
"""Delete a model or a version from the model store."""
|
|
188
|
-
|
|
189
|
-
self._models = ModelsStoreApi(self._client.api_client)
|
|
190
|
-
models = self._models.models_store_list_models(project_id=teamspace_id, name=name).models
|
|
196
|
+
models = self.models.models_store_list_models(project_id=teamspace_id, name=name).models
|
|
191
197
|
assert len(models) == 1, "Multiple models with the same name found"
|
|
192
198
|
model_id = models[0].id
|
|
193
199
|
# decide if delete only version of whole model
|
|
194
200
|
if version:
|
|
195
201
|
if version == "latest":
|
|
196
202
|
version = models[0].latest_version
|
|
197
|
-
self.
|
|
203
|
+
self.models.models_store_delete_model_version(project_id=teamspace_id, model_id=model_id, version=version)
|
|
198
204
|
else:
|
|
199
|
-
self.
|
|
205
|
+
self.models.models_store_delete_model(project_id=teamspace_id, model_id=model_id)
|
|
200
206
|
|
|
201
207
|
def upload_model_file(
|
|
202
208
|
self,
|
|
@@ -242,9 +248,7 @@ class TeamspaceApi:
|
|
|
242
248
|
)
|
|
243
249
|
|
|
244
250
|
def complete_model_upload(self, model_id: str, version: str, teamspace_id: str) -> None:
|
|
245
|
-
|
|
246
|
-
self._models = ModelsStoreApi(self._client.api_client)
|
|
247
|
-
self._models.models_store_complete_model_upload(
|
|
251
|
+
self.models.models_store_complete_model_upload(
|
|
248
252
|
body=_DummyBody(),
|
|
249
253
|
project_id=teamspace_id,
|
|
250
254
|
model_id=model_id,
|
lightning_sdk/api/utils.py
CHANGED
|
@@ -28,6 +28,7 @@ from lightning_sdk.lightning_cloud.openapi import (
|
|
|
28
28
|
V1UploadProjectArtifactResponse,
|
|
29
29
|
VersionUploadsBody,
|
|
30
30
|
)
|
|
31
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_model_version_archive import V1ModelVersionArchive
|
|
31
32
|
|
|
32
33
|
try:
|
|
33
34
|
from lightning_sdk.lightning_cloud.openapi import AppsIdBody1 as AppsIdBody
|
|
@@ -492,6 +493,24 @@ class _FileDownloader:
|
|
|
492
493
|
os.rename(tmp_filename, self.local_path)
|
|
493
494
|
|
|
494
495
|
|
|
496
|
+
def _get_model_version(client: LightningClient, teamspace_id: str, name: str, version: str) -> V1ModelVersionArchive:
|
|
497
|
+
api = ModelsStoreApi(client.api_client)
|
|
498
|
+
models = api.models_store_list_models(project_id=teamspace_id, name=name).models
|
|
499
|
+
if not models:
|
|
500
|
+
raise ValueError(f"Model `{name}` does not exist")
|
|
501
|
+
elif len(models) > 1:
|
|
502
|
+
raise ValueError("Multiple models with the same name found")
|
|
503
|
+
if version == "latest":
|
|
504
|
+
return models[0].latest_version
|
|
505
|
+
versions = api.models_store_list_model_versions(project_id=teamspace_id, model_id=models[0].id).versions
|
|
506
|
+
if not versions:
|
|
507
|
+
raise ValueError(f"Model `{name}` does not have any versions")
|
|
508
|
+
for ver in versions:
|
|
509
|
+
if ver.version == version:
|
|
510
|
+
return ver
|
|
511
|
+
raise ValueError(f"Model `{name}` does not have version `{version}`")
|
|
512
|
+
|
|
513
|
+
|
|
495
514
|
def _download_model_files(
|
|
496
515
|
client: LightningClient,
|
|
497
516
|
teamspace_id: str,
|
lightning_sdk/cli/ai_hub.py
CHANGED
|
@@ -46,4 +46,4 @@ class _AIHub(_StudiosMenu):
|
|
|
46
46
|
teamspace: Teamspace to deploy the API to. Defaults to user's default teamspace.
|
|
47
47
|
org: Organization to deploy the API to. Defaults to user's default organization.
|
|
48
48
|
"""
|
|
49
|
-
return self._hub.
|
|
49
|
+
return self._hub.run(api_id, cluster=cluster, name=name, teamspace=teamspace, org=org)
|
lightning_sdk/cli/run.py
CHANGED
|
@@ -36,6 +36,10 @@ class _Run:
|
|
|
36
36
|
If not provided will fall back to the teamspaces default cluster.
|
|
37
37
|
env: Environment variables to set inside the job.
|
|
38
38
|
interruptible: Whether the job should run on interruptible instances. They are cheaper but can be preempted.
|
|
39
|
+
image_credentials: The credentials used to pull the image. Required if the image is private.
|
|
40
|
+
This should be the name of the respective credentials secret created on the Lightning AI platform.
|
|
41
|
+
cluster_auth: Whether to authenticate with the cluster to pull the image.
|
|
42
|
+
Required if the registry is part of a cluster provider (e.g. ECR).
|
|
39
43
|
"""
|
|
40
44
|
self.job.__func__.__doc__ = docstr
|
|
41
45
|
|
|
@@ -55,6 +59,8 @@ class _Run:
|
|
|
55
59
|
cluster: Optional[str] = None,
|
|
56
60
|
env: Optional[Dict[str, str]] = None,
|
|
57
61
|
interruptible: bool = False,
|
|
62
|
+
image_credentials: Optional[str] = None,
|
|
63
|
+
cluster_auth: bool = False,
|
|
58
64
|
) -> None:
|
|
59
65
|
machine_enum = Machine(machine.upper())
|
|
60
66
|
Job.run(
|
|
@@ -69,4 +75,6 @@ class _Run:
|
|
|
69
75
|
cluster=cluster,
|
|
70
76
|
env=env,
|
|
71
77
|
interruptible=interruptible,
|
|
78
|
+
image_credentials=image_credentials,
|
|
79
|
+
cluster_auth=cluster_auth,
|
|
72
80
|
)
|
lightning_sdk/job/base.py
CHANGED
|
@@ -50,6 +50,8 @@ class _BaseJob(ABC):
|
|
|
50
50
|
cluster: Optional[str] = None,
|
|
51
51
|
env: Optional[Dict[str, str]] = None,
|
|
52
52
|
interruptible: bool = False,
|
|
53
|
+
image_credentials: Optional[str] = None,
|
|
54
|
+
cluster_auth: bool = False,
|
|
53
55
|
) -> "_BaseJob":
|
|
54
56
|
from lightning_sdk.studio import Studio
|
|
55
57
|
|
|
@@ -80,6 +82,13 @@ class _BaseJob(ABC):
|
|
|
80
82
|
"Studio cluster does not match provided cluster. "
|
|
81
83
|
"Can only run jobs with Studio envs in the same cluster."
|
|
82
84
|
)
|
|
85
|
+
|
|
86
|
+
if image_credentials is not None:
|
|
87
|
+
raise ValueError("image_credentials is only supported when using a custom image")
|
|
88
|
+
|
|
89
|
+
if cluster_auth:
|
|
90
|
+
raise ValueError("cluster_auth is only supported when using a custom image")
|
|
91
|
+
|
|
83
92
|
else:
|
|
84
93
|
if studio is not None:
|
|
85
94
|
raise RuntimeError(
|
|
@@ -95,6 +104,8 @@ class _BaseJob(ABC):
|
|
|
95
104
|
image=image,
|
|
96
105
|
env=env,
|
|
97
106
|
interruptible=interruptible,
|
|
107
|
+
image_credentials=image_credentials,
|
|
108
|
+
cluster_auth=cluster_auth,
|
|
98
109
|
)
|
|
99
110
|
return inst
|
|
100
111
|
|
|
@@ -108,6 +119,8 @@ class _BaseJob(ABC):
|
|
|
108
119
|
env: Optional[Dict[str, str]] = None,
|
|
109
120
|
interruptible: bool = False,
|
|
110
121
|
cluster: Optional[str] = None,
|
|
122
|
+
image_credentials: Optional[str] = None,
|
|
123
|
+
cluster_auth: bool = False,
|
|
111
124
|
) -> None:
|
|
112
125
|
"""Submits a job and updates the internal _job attribute as well as the _name attribute."""
|
|
113
126
|
|
lightning_sdk/job/job.py
CHANGED
|
@@ -58,6 +58,8 @@ class Job(_BaseJob):
|
|
|
58
58
|
cluster: Optional[str] = None,
|
|
59
59
|
env: Optional[Dict[str, str]] = None,
|
|
60
60
|
interruptible: bool = False,
|
|
61
|
+
image_credentials: Optional[str] = None,
|
|
62
|
+
cluster_auth: bool = False,
|
|
61
63
|
) -> "Job":
|
|
62
64
|
ret_val = super().run(
|
|
63
65
|
name=name,
|
|
@@ -71,6 +73,8 @@ class Job(_BaseJob):
|
|
|
71
73
|
cluster=cluster,
|
|
72
74
|
env=env,
|
|
73
75
|
interruptible=interruptible,
|
|
76
|
+
image_credentials=image_credentials,
|
|
77
|
+
cluster_auth=cluster_auth,
|
|
74
78
|
)
|
|
75
79
|
# required for typing with "Job"
|
|
76
80
|
assert isinstance(ret_val, cls)
|
|
@@ -85,6 +89,8 @@ class Job(_BaseJob):
|
|
|
85
89
|
env: Optional[Dict[str, str]] = None,
|
|
86
90
|
interruptible: bool = False,
|
|
87
91
|
cluster: Optional[str] = None,
|
|
92
|
+
image_credentials: Optional[str] = None,
|
|
93
|
+
cluster_auth: bool = False,
|
|
88
94
|
) -> None:
|
|
89
95
|
return self._internal_job._submit(
|
|
90
96
|
machine=machine,
|
|
@@ -94,6 +100,8 @@ class Job(_BaseJob):
|
|
|
94
100
|
image=image,
|
|
95
101
|
env=env,
|
|
96
102
|
interruptible=interruptible,
|
|
103
|
+
image_credentials=image_credentials,
|
|
104
|
+
cluster_auth=cluster_auth,
|
|
97
105
|
)
|
|
98
106
|
|
|
99
107
|
def stop(self) -> None:
|
lightning_sdk/job/v1.py
CHANGED
|
@@ -54,6 +54,8 @@ class _JobV1(_BaseJob):
|
|
|
54
54
|
cluster=cluster,
|
|
55
55
|
env=None,
|
|
56
56
|
interruptible=interruptible,
|
|
57
|
+
image_credentials=None,
|
|
58
|
+
cluster_auth=False,
|
|
57
59
|
)
|
|
58
60
|
|
|
59
61
|
def _submit(
|
|
@@ -65,11 +67,13 @@ class _JobV1(_BaseJob):
|
|
|
65
67
|
env: Optional[Dict[str, str]] = None,
|
|
66
68
|
interruptible: bool = False,
|
|
67
69
|
cluster: Optional[str] = None,
|
|
70
|
+
image_credentials: Optional[str] = None,
|
|
71
|
+
cluster_auth: bool = False,
|
|
68
72
|
) -> None:
|
|
69
73
|
if studio is None:
|
|
70
74
|
raise ValueError("Studio is required for submitting jobs")
|
|
71
75
|
|
|
72
|
-
if image is not None:
|
|
76
|
+
if image is not None or image_credentials is not None or cluster_auth:
|
|
73
77
|
raise ValueError("Image is not supported for submitting jobs")
|
|
74
78
|
|
|
75
79
|
if env is not None:
|
lightning_sdk/job/v2.py
CHANGED
|
@@ -34,6 +34,8 @@ class _JobV2(_BaseJob):
|
|
|
34
34
|
env: Optional[Dict[str, str]] = None,
|
|
35
35
|
interruptible: bool = False,
|
|
36
36
|
cluster: Optional[str] = None,
|
|
37
|
+
image_credentials: Optional[str] = None,
|
|
38
|
+
cluster_auth: bool = False,
|
|
37
39
|
) -> None:
|
|
38
40
|
# Command is required if Studio is provided to know what to run
|
|
39
41
|
# Image is mutually exclusive with Studio
|
|
@@ -62,6 +64,8 @@ class _JobV2(_BaseJob):
|
|
|
62
64
|
machine=machine,
|
|
63
65
|
interruptible=interruptible,
|
|
64
66
|
env=env,
|
|
67
|
+
image_credentials=image_credentials,
|
|
68
|
+
cluster_auth=cluster_auth,
|
|
65
69
|
)
|
|
66
70
|
self._job = submitted
|
|
67
71
|
self._name = submitted.name
|
|
@@ -138,6 +138,7 @@ from lightning_sdk.lightning_cloud.openapi.models.metricsstream_delete_body impo
|
|
|
138
138
|
from lightning_sdk.lightning_cloud.openapi.models.metricsstream_id_body import MetricsstreamIdBody
|
|
139
139
|
from lightning_sdk.lightning_cloud.openapi.models.model_id_versions_body import ModelIdVersionsBody
|
|
140
140
|
from lightning_sdk.lightning_cloud.openapi.models.models_model_id_body import ModelsModelIdBody
|
|
141
|
+
from lightning_sdk.lightning_cloud.openapi.models.multimachinejobs_id_body import MultimachinejobsIdBody
|
|
141
142
|
from lightning_sdk.lightning_cloud.openapi.models.multipartuploads_upload_id_body import MultipartuploadsUploadIdBody
|
|
142
143
|
from lightning_sdk.lightning_cloud.openapi.models.org_id_memberships_body import OrgIdMembershipsBody
|
|
143
144
|
from lightning_sdk.lightning_cloud.openapi.models.org_id_roles_body import OrgIdRolesBody
|
|
@@ -157,6 +158,7 @@ from lightning_sdk.lightning_cloud.openapi.models.project_id_invite_body import
|
|
|
157
158
|
from lightning_sdk.lightning_cloud.openapi.models.project_id_jobs_body import ProjectIdJobsBody
|
|
158
159
|
from lightning_sdk.lightning_cloud.openapi.models.project_id_memberships_body import ProjectIdMembershipsBody
|
|
159
160
|
from lightning_sdk.lightning_cloud.openapi.models.project_id_models_body import ProjectIdModelsBody
|
|
161
|
+
from lightning_sdk.lightning_cloud.openapi.models.project_id_multimachinejobs_body import ProjectIdMultimachinejobsBody
|
|
160
162
|
from lightning_sdk.lightning_cloud.openapi.models.project_id_projectclustersbindings_body import ProjectIdProjectclustersbindingsBody
|
|
161
163
|
from lightning_sdk.lightning_cloud.openapi.models.project_id_secrets_body import ProjectIdSecretsBody
|
|
162
164
|
from lightning_sdk.lightning_cloud.openapi.models.project_id_serviceexecution_body import ProjectIdServiceexecutionBody
|
|
@@ -200,6 +202,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_agent_job import V1AgentJob
|
|
|
200
202
|
from lightning_sdk.lightning_cloud.openapi.models.v1_agent_job_artifact import V1AgentJobArtifact
|
|
201
203
|
from lightning_sdk.lightning_cloud.openapi.models.v1_agent_upload_multipart_url import V1AgentUploadMultipartUrl
|
|
202
204
|
from lightning_sdk.lightning_cloud.openapi.models.v1_agent_upload_part_response import V1AgentUploadPartResponse
|
|
205
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_api_pricing_spec import V1ApiPricingSpec
|
|
203
206
|
from lightning_sdk.lightning_cloud.openapi.models.v1_app_type import V1AppType
|
|
204
207
|
from lightning_sdk.lightning_cloud.openapi.models.v1_append_logger_metrics_response import V1AppendLoggerMetricsResponse
|
|
205
208
|
from lightning_sdk.lightning_cloud.openapi.models.v1_approve_auto_join_domain_response import V1ApproveAutoJoinDomainResponse
|
|
@@ -340,6 +343,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_delete_managed_model_respon
|
|
|
340
343
|
from lightning_sdk.lightning_cloud.openapi.models.v1_delete_metrics_stream_response import V1DeleteMetricsStreamResponse
|
|
341
344
|
from lightning_sdk.lightning_cloud.openapi.models.v1_delete_model_response import V1DeleteModelResponse
|
|
342
345
|
from lightning_sdk.lightning_cloud.openapi.models.v1_delete_model_version_response import V1DeleteModelVersionResponse
|
|
346
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_delete_multi_machine_job_response import V1DeleteMultiMachineJobResponse
|
|
343
347
|
from lightning_sdk.lightning_cloud.openapi.models.v1_delete_org_membership_response import V1DeleteOrgMembershipResponse
|
|
344
348
|
from lightning_sdk.lightning_cloud.openapi.models.v1_delete_org_membership_role_binding_response import V1DeleteOrgMembershipRoleBindingResponse
|
|
345
349
|
from lightning_sdk.lightning_cloud.openapi.models.v1_delete_org_role_response import V1DeleteOrgRoleResponse
|
|
@@ -364,6 +368,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_deployment import V1Deploym
|
|
|
364
368
|
from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_event import V1DeploymentEvent
|
|
365
369
|
from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_event_type import V1DeploymentEventType
|
|
366
370
|
from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_metrics import V1DeploymentMetrics
|
|
371
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_performance import V1DeploymentPerformance
|
|
367
372
|
from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_release import V1DeploymentRelease
|
|
368
373
|
from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_spec import V1DeploymentSpec
|
|
369
374
|
from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_state import V1DeploymentState
|
|
@@ -388,9 +393,8 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_drive_status import V1Drive
|
|
|
388
393
|
from lightning_sdk.lightning_cloud.openapi.models.v1_drive_type import V1DriveType
|
|
389
394
|
from lightning_sdk.lightning_cloud.openapi.models.v1_drive_type_spec import V1DriveTypeSpec
|
|
390
395
|
from lightning_sdk.lightning_cloud.openapi.models.v1_drive_type_status import V1DriveTypeStatus
|
|
391
|
-
from lightning_sdk.lightning_cloud.openapi.models.v1_efs_folder_data_connection import V1EFSFolderDataConnection
|
|
392
396
|
from lightning_sdk.lightning_cloud.openapi.models.v1_ebs import V1Ebs
|
|
393
|
-
from lightning_sdk.lightning_cloud.openapi.models.
|
|
397
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_efs_config import V1EfsConfig
|
|
394
398
|
from lightning_sdk.lightning_cloud.openapi.models.v1_endpoint import V1Endpoint
|
|
395
399
|
from lightning_sdk.lightning_cloud.openapi.models.v1_endpoint_auth import V1EndpointAuth
|
|
396
400
|
from lightning_sdk.lightning_cloud.openapi.models.v1_endpoint_prewarm import V1EndpointPrewarm
|
|
@@ -478,6 +482,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_job_timing import V1JobTimi
|
|
|
478
482
|
from lightning_sdk.lightning_cloud.openapi.models.v1_joinable_organization import V1JoinableOrganization
|
|
479
483
|
from lightning_sdk.lightning_cloud.openapi.models.v1_keep_alive_cloud_space_instance_response import V1KeepAliveCloudSpaceInstanceResponse
|
|
480
484
|
from lightning_sdk.lightning_cloud.openapi.models.v1_knowledge_configuration import V1KnowledgeConfiguration
|
|
485
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_lambda_labs_direct_v1 import V1LambdaLabsDirectV1
|
|
481
486
|
from lightning_sdk.lightning_cloud.openapi.models.v1_lightning_app_user import V1LightningAppUser
|
|
482
487
|
from lightning_sdk.lightning_cloud.openapi.models.v1_lightning_auth import V1LightningAuth
|
|
483
488
|
from lightning_sdk.lightning_cloud.openapi.models.v1_lightning_basic_auth import V1LightningBasicAuth
|
|
@@ -552,6 +557,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_list_memberships_response i
|
|
|
552
557
|
from lightning_sdk.lightning_cloud.openapi.models.v1_list_metrics_streams_response import V1ListMetricsStreamsResponse
|
|
553
558
|
from lightning_sdk.lightning_cloud.openapi.models.v1_list_model_versions_response import V1ListModelVersionsResponse
|
|
554
559
|
from lightning_sdk.lightning_cloud.openapi.models.v1_list_models_response import V1ListModelsResponse
|
|
560
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_list_multi_machine_jobs_response import V1ListMultiMachineJobsResponse
|
|
555
561
|
from lightning_sdk.lightning_cloud.openapi.models.v1_list_new_features_for_user_response import V1ListNewFeaturesForUserResponse
|
|
556
562
|
from lightning_sdk.lightning_cloud.openapi.models.v1_list_org_members_response import V1ListOrgMembersResponse
|
|
557
563
|
from lightning_sdk.lightning_cloud.openapi.models.v1_list_org_membership_role_binding_response import V1ListOrgMembershipRoleBindingResponse
|
|
@@ -587,6 +593,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_login_response import V1Log
|
|
|
587
593
|
from lightning_sdk.lightning_cloud.openapi.models.v1_logout_request import V1LogoutRequest
|
|
588
594
|
from lightning_sdk.lightning_cloud.openapi.models.v1_logout_response import V1LogoutResponse
|
|
589
595
|
from lightning_sdk.lightning_cloud.openapi.models.v1_logs_response import V1LogsResponse
|
|
596
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_machines_selector import V1MachinesSelector
|
|
590
597
|
from lightning_sdk.lightning_cloud.openapi.models.v1_magic_link_login_request import V1MagicLinkLoginRequest
|
|
591
598
|
from lightning_sdk.lightning_cloud.openapi.models.v1_magic_link_login_response import V1MagicLinkLoginResponse
|
|
592
599
|
from lightning_sdk.lightning_cloud.openapi.models.v1_managed_endpoint import V1ManagedEndpoint
|
|
@@ -595,6 +602,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_membership import V1Members
|
|
|
595
602
|
from lightning_sdk.lightning_cloud.openapi.models.v1_message import V1Message
|
|
596
603
|
from lightning_sdk.lightning_cloud.openapi.models.v1_message_author import V1MessageAuthor
|
|
597
604
|
from lightning_sdk.lightning_cloud.openapi.models.v1_message_content import V1MessageContent
|
|
605
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_message_content_type import V1MessageContentType
|
|
598
606
|
from lightning_sdk.lightning_cloud.openapi.models.v1_metadata import V1Metadata
|
|
599
607
|
from lightning_sdk.lightning_cloud.openapi.models.v1_metric_value import V1MetricValue
|
|
600
608
|
from lightning_sdk.lightning_cloud.openapi.models.v1_metrics import V1Metrics
|
|
@@ -604,6 +612,9 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_metrics_tracker import V1Me
|
|
|
604
612
|
from lightning_sdk.lightning_cloud.openapi.models.v1_model import V1Model
|
|
605
613
|
from lightning_sdk.lightning_cloud.openapi.models.v1_model_version_archive import V1ModelVersionArchive
|
|
606
614
|
from lightning_sdk.lightning_cloud.openapi.models.v1_mount_target import V1MountTarget
|
|
615
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_multi_machine_job import V1MultiMachineJob
|
|
616
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_multi_machine_job_state import V1MultiMachineJobState
|
|
617
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_multi_machine_job_status import V1MultiMachineJobStatus
|
|
607
618
|
from lightning_sdk.lightning_cloud.openapi.models.v1_named_get_logger_metrics import V1NamedGetLoggerMetrics
|
|
608
619
|
from lightning_sdk.lightning_cloud.openapi.models.v1_network_config import V1NetworkConfig
|
|
609
620
|
from lightning_sdk.lightning_cloud.openapi.models.v1_new_feature import V1NewFeature
|
|
@@ -2197,6 +2197,7 @@ class ClusterServiceApi(object):
|
|
|
2197
2197
|
>>> result = thread.get()
|
|
2198
2198
|
|
|
2199
2199
|
:param async_req bool
|
|
2200
|
+
:param bool include_pricing:
|
|
2200
2201
|
:return: V1ListDefaultClusterAcceleratorsResponse
|
|
2201
2202
|
If the method is called asynchronously,
|
|
2202
2203
|
returns the request thread.
|
|
@@ -2217,12 +2218,13 @@ class ClusterServiceApi(object):
|
|
|
2217
2218
|
>>> result = thread.get()
|
|
2218
2219
|
|
|
2219
2220
|
:param async_req bool
|
|
2221
|
+
:param bool include_pricing:
|
|
2220
2222
|
:return: V1ListDefaultClusterAcceleratorsResponse
|
|
2221
2223
|
If the method is called asynchronously,
|
|
2222
2224
|
returns the request thread.
|
|
2223
2225
|
"""
|
|
2224
2226
|
|
|
2225
|
-
all_params = [] # noqa: E501
|
|
2227
|
+
all_params = ['include_pricing'] # noqa: E501
|
|
2226
2228
|
all_params.append('async_req')
|
|
2227
2229
|
all_params.append('_return_http_data_only')
|
|
2228
2230
|
all_params.append('_preload_content')
|
|
@@ -2243,6 +2245,8 @@ class ClusterServiceApi(object):
|
|
|
2243
2245
|
path_params = {}
|
|
2244
2246
|
|
|
2245
2247
|
query_params = []
|
|
2248
|
+
if 'include_pricing' in params:
|
|
2249
|
+
query_params.append(('includePricing', params['include_pricing'])) # noqa: E501
|
|
2246
2250
|
|
|
2247
2251
|
header_params = {}
|
|
2248
2252
|
|