skypilot-nightly 1.0.0.dev20250806__py3-none-any.whl → 1.0.0.dev20250807__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of skypilot-nightly might be problematic. Click here for more details.

Files changed (123) hide show
  1. sky/__init__.py +2 -2
  2. sky/backends/cloud_vm_ray_backend.py +33 -4
  3. sky/check.py +11 -1
  4. sky/client/cli/command.py +208 -93
  5. sky/client/sdk.py +14 -1
  6. sky/client/sdk_async.py +4 -0
  7. sky/dashboard/out/404.html +1 -1
  8. sky/dashboard/out/_next/static/YAirOGsV1z6B2RJ0VIUmD/_buildManifest.js +1 -0
  9. sky/dashboard/out/_next/static/chunks/1141-a8a8f1adba34c892.js +11 -0
  10. sky/dashboard/out/_next/static/chunks/1871-980a395e92633a5c.js +6 -0
  11. sky/dashboard/out/_next/static/chunks/3785.6003d293cb83eab4.js +1 -0
  12. sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +1 -0
  13. sky/dashboard/out/_next/static/chunks/4725.29550342bd53afd8.js +1 -0
  14. sky/dashboard/out/_next/static/chunks/{4937.d6bf67771e353356.js → 4937.a2baa2df5572a276.js} +1 -1
  15. sky/dashboard/out/_next/static/chunks/6130-2be46d70a38f1e82.js +1 -0
  16. sky/dashboard/out/_next/static/chunks/6601-3e21152fe16da09c.js +1 -0
  17. sky/dashboard/out/_next/static/chunks/{691.6d99cbfba347cebf.js → 691.5eeedf82cc243343.js} +1 -1
  18. sky/dashboard/out/_next/static/chunks/6989-6129c1cfbcf51063.js +1 -0
  19. sky/dashboard/out/_next/static/chunks/6990-0f886f16e0d55ff8.js +1 -0
  20. sky/dashboard/out/_next/static/chunks/8056-019615038d6ce427.js +1 -0
  21. sky/dashboard/out/_next/static/chunks/8252.62b0d23aed618bb2.js +16 -0
  22. sky/dashboard/out/_next/static/chunks/8969-318c3dca725e8e5d.js +1 -0
  23. sky/dashboard/out/_next/static/chunks/9025.a1bef12d672bb66d.js +6 -0
  24. sky/dashboard/out/_next/static/chunks/9159-11421c0f2909236f.js +1 -0
  25. sky/dashboard/out/_next/static/chunks/9360.85b0b1b4054574dd.js +31 -0
  26. sky/dashboard/out/_next/static/chunks/9666.cd4273f2a5c5802c.js +1 -0
  27. sky/dashboard/out/_next/static/chunks/{9847.4c46c5e229c78704.js → 9847.757720f3b40c0aa5.js} +1 -1
  28. sky/dashboard/out/_next/static/chunks/pages/{_app-2a43ea3241bbdacd.js → _app-1e6de35d15a8d432.js} +1 -1
  29. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-6fd1d2d8441aa54b.js +11 -0
  30. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-155d477a6c3e04e2.js +1 -0
  31. sky/dashboard/out/_next/static/chunks/pages/{clusters-47f1ddae13a2f8e4.js → clusters-b30460f683e6ba96.js} +1 -1
  32. sky/dashboard/out/_next/static/chunks/pages/config-dfb9bf07b13045f4.js +1 -0
  33. sky/dashboard/out/_next/static/chunks/pages/infra/{[context]-2a44e70b500b6b70.js → [context]-13d53fffc03ccb52.js} +1 -1
  34. sky/dashboard/out/_next/static/chunks/pages/{infra-22faac9325016d83.js → infra-fc9222e26c8e2f0d.js} +1 -1
  35. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-154f55cf8af55be5.js +11 -0
  36. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-f5ccf5d39d87aebe.js +21 -0
  37. sky/dashboard/out/_next/static/chunks/pages/jobs-cdc60fb5d371e16a.js +1 -0
  38. sky/dashboard/out/_next/static/chunks/pages/{users-b90c865a690bfe84.js → users-7ed36e44e779d5c7.js} +1 -1
  39. sky/dashboard/out/_next/static/chunks/pages/{volumes-7af733f5d7b6ed1c.js → volumes-c9695d657f78b5dc.js} +1 -1
  40. sky/dashboard/out/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js +1 -0
  41. sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-f72f73bcef9541dc.js +1 -0
  42. sky/dashboard/out/_next/static/chunks/pages/workspaces-8f67be60165724cc.js +1 -0
  43. sky/dashboard/out/_next/static/chunks/webpack-76efbdad99742559.js +1 -0
  44. sky/dashboard/out/_next/static/css/4614e06482d7309e.css +3 -0
  45. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  46. sky/dashboard/out/clusters/[cluster].html +1 -1
  47. sky/dashboard/out/clusters.html +1 -1
  48. sky/dashboard/out/config.html +1 -1
  49. sky/dashboard/out/index.html +1 -1
  50. sky/dashboard/out/infra/[context].html +1 -1
  51. sky/dashboard/out/infra.html +1 -1
  52. sky/dashboard/out/jobs/[job].html +1 -1
  53. sky/dashboard/out/jobs/pools/[pool].html +1 -0
  54. sky/dashboard/out/jobs.html +1 -1
  55. sky/dashboard/out/users.html +1 -1
  56. sky/dashboard/out/volumes.html +1 -1
  57. sky/dashboard/out/workspace/new.html +1 -1
  58. sky/dashboard/out/workspaces/[name].html +1 -1
  59. sky/dashboard/out/workspaces.html +1 -1
  60. sky/global_user_state.py +14 -2
  61. sky/jobs/__init__.py +2 -0
  62. sky/jobs/client/sdk.py +43 -2
  63. sky/jobs/server/core.py +48 -1
  64. sky/jobs/server/server.py +52 -3
  65. sky/jobs/state.py +5 -1
  66. sky/schemas/db/global_user_state/002_add_workspace_to_cluster_history.py +35 -0
  67. sky/schemas/db/spot_jobs/003_pool_hash.py +34 -0
  68. sky/serve/client/impl.py +85 -1
  69. sky/serve/client/sdk.py +16 -47
  70. sky/serve/constants.py +2 -1
  71. sky/serve/controller.py +4 -2
  72. sky/serve/serve_state.py +28 -5
  73. sky/serve/serve_utils.py +77 -46
  74. sky/serve/server/core.py +13 -197
  75. sky/serve/server/impl.py +239 -2
  76. sky/serve/service.py +8 -3
  77. sky/server/common.py +11 -4
  78. sky/server/constants.py +1 -1
  79. sky/server/requests/executor.py +5 -3
  80. sky/server/requests/payloads.py +19 -0
  81. sky/task.py +18 -11
  82. sky/templates/kubernetes-ray.yml.j2 +5 -0
  83. sky/templates/sky-serve-controller.yaml.j2 +1 -0
  84. sky/usage/usage_lib.py +8 -6
  85. sky/utils/annotations.py +8 -3
  86. sky/utils/common_utils.py +11 -1
  87. sky/utils/db/migration_utils.py +2 -2
  88. {skypilot_nightly-1.0.0.dev20250806.dist-info → skypilot_nightly-1.0.0.dev20250807.dist-info}/METADATA +18 -13
  89. {skypilot_nightly-1.0.0.dev20250806.dist-info → skypilot_nightly-1.0.0.dev20250807.dist-info}/RECORD +95 -92
  90. sky/client/sdk.pyi +0 -301
  91. sky/dashboard/out/_next/static/Gelsd19kVxXcX7aQQGsGu/_buildManifest.js +0 -1
  92. sky/dashboard/out/_next/static/chunks/1043-75af48ca5d5aaf57.js +0 -1
  93. sky/dashboard/out/_next/static/chunks/1141-8678a9102cc5f67e.js +0 -11
  94. sky/dashboard/out/_next/static/chunks/1664-22b00e32c9ff96a4.js +0 -1
  95. sky/dashboard/out/_next/static/chunks/1871-ced1c14230cad6e1.js +0 -6
  96. sky/dashboard/out/_next/static/chunks/2003.f90b06bb1f914295.js +0 -1
  97. sky/dashboard/out/_next/static/chunks/2350.fab69e61bac57b23.js +0 -1
  98. sky/dashboard/out/_next/static/chunks/2622-951867535095b0eb.js +0 -1
  99. sky/dashboard/out/_next/static/chunks/3785.0a173cd4393f0fef.js +0 -1
  100. sky/dashboard/out/_next/static/chunks/4725.42f21f250f91f65b.js +0 -1
  101. sky/dashboard/out/_next/static/chunks/4869.18e6a4361a380763.js +0 -16
  102. sky/dashboard/out/_next/static/chunks/5230-f3bb2663e442e86c.js +0 -1
  103. sky/dashboard/out/_next/static/chunks/6601-2109d22e7861861c.js +0 -1
  104. sky/dashboard/out/_next/static/chunks/6990-08b2a1cae076a943.js +0 -1
  105. sky/dashboard/out/_next/static/chunks/8969-9a8cca241b30db83.js +0 -1
  106. sky/dashboard/out/_next/static/chunks/9025.99f29acb7617963e.js +0 -6
  107. sky/dashboard/out/_next/static/chunks/938-bda2685db5eae6cf.js +0 -1
  108. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-7cb24da04ca00956.js +0 -11
  109. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-1e95993124dbfc57.js +0 -1
  110. sky/dashboard/out/_next/static/chunks/pages/config-d56e64f30db7b42e.js +0 -1
  111. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-90693cb88b5599a7.js +0 -11
  112. sky/dashboard/out/_next/static/chunks/pages/jobs-ab318e52eb4424a7.js +0 -1
  113. sky/dashboard/out/_next/static/chunks/pages/workspace/new-92f741084a89e27b.js +0 -1
  114. sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-35e0de5bca55e594.js +0 -1
  115. sky/dashboard/out/_next/static/chunks/pages/workspaces-062525fb5462acb6.js +0 -1
  116. sky/dashboard/out/_next/static/chunks/webpack-387626669badf82e.js +0 -1
  117. sky/dashboard/out/_next/static/css/b3227360726f12eb.css +0 -3
  118. /sky/dashboard/out/_next/static/{Gelsd19kVxXcX7aQQGsGu → YAirOGsV1z6B2RJ0VIUmD}/_ssgManifest.js +0 -0
  119. /sky/dashboard/out/_next/static/chunks/{6135-2d7ed3350659d073.js → 6135-85426374db04811e.js} +0 -0
  120. {skypilot_nightly-1.0.0.dev20250806.dist-info → skypilot_nightly-1.0.0.dev20250807.dist-info}/WHEEL +0 -0
  121. {skypilot_nightly-1.0.0.dev20250806.dist-info → skypilot_nightly-1.0.0.dev20250807.dist-info}/entry_points.txt +0 -0
  122. {skypilot_nightly-1.0.0.dev20250806.dist-info → skypilot_nightly-1.0.0.dev20250807.dist-info}/licenses/LICENSE +0 -0
  123. {skypilot_nightly-1.0.0.dev20250806.dist-info → skypilot_nightly-1.0.0.dev20250807.dist-info}/top_level.txt +0 -0
sky/task.py CHANGED
@@ -241,8 +241,8 @@ class Task:
241
241
  self,
242
242
  name: Optional[str] = None,
243
243
  *,
244
- setup: Optional[str] = None,
245
- run: Optional[CommandOrCommandGen] = None,
244
+ setup: Optional[Union[str, List[str]]] = None,
245
+ run: Optional[Union[CommandOrCommandGen, List[str]]] = None,
246
246
  envs: Optional[Dict[str, str]] = None,
247
247
  secrets: Optional[Dict[str, str]] = None,
248
248
  workdir: Optional[Union[str, Dict[str, Any]]] = None,
@@ -293,15 +293,15 @@ class Task:
293
293
 
294
294
  Args:
295
295
  name: A string name for the Task for display purposes.
296
- setup: A setup command, which will be run before executing the run
296
+ setup: A setup command(s), which will be run before executing the run
297
297
  commands ``run``, and executed under ``workdir``.
298
298
  run: The actual command for the task. If not None, either a shell
299
- command (str) or a command generator (callable). If latter, it
300
- must take a node rank and a list of node addresses as input and
301
- return a shell command (str) (valid to return None for some nodes,
302
- in which case no commands are run on them). Run commands will be
303
- run under ``workdir``. Note the command generator should be a
304
- self-contained lambda.
299
+ command(s) (str, list(str)) or a command generator (callable). If
300
+ latter, it must take a node rank and a list of node addresses as
301
+ input and return a shell command (str) (valid to return None for
302
+ some nodes, in which case no commands are run on them). Run
303
+ commands will be run under ``workdir``. Note the command generator
304
+ should be a self-contained lambda.
305
305
  envs: A dictionary of environment variables to set before running the
306
306
  setup and run commands.
307
307
  secrets: A dictionary of secret environment variables to set before
@@ -347,15 +347,22 @@ class Task:
347
347
  YAML config.
348
348
  """
349
349
  self.name = name
350
- self.run = run
351
350
  self.storage_mounts: Dict[str, storage_lib.Storage] = {}
352
351
  self.storage_plans: Dict[storage_lib.Storage,
353
352
  storage_lib.StoreType] = {}
354
- self.setup = setup
355
353
  self._envs = envs or {}
356
354
  self._secrets = secrets or {}
357
355
  self._volumes = volumes or {}
358
356
 
357
+ # concatenate commands if given as list
358
+ def _concat(commands):
359
+ if isinstance(commands, list):
360
+ return '\n'.join(commands)
361
+ return commands
362
+
363
+ self.run = _concat(run)
364
+ self.setup = _concat(setup)
365
+
359
366
  # Validate Docker login configuration early if both envs and secrets
360
367
  # contain Docker variables
361
368
  if self._envs or self._secrets:
@@ -777,6 +777,11 @@ available_node_types:
777
777
  {{ ray_installation_commands }}
778
778
 
779
779
  VIRTUAL_ENV=~/skypilot-runtime ~/.local/bin/uv pip install skypilot[kubernetes,remote]
780
+ # Wait for `patch` package to be installed before applying ray patches
781
+ until dpkg -l | grep -q "^ii patch "; do
782
+ sleep 0.1
783
+ echo "Waiting for patch package to be installed..."
784
+ done
780
785
  # Apply Ray patches for progress bar fix
781
786
  ~/.local/bin/uv pip list | grep "ray " | grep 2.9.3 2>&1 > /dev/null && {
782
787
  VIRTUAL_ENV=~/skypilot-runtime python -c "from sky.skylet.ray_patches import patch; patch()" || exit 1;
@@ -57,6 +57,7 @@ run: |
57
57
  -u -m sky.serve.service \
58
58
  --service-name {{service_name}} \
59
59
  --task-yaml {{remote_task_yaml_path}} \
60
+ --entrypoint {{entrypoint}} \
60
61
  {%- if consolidation_mode_job_id is not none %}
61
62
  --job-id {{consolidation_mode_job_id}} \
62
63
  {%- else %}
sky/usage/usage_lib.py CHANGED
@@ -10,6 +10,8 @@ import traceback
10
10
  import typing
11
11
  from typing import Any, Callable, Dict, List, Optional, Union
12
12
 
13
+ from typing_extensions import ParamSpec
14
+
13
15
  import sky
14
16
  from sky import sky_logging
15
17
  from sky.adaptors import common as adaptors_common
@@ -517,26 +519,26 @@ def entrypoint_context(name: str, fallback: bool = False):
517
519
 
518
520
 
519
521
  T = typing.TypeVar('T')
522
+ P = ParamSpec('P')
520
523
 
521
524
 
522
525
  @typing.overload
523
526
  def entrypoint(
524
527
  name_or_fn: str,
525
- fallback: bool = False
526
- ) -> Callable[[Callable[..., T]], Callable[..., T]]:
528
+ fallback: bool = False) -> Callable[[Callable[P, T]], Callable[P, T]]:
527
529
  ...
528
530
 
529
531
 
530
532
  @typing.overload
531
- def entrypoint(name_or_fn: Callable[..., T],
532
- fallback: bool = False) -> Callable[..., T]:
533
+ def entrypoint(name_or_fn: Callable[P, T],
534
+ fallback: bool = False) -> Callable[P, T]:
533
535
  ...
534
536
 
535
537
 
536
538
  def entrypoint(
537
- name_or_fn: Union[str, Callable[..., T]],
539
+ name_or_fn: Union[str, Callable[P, T]],
538
540
  fallback: bool = False
539
- ) -> Union[Callable[..., T], Callable[[Callable[..., T]], Callable[..., T]]]:
541
+ ) -> Union[Callable[P, T], Callable[[Callable[P, T]], Callable[P, T]]]:
540
542
  return common_utils.make_decorator(entrypoint_context,
541
543
  name_or_fn,
542
544
  fallback=fallback)
sky/utils/annotations.py CHANGED
@@ -1,14 +1,19 @@
1
1
  """Annotations for public APIs."""
2
2
 
3
3
  import functools
4
- from typing import Callable, Literal
4
+ from typing import Callable, Literal, TypeVar
5
+
6
+ from typing_extensions import ParamSpec
5
7
 
6
8
  # Whether the current process is a SkyPilot API server process.
7
9
  is_on_api_server = True
8
10
  FUNCTIONS_NEED_RELOAD_CACHE = []
9
11
 
12
+ T = TypeVar('T')
13
+ P = ParamSpec('P')
14
+
10
15
 
11
- def client_api(func):
16
+ def client_api(func: Callable[P, T]) -> Callable[P, T]:
12
17
  """Mark a function as a client-side API.
13
18
 
14
19
  Code invoked by server-side functions will find annotations.is_on_api_server
@@ -38,7 +43,7 @@ def lru_cache(scope: Literal['global', 'request'], *lru_cache_args,
38
43
  lru_cache_kwargs: Keyword arguments for functools.lru_cache.
39
44
  """
40
45
 
41
- def decorator(func: Callable) -> Callable:
46
+ def decorator(func: Callable[P, T]) -> Callable[P, T]:
42
47
  if scope == 'global':
43
48
  return functools.lru_cache(*lru_cache_args,
44
49
  **lru_cache_kwargs)(func)
sky/utils/common_utils.py CHANGED
@@ -271,12 +271,13 @@ _current_command: Optional[str] = None
271
271
  _current_client_entrypoint: Optional[str] = None
272
272
  _using_remote_api_server: Optional[bool] = None
273
273
  _current_user: Optional['models.User'] = None
274
+ _current_request_id: Optional[str] = None
274
275
 
275
276
 
276
277
  def set_request_context(client_entrypoint: Optional[str],
277
278
  client_command: Optional[str],
278
279
  using_remote_api_server: bool,
279
- user: Optional['models.User']):
280
+ user: Optional['models.User'], request_id: str) -> None:
280
281
  """Override the current client entrypoint and command.
281
282
 
282
283
  This is useful when we are on the SkyPilot API server side and we have a
@@ -286,10 +287,19 @@ def set_request_context(client_entrypoint: Optional[str],
286
287
  global _current_client_entrypoint
287
288
  global _using_remote_api_server
288
289
  global _current_user
290
+ global _current_request_id
289
291
  _current_command = client_command
290
292
  _current_client_entrypoint = client_entrypoint
291
293
  _using_remote_api_server = using_remote_api_server
292
294
  _current_user = user
295
+ _current_request_id = request_id
296
+
297
+
298
+ def get_current_request_id() -> str:
299
+ """Returns the current request id."""
300
+ if _current_request_id is not None:
301
+ return _current_request_id
302
+ return 'dummy-request-id'
293
303
 
294
304
 
295
305
  def get_current_command() -> str:
@@ -19,11 +19,11 @@ logger = sky_logging.init_logger(__name__)
19
19
  DB_INIT_LOCK_TIMEOUT_SECONDS = 10
20
20
 
21
21
  GLOBAL_USER_STATE_DB_NAME = 'state_db'
22
- GLOBAL_USER_STATE_VERSION = '001'
22
+ GLOBAL_USER_STATE_VERSION = '002'
23
23
  GLOBAL_USER_STATE_LOCK_PATH = '~/.sky/locks/.state_db.lock'
24
24
 
25
25
  SPOT_JOBS_DB_NAME = 'spot_jobs_db'
26
- SPOT_JOBS_VERSION = '002'
26
+ SPOT_JOBS_VERSION = '003'
27
27
  SPOT_JOBS_LOCK_PATH = '~/.sky/locks/.spot_jobs_db.lock'
28
28
 
29
29
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250806
3
+ Version: 1.0.0.dev20250807
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -256,12 +256,18 @@ Dynamic: summary
256
256
 
257
257
  ----
258
258
 
259
- SkyPilot is an open-source framework for running AI and batch workloads on any infra.
259
+ SkyPilot is an open-source system for running AI and batch workloads on any infra.
260
260
 
261
261
  SkyPilot **is easy to use for AI users**:
262
- - Quickly spin up compute on your own infra
262
+ - Quickly spin up jobs on your own infra
263
263
  - Environment and job as code — simple and portable
264
- - Easy job management: queue, run, and auto-recover many jobs
264
+ - Easy management: queue, run, and auto-recover many jobs
265
+
266
+ SkyPilot **makes Kubernetes easy for AI teams**:
267
+
268
+ - Slurm-like ease of use, cloud-native robustness
269
+ - Local dev experience on K8s: SSH into pods, sync code, or connect IDE
270
+ - Turbocharge your clusters: gang scheduling, multi-cluster, and scaling
265
271
 
266
272
  SkyPilot **unifies multiple clusters, clouds, and hardware**:
267
273
  - One interface to use reserved GPUs, Kubernetes clusters, or 16+ clouds
@@ -309,7 +315,7 @@ You can find our documentation [here](https://docs.skypilot.co/).
309
315
 
310
316
  A SkyPilot task specifies: resource requirements, data to be synced, setup commands, and the task commands.
311
317
 
312
- Once written in this [**unified interface**](https://docs.skypilot.co/en/latest/reference/yaml-spec.html) (YAML or Python API), the task can be launched on any available cloud. This avoids vendor lock-in, and allows easily moving jobs to a different provider.
318
+ Once written in this [**unified interface**](https://docs.skypilot.co/en/latest/reference/yaml-spec.html) (YAML or Python API), the task can be launched on any available infra (Kubernetes, cloud, etc.). This avoids vendor lock-in, and allows easily moving jobs to a different provider.
313
319
 
314
320
  Paste the following into a file `my_task.yaml`:
315
321
 
@@ -347,12 +353,11 @@ sky launch my_task.yaml
347
353
  ```
348
354
 
349
355
  SkyPilot then performs the heavy-lifting for you, including:
350
- 1. Find the lowest priced VM instance type across different clouds
351
- 2. Provision the VM, with auto-failover if the cloud returned capacity errors
352
- 3. Sync the local `workdir` to the VM
353
- 4. Run the task's `setup` commands to prepare the VM for running the task
354
- 5. Run the task's `run` commands
355
-
356
+ 1. Find the cheapest & available infra across your clusters or clouds
357
+ 2. Provision the GPUs (pods or VMs), with auto-failover if the infra returned capacity errors
358
+ 3. Sync your local `workdir` to the provisioned cluster
359
+ 4. Auto-install dependencies by running the task's `setup` commands
360
+ 5. Run the task's `run` commands, and stream logs
356
361
 
357
362
  See [Quickstart](https://docs.skypilot.co/en/latest/getting-started/quickstart.html) to get started with SkyPilot.
358
363
 
@@ -364,13 +369,13 @@ Latest featured examples:
364
369
 
365
370
  | Task | Examples |
366
371
  |----------|----------|
367
- | Training | [PyTorch](https://docs.skypilot.co/en/latest/getting-started/tutorial.html), [DeepSpeed](https://docs.skypilot.co/en/latest/examples/training/deepspeed.html), [Finetune Llama 3](https://docs.skypilot.co/en/latest/examples/training/llama-3_1-finetuning.html), [NeMo](https://docs.skypilot.co/en/latest/examples/training/nemo.html), [Ray](https://docs.skypilot.co/en/latest/examples/training/ray.html), [Unsloth](https://docs.skypilot.co/en/latest/examples/training/unsloth.html), [Jax/TPU](https://docs.skypilot.co/en/latest/examples/training/tpu.html) |
372
+ | Training | [Verl](https://docs.skypilot.co/en/latest/examples/training/verl.html), [Finetune Llama 4](https://docs.skypilot.co/en/latest/examples/training/llama-4-finetuning.html), [PyTorch](https://docs.skypilot.co/en/latest/getting-started/tutorial.html), [DeepSpeed](https://docs.skypilot.co/en/latest/examples/training/deepspeed.html), [NeMo](https://docs.skypilot.co/en/latest/examples/training/nemo.html), [Ray](https://docs.skypilot.co/en/latest/examples/training/ray.html), [Unsloth](https://docs.skypilot.co/en/latest/examples/training/unsloth.html), [Jax/TPU](https://docs.skypilot.co/en/latest/examples/training/tpu.html) |
368
373
  | Serving | [vLLM](https://docs.skypilot.co/en/latest/examples/serving/vllm.html), [SGLang](https://docs.skypilot.co/en/latest/examples/serving/sglang.html), [Ollama](https://docs.skypilot.co/en/latest/examples/serving/ollama.html) |
369
374
  | Models | [DeepSeek-R1](https://docs.skypilot.co/en/latest/examples/models/deepseek-r1.html), [Llama 3](https://docs.skypilot.co/en/latest/examples/models/llama-3.html), [CodeLlama](https://docs.skypilot.co/en/latest/examples/models/codellama.html), [Qwen](https://docs.skypilot.co/en/latest/examples/models/qwen.html), [Mixtral](https://docs.skypilot.co/en/latest/examples/models/mixtral.html) |
370
375
  | AI apps | [RAG](https://docs.skypilot.co/en/latest/examples/applications/rag.html), [vector databases](https://docs.skypilot.co/en/latest/examples/applications/vector_database.html) (ChromaDB, CLIP) |
371
376
  | Common frameworks | [Airflow](https://docs.skypilot.co/en/latest/examples/frameworks/airflow.html), [Jupyter](https://docs.skypilot.co/en/latest/examples/frameworks/jupyter.html) |
372
377
 
373
- Source files and more examples can be found in [`llm/`](https://github.com/skypilot-org/skypilot/tree/master/llm) and [`examples/`](https://github.com/skypilot-org/skypilot/tree/master/examples).
378
+ Source files can be found in [`llm/`](https://github.com/skypilot-org/skypilot/tree/master/llm) and [`examples/`](https://github.com/skypilot-org/skypilot/tree/master/examples).
374
379
 
375
380
  ## More information
376
381
  To learn more, see [SkyPilot Overview](https://docs.skypilot.co/en/latest/overview.html), [SkyPilot docs](https://docs.skypilot.co/en/latest/), and [SkyPilot blog](https://blog.skypilot.co/).