skypilot-nightly 1.0.0.dev20250407__tar.gz → 1.0.0.dev20250408__tar.gz
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.
- {skypilot_nightly-1.0.0.dev20250407/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20250408}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/__init__.py +2 -2
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/cloud_vm_ray_backend.py +1 -4
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/storage_utils.py +10 -3
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/executor.py +204 -126
- skypilot_nightly-1.0.0.dev20250408/sky/server/requests/process.py +212 -0
- skypilot_nightly-1.0.0.dev20250408/sky/server/requests/queues/local_queue.py +16 -0
- skypilot_nightly-1.0.0.dev20250408/sky/utils/atomic.py +52 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/common_utils.py +2 -2
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/validator.py +1 -8
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408/skypilot_nightly.egg-info}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/SOURCES.txt +4 -0
- skypilot_nightly-1.0.0.dev20250408/tests/test_failover.py +101 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/README.md +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/pyproject.toml +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/setup.cfg +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/cloudflare.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/do.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/docker.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/nebius.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/vast.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/admin_policy.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/authentication.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/backend_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/local_docker_backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/wheel_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/benchmark/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/benchmark/benchmark_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/benchmark/benchmark_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/check.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/client/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/client/cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/client/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/client/sdk.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/cloud_stores.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/do.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/lambda_cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/nebius.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/paperspace.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/scp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/aws_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/azure_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_vast.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/do_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/nebius_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/oci_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/scp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/vast_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/aws_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/azure_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/gcp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/oci_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/scp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/vast.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/dag.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/data_transfer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/data_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/mounting_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/exceptions.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/execution.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/client/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/client/sdk.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/controller.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/dashboard/dashboard.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/dashboard/static/favicon.ico +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/dashboard/templates/index.html +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/recovery_strategy.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/scheduler.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/dashboard_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/server.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/models.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/optimizer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/azure-config-template.json +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/cudo_machine_type.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/cudo_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/cudo_wrapper.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/instance_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/mig_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/instance_setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/network.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/network_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/query_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/provisioner.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/api/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/api/commands.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/api/pods.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/cls_api_client.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/custom_script.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/id_generator.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/service_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/ssl_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/vapiconnect.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/vim_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/vsphere_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/resources.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/autoscalers.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/client/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/client/sdk.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/controller.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/load_balancer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/load_balancing_policies.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/replica_managers.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/serve_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/serve_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/server/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/server/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/server/server.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/service.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/service_spec.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/spot_placer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/html/log.html +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/event_loop.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/payloads.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/preconditions.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/queues/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/queues/mp_queue.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/requests.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/serializers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/serializers/decoders.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/serializers/encoders.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/server.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/stream_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/uvicorn.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/setup_files/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/setup_files/dependencies.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/setup_files/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/sky_logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/attempt_skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/autostop_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/configs.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/events.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/job_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/log_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/log_lib.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/command_runner.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/scp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/scp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/scp/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/cli.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/updater.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/worker.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/subprocess_daemon.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skypilot_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/task.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/aws-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/azure-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/cudo-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/do-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/fluidstack-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/gcp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/ibm-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/jobs-controller.yaml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/lambda-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/local-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/nebius-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/oci-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/paperspace-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/runpod-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/scp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/skypilot-server-kubernetes-proxy.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/vast-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/vsphere-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/websocket_proxy.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/usage/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/usage/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/usage/usage_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/accelerator_registry.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/admin_policy_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/annotations.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/cli_utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/cli_utils/status_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/cluster_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/command_runner.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/command_runner.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/config_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/control_master_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/controller_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/dag_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/db_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/env_options.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/create_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/delete_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/exec_kubeconfig_converter.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/generate_kind_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/gpu_labeler.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/kubernetes_deploy_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/rsync_helper.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes_enums.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/log_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/message_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/registry.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/resources_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/rich_console_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/rich_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/schemas.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/status_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/subprocess_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/timeline.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/ux_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/requires.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/top_level.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_api.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_jobs.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_jobs_and_serve.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_list_accelerators.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_optimizer_dryruns.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_optimizer_random_dag.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_serve_autoscaler.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_smoke.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_wheels.py +0 -0
- {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_yaml_parser.py +0 -0
@@ -5,7 +5,7 @@ from typing import Optional
|
|
5
5
|
import urllib.request
|
6
6
|
|
7
7
|
# Replaced with the current commit when building the wheels.
|
8
|
-
_SKYPILOT_COMMIT_SHA = '
|
8
|
+
_SKYPILOT_COMMIT_SHA = 'e0674be528e87191ade88961c44c6449d01232fa'
|
9
9
|
|
10
10
|
|
11
11
|
def _get_git_commit():
|
@@ -35,7 +35,7 @@ def _get_git_commit():
|
|
35
35
|
|
36
36
|
|
37
37
|
__commit__ = _get_git_commit()
|
38
|
-
__version__ = '1.0.0.
|
38
|
+
__version__ = '1.0.0.dev20250408'
|
39
39
|
__root_dir__ = os.path.dirname(os.path.abspath(__file__))
|
40
40
|
|
41
41
|
|
@@ -655,12 +655,9 @@ class RayCodeGen:
|
|
655
655
|
rclone_flush_script = {rclone_flush_script!r}
|
656
656
|
if run_fn is not None:
|
657
657
|
script = run_fn({gang_scheduling_id}, gang_scheduling_id_to_ip)
|
658
|
-
if script is not None:
|
659
|
-
script += rclone_flush_script
|
660
|
-
else:
|
661
|
-
script = rclone_flush_script
|
662
658
|
|
663
659
|
if script is not None:
|
660
|
+
script += rclone_flush_script
|
664
661
|
sky_env_vars_dict['{constants.SKYPILOT_NUM_GPUS_PER_NODE}'] = {int(math.ceil(num_gpus))!r}
|
665
662
|
# Backward compatibility: Environment starting with `SKY_` is
|
666
663
|
# deprecated. Remove it in v0.9.0.
|
{skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/storage_utils.py
RENAMED
@@ -227,6 +227,9 @@ def get_excluded_files(src_dir_path: str) -> List[str]:
|
|
227
227
|
expand_src_dir_path = os.path.expanduser(src_dir_path)
|
228
228
|
skyignore_path = os.path.join(expand_src_dir_path,
|
229
229
|
constants.SKY_IGNORE_FILE)
|
230
|
+
# Fail fast if the source is a file.
|
231
|
+
if os.path.isfile(expand_src_dir_path):
|
232
|
+
raise ValueError(f'{src_dir_path} is a file, not a directory.')
|
230
233
|
if os.path.exists(skyignore_path):
|
231
234
|
logger.debug(f' {colorama.Style.DIM}'
|
232
235
|
f'Excluded files to sync to cluster based on '
|
@@ -267,11 +270,15 @@ def zip_files_and_folders(items: List[str],
|
|
267
270
|
item = os.path.expanduser(item)
|
268
271
|
if not os.path.isfile(item) and not os.path.isdir(item):
|
269
272
|
raise ValueError(f'{item} does not exist.')
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
+
if os.path.isfile(item):
|
274
|
+
# Add the file to the zip archive even if it matches
|
275
|
+
# patterns in dot ignore files, as it was explicitly
|
276
|
+
# specified by user.
|
273
277
|
zipf.write(item)
|
274
278
|
elif os.path.isdir(item):
|
279
|
+
excluded_files = set([
|
280
|
+
os.path.join(item, f) for f in get_excluded_files(item)
|
281
|
+
])
|
275
282
|
for root, dirs, files in os.walk(item, followlinks=False):
|
276
283
|
# Modify dirs in-place to control os.walk()'s traversal
|
277
284
|
# behavior. This filters out excluded directories BEFORE
|
@@ -18,9 +18,7 @@ The number of the workers is determined by the system resources.
|
|
18
18
|
|
19
19
|
See the [README.md](../README.md) for detailed architecture of the executor.
|
20
20
|
"""
|
21
|
-
import concurrent.futures
|
22
21
|
import contextlib
|
23
|
-
import dataclasses
|
24
22
|
import enum
|
25
23
|
import multiprocessing
|
26
24
|
import os
|
@@ -42,7 +40,9 @@ from sky.server import common as server_common
|
|
42
40
|
from sky.server import constants as server_constants
|
43
41
|
from sky.server.requests import payloads
|
44
42
|
from sky.server.requests import preconditions
|
43
|
+
from sky.server.requests import process
|
45
44
|
from sky.server.requests import requests as api_requests
|
45
|
+
from sky.server.requests.queues import local_queue
|
46
46
|
from sky.server.requests.queues import mp_queue
|
47
47
|
from sky.skylet import constants
|
48
48
|
from sky.utils import annotations
|
@@ -101,22 +101,23 @@ _MIN_LONG_WORKERS = 1
|
|
101
101
|
# workers so at least 2 workers are needed to ensure responsiveness.
|
102
102
|
_MIN_SHORT_WORKERS = 2
|
103
103
|
|
104
|
+
# Default number of burstable workers for local API server. A heuristic number
|
105
|
+
# that is large enough for most local cases.
|
106
|
+
# TODO(aylei): the number of burstable workers should be auto-tuned based on the
|
107
|
+
# system usage stats.
|
108
|
+
_BURSTABLE_WORKERS_FOR_LOCAL = 1024
|
109
|
+
|
104
110
|
|
105
111
|
class QueueBackend(enum.Enum):
|
112
|
+
# Local queue backend serves queues in each process locally, which has
|
113
|
+
# lower resource usage but the consumer must be in the same process, i.e.
|
114
|
+
# this only works in single-process mode.
|
115
|
+
LOCAL = 'local'
|
116
|
+
# Multi-process queue backend starts a dedicated process for serving queues.
|
106
117
|
MULTIPROCESSING = 'multiprocessing'
|
107
118
|
# TODO(zhwu): we can add redis backend in the future.
|
108
119
|
|
109
120
|
|
110
|
-
@dataclasses.dataclass
|
111
|
-
class RequestWorker:
|
112
|
-
id: int
|
113
|
-
# The type of queue this worker works on.
|
114
|
-
schedule_type: api_requests.ScheduleType
|
115
|
-
|
116
|
-
def __str__(self) -> str:
|
117
|
-
return f'Worker(id={self.id}, schedule_type={self.schedule_type.value})'
|
118
|
-
|
119
|
-
|
120
121
|
class RequestQueue:
|
121
122
|
"""The queue for the requests, either redis or multiprocessing.
|
122
123
|
|
@@ -128,9 +129,12 @@ class RequestQueue:
|
|
128
129
|
backend: Optional[QueueBackend] = None) -> None:
|
129
130
|
self.name = schedule_type.value
|
130
131
|
self.backend = backend
|
131
|
-
|
132
|
-
|
133
|
-
|
132
|
+
if backend == QueueBackend.MULTIPROCESSING:
|
133
|
+
self.queue = mp_queue.get_queue(self.name)
|
134
|
+
elif backend == QueueBackend.LOCAL:
|
135
|
+
self.queue = local_queue.get_queue(self.name)
|
136
|
+
else:
|
137
|
+
raise RuntimeError(f'Invalid queue backend: {backend}')
|
134
138
|
|
135
139
|
def put(self, request: Tuple[str, bool]) -> None:
|
136
140
|
"""Put and request to the queue.
|
@@ -161,6 +165,104 @@ class RequestQueue:
|
|
161
165
|
queue_backend = QueueBackend.MULTIPROCESSING
|
162
166
|
|
163
167
|
|
168
|
+
def executor_initializer(proc_group: str):
|
169
|
+
setproctitle.setproctitle(f'SkyPilot:executor:{proc_group}:'
|
170
|
+
f'{multiprocessing.current_process().pid}')
|
171
|
+
|
172
|
+
|
173
|
+
class RequestWorker:
|
174
|
+
"""A worker that polls requests from the queue and runs them.
|
175
|
+
|
176
|
+
The worker can run at least `garanteed_parallelism` requests in parallel.
|
177
|
+
If there are more resources available, it can spin up extra workers up to
|
178
|
+
`garanteed_parallelism + burstable_parallelism`.
|
179
|
+
"""
|
180
|
+
|
181
|
+
# The type of queue this worker works on.
|
182
|
+
schedule_type: api_requests.ScheduleType
|
183
|
+
# The least number of requests that this worker can run in parallel.
|
184
|
+
garanteed_parallelism: int
|
185
|
+
# The extra number of requests that this worker can run in parallel
|
186
|
+
# if there are available CPU/memory resources.
|
187
|
+
burstable_parallelism: int = 0
|
188
|
+
|
189
|
+
def __init__(self,
|
190
|
+
schedule_type: api_requests.ScheduleType,
|
191
|
+
garanteed_parallelism: int,
|
192
|
+
burstable_parallelism: int = 0) -> None:
|
193
|
+
self.schedule_type = schedule_type
|
194
|
+
self.garanteed_parallelism = garanteed_parallelism
|
195
|
+
self.burstable_parallelism = burstable_parallelism
|
196
|
+
|
197
|
+
def __str__(self) -> str:
|
198
|
+
return f'Worker(schedule_type={self.schedule_type.value})'
|
199
|
+
|
200
|
+
def process_request(self, executor: process.BurstableExecutor,
|
201
|
+
queue: RequestQueue) -> None:
|
202
|
+
try:
|
203
|
+
request_element = queue.get()
|
204
|
+
if request_element is None:
|
205
|
+
time.sleep(0.1)
|
206
|
+
return
|
207
|
+
request_id, ignore_return_value = request_element
|
208
|
+
request = api_requests.get_request(request_id)
|
209
|
+
assert request is not None, f'Request with ID {request_id} is None'
|
210
|
+
if request.status == api_requests.RequestStatus.CANCELLED:
|
211
|
+
return
|
212
|
+
logger.info(f'[{self}] Submitting request: {request_id}')
|
213
|
+
# Start additional process to run the request, so that it can be
|
214
|
+
# cancelled when requested by a user.
|
215
|
+
# TODO(zhwu): since the executor is reusing the request process,
|
216
|
+
# multiple requests can share the same process pid, which may cause
|
217
|
+
# issues with SkyPilot core functions if they rely on the exit of
|
218
|
+
# the process, such as subprocess_daemon.py.
|
219
|
+
executor.submit_until_success(_request_execution_wrapper,
|
220
|
+
request_id, ignore_return_value)
|
221
|
+
|
222
|
+
logger.info(f'[{self}] Submitted request: {request_id}')
|
223
|
+
except (Exception, SystemExit) as e: # pylint: disable=broad-except
|
224
|
+
# Catch any other exceptions to avoid crashing the worker process.
|
225
|
+
logger.error(
|
226
|
+
f'[{self}] Error processing request: '
|
227
|
+
f'{request_id if "request_id" in locals() else ""} '
|
228
|
+
f'{common_utils.format_exception(e, use_bracket=True)}')
|
229
|
+
|
230
|
+
def run(self) -> None:
|
231
|
+
# Handle the SIGTERM signal to abort the executor process gracefully.
|
232
|
+
proc_group = f'{self.schedule_type.value}'
|
233
|
+
if threading.current_thread() is threading.main_thread():
|
234
|
+
signal.signal(signal.SIGTERM, _sigterm_handler)
|
235
|
+
setproctitle.setproctitle(f'SkyPilot:worker:{proc_group}')
|
236
|
+
queue = _get_queue(self.schedule_type)
|
237
|
+
|
238
|
+
# Use concurrent.futures.ProcessPoolExecutor instead of
|
239
|
+
# multiprocessing.Pool because the former is more efficient with the
|
240
|
+
# support of lazy creation of worker processes.
|
241
|
+
# We use executor instead of individual multiprocessing.Process to avoid
|
242
|
+
# the overhead of forking a new process for each request, which can be
|
243
|
+
# about 1s delay.
|
244
|
+
try:
|
245
|
+
executor = process.BurstableExecutor(
|
246
|
+
garanteed_workers=self.garanteed_parallelism,
|
247
|
+
burst_workers=self.burstable_parallelism,
|
248
|
+
initializer=executor_initializer,
|
249
|
+
initargs=(proc_group,))
|
250
|
+
while True:
|
251
|
+
self.process_request(executor, queue)
|
252
|
+
# TODO(aylei): better to distinct between KeyboardInterrupt and SIGTERM.
|
253
|
+
except KeyboardInterrupt:
|
254
|
+
pass
|
255
|
+
finally:
|
256
|
+
# In most cases, here we receive either ctrl-c in foreground
|
257
|
+
# execution or SIGTERM on server exiting. Gracefully exit the
|
258
|
+
# worker process and the executor.
|
259
|
+
# TODO(aylei): worker may also be killed by system daemons like
|
260
|
+
# OOM killer, crash the API server or recreate the worker process
|
261
|
+
# to avoid broken state in such cases.
|
262
|
+
logger.info(f'[{self}] Worker process interrupted')
|
263
|
+
executor.shutdown()
|
264
|
+
|
265
|
+
|
164
266
|
@annotations.lru_cache(scope='global', maxsize=None)
|
165
267
|
def _get_queue(schedule_type: api_requests.ScheduleType) -> RequestQueue:
|
166
268
|
return RequestQueue(schedule_type, backend=queue_backend)
|
@@ -349,110 +451,77 @@ def schedule_request(
|
|
349
451
|
enqueue()
|
350
452
|
|
351
453
|
|
352
|
-
def executor_initializer(proc_group: str):
|
353
|
-
setproctitle.setproctitle(f'SkyPilot:executor:{proc_group}:'
|
354
|
-
f'{multiprocessing.current_process().pid}')
|
355
|
-
|
356
|
-
|
357
|
-
def request_worker(worker: RequestWorker, max_parallel_size: int) -> None:
|
358
|
-
"""Worker for the requests.
|
359
|
-
|
360
|
-
Args:
|
361
|
-
max_parallel_size: Maximum number of parallel jobs this worker can run.
|
362
|
-
"""
|
363
|
-
# Handle the SIGTERM signal to abort the executor process gracefully.
|
364
|
-
signal.signal(signal.SIGTERM, _sigterm_handler)
|
365
|
-
proc_group = f'{worker.schedule_type.value}-{worker.id}'
|
366
|
-
setproctitle.setproctitle(f'SkyPilot:worker:{proc_group}')
|
367
|
-
queue = _get_queue(worker.schedule_type)
|
368
|
-
|
369
|
-
def process_request(executor: concurrent.futures.ProcessPoolExecutor):
|
370
|
-
try:
|
371
|
-
request_element = queue.get()
|
372
|
-
if request_element is None:
|
373
|
-
time.sleep(0.1)
|
374
|
-
return
|
375
|
-
request_id, ignore_return_value = request_element
|
376
|
-
request = api_requests.get_request(request_id)
|
377
|
-
assert request is not None, f'Request with ID {request_id} is None'
|
378
|
-
if request.status == api_requests.RequestStatus.CANCELLED:
|
379
|
-
return
|
380
|
-
logger.info(f'[{worker}] Submitting request: {request_id}')
|
381
|
-
# Start additional process to run the request, so that it can be
|
382
|
-
# cancelled when requested by a user.
|
383
|
-
# TODO(zhwu): since the executor is reusing the request process,
|
384
|
-
# multiple requests can share the same process pid, which may cause
|
385
|
-
# issues with SkyPilot core functions if they rely on the exit of
|
386
|
-
# the process, such as subprocess_daemon.py.
|
387
|
-
future = executor.submit(_request_execution_wrapper, request_id,
|
388
|
-
ignore_return_value)
|
389
|
-
|
390
|
-
if worker.schedule_type == api_requests.ScheduleType.LONG:
|
391
|
-
try:
|
392
|
-
future.result(timeout=None)
|
393
|
-
except Exception as e: # pylint: disable=broad-except
|
394
|
-
logger.error(f'[{worker}] Request {request_id} failed: {e}')
|
395
|
-
logger.info(f'[{worker}] Finished request: {request_id}')
|
396
|
-
else:
|
397
|
-
logger.info(f'[{worker}] Submitted request: {request_id}')
|
398
|
-
except (Exception, SystemExit) as e: # pylint: disable=broad-except
|
399
|
-
# Catch any other exceptions to avoid crashing the worker process.
|
400
|
-
logger.error(
|
401
|
-
f'[{worker}] Error processing request: '
|
402
|
-
f'{request_id if "request_id" in locals() else ""} '
|
403
|
-
f'{common_utils.format_exception(e, use_bracket=True)}')
|
404
|
-
|
405
|
-
# Use concurrent.futures.ProcessPoolExecutor instead of multiprocessing.Pool
|
406
|
-
# because the former is more efficient with the support of lazy creation of
|
407
|
-
# worker processes.
|
408
|
-
# We use executor instead of individual multiprocessing.Process to avoid
|
409
|
-
# the overhead of forking a new process for each request, which can be about
|
410
|
-
# 1s delay.
|
411
|
-
try:
|
412
|
-
executor = concurrent.futures.ProcessPoolExecutor(
|
413
|
-
max_workers=max_parallel_size,
|
414
|
-
initializer=executor_initializer,
|
415
|
-
initargs=(proc_group,))
|
416
|
-
while True:
|
417
|
-
process_request(executor)
|
418
|
-
# TODO(aylei): better to distinct between KeyboardInterrupt and SIGTERM.
|
419
|
-
except KeyboardInterrupt:
|
420
|
-
pass
|
421
|
-
finally:
|
422
|
-
# In most cases, here we receive either ctrl-c in foreground execution
|
423
|
-
# or SIGTERM on server exiting. Gracefully exit the worker process and
|
424
|
-
# the executor.
|
425
|
-
# TODO(aylei): worker may also be killed by system daemons like OOM
|
426
|
-
# killer, crash the API server or recreate the worker process to avoid
|
427
|
-
# broken state in such cases.
|
428
|
-
logger.info(f'[{worker}] Worker process interrupted')
|
429
|
-
executor_processes = list(executor._processes.values()) # pylint: disable=protected-access,line-too-long
|
430
|
-
# Shutdown the executor so that executor process can exit once the
|
431
|
-
# running task is finished or interrupted.
|
432
|
-
executor.shutdown(wait=False)
|
433
|
-
# Proactively interrupt the running task to avoid indefinite waiting.
|
434
|
-
subprocess_utils.run_in_parallel(
|
435
|
-
subprocess_utils.kill_process_with_grace_period,
|
436
|
-
executor_processes,
|
437
|
-
num_threads=len(executor_processes))
|
438
|
-
|
439
|
-
|
440
454
|
def start(deploy: bool) -> List[multiprocessing.Process]:
|
441
|
-
"""Start the request workers.
|
455
|
+
"""Start the request workers.
|
456
|
+
|
457
|
+
Request workers run in background, schedule the requests and delegate the
|
458
|
+
request execution to executor processes. We have different assumptions for
|
459
|
+
the resources in different deployment modes, which leads to different
|
460
|
+
worker setups:
|
461
|
+
|
462
|
+
- Deployment mode (deploy=True), we assume the resources are dedicated to
|
463
|
+
the API server and the resources will be tuned for serious use cases, so:
|
464
|
+
- Use multiprocessing queue backend and dedicated workers processes to
|
465
|
+
avoid GIL contention.
|
466
|
+
- Parallelism (number of executor processes) is fixed and executor
|
467
|
+
processes have same lifecycle with the server, which ensures
|
468
|
+
best-effort cache reusing and stable resources consumption.
|
469
|
+
- Reject to start in low resource environments, to avoid flaky
|
470
|
+
deployments.
|
471
|
+
- Local mode (deploy=False), we assume the server is running in a shared
|
472
|
+
environment (e.g. laptop) and users typically do not pay attention to
|
473
|
+
the resource setup of the server. Moreover, existing users may expect
|
474
|
+
some consistent behaviors with old versions, i.e. before API server was
|
475
|
+
introduced, so:
|
476
|
+
- The max number of long-running executor processes are limited, to avoid
|
477
|
+
high memory consumption when the server is idle.
|
478
|
+
- Allow burstable workers to handle requests when all long-running
|
479
|
+
workers are busy, which mimics the behavior of local sky CLI before
|
480
|
+
API server was introduced.
|
481
|
+
- Works in low resources environments, and further reduce the memory
|
482
|
+
consumption in low resource environments.
|
483
|
+
|
484
|
+
Note that there is still significant overhead for SDK users when migrate to
|
485
|
+
local API server. Since the users are free to run sky operations in Threads
|
486
|
+
when using SDK but all client operations will occupy at least one worker
|
487
|
+
process after API server was introduced.
|
488
|
+
"""
|
442
489
|
# Determine the job capacity of the workers based on the system resources.
|
443
490
|
cpu_count = common_utils.get_cpu_count()
|
444
491
|
mem_size_gb = common_utils.get_mem_size_gb()
|
445
492
|
mem_size_gb = max(0, mem_size_gb - server_constants.MIN_AVAIL_MEM_GB)
|
493
|
+
# Runs in low resource mode if the available memory is less than
|
494
|
+
# server_constants.MIN_AVAIL_MEM_GB.
|
446
495
|
max_parallel_for_long = _max_long_worker_parallism(cpu_count,
|
447
496
|
mem_size_gb,
|
448
497
|
local=not deploy)
|
449
498
|
max_parallel_for_short = _max_short_worker_parallism(
|
450
499
|
mem_size_gb, max_parallel_for_long)
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
500
|
+
if mem_size_gb < server_constants.MIN_AVAIL_MEM_GB:
|
501
|
+
# Permanent worker process may have significant memory consumption
|
502
|
+
# (~350MB per worker) after running commands like `sky check`, so we
|
503
|
+
# don't start any permanent workers in low resource local mode. This
|
504
|
+
# mimics the behavior of local sky CLI before API server was
|
505
|
+
# introduced, where the CLI will start new process everytime and
|
506
|
+
# never reject to start due to resource constraints.
|
507
|
+
# Note that the refresh daemon will still occupy one worker
|
508
|
+
# permanently because it never exits.
|
509
|
+
max_parallel_for_long = 0
|
510
|
+
max_parallel_for_short = 0
|
511
|
+
logger.warning(
|
512
|
+
'SkyPilot API server will run in low resource mode because '
|
513
|
+
'the available memory is less than '
|
514
|
+
f'{server_constants.MIN_AVAIL_MEM_GB}GB.')
|
515
|
+
else:
|
516
|
+
logger.info(
|
517
|
+
f'SkyPilot API server will start {max_parallel_for_long} workers '
|
518
|
+
f'for long requests and will allow at max '
|
519
|
+
f'{max_parallel_for_short} short requests in parallel.')
|
520
|
+
if not deploy:
|
521
|
+
# For local mode, use local queue backend since we only run 1 uvicorn
|
522
|
+
# worker in local mode.
|
523
|
+
global queue_backend
|
524
|
+
queue_backend = QueueBackend.LOCAL
|
456
525
|
sub_procs = []
|
457
526
|
# Setup the queues.
|
458
527
|
if queue_backend == QueueBackend.MULTIPROCESSING:
|
@@ -471,28 +540,37 @@ def start(deploy: bool) -> List[multiprocessing.Process]:
|
|
471
540
|
target=mp_queue.start_queue_manager, args=(queue_names, port))
|
472
541
|
queue_server.start()
|
473
542
|
sub_procs.append(queue_server)
|
474
|
-
mp_queue.wait_for_queues_to_be_ready(queue_names,
|
543
|
+
mp_queue.wait_for_queues_to_be_ready(queue_names,
|
544
|
+
queue_server,
|
545
|
+
port=port)
|
546
|
+
elif queue_backend == QueueBackend.LOCAL:
|
547
|
+
# No setup is needed for local queue backend.
|
548
|
+
pass
|
549
|
+
else:
|
550
|
+
# Should be checked earlier, but just in case.
|
551
|
+
raise RuntimeError(f'Invalid queue backend: {queue_backend}')
|
475
552
|
|
476
553
|
logger.info('Request queues created')
|
477
554
|
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
555
|
+
def run_worker_in_background(worker: RequestWorker):
|
556
|
+
# Thread dispatcher is sufficient for current scale, refer to
|
557
|
+
# tests/load_tests/test_queue_dispatcher.py for more details.
|
558
|
+
# Use daemon thread for automatic cleanup.
|
559
|
+
thread = threading.Thread(target=worker.run, daemon=True)
|
560
|
+
thread.start()
|
561
|
+
|
562
|
+
burstable_parallelism = _BURSTABLE_WORKERS_FOR_LOCAL if not deploy else 0
|
563
|
+
# Start a worker for long requests.
|
564
|
+
long_worker = RequestWorker(schedule_type=api_requests.ScheduleType.LONG,
|
565
|
+
garanteed_parallelism=max_parallel_for_long,
|
566
|
+
burstable_parallelism=burstable_parallelism)
|
567
|
+
run_worker_in_background(long_worker)
|
489
568
|
|
490
569
|
# Start a worker for short requests.
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
sub_procs.append(worker_proc)
|
570
|
+
short_worker = RequestWorker(schedule_type=api_requests.ScheduleType.SHORT,
|
571
|
+
garanteed_parallelism=max_parallel_for_short,
|
572
|
+
burstable_parallelism=burstable_parallelism)
|
573
|
+
run_worker_in_background(short_worker)
|
496
574
|
return sub_procs
|
497
575
|
|
498
576
|
|