lightning-sdk 0.1.3__py3-none-any.whl → 0.1.47__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 +12 -2
- lightning_sdk/agents.py +46 -0
- lightning_sdk/ai_hub.py +185 -0
- lightning_sdk/api/__init__.py +4 -0
- lightning_sdk/api/agents_api.py +107 -0
- lightning_sdk/api/ai_hub_api.py +130 -0
- lightning_sdk/api/deployment_api.py +574 -0
- lightning_sdk/api/job_api.py +328 -0
- lightning_sdk/api/lit_registry_api.py +12 -0
- lightning_sdk/api/mmt_api.py +205 -0
- lightning_sdk/api/org_api.py +1 -3
- lightning_sdk/api/studio_api.py +172 -81
- lightning_sdk/api/teamspace_api.py +237 -20
- lightning_sdk/api/user_api.py +24 -9
- lightning_sdk/api/utils.py +429 -48
- lightning_sdk/cli/ai_hub.py +49 -0
- lightning_sdk/cli/download.py +132 -0
- lightning_sdk/cli/entrypoint.py +13 -3
- lightning_sdk/cli/list.py +54 -0
- lightning_sdk/cli/run.py +206 -0
- lightning_sdk/cli/serve.py +218 -0
- lightning_sdk/cli/studios_menu.py +78 -0
- lightning_sdk/cli/teamspace_menu.py +94 -0
- lightning_sdk/cli/upload.py +79 -89
- lightning_sdk/constants.py +29 -1
- lightning_sdk/deployment/__init__.py +25 -0
- lightning_sdk/deployment/deployment.py +389 -0
- lightning_sdk/helpers.py +49 -0
- lightning_sdk/job/__init__.py +5 -0
- lightning_sdk/job/base.py +359 -0
- lightning_sdk/job/job.py +291 -0
- lightning_sdk/job/v1.py +269 -0
- lightning_sdk/job/v2.py +221 -0
- lightning_sdk/job/work.py +81 -0
- lightning_sdk/lightning_cloud/__version__.py +1 -1
- lightning_sdk/lightning_cloud/cli/__main__.py +15 -13
- lightning_sdk/lightning_cloud/env.py +1 -0
- lightning_sdk/lightning_cloud/login.py +12 -8
- lightning_sdk/lightning_cloud/openapi/__init__.py +289 -42
- lightning_sdk/lightning_cloud/openapi/api/__init__.py +10 -0
- lightning_sdk/lightning_cloud/openapi/api/analytics_service_api.py +141 -0
- lightning_sdk/lightning_cloud/openapi/api/assistants_service_api.py +1075 -227
- lightning_sdk/lightning_cloud/openapi/api/billing_service_api.py +9 -1
- lightning_sdk/lightning_cloud/openapi/api/cloud_space_service_api.py +992 -233
- lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +883 -120
- lightning_sdk/lightning_cloud/openapi/api/data_connection_service_api.py +10 -5
- lightning_sdk/lightning_cloud/openapi/api/deployment_templates_service_api.py +756 -0
- lightning_sdk/lightning_cloud/openapi/api/endpoint_service_api.py +422 -1
- lightning_sdk/lightning_cloud/openapi/api/experiments_service_api.py +242 -0
- lightning_sdk/lightning_cloud/openapi/api/file_system_service_api.py +674 -0
- lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +3823 -0
- lightning_sdk/lightning_cloud/openapi/api/lightningapp_instance_service_api.py +158 -594
- lightning_sdk/lightning_cloud/openapi/api/lightningapp_v2_service_api.py +0 -1086
- lightning_sdk/lightning_cloud/openapi/api/lightningwork_service_api.py +113 -0
- lightning_sdk/lightning_cloud/openapi/api/lit_logger_service_api.py +1753 -0
- lightning_sdk/lightning_cloud/openapi/api/lit_registry_service_api.py +343 -0
- lightning_sdk/lightning_cloud/openapi/api/models_store_api.py +1423 -108
- lightning_sdk/lightning_cloud/openapi/api/organizations_service_api.py +421 -1
- lightning_sdk/lightning_cloud/openapi/api/profiler_service_api.py +663 -0
- lightning_sdk/lightning_cloud/openapi/api/projects_service_api.py +5 -1
- lightning_sdk/lightning_cloud/openapi/api/secret_service_api.py +478 -1
- lightning_sdk/lightning_cloud/openapi/api/slurm_jobs_user_service_api.py +9 -5
- lightning_sdk/lightning_cloud/openapi/api/snowflake_service_api.py +686 -0
- lightning_sdk/lightning_cloud/openapi/api/storage_service_api.py +1094 -0
- lightning_sdk/lightning_cloud/openapi/api/studio_jobs_service_api.py +4 -4
- lightning_sdk/lightning_cloud/openapi/api/user_service_api.py +1081 -34
- lightning_sdk/lightning_cloud/openapi/models/__init__.py +279 -40
- lightning_sdk/lightning_cloud/openapi/models/affiliatelinks_id_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/agentmanagedendpoints_id_body.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/{assistants_id_body.py → agents_id_body.py} +201 -71
- lightning_sdk/lightning_cloud/openapi/models/app_id_works_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/approveautojoindomain_domain_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/apps_id_body1.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/assistant_id_conversations_body.py +1 -27
- lightning_sdk/lightning_cloud/openapi/models/{v1_get_cluster_health_response.py → captures_id_body.py} +16 -16
- lightning_sdk/lightning_cloud/openapi/models/cloud_space_id_versionpublications_body1.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/cloudspace_id_runs_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/cloudspaces_id_body.py +58 -6
- lightning_sdk/lightning_cloud/openapi/models/cluster_id_capacityblock_body.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/cluster_id_capacityreservations_body.py +55 -3
- lightning_sdk/lightning_cloud/openapi/models/cluster_id_proxies_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/create.py +157 -1
- lightning_sdk/lightning_cloud/openapi/models/create_deployment_request_defines_a_spec_for_the_job_that_allows_for_autoscaling_jobs.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/deployments_id_body.py +565 -0
- lightning_sdk/lightning_cloud/openapi/models/deploymenttemplates_id_body.py +513 -0
- lightning_sdk/lightning_cloud/openapi/models/endpoints_id_body.py +43 -17
- lightning_sdk/lightning_cloud/openapi/models/experiment_name_variant_name_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/externalv1_cloud_space_instance_status.py +107 -1
- lightning_sdk/lightning_cloud/openapi/models/externalv1_lightningapp_instance.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/externalv1_user_status.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/fileendpoints_id_body.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/id_codeconfig_body.py +29 -55
- lightning_sdk/lightning_cloud/openapi/models/id_engage_body.py +3 -29
- lightning_sdk/lightning_cloud/openapi/models/id_engage_body1.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/id_execute_body.py +3 -55
- lightning_sdk/lightning_cloud/openapi/models/id_execute_body1.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/id_get_body.py +133 -3
- lightning_sdk/lightning_cloud/openapi/models/id_index_body.py +67 -15
- lightning_sdk/lightning_cloud/openapi/models/id_index_body2.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/id_index_body3.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/id_reportlogsactivity_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/id_start_body.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/id_storage_body.py +52 -26
- lightning_sdk/lightning_cloud/openapi/models/id_visibility_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/jobs_id_body1.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/jobs_id_body2.py +17 -43
- lightning_sdk/lightning_cloud/openapi/models/jobs_id_body3.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/litloggermetrics_id_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/litpages_id_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/loggermetrics_id_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/metrics_stream_id_loggerartifacts_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/metricsstream_create_body.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_cloud_space_id_list.py → metricsstream_delete_body.py} +10 -10
- lightning_sdk/lightning_cloud/openapi/models/metricsstream_id_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_upload_model_response.py → model_id_versions_body.py} +25 -51
- lightning_sdk/lightning_cloud/openapi/models/model_id_visibility_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/models_model_id_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/multimachinejobs_id_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/org_id_memberships_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/orgs_id_body.py +183 -1
- lightning_sdk/lightning_cloud/openapi/models/profiler_captures_body.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/profiler_enabled_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_agentmanagedendpoints_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/{project_id_assistants_body.py → project_id_agents_body.py} +159 -55
- lightning_sdk/lightning_cloud/openapi/models/project_id_cloudspaces_body.py +71 -19
- lightning_sdk/lightning_cloud/openapi/models/project_id_fileendpoints_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/project_id_jobs_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_litregistry_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_memberships_body.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_upload_model_request.py → project_id_models_body.py} +70 -70
- lightning_sdk/lightning_cloud/openapi/models/project_id_multimachinejobs_body.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_secrets_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/project_id_snowflake_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/projects_id_body.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/query_query_id_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/secrets_id_body1.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/servers_server_id_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/service_artifact_artifact_kind.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/serviceexecution_id_body.py +43 -43
- lightning_sdk/lightning_cloud/openapi/models/slurm_jobs_body.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/snowflake_export_body.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_download_model_response.py → snowflake_query_body.py} +51 -51
- lightning_sdk/lightning_cloud/openapi/models/storage_complete_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/update.py +105 -1
- lightning_sdk/lightning_cloud/openapi/models/upload_id_complete_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/upload_id_parts_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/user_id_affiliatelinks_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_accelerator_quota_info.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_ack_user_storage_violation_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_add_job_timing_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_affiliate_link.py +435 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_agent_job.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_api_pricing_spec.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_app_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_append_logger_metrics_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_approve_auto_join_domain_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_assign_variant_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_assistant.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_assistant_knowledge_item_status.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_assistant_knowledge_status.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_assistant_model_status.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_auto_join_domain_validation.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_auto_join_org_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_autoscaling_spec.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_autoscaling_target_metric.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_aws_direct_v1.py +133 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_batch_update_lightningwork_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cancellation_metadata.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_capacity_block_offering.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_check_snowflake_connection_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_checkbox.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space.py +136 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_code_version.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_instance_config.py +1 -53
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_instance_startup_status.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_cluster_log_service.py → v1_cloud_space_session.py} +49 -49
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_version.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_accelerator.py +445 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_capacity_reservation.py +55 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_names.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_proxy.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_resource_tag.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_security_options.py +357 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py +157 -107
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_state.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_status.py +17 -43
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_tagging_options.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_type.py +0 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_command_argument.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_complete_model_upload_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_complete_multi_part_upload_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_completed_part.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_conversation.py +15 -15
- lightning_sdk/lightning_cloud/openapi/models/v1_conversation_response_chunk.py +26 -26
- lightning_sdk/lightning_cloud/openapi/models/v1_count_metrics_streams_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_checkout_session_request.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_create_cluster_request.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_create_deployment_template_request.py +539 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_multi_part_upload_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_organization_request.py +159 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_create_project_request.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_create_shared_metrics_stream_request.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_shared_metrics_stream_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_snowflake_connection_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_user_secret_request.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_data_connection.py +365 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_cluster_performance_profile.py → v1_data_connection_state.py} +11 -9
- lightning_sdk/lightning_cloud/openapi/models/v1_data_path.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_affiliate_link_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_cloud_space_session_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_cluster_proxy_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_container_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_deployment_release_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_azure_cluster_driver_status.py → v1_delete_deployment_response.py} +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_index_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_byom_cluster_driver.py → v1_delete_job_response.py} +6 -6
- lightning_sdk/lightning_cloud/openapi/models/{v1_delete_lightningapp_v2_response.py → v1_delete_logger_artifact_response.py} +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_managed_endpoint_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_metrics_stream_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_multi_machine_job_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_profiler_capture_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_delete_lightningapp_release_response.py → v1_delete_shared_metrics_stream_response.py} +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment.py +617 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_api.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_event.py +357 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_event_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_metrics.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_performance.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_release.py +331 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_spec.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/{get_cluster_health_response_health_status.py → v1_deployment_state.py} +11 -9
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_status.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_strategy.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template.py +721 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_engagement_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_gallery_response.py +591 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter.py +435 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter_placement.py +106 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter_type.py +106 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_summary.py +591 -0
- lightning_sdk/lightning_cloud/openapi/models/{instance_type_availability.py → v1_deployment_template_type.py} +10 -10
- lightning_sdk/lightning_cloud/openapi/models/{v1_get_lightningapp_source_code_download_url_response.py → v1_download_job_logs_response.py} +10 -10
- lightning_sdk/lightning_cloud/openapi/models/v1_download_service_execution_artifact_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_ebs.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_efs_config.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_endpoint.py +53 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_endpoint_auth.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_endpoint_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_execute_cloud_space_command_response.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_execute_in_cloud_space_session_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_execute_snowflake_query_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_experiment.py +409 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_export_snowflake_query_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_file_endpoint.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_instance_spec.py → v1_filesystem_app.py} +85 -59
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_cloud_space.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_dataset.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_job.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_slurm_job.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_snowflake_connection.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_work.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_find_capacity_block_offering_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_gcp_data_connection.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_gcs_folder_data_connection.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_affiliate_link_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_list_cluster_instance_types_response.py → v1_get_deployment_routing_telemetry_aggregated_response.py} +23 -23
- lightning_sdk/lightning_cloud/openapi/models/v1_get_deployment_routing_telemetry_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_folder_index_response.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_cluster_driver_status.py → v1_get_job_stats_response.py} +39 -39
- lightning_sdk/lightning_cloud/openapi/models/v1_get_job_system_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_lightningapp_instance_open_ports_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_logger_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_file_upload_urls_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_file_url_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_files_response.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_files_url_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_lightningwork_cluster_driver.py → v1_get_project_artifact_response.py} +33 -14
- lightning_sdk/lightning_cloud/openapi/models/v1_get_project_balance_response.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_get_project_storage_metadata_response.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_service_execution_status_response.py +67 -15
- lightning_sdk/lightning_cloud/openapi/models/v1_get_snowflake_query_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_balance_response.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_response.py +105 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_storage_breakdown_response.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_storage_response.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_google_cloud_direct_v1.py +137 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_google_cloud_direct_v1_status.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_header.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_external_kubeconfig.py → v1_health_check_exec.py} +21 -21
- lightning_sdk/lightning_cloud/openapi/models/v1_health_check_http_get.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_ids_logger_metrics.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_input.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_interrupt_server_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job.py +723 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_health_check_config.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_log_entry.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_logs_page.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_logs_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_spec.py +669 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_timing.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_joinable_organization.py +331 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_knowledge_configuration.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lambda_labs_direct_v1.py +125 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lightning_run.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningapp_instance_spec.py +105 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningapp_instance_status.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningwork_spec.py +27 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningwork_status.py +81 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_list_affiliate_links_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cloud_space_python_versions_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cloud_space_sessions_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cloud_space_tags_response.py +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cluster_availabilities_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cluster_proxies_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployment_events_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployment_releases_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployment_tags_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployment_templates_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployments_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_experiments_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_apps_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_cloud_spaces_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_datasets_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_jobs_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_slurm_jobs_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_snowflake_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_list_lightningapps_v2_response.py → v1_list_jobs_response.py} +31 -31
- lightning_sdk/lightning_cloud/openapi/models/v1_list_joinable_organizations_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_logger_artifact_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_metrics_streams_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_multi_machine_job_events_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_multi_machine_jobs_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_new_features_for_user_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_profiler_captures_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_project_locked_resources_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_published_cloud_spaces_response.py +3 -29
- lightning_sdk/lightning_cloud/openapi/models/v1_list_published_deployment_templates_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_service_execution_lightningapp_instances_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lit_page.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_lit_registry_project.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lit_repository.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_locked_resource.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_logger_artifact.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_machines_selector.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_magic_link_login_request.py +81 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_magic_link_login_response.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_managed_endpoint.py +175 -19
- lightning_sdk/lightning_cloud/openapi/models/v1_managed_model.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_managed_model_abilities.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_membership.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_message.py +138 -8
- 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_metadata.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_metric_value.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics_stream.py +799 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics_tags.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics_tracker.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_model.py +95 -17
- lightning_sdk/lightning_cloud/openapi/models/v1_model_file.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_model_version_archive.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_mount_target.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job.py +487 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_event.py +331 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_lightningapp_cluster_driver.py → v1_multi_machine_job_event_type.py} +9 -9
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_fault_tolerance.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_fault_tolerance_strategy.py +105 -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 +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_named_get_logger_metrics.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_new_feature.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_onboarding_event_request.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_onboarding_event_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_organization.py +209 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_parameterization_spec.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_path_telemetry.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_phase_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_profiler_capture.py +357 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_profiler_enabled_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_project.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_project_membership.py +263 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_project_settings.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_project_storage.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_published_cloud_space_response.py +188 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_purchase_capacity_block_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_query_param.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_query_result.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_query_result_row.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_refresh_path_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_regional_load_balancer.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_report_logs_activity_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_request_cluster_access_request.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_request_cluster_access_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_cloud_space_tag.py → v1_resource_tag.py} +18 -18
- lightning_sdk/lightning_cloud/openapi/models/{appsv2_id_body.py → v1_resource_visibility.py} +37 -37
- lightning_sdk/lightning_cloud/openapi/models/v1_resources.py +37 -11
- lightning_sdk/lightning_cloud/openapi/models/v1_restore_deployment_release_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_rolling_update_strategy.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_rule_condition.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_rule_resource.py +11 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_s3_folder_data_connection.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_search_job_logs_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_secret.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_secret_type.py +105 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_select.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_server_check_in_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_service_artifact.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_service_execution.py +43 -43
- lightning_sdk/lightning_cloud/openapi/models/v1_should_start_syncing_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_signed_url.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_slurm_job.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_slurm_node.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_slurm_v1.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_snowflake_data_connection.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_status_code_telemetry.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_storage_asset.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_storage_asset_type.py +105 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_studio_job_app.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_system_info.py +617 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_telemetry.py +331 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_timestamp_code_telemetry.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_transaction.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_transfer_user_balance_request.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_update_billing_subscription_request.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_update_cluster_accelerators_request.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_index_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_metrics_stream_visibility_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_model_visibility_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_shared_metrics_stream_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_snowflake_query_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_user_request.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_update_user_viewed_new_features_request.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_user_viewed_new_features_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_upstream_cloud_space.py +97 -19
- lightning_sdk/lightning_cloud/openapi/models/v1_upstream_job.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_usage.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_usage_details.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +1032 -330
- lightning_sdk/lightning_cloud/openapi/models/v1_user_requested_compute_config.py +45 -45
- lightning_sdk/lightning_cloud/openapi/models/v1_user_requested_flow_compute_config.py +29 -29
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_assistant_status_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_auto_join_domain_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_data_connection_response.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_deployment_image_request.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_deployment_image_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_managed_endpoint_request.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_managed_endpoint_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_managed_model_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_volume.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_vultr_direct_v1.py +125 -0
- lightning_sdk/lightning_cloud/openapi/models/validate.py +97 -19
- lightning_sdk/lightning_cloud/openapi/models/validateautojoindomain_domain_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/version_uploads_body.py +123 -0
- lightning_sdk/lightning_cloud/rest_client.py +47 -23
- lightning_sdk/lightning_cloud/source_code/logs_socket_api.py +1 -1
- lightning_sdk/lightning_cloud/source_code/tar.py +1 -3
- lightning_sdk/lightning_cloud/utils/data_connection.py +144 -7
- lightning_sdk/lit_registry.py +39 -0
- lightning_sdk/machine.py +21 -4
- lightning_sdk/mmt/__init__.py +4 -0
- lightning_sdk/mmt/base.py +326 -0
- lightning_sdk/mmt/mmt.py +306 -0
- lightning_sdk/mmt/v1.py +209 -0
- lightning_sdk/mmt/v2.py +221 -0
- lightning_sdk/models.py +153 -0
- lightning_sdk/organization.py +1 -1
- lightning_sdk/plugin.py +207 -41
- lightning_sdk/services/__init__.py +2 -1
- lightning_sdk/services/file_endpoint.py +116 -213
- lightning_sdk/services/finetune/__init__.py +13 -15
- lightning_sdk/services/utilities.py +99 -26
- lightning_sdk/status.py +11 -6
- lightning_sdk/studio.py +90 -17
- lightning_sdk/teamspace.py +240 -12
- lightning_sdk/user.py +1 -1
- lightning_sdk/utils/__init__.py +0 -0
- lightning_sdk/utils/dynamic.py +61 -0
- lightning_sdk/utils/enum.py +116 -0
- lightning_sdk/{utils.py → utils/resolve.py} +41 -4
- lightning_sdk-0.1.47.dist-info/LICENSE +21 -0
- {lightning_sdk-0.1.3.dist-info → lightning_sdk-0.1.47.dist-info}/METADATA +30 -4
- {lightning_sdk-0.1.3.dist-info → lightning_sdk-0.1.47.dist-info}/RECORD +487 -204
- {lightning_sdk-0.1.3.dist-info → lightning_sdk-0.1.47.dist-info}/WHEEL +1 -1
- lightning_sdk/lightning_cloud/openapi/models/app_id_releases_body.py +0 -541
- lightning_sdk/lightning_cloud/openapi/models/id_endpoint_body.py +0 -409
- lightning_sdk/lightning_cloud/openapi/models/id_get_body1.py +0 -333
- lightning_sdk/lightning_cloud/openapi/models/project_id_appsv2_body.py +0 -201
- lightning_sdk/lightning_cloud/openapi/models/v1_aws_cluster_driver_spec.py +0 -1039
- lightning_sdk/lightning_cloud/openapi/models/v1_aws_cluster_secondary_region_spec.py +0 -253
- lightning_sdk/lightning_cloud/openapi/models/v1_azure_cluster_driver_spec.py +0 -227
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_driver.py +0 -175
- lightning_sdk/lightning_cloud/openapi/models/v1_container_resources.py +0 -201
- lightning_sdk/lightning_cloud/openapi/models/v1_eks_custer_driver_status.py +0 -387
- lightning_sdk/lightning_cloud/openapi/models/v1_instance_type.py +0 -305
- lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_cluster_driver.py +0 -359
- lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_cluster_status.py +0 -279
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningapp_release.py +0 -697
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningapp_v2.py +0 -331
- lightning_sdk/services/uploader.py +0 -123
- {lightning_sdk-0.1.3.dist-info → lightning_sdk-0.1.47.dist-info}/entry_points.txt +0 -0
- {lightning_sdk-0.1.3.dist-info → lightning_sdk-0.1.47.dist-info}/top_level.txt +0 -0
lightning_sdk/api/utils.py
CHANGED
|
@@ -1,23 +1,42 @@
|
|
|
1
|
+
import concurrent.futures
|
|
2
|
+
import errno
|
|
1
3
|
import math
|
|
2
4
|
import os
|
|
5
|
+
import re
|
|
3
6
|
from concurrent.futures import ThreadPoolExecutor
|
|
4
7
|
from functools import partial
|
|
5
|
-
from
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, Dict, List, Optional, Tuple, Union
|
|
6
10
|
|
|
7
11
|
import backoff
|
|
8
12
|
import requests
|
|
9
|
-
from tqdm import tqdm
|
|
10
|
-
from tqdm.utils import CallbackIOWrapper
|
|
13
|
+
from tqdm.auto import tqdm
|
|
11
14
|
|
|
15
|
+
from lightning_sdk.constants import __GLOBAL_LIGHTNING_UNIQUE_IDS_STORE__, _LIGHTNING_DEBUG
|
|
12
16
|
from lightning_sdk.lightning_cloud.openapi import (
|
|
17
|
+
CloudSpaceServiceApi,
|
|
18
|
+
Externalv1LightningappInstance,
|
|
19
|
+
ModelsStoreApi,
|
|
13
20
|
ProjectIdStorageBody,
|
|
14
21
|
StorageCompleteBody,
|
|
22
|
+
UploadIdCompleteBody,
|
|
23
|
+
UploadIdPartsBody,
|
|
15
24
|
UploadsUploadIdBody,
|
|
25
|
+
V1CompletedPart,
|
|
16
26
|
V1CompleteUpload,
|
|
17
27
|
V1PresignedUrl,
|
|
28
|
+
V1SignedUrl,
|
|
18
29
|
V1UploadProjectArtifactPartsResponse,
|
|
19
30
|
V1UploadProjectArtifactResponse,
|
|
31
|
+
VersionUploadsBody,
|
|
20
32
|
)
|
|
33
|
+
from lightning_sdk.lightning_cloud.openapi.models.v1_model_version_archive import V1ModelVersionArchive
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
from lightning_sdk.lightning_cloud.openapi import AppsIdBody1 as AppsIdBody
|
|
37
|
+
except ImportError:
|
|
38
|
+
from lightning_sdk.lightning_cloud.openapi import AppsIdBody
|
|
39
|
+
from lightning_sdk.lightning_cloud.openapi.rest import ApiException
|
|
21
40
|
from lightning_sdk.lightning_cloud.rest_client import LightningClient
|
|
22
41
|
from lightning_sdk.machine import Machine
|
|
23
42
|
|
|
@@ -48,20 +67,19 @@ class _FileUploader:
|
|
|
48
67
|
def __init__(
|
|
49
68
|
self,
|
|
50
69
|
client: LightningClient,
|
|
51
|
-
studio_id: str,
|
|
52
70
|
teamspace_id: str,
|
|
53
|
-
|
|
71
|
+
cloud_account: str,
|
|
54
72
|
file_path: str,
|
|
55
73
|
remote_path: str,
|
|
56
74
|
progress_bar: bool,
|
|
57
75
|
) -> None:
|
|
58
76
|
self.client = client
|
|
59
77
|
self.teamspace_id = teamspace_id
|
|
60
|
-
self.
|
|
78
|
+
self.cloud_account = cloud_account
|
|
61
79
|
|
|
62
80
|
self.local_path = file_path
|
|
63
81
|
|
|
64
|
-
self.remote_path =
|
|
82
|
+
self.remote_path = remote_path
|
|
65
83
|
self.multipart_threshold = int(os.environ.get("LIGHTNING_MULTIPART_THRESHOLD", _MAX_SIZE_MULTI_PART_CHUNK))
|
|
66
84
|
self.filesize = os.path.getsize(file_path)
|
|
67
85
|
if progress_bar:
|
|
@@ -87,42 +105,140 @@ class _FileUploader:
|
|
|
87
105
|
"""
|
|
88
106
|
count = 1 if self.filesize <= self.multipart_threshold else math.ceil(self.filesize / self.chunk_size)
|
|
89
107
|
|
|
90
|
-
if count == 1:
|
|
91
|
-
return self._singlepart_upload()
|
|
92
|
-
|
|
93
108
|
return self._multipart_upload(count=count)
|
|
94
109
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
resp: V1UploadProjectArtifactResponse = self.client.lightningapp_instance_service_upload_project_artifact(
|
|
110
|
+
def _multipart_upload(self, count: int) -> None:
|
|
111
|
+
"""Does a parallel multipart upload."""
|
|
112
|
+
body = ProjectIdStorageBody(cluster_id=self.cloud_account, filename=self.remote_path)
|
|
113
|
+
resp: V1UploadProjectArtifactResponse = self.client.storage_service_upload_project_artifact(
|
|
100
114
|
body=body, project_id=self.teamspace_id
|
|
101
115
|
)
|
|
102
116
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
117
|
+
# get indices for each batch, part numbers start at 1
|
|
118
|
+
batched_indices = [
|
|
119
|
+
list(range(i + 1, min(i + self.batch_size + 1, count + 1))) for i in range(0, count, self.batch_size)
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
completed: List[V1CompleteUpload] = []
|
|
123
|
+
with ThreadPoolExecutor(self.max_workers) as p:
|
|
124
|
+
for batch in batched_indices:
|
|
125
|
+
completed.extend(self._process_upload_batch(executor=p, batch=batch, upload_id=resp.upload_id))
|
|
126
|
+
|
|
127
|
+
completed_body = StorageCompleteBody(
|
|
128
|
+
cluster_id=self.cloud_account, filename=self.remote_path, parts=completed, upload_id=resp.upload_id
|
|
129
|
+
)
|
|
130
|
+
self.client.storage_service_complete_upload_project_artifact(body=completed_body, project_id=self.teamspace_id)
|
|
131
|
+
|
|
132
|
+
def _process_upload_batch(self, executor: ThreadPoolExecutor, batch: List[int], upload_id: str) -> None:
|
|
133
|
+
"""Uploads a single batch of chunks in parallel."""
|
|
134
|
+
urls = self._request_urls(parts=batch, upload_id=upload_id)
|
|
135
|
+
func = partial(self._handle_uploading_single_part, upload_id=upload_id)
|
|
136
|
+
return executor.map(func, urls)
|
|
137
|
+
|
|
138
|
+
def _request_urls(self, parts: List[int], upload_id: str) -> List[V1PresignedUrl]:
|
|
139
|
+
"""Requests urls for a batch of parts."""
|
|
140
|
+
body = UploadsUploadIdBody(cluster_id=self.cloud_account, filename=self.remote_path, parts=parts)
|
|
141
|
+
resp: V1UploadProjectArtifactPartsResponse = self.client.storage_service_upload_project_artifact_parts(
|
|
142
|
+
body, self.teamspace_id, upload_id
|
|
143
|
+
)
|
|
144
|
+
return resp.urls
|
|
145
|
+
|
|
146
|
+
def _handle_uploading_single_part(self, presigned_url: V1PresignedUrl, upload_id: str) -> V1CompleteUpload:
|
|
147
|
+
"""Uploads a single part of a multipart upload including retires with backoff."""
|
|
148
|
+
try:
|
|
149
|
+
return self._handle_upload_presigned_url(
|
|
150
|
+
presigned_url=presigned_url,
|
|
106
151
|
)
|
|
152
|
+
except Exception:
|
|
153
|
+
return self._error_handling_upload(part=presigned_url.part_number, upload_id=upload_id)
|
|
154
|
+
|
|
155
|
+
def _handle_upload_presigned_url(self, presigned_url: V1PresignedUrl) -> V1CompleteUpload:
|
|
156
|
+
"""Straightforward uploads the part given a single url."""
|
|
157
|
+
with open(self.local_path, "rb") as f:
|
|
158
|
+
f.seek((int(presigned_url.part_number) - 1) * self.chunk_size)
|
|
159
|
+
data = f.read(self.chunk_size)
|
|
107
160
|
|
|
108
|
-
|
|
161
|
+
response = requests.put(presigned_url.url, data=data)
|
|
109
162
|
response.raise_for_status()
|
|
163
|
+
if self.progress_bar is not None:
|
|
164
|
+
self.progress_bar.update(len(data))
|
|
110
165
|
|
|
111
166
|
etag = response.headers.get("ETag")
|
|
112
|
-
|
|
167
|
+
return V1CompleteUpload(etag=etag, part_number=presigned_url.part_number)
|
|
113
168
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
self.
|
|
118
|
-
|
|
169
|
+
@backoff.on_exception(backoff.expo, (requests.exceptions.HTTPError), max_tries=10)
|
|
170
|
+
def _error_handling_upload(self, part: int, upload_id: str) -> V1CompleteUpload:
|
|
171
|
+
"""Retries uploading with re-requesting the url."""
|
|
172
|
+
urls = self._request_urls(
|
|
173
|
+
parts=[part],
|
|
174
|
+
upload_id=upload_id,
|
|
119
175
|
)
|
|
176
|
+
if len(urls) != 1:
|
|
177
|
+
raise ValueError(
|
|
178
|
+
f"expected to get exactly one url, but got {len(urls)} for part {part} of {self.remote_path}"
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
return self._handle_upload_presigned_url(presigned_url=urls[0])
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class _ModelFileUploader:
|
|
185
|
+
"""A class handling the upload of model artifacts.
|
|
186
|
+
|
|
187
|
+
Supports parallelized multi-part uploads.
|
|
188
|
+
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
def __init__(
|
|
192
|
+
self,
|
|
193
|
+
client: LightningClient,
|
|
194
|
+
model_id: str,
|
|
195
|
+
version: str,
|
|
196
|
+
teamspace_id: str,
|
|
197
|
+
cloud_account: str,
|
|
198
|
+
file_path: str,
|
|
199
|
+
remote_path: str,
|
|
200
|
+
progress_bar: bool,
|
|
201
|
+
) -> None:
|
|
202
|
+
self.client = client
|
|
203
|
+
self.model_id = model_id
|
|
204
|
+
self.version = version
|
|
205
|
+
self.teamspace_id = teamspace_id
|
|
206
|
+
self.local_path = file_path
|
|
207
|
+
self.remote_path = remote_path
|
|
208
|
+
|
|
209
|
+
self.api = ModelsStoreApi(client.api_client)
|
|
210
|
+
self.multipart_threshold = int(os.environ.get("LIGHTNING_MULTIPART_THRESHOLD", _MAX_SIZE_MULTI_PART_CHUNK))
|
|
211
|
+
self.filesize = os.path.getsize(file_path)
|
|
212
|
+
if progress_bar:
|
|
213
|
+
self.progress_bar = tqdm(
|
|
214
|
+
desc=f"Uploading {os.path.split(file_path)[1]}",
|
|
215
|
+
total=self.filesize,
|
|
216
|
+
unit="B",
|
|
217
|
+
unit_scale=True,
|
|
218
|
+
unit_divisor=1000,
|
|
219
|
+
position=1,
|
|
220
|
+
leave=False,
|
|
221
|
+
)
|
|
222
|
+
else:
|
|
223
|
+
self.progress_bar = None
|
|
224
|
+
self.chunk_size = int(os.environ.get("LIGHTNING_MULTI_PART_PART_SIZE", _MAX_SIZE_MULTI_PART_CHUNK))
|
|
225
|
+
assert self.chunk_size < _SIZE_LIMIT_SINGLE_PART
|
|
226
|
+
self.max_workers = int(os.environ.get("LIGHTNING_MULTI_PART_MAX_WORKERS", _MAX_WORKERS))
|
|
227
|
+
self.batch_size = int(os.environ.get("LIGHTNING_MULTI_PART_BATCH_SIZE", _MAX_BATCH_SIZE))
|
|
228
|
+
|
|
229
|
+
def __call__(self) -> None:
|
|
230
|
+
"""Does the actual uploading."""
|
|
231
|
+
count = 1 if self.filesize <= self.multipart_threshold else math.ceil(self.filesize / self.chunk_size)
|
|
232
|
+
return self._multipart_upload(count=count)
|
|
120
233
|
|
|
121
234
|
def _multipart_upload(self, count: int) -> None:
|
|
122
235
|
"""Does a parallel multipart upload."""
|
|
123
|
-
body =
|
|
124
|
-
resp
|
|
125
|
-
body
|
|
236
|
+
body = VersionUploadsBody(filepath=self.remote_path)
|
|
237
|
+
resp = self.api.models_store_create_multi_part_upload(
|
|
238
|
+
body,
|
|
239
|
+
project_id=self.teamspace_id,
|
|
240
|
+
model_id=self.model_id,
|
|
241
|
+
version=self.version,
|
|
126
242
|
)
|
|
127
243
|
|
|
128
244
|
# get indices for each batch, part numbers start at 1
|
|
@@ -130,16 +246,18 @@ class _FileUploader:
|
|
|
130
246
|
list(range(i + 1, min(i + self.batch_size + 1, count + 1))) for i in range(0, count, self.batch_size)
|
|
131
247
|
]
|
|
132
248
|
|
|
133
|
-
completed: List[
|
|
249
|
+
completed: List[V1CompletedPart] = []
|
|
134
250
|
with ThreadPoolExecutor(self.max_workers) as p:
|
|
135
251
|
for batch in batched_indices:
|
|
136
252
|
completed.extend(self._process_upload_batch(executor=p, batch=batch, upload_id=resp.upload_id))
|
|
137
253
|
|
|
138
|
-
completed_body =
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
254
|
+
completed_body = UploadIdCompleteBody(filepath=self.remote_path, parts=completed)
|
|
255
|
+
self.api.models_store_complete_multi_part_upload(
|
|
256
|
+
completed_body,
|
|
257
|
+
project_id=self.teamspace_id,
|
|
258
|
+
model_id=self.model_id,
|
|
259
|
+
version=self.version,
|
|
260
|
+
upload_id=resp.upload_id,
|
|
143
261
|
)
|
|
144
262
|
|
|
145
263
|
def _process_upload_batch(self, executor: ThreadPoolExecutor, batch: List[int], upload_id: str) -> None:
|
|
@@ -148,15 +266,19 @@ class _FileUploader:
|
|
|
148
266
|
func = partial(self._handle_uploading_single_part, upload_id=upload_id)
|
|
149
267
|
return executor.map(func, urls)
|
|
150
268
|
|
|
151
|
-
def _request_urls(self, parts: List[int], upload_id: str) -> List[
|
|
269
|
+
def _request_urls(self, parts: List[int], upload_id: str) -> List[V1SignedUrl]:
|
|
152
270
|
"""Requests urls for a batch of parts."""
|
|
153
|
-
body =
|
|
154
|
-
resp
|
|
155
|
-
|
|
271
|
+
body = UploadIdPartsBody(filepath=self.remote_path, parts=parts)
|
|
272
|
+
resp = self.api.models_store_get_model_file_upload_urls(
|
|
273
|
+
body,
|
|
274
|
+
project_id=self.teamspace_id,
|
|
275
|
+
model_id=self.model_id,
|
|
276
|
+
version=self.version,
|
|
277
|
+
upload_id=upload_id,
|
|
156
278
|
)
|
|
157
279
|
return resp.urls
|
|
158
280
|
|
|
159
|
-
def _handle_uploading_single_part(self, presigned_url:
|
|
281
|
+
def _handle_uploading_single_part(self, presigned_url: V1SignedUrl, upload_id: str) -> V1CompletedPart:
|
|
160
282
|
"""Uploads a single part of a multipart upload including retires with backoff."""
|
|
161
283
|
try:
|
|
162
284
|
return self._handle_upload_presigned_url(
|
|
@@ -165,7 +287,7 @@ class _FileUploader:
|
|
|
165
287
|
except Exception:
|
|
166
288
|
return self._error_handling_upload(part=presigned_url.part_number, upload_id=upload_id)
|
|
167
289
|
|
|
168
|
-
def _handle_upload_presigned_url(self, presigned_url:
|
|
290
|
+
def _handle_upload_presigned_url(self, presigned_url: V1SignedUrl) -> V1CompletedPart:
|
|
169
291
|
"""Straightforward uploads the part given a single url."""
|
|
170
292
|
with open(self.local_path, "rb") as f:
|
|
171
293
|
f.seek((int(presigned_url.part_number) - 1) * self.chunk_size)
|
|
@@ -174,13 +296,13 @@ class _FileUploader:
|
|
|
174
296
|
response = requests.put(presigned_url.url, data=data)
|
|
175
297
|
response.raise_for_status()
|
|
176
298
|
if self.progress_bar is not None:
|
|
177
|
-
self.progress_bar.update(
|
|
299
|
+
self.progress_bar.update(len(data))
|
|
178
300
|
|
|
179
301
|
etag = response.headers.get("ETag")
|
|
180
|
-
return
|
|
302
|
+
return V1CompletedPart(etag=etag, part_number=presigned_url.part_number)
|
|
181
303
|
|
|
182
304
|
@backoff.on_exception(backoff.expo, (requests.exceptions.HTTPError), max_tries=10)
|
|
183
|
-
def _error_handling_upload(self, part: int, upload_id: str) ->
|
|
305
|
+
def _error_handling_upload(self, part: int, upload_id: str) -> V1CompletedPart:
|
|
184
306
|
"""Retries uploading with re-requesting the url."""
|
|
185
307
|
urls = self._request_urls(
|
|
186
308
|
parts=[part],
|
|
@@ -200,19 +322,35 @@ class _DummyResponse:
|
|
|
200
322
|
|
|
201
323
|
|
|
202
324
|
# TODO: This should really come from some kind of metadata service
|
|
203
|
-
# TODO: Add trainium instances once feature flag is lifted
|
|
204
325
|
_MACHINE_TO_COMPUTE_NAME: Dict[Machine, str] = {
|
|
326
|
+
Machine.CPU_SMALL: "m3.medium",
|
|
205
327
|
Machine.CPU: "cpu-4",
|
|
206
|
-
Machine.DATA_PREP: "data-large
|
|
328
|
+
Machine.DATA_PREP: "data-large",
|
|
329
|
+
Machine.DATA_PREP_MAX: "data-max",
|
|
330
|
+
Machine.DATA_PREP_ULTRA: "data-ultra",
|
|
207
331
|
Machine.T4: "g4dn.2xlarge",
|
|
208
332
|
Machine.T4_X_4: "g4dn.12xlarge",
|
|
209
|
-
Machine.
|
|
210
|
-
Machine.
|
|
333
|
+
Machine.L4: "g6.4xlarge",
|
|
334
|
+
Machine.L4_X_4: "g6.12xlarge",
|
|
335
|
+
Machine.L4_X_8: "g6.48xlarge",
|
|
211
336
|
Machine.A10G: "g5.8xlarge",
|
|
212
337
|
Machine.A10G_X_4: "g5.12xlarge",
|
|
338
|
+
Machine.A10G_X_8: "g5.48xlarge",
|
|
339
|
+
Machine.L40S: "g6e.4xlarge",
|
|
340
|
+
Machine.L40S_X_4: "g6e.12xlarge",
|
|
341
|
+
Machine.L40S_X_8: "g6e.48xlarge",
|
|
213
342
|
Machine.A100_X_8: "p4d.24xlarge",
|
|
343
|
+
Machine.H100_X_8: "p5.48xlarge",
|
|
344
|
+
Machine.H200_X_8: "p5e.48xlarge",
|
|
214
345
|
}
|
|
215
346
|
|
|
347
|
+
|
|
348
|
+
def _machine_to_compute_name(machine: Union[Machine, str]) -> str:
|
|
349
|
+
if isinstance(machine, Machine):
|
|
350
|
+
return _MACHINE_TO_COMPUTE_NAME[machine]
|
|
351
|
+
return machine
|
|
352
|
+
|
|
353
|
+
|
|
216
354
|
_COMPUTE_NAME_TO_MACHINE: Dict[str, Machine] = {v: k for k, v in _MACHINE_TO_COMPUTE_NAME.items()}
|
|
217
355
|
|
|
218
356
|
_DEFAULT_CLOUD_URL = "https://lightning.ai:443"
|
|
@@ -224,5 +362,248 @@ def _get_cloud_url() -> str:
|
|
|
224
362
|
return cloud_url
|
|
225
363
|
|
|
226
364
|
|
|
227
|
-
def
|
|
365
|
+
def _sanitize_studio_remote_path(path: str, studio_id: str) -> str:
|
|
228
366
|
return f"/cloudspaces/{studio_id}/code/content/{path.replace('/teamspace/studios/this_studio/', '')}"
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
_DOWNLOAD_REQUEST_CHUNK_SIZE = 10 * _BYTES_PER_MB
|
|
370
|
+
_DOWNLOAD_MIN_CHUNK_SIZE = 100 * _BYTES_PER_KB
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
class _FileDownloader:
|
|
374
|
+
def __init__(
|
|
375
|
+
self,
|
|
376
|
+
client: LightningClient,
|
|
377
|
+
model_id: str,
|
|
378
|
+
version: str,
|
|
379
|
+
teamspace_id: str,
|
|
380
|
+
remote_path: str,
|
|
381
|
+
file_path: str,
|
|
382
|
+
executor: ThreadPoolExecutor,
|
|
383
|
+
num_workers: int = 20,
|
|
384
|
+
progress_bar: Optional[tqdm] = None,
|
|
385
|
+
) -> None:
|
|
386
|
+
self.api = ModelsStoreApi(client.api_client)
|
|
387
|
+
self.model_id = model_id
|
|
388
|
+
self.version = version
|
|
389
|
+
self.teamspace_id = teamspace_id
|
|
390
|
+
self.local_path = file_path
|
|
391
|
+
self.remote_path = remote_path
|
|
392
|
+
self.progress_bar = progress_bar
|
|
393
|
+
self.num_workers = num_workers
|
|
394
|
+
self._url = ""
|
|
395
|
+
self._size = 0
|
|
396
|
+
self.executor = executor
|
|
397
|
+
|
|
398
|
+
@backoff.on_exception(backoff.expo, ApiException, max_tries=10)
|
|
399
|
+
def refresh(self) -> None:
|
|
400
|
+
response = self.api.models_store_get_model_file_url(
|
|
401
|
+
project_id=self.teamspace_id, model_id=self.model_id, version=self.version, filepath=self.remote_path
|
|
402
|
+
)
|
|
403
|
+
self._url = response.url
|
|
404
|
+
self._size = int(response.size)
|
|
405
|
+
|
|
406
|
+
@property
|
|
407
|
+
def url(self) -> str:
|
|
408
|
+
return self._url
|
|
409
|
+
|
|
410
|
+
@property
|
|
411
|
+
def size(self) -> int:
|
|
412
|
+
return self._size
|
|
413
|
+
|
|
414
|
+
def update_progress(self, n: int) -> None:
|
|
415
|
+
if self.progress_bar is None:
|
|
416
|
+
return
|
|
417
|
+
self.progress_bar.update(n)
|
|
418
|
+
|
|
419
|
+
@backoff.on_exception(backoff.expo, (requests.exceptions.HTTPError), max_tries=10)
|
|
420
|
+
def _download_chunk(self, filename: str, start_end: Tuple[int]) -> None:
|
|
421
|
+
start, end = start_end
|
|
422
|
+
headers = {"Range": f"bytes={start}-{end}"}
|
|
423
|
+
|
|
424
|
+
with requests.get(self.url, headers=headers, stream=True) as response:
|
|
425
|
+
if response.status_code in [200, 206]:
|
|
426
|
+
with open(filename, "r+b") as f:
|
|
427
|
+
f.seek(start)
|
|
428
|
+
for chunk in response.iter_content(chunk_size=_DOWNLOAD_REQUEST_CHUNK_SIZE):
|
|
429
|
+
f.write(chunk)
|
|
430
|
+
self.update_progress(len(chunk)) # tqdm write is thread-safe
|
|
431
|
+
if response.status_code == 403: # Expired
|
|
432
|
+
self.refresh()
|
|
433
|
+
response.raise_for_status()
|
|
434
|
+
|
|
435
|
+
def _create_empty_file(self, filename: str, file_size: int) -> None:
|
|
436
|
+
if hasattr(os, "posix_fallocate"):
|
|
437
|
+
fd = os.open(filename, os.O_RDWR | os.O_CREAT)
|
|
438
|
+
if file_size > 0:
|
|
439
|
+
os.posix_fallocate(fd, 0, file_size)
|
|
440
|
+
os.close(fd)
|
|
441
|
+
else:
|
|
442
|
+
with open(filename, "wb") as f:
|
|
443
|
+
block_size = 1024 * 1024
|
|
444
|
+
for _ in range(file_size // block_size):
|
|
445
|
+
f.write(b"\x00" * block_size)
|
|
446
|
+
|
|
447
|
+
remaining_size = file_size % block_size
|
|
448
|
+
|
|
449
|
+
if remaining_size > 0:
|
|
450
|
+
f.write(b"\x00" * remaining_size)
|
|
451
|
+
|
|
452
|
+
def _multipart_download(self, filename: str, num_workers: int) -> None:
|
|
453
|
+
num_chunks = num_workers
|
|
454
|
+
chunk_size = math.ceil(self.size / num_chunks)
|
|
455
|
+
|
|
456
|
+
if chunk_size < _DOWNLOAD_MIN_CHUNK_SIZE:
|
|
457
|
+
num_chunks = math.ceil(self.size / _DOWNLOAD_MIN_CHUNK_SIZE)
|
|
458
|
+
chunk_size = _DOWNLOAD_MIN_CHUNK_SIZE
|
|
459
|
+
|
|
460
|
+
ranges = []
|
|
461
|
+
for part_number in range(num_chunks):
|
|
462
|
+
start = part_number * chunk_size
|
|
463
|
+
end = min(start + chunk_size - 1, self.size - 1)
|
|
464
|
+
ranges.append((start, end))
|
|
465
|
+
|
|
466
|
+
futures = [self.executor.submit(self._download_chunk, filename, r) for r in ranges]
|
|
467
|
+
concurrent.futures.wait(futures)
|
|
468
|
+
|
|
469
|
+
def download(self) -> None:
|
|
470
|
+
self.refresh()
|
|
471
|
+
|
|
472
|
+
tmp_filename = f"{self.local_path}.download"
|
|
473
|
+
|
|
474
|
+
try:
|
|
475
|
+
self._create_empty_file(tmp_filename, self.size)
|
|
476
|
+
except OSError as e:
|
|
477
|
+
if e.errno == errno.ENOSPC:
|
|
478
|
+
print(f"Tried to create {self.local_path} of size {self.size}, but no space left on device.")
|
|
479
|
+
else:
|
|
480
|
+
print(f"An error occurred while creating file {self.local_path}: {e}.")
|
|
481
|
+
|
|
482
|
+
os.remove(tmp_filename)
|
|
483
|
+
raise
|
|
484
|
+
|
|
485
|
+
if self.size == 0:
|
|
486
|
+
os.rename(tmp_filename, self.local_path)
|
|
487
|
+
return
|
|
488
|
+
|
|
489
|
+
try:
|
|
490
|
+
self._multipart_download(tmp_filename, self.num_workers)
|
|
491
|
+
except Exception as e:
|
|
492
|
+
print(f"An error occurred while downloading file {self.remote_path}: {e}.")
|
|
493
|
+
|
|
494
|
+
os.remove(tmp_filename)
|
|
495
|
+
raise
|
|
496
|
+
|
|
497
|
+
os.rename(tmp_filename, self.local_path)
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
def _get_model_version(client: LightningClient, teamspace_id: str, name: str, version: str) -> V1ModelVersionArchive:
|
|
501
|
+
api = ModelsStoreApi(client.api_client)
|
|
502
|
+
models = api.models_store_list_models(project_id=teamspace_id, name=name).models
|
|
503
|
+
if not models:
|
|
504
|
+
raise ValueError(f"Model `{name}` does not exist")
|
|
505
|
+
elif len(models) > 1:
|
|
506
|
+
raise ValueError("Multiple models with the same name found")
|
|
507
|
+
if version == "latest":
|
|
508
|
+
return models[0].latest_version
|
|
509
|
+
versions = api.models_store_list_model_versions(project_id=teamspace_id, model_id=models[0].id).versions
|
|
510
|
+
if not versions:
|
|
511
|
+
raise ValueError(f"Model `{name}` does not have any versions")
|
|
512
|
+
for ver in versions:
|
|
513
|
+
if ver.version == version:
|
|
514
|
+
return ver
|
|
515
|
+
raise ValueError(f"Model `{name}` does not have version `{version}`")
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
def _download_model_files(
|
|
519
|
+
client: LightningClient,
|
|
520
|
+
teamspace_name: str,
|
|
521
|
+
teamspace_owner_name: str,
|
|
522
|
+
name: str,
|
|
523
|
+
version: str,
|
|
524
|
+
download_dir: Path,
|
|
525
|
+
progress_bar: bool,
|
|
526
|
+
num_workers: int = 20,
|
|
527
|
+
) -> List[str]:
|
|
528
|
+
api = ModelsStoreApi(client.api_client)
|
|
529
|
+
response = api.models_store_get_model_files(
|
|
530
|
+
project_name=teamspace_name, project_owner_name=teamspace_owner_name, name=name, version=version
|
|
531
|
+
)
|
|
532
|
+
|
|
533
|
+
pbar = None
|
|
534
|
+
if progress_bar:
|
|
535
|
+
pbar = tqdm(
|
|
536
|
+
desc=f"Downloading {version}",
|
|
537
|
+
unit="B",
|
|
538
|
+
total=float(response.size_bytes),
|
|
539
|
+
unit_scale=True,
|
|
540
|
+
unit_divisor=1000,
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
with ThreadPoolExecutor(max_workers=min(num_workers, len(response.filepaths))) as file_executor, ThreadPoolExecutor(
|
|
544
|
+
max_workers=num_workers
|
|
545
|
+
) as part_executor:
|
|
546
|
+
futures = []
|
|
547
|
+
|
|
548
|
+
for filepath in response.filepaths:
|
|
549
|
+
local_file = download_dir / filepath
|
|
550
|
+
local_file.parent.mkdir(parents=True, exist_ok=True)
|
|
551
|
+
|
|
552
|
+
file_downloader = _FileDownloader(
|
|
553
|
+
client=client,
|
|
554
|
+
model_id=response.model_id,
|
|
555
|
+
version=response.version,
|
|
556
|
+
teamspace_id=response.project_id,
|
|
557
|
+
remote_path=filepath,
|
|
558
|
+
file_path=str(local_file),
|
|
559
|
+
num_workers=num_workers,
|
|
560
|
+
progress_bar=pbar,
|
|
561
|
+
executor=part_executor,
|
|
562
|
+
)
|
|
563
|
+
|
|
564
|
+
futures.append(file_executor.submit(file_downloader.download))
|
|
565
|
+
|
|
566
|
+
# wait for all threads
|
|
567
|
+
concurrent.futures.wait(futures)
|
|
568
|
+
|
|
569
|
+
return response.filepaths
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
def _create_app(
|
|
573
|
+
client: CloudSpaceServiceApi,
|
|
574
|
+
studio_id: str,
|
|
575
|
+
teamspace_id: str,
|
|
576
|
+
cloud_account: str,
|
|
577
|
+
plugin_type: str,
|
|
578
|
+
**other_arguments: Any,
|
|
579
|
+
) -> Externalv1LightningappInstance:
|
|
580
|
+
"""Creates an arbitrary app."""
|
|
581
|
+
from lightning_sdk.utils.resolve import _LIGHTNING_SERVICE_EXECUTION_ID_KEY
|
|
582
|
+
|
|
583
|
+
# Check if 'interruptible' is in the arguments and convert it to a string
|
|
584
|
+
if isinstance(other_arguments, dict) and "interruptible" in other_arguments:
|
|
585
|
+
other_arguments["spot"] = str(other_arguments["interruptible"]).lower()
|
|
586
|
+
del other_arguments["interruptible"]
|
|
587
|
+
|
|
588
|
+
body = AppsIdBody(
|
|
589
|
+
cluster_id=cloud_account,
|
|
590
|
+
plugin_arguments=other_arguments,
|
|
591
|
+
service_id=os.getenv(_LIGHTNING_SERVICE_EXECUTION_ID_KEY),
|
|
592
|
+
unique_id=__GLOBAL_LIGHTNING_UNIQUE_IDS_STORE__[studio_id],
|
|
593
|
+
)
|
|
594
|
+
|
|
595
|
+
resp = client.cloud_space_service_create_cloud_space_app_instance(
|
|
596
|
+
body=body, project_id=teamspace_id, cloudspace_id=studio_id, id=plugin_type
|
|
597
|
+
).lightningappinstance
|
|
598
|
+
|
|
599
|
+
if _LIGHTNING_DEBUG:
|
|
600
|
+
print(f"Create App: {resp.id=} {teamspace_id=} {studio_id=} {cloud_account=}")
|
|
601
|
+
|
|
602
|
+
return resp
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
def remove_datetime_prefix(text: str) -> str:
|
|
606
|
+
# Use a regular expression to match the datetime pattern at the start of each line
|
|
607
|
+
# lines looks something like
|
|
608
|
+
# '[2025-01-08T14:15:03.797142418Z] ⚡ ~ echo Hello\n[2025-01-08T14:15:03.803077717Z] Hello\n'
|
|
609
|
+
return re.sub(r"^\[.*?\] ", "", text, flags=re.MULTILINE)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from typing import List, Optional
|
|
2
|
+
|
|
3
|
+
from lightning_sdk.ai_hub import AIHub
|
|
4
|
+
from lightning_sdk.cli.studios_menu import _StudiosMenu
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class _AIHub(_StudiosMenu):
|
|
8
|
+
"""Interact with Lightning Studio - AI Hub."""
|
|
9
|
+
|
|
10
|
+
def __init__(self) -> None:
|
|
11
|
+
self._hub = AIHub()
|
|
12
|
+
|
|
13
|
+
def api_info(self, api_id: str) -> dict:
|
|
14
|
+
"""Get full API template info such as input details.
|
|
15
|
+
|
|
16
|
+
Example:
|
|
17
|
+
lightning aihub api_info [API_ID]
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
api_id: The ID of the API for which information is requested.
|
|
21
|
+
"""
|
|
22
|
+
return self._hub.api_info(api_id)
|
|
23
|
+
|
|
24
|
+
def list_apis(self, search: Optional[str] = None) -> List[dict]:
|
|
25
|
+
"""List API templates available in the AI Hub.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
search: Search for API templates by name.
|
|
29
|
+
"""
|
|
30
|
+
return self._hub.list_apis(search=search)
|
|
31
|
+
|
|
32
|
+
def deploy(
|
|
33
|
+
self,
|
|
34
|
+
api_id: str,
|
|
35
|
+
cloud_account: Optional[str] = None,
|
|
36
|
+
name: Optional[str] = None,
|
|
37
|
+
teamspace: Optional[str] = None,
|
|
38
|
+
org: Optional[str] = None,
|
|
39
|
+
) -> dict:
|
|
40
|
+
"""Deploy an API template from the AI Hub.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
api_id: API template ID.
|
|
44
|
+
cloud_account: Cloud Account to deploy the API to. Defaults to user's default cloud account.
|
|
45
|
+
name: Name of the deployed API. Defaults to the name of the API template.
|
|
46
|
+
teamspace: Teamspace to deploy the API to. Defaults to user's default teamspace.
|
|
47
|
+
org: Organization to deploy the API to. Defaults to user's default organization.
|
|
48
|
+
"""
|
|
49
|
+
return self._hub.run(api_id, cloud_account=cloud_account, name=name, teamspace=teamspace, org=org)
|