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.
Files changed (382) hide show
  1. {skypilot_nightly-1.0.0.dev20250407/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20250408}/PKG-INFO +1 -1
  2. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/__init__.py +2 -2
  3. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/cloud_vm_ray_backend.py +1 -4
  4. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/storage_utils.py +10 -3
  5. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/executor.py +204 -126
  6. skypilot_nightly-1.0.0.dev20250408/sky/server/requests/process.py +212 -0
  7. skypilot_nightly-1.0.0.dev20250408/sky/server/requests/queues/local_queue.py +16 -0
  8. skypilot_nightly-1.0.0.dev20250408/sky/utils/atomic.py +52 -0
  9. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/common_utils.py +2 -2
  10. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/validator.py +1 -8
  11. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408/skypilot_nightly.egg-info}/PKG-INFO +1 -1
  12. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/SOURCES.txt +4 -0
  13. skypilot_nightly-1.0.0.dev20250408/tests/test_failover.py +101 -0
  14. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/LICENSE +0 -0
  15. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/MANIFEST.in +0 -0
  16. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/README.md +0 -0
  17. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/pyproject.toml +0 -0
  18. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/setup.cfg +0 -0
  19. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/setup.py +0 -0
  20. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/__init__.py +0 -0
  21. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/aws.py +0 -0
  22. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/azure.py +0 -0
  23. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/cloudflare.py +0 -0
  24. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/common.py +0 -0
  25. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/cudo.py +0 -0
  26. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/do.py +0 -0
  27. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/docker.py +0 -0
  28. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/gcp.py +0 -0
  29. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/ibm.py +0 -0
  30. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/kubernetes.py +0 -0
  31. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/nebius.py +0 -0
  32. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/oci.py +0 -0
  33. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/runpod.py +0 -0
  34. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/vast.py +0 -0
  35. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/vsphere.py +0 -0
  36. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/admin_policy.py +0 -0
  37. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/authentication.py +0 -0
  38. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/__init__.py +0 -0
  39. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/backend.py +0 -0
  40. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/backend_utils.py +0 -0
  41. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/docker_utils.py +0 -0
  42. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/local_docker_backend.py +0 -0
  43. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
  44. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/wheel_utils.py +0 -0
  45. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/benchmark/__init__.py +0 -0
  46. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/benchmark/benchmark_state.py +0 -0
  47. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/benchmark/benchmark_utils.py +0 -0
  48. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/check.py +0 -0
  49. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/cli.py +0 -0
  50. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/client/__init__.py +0 -0
  51. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/client/cli.py +0 -0
  52. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/client/common.py +0 -0
  53. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/client/sdk.py +0 -0
  54. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/cloud_stores.py +0 -0
  55. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/__init__.py +0 -0
  56. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/aws.py +0 -0
  57. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/azure.py +0 -0
  58. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/cloud.py +0 -0
  59. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/cudo.py +0 -0
  60. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/do.py +0 -0
  61. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/fluidstack.py +0 -0
  62. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/gcp.py +0 -0
  63. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/ibm.py +0 -0
  64. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/kubernetes.py +0 -0
  65. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/lambda_cloud.py +0 -0
  66. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/nebius.py +0 -0
  67. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/oci.py +0 -0
  68. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/paperspace.py +0 -0
  69. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/runpod.py +0 -0
  70. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/scp.py +0 -0
  71. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/__init__.py +0 -0
  72. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/aws_catalog.py +0 -0
  73. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/azure_catalog.py +0 -0
  74. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/common.py +0 -0
  75. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/config.py +0 -0
  76. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/constants.py +0 -0
  77. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
  78. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
  79. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
  80. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
  81. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
  82. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
  83. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
  84. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_ibm.py +0 -0
  85. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
  86. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_vast.py +0 -0
  87. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
  88. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/do_catalog.py +0 -0
  89. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
  90. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
  91. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
  92. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
  93. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
  94. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/nebius_catalog.py +0 -0
  95. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/oci_catalog.py +0 -0
  96. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
  97. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
  98. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/scp_catalog.py +0 -0
  99. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/vast_catalog.py +0 -0
  100. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
  101. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/__init__.py +0 -0
  102. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/aws_utils.py +0 -0
  103. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/azure_utils.py +0 -0
  104. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/gcp_utils.py +0 -0
  105. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/oci_utils.py +0 -0
  106. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/scp_utils.py +0 -0
  107. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/vast.py +0 -0
  108. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/vsphere.py +0 -0
  109. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/core.py +0 -0
  110. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/dag.py +0 -0
  111. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/__init__.py +0 -0
  112. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/data_transfer.py +0 -0
  113. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/data_utils.py +0 -0
  114. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/mounting_utils.py +0 -0
  115. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/data/storage.py +0 -0
  116. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/exceptions.py +0 -0
  117. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/execution.py +0 -0
  118. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/global_user_state.py +0 -0
  119. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/__init__.py +0 -0
  120. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/client/__init__.py +0 -0
  121. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/client/sdk.py +0 -0
  122. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/constants.py +0 -0
  123. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/controller.py +0 -0
  124. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/dashboard/dashboard.py +0 -0
  125. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/dashboard/static/favicon.ico +0 -0
  126. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/dashboard/templates/index.html +0 -0
  127. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/recovery_strategy.py +0 -0
  128. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/scheduler.py +0 -0
  129. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/__init__.py +0 -0
  130. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/core.py +0 -0
  131. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/dashboard_utils.py +0 -0
  132. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/server.py +0 -0
  133. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/state.py +0 -0
  134. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/utils.py +0 -0
  135. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/models.py +0 -0
  136. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/optimizer.py +0 -0
  137. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/__init__.py +0 -0
  138. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/__init__.py +0 -0
  139. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/config.py +0 -0
  140. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/instance.py +0 -0
  141. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/utils.py +0 -0
  142. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/__init__.py +0 -0
  143. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/azure-config-template.json +0 -0
  144. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/config.py +0 -0
  145. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/instance.py +0 -0
  146. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/common.py +0 -0
  147. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/constants.py +0 -0
  148. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/__init__.py +0 -0
  149. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/config.py +0 -0
  150. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/cudo_machine_type.py +0 -0
  151. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/cudo_utils.py +0 -0
  152. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/cudo_wrapper.py +0 -0
  153. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/instance.py +0 -0
  154. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/__init__.py +0 -0
  155. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/config.py +0 -0
  156. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/constants.py +0 -0
  157. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/instance.py +0 -0
  158. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/utils.py +0 -0
  159. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/docker_utils.py +0 -0
  160. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/__init__.py +0 -0
  161. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/config.py +0 -0
  162. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
  163. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/instance.py +0 -0
  164. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/__init__.py +0 -0
  165. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/config.py +0 -0
  166. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/constants.py +0 -0
  167. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/instance.py +0 -0
  168. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/instance_utils.py +0 -0
  169. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/mig_utils.py +0 -0
  170. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/instance_setup.py +0 -0
  171. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/__init__.py +0 -0
  172. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/config.py +0 -0
  173. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/constants.py +0 -0
  174. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/instance.py +0 -0
  175. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
  176. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
  177. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/network.py +0 -0
  178. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/network_utils.py +0 -0
  179. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/utils.py +0 -0
  180. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/__init__.py +0 -0
  181. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/config.py +0 -0
  182. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/instance.py +0 -0
  183. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
  184. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/logging.py +0 -0
  185. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/metadata_utils.py +0 -0
  186. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/__init__.py +0 -0
  187. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/config.py +0 -0
  188. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/instance.py +0 -0
  189. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/utils.py +0 -0
  190. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/__init__.py +0 -0
  191. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/config.py +0 -0
  192. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/instance.py +0 -0
  193. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/query_utils.py +0 -0
  194. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/__init__.py +0 -0
  195. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/config.py +0 -0
  196. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/constants.py +0 -0
  197. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/instance.py +0 -0
  198. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/utils.py +0 -0
  199. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/provisioner.py +0 -0
  200. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/__init__.py +0 -0
  201. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/api/__init__.py +0 -0
  202. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/api/commands.py +0 -0
  203. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/api/pods.py +0 -0
  204. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/config.py +0 -0
  205. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/instance.py +0 -0
  206. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/utils.py +0 -0
  207. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/__init__.py +0 -0
  208. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/config.py +0 -0
  209. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/instance.py +0 -0
  210. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/utils.py +0 -0
  211. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/__init__.py +0 -0
  212. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/__init__.py +0 -0
  213. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/cls_api_client.py +0 -0
  214. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
  215. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/custom_script.py +0 -0
  216. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/id_generator.py +0 -0
  217. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/metadata_utils.py +0 -0
  218. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/service_manager.py +0 -0
  219. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
  220. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/ssl_helper.py +0 -0
  221. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/vapiconnect.py +0 -0
  222. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/vim_utils.py +0 -0
  223. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/config.py +0 -0
  224. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/instance.py +0 -0
  225. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/vsphere_utils.py +0 -0
  226. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/resources.py +0 -0
  227. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/__init__.py +0 -0
  228. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/autoscalers.py +0 -0
  229. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/client/__init__.py +0 -0
  230. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/client/sdk.py +0 -0
  231. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/constants.py +0 -0
  232. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/controller.py +0 -0
  233. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/load_balancer.py +0 -0
  234. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/load_balancing_policies.py +0 -0
  235. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/replica_managers.py +0 -0
  236. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/serve_state.py +0 -0
  237. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/serve_utils.py +0 -0
  238. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/server/__init__.py +0 -0
  239. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/server/core.py +0 -0
  240. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/server/server.py +0 -0
  241. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/service.py +0 -0
  242. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/service_spec.py +0 -0
  243. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/spot_placer.py +0 -0
  244. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/__init__.py +0 -0
  245. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/common.py +0 -0
  246. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/constants.py +0 -0
  247. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/html/log.html +0 -0
  248. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/__init__.py +0 -0
  249. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/event_loop.py +0 -0
  250. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/payloads.py +0 -0
  251. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/preconditions.py +0 -0
  252. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/queues/__init__.py +0 -0
  253. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/queues/mp_queue.py +0 -0
  254. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/requests.py +0 -0
  255. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/serializers/__init__.py +0 -0
  256. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/serializers/decoders.py +0 -0
  257. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/serializers/encoders.py +0 -0
  258. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/server.py +0 -0
  259. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/stream_utils.py +0 -0
  260. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/server/uvicorn.py +0 -0
  261. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/setup_files/MANIFEST.in +0 -0
  262. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/setup_files/dependencies.py +0 -0
  263. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/setup_files/setup.py +0 -0
  264. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/sky_logging.py +0 -0
  265. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/LICENSE +0 -0
  266. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/__init__.py +0 -0
  267. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/attempt_skylet.py +0 -0
  268. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/autostop_lib.py +0 -0
  269. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/configs.py +0 -0
  270. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/constants.py +0 -0
  271. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/events.py +0 -0
  272. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/job_lib.py +0 -0
  273. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/log_lib.py +0 -0
  274. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/log_lib.pyi +0 -0
  275. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/__init__.py +0 -0
  276. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/command_runner.py +0 -0
  277. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/__init__.py +0 -0
  278. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/node_provider.py +0 -0
  279. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/utils.py +0 -0
  280. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
  281. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/scp/__init__.py +0 -0
  282. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/scp/config.py +0 -0
  283. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/scp/node_provider.py +0 -0
  284. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/__init__.py +0 -0
  285. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
  286. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/cli.py.patch +0 -0
  287. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
  288. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
  289. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
  290. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/updater.py.patch +0 -0
  291. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/worker.py.patch +0 -0
  292. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/skylet.py +0 -0
  293. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/subprocess_daemon.py +0 -0
  294. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/skypilot_config.py +0 -0
  295. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/task.py +0 -0
  296. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/aws-ray.yml.j2 +0 -0
  297. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/azure-ray.yml.j2 +0 -0
  298. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/cudo-ray.yml.j2 +0 -0
  299. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/do-ray.yml.j2 +0 -0
  300. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/fluidstack-ray.yml.j2 +0 -0
  301. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/gcp-ray.yml.j2 +0 -0
  302. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/ibm-ray.yml.j2 +0 -0
  303. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/jobs-controller.yaml.j2 +0 -0
  304. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
  305. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
  306. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
  307. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-ray.yml.j2 +0 -0
  308. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
  309. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/lambda-ray.yml.j2 +0 -0
  310. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/local-ray.yml.j2 +0 -0
  311. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/nebius-ray.yml.j2 +0 -0
  312. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/oci-ray.yml.j2 +0 -0
  313. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/paperspace-ray.yml.j2 +0 -0
  314. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/runpod-ray.yml.j2 +0 -0
  315. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/scp-ray.yml.j2 +0 -0
  316. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
  317. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/skypilot-server-kubernetes-proxy.sh +0 -0
  318. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/vast-ray.yml.j2 +0 -0
  319. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/vsphere-ray.yml.j2 +0 -0
  320. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/websocket_proxy.py +0 -0
  321. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/usage/__init__.py +0 -0
  322. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/usage/constants.py +0 -0
  323. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/usage/usage_lib.py +0 -0
  324. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/__init__.py +0 -0
  325. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/accelerator_registry.py +0 -0
  326. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/admin_policy_utils.py +0 -0
  327. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/annotations.py +0 -0
  328. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/cli_utils/__init__.py +0 -0
  329. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/cli_utils/status_utils.py +0 -0
  330. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/cluster_utils.py +0 -0
  331. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/command_runner.py +0 -0
  332. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/command_runner.pyi +0 -0
  333. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/common.py +0 -0
  334. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/config_utils.py +0 -0
  335. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/control_master_utils.py +0 -0
  336. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/controller_utils.py +0 -0
  337. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/dag_utils.py +0 -0
  338. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/db_utils.py +0 -0
  339. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/env_options.py +0 -0
  340. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/__init__.py +0 -0
  341. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/create_cluster.sh +0 -0
  342. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/delete_cluster.sh +0 -0
  343. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
  344. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/exec_kubeconfig_converter.py +0 -0
  345. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/generate_kind_config.py +0 -0
  346. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
  347. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/gpu_labeler.py +0 -0
  348. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
  349. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
  350. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/kubernetes_deploy_utils.py +0 -0
  351. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/rsync_helper.sh +0 -0
  352. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
  353. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes_enums.py +0 -0
  354. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/log_utils.py +0 -0
  355. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/message_utils.py +0 -0
  356. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/registry.py +0 -0
  357. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/resources_utils.py +0 -0
  358. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/rich_console_utils.py +0 -0
  359. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/rich_utils.py +0 -0
  360. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/schemas.py +0 -0
  361. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/status_lib.py +0 -0
  362. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/subprocess_utils.py +0 -0
  363. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/timeline.py +0 -0
  364. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/ux_utils.py +0 -0
  365. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
  366. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/entry_points.txt +0 -0
  367. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/requires.txt +0 -0
  368. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/top_level.txt +0 -0
  369. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_api.py +0 -0
  370. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_cli.py +0 -0
  371. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_config.py +0 -0
  372. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_global_user_state.py +0 -0
  373. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_jobs.py +0 -0
  374. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_jobs_and_serve.py +0 -0
  375. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_list_accelerators.py +0 -0
  376. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_optimizer_dryruns.py +0 -0
  377. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_optimizer_random_dag.py +0 -0
  378. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_serve_autoscaler.py +0 -0
  379. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_smoke.py +0 -0
  380. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_storage.py +0 -0
  381. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_wheels.py +0 -0
  382. {skypilot_nightly-1.0.0.dev20250407 → skypilot_nightly-1.0.0.dev20250408}/tests/test_yaml_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250407
3
+ Version: 1.0.0.dev20250408
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.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 = 'c5039370280815a3f347e76622dc154ede36d6c3'
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.dev20250407'
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.
@@ -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
- excluded_files = set(
271
- [os.path.join(item, f) for f in get_excluded_files(item)])
272
- if os.path.isfile(item) and item not in excluded_files:
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
- assert (backend is None or
132
- backend == QueueBackend.MULTIPROCESSING), backend
133
- self.queue = mp_queue.get_queue(self.name)
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
- logger.info(
452
- f'SkyPilot API server will start {max_parallel_for_long} workers for '
453
- f'long requests and will allow at max '
454
- f'{max_parallel_for_short} short requests in parallel.')
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, queue_server, port)
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
- long_workers = []
479
- for worker_id in range(max_parallel_for_long):
480
- worker = RequestWorker(id=worker_id,
481
- schedule_type=api_requests.ScheduleType.LONG)
482
- worker_proc = multiprocessing.Process(target=request_worker,
483
- args=(worker, 1))
484
- long_workers.append(worker_proc)
485
- sub_procs.append(worker_proc)
486
- threading.Thread(target=subprocess_utils.slow_start_processes,
487
- args=(long_workers,),
488
- daemon=True).start()
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
- worker = RequestWorker(id=1, schedule_type=api_requests.ScheduleType.SHORT)
492
- worker_proc = multiprocessing.Process(target=request_worker,
493
- args=(worker, max_parallel_for_short))
494
- worker_proc.start()
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