dstack 0.19.24__py3-none-any.whl → 0.19.25__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 dstack might be problematic. Click here for more details.

Files changed (56) hide show
  1. dstack/_internal/cli/commands/apply.py +14 -2
  2. dstack/_internal/cli/commands/init.py +47 -2
  3. dstack/_internal/cli/commands/offer.py +68 -60
  4. dstack/_internal/cli/services/configurators/run.py +35 -10
  5. dstack/_internal/cli/services/repos.py +6 -24
  6. dstack/_internal/cli/utils/common.py +7 -0
  7. dstack/_internal/cli/utils/gpu.py +210 -0
  8. dstack/_internal/cli/utils/run.py +33 -0
  9. dstack/_internal/core/backends/aws/compute.py +1 -4
  10. dstack/_internal/core/backends/base/compute.py +0 -4
  11. dstack/_internal/core/backends/gcp/compute.py +1 -4
  12. dstack/_internal/core/backends/nebius/compute.py +1 -4
  13. dstack/_internal/core/models/common.py +1 -1
  14. dstack/_internal/core/models/config.py +3 -1
  15. dstack/_internal/core/models/configurations.py +16 -14
  16. dstack/_internal/core/models/fleets.py +2 -2
  17. dstack/_internal/core/models/instances.py +1 -1
  18. dstack/_internal/core/models/profiles.py +2 -2
  19. dstack/_internal/core/models/repos/remote.py +2 -2
  20. dstack/_internal/core/models/resources.py +4 -4
  21. dstack/_internal/core/models/runs.py +1 -1
  22. dstack/_internal/core/services/configs/__init__.py +8 -7
  23. dstack/_internal/proxy/gateway/services/registry.py +2 -0
  24. dstack/_internal/server/app.py +2 -0
  25. dstack/_internal/server/background/tasks/process_fleets.py +10 -2
  26. dstack/_internal/server/background/tasks/process_running_jobs.py +65 -44
  27. dstack/_internal/server/background/tasks/process_runs.py +15 -14
  28. dstack/_internal/server/background/tasks/process_submitted_jobs.py +251 -52
  29. dstack/_internal/server/migrations/versions/3d7f6c2ec000_add_jobmodel_registered.py +28 -0
  30. dstack/_internal/server/migrations/versions/e2d08cd1b8d9_add_jobmodel_fleet.py +41 -0
  31. dstack/_internal/server/models.py +13 -1
  32. dstack/_internal/server/routers/gpus.py +29 -0
  33. dstack/_internal/server/schemas/gateways.py +1 -1
  34. dstack/_internal/server/schemas/gpus.py +66 -0
  35. dstack/_internal/server/services/docker.py +1 -1
  36. dstack/_internal/server/services/gpus.py +390 -0
  37. dstack/_internal/server/services/offers.py +48 -31
  38. dstack/_internal/server/services/probes.py +5 -1
  39. dstack/_internal/server/services/proxy/repo.py +1 -0
  40. dstack/_internal/server/services/runs.py +12 -11
  41. dstack/_internal/server/services/services/__init__.py +60 -41
  42. dstack/_internal/server/statics/index.html +1 -1
  43. dstack/_internal/server/statics/logo-notext.svg +116 -0
  44. dstack/_internal/server/statics/{main-03e818b110e1d5705378.css → main-aec4762350e34d6fbff9.css} +1 -1
  45. dstack/_internal/server/statics/{main-16813e4e1d1c4119eda3.js → main-d151b300fcac3933213d.js} +19 -22
  46. dstack/_internal/server/statics/{main-16813e4e1d1c4119eda3.js.map → main-d151b300fcac3933213d.js.map} +1 -1
  47. dstack/_internal/server/testing/common.py +7 -2
  48. dstack/api/_public/repos.py +8 -7
  49. dstack/api/server/__init__.py +6 -0
  50. dstack/api/server/_gpus.py +22 -0
  51. dstack/version.py +1 -1
  52. {dstack-0.19.24.dist-info → dstack-0.19.25.dist-info}/METADATA +1 -1
  53. {dstack-0.19.24.dist-info → dstack-0.19.25.dist-info}/RECORD +56 -48
  54. {dstack-0.19.24.dist-info → dstack-0.19.25.dist-info}/WHEEL +0 -0
  55. {dstack-0.19.24.dist-info → dstack-0.19.25.dist-info}/entry_points.txt +0 -0
  56. {dstack-0.19.24.dist-info → dstack-0.19.25.dist-info}/licenses/LICENSE.md +0 -0
@@ -173,24 +173,43 @@ async def register_replica(
173
173
  ssh_head_proxy: Optional[SSHConnectionParams],
174
174
  ssh_head_proxy_private_key: Optional[str],
175
175
  ):
176
- if gateway_id is None: # in-server proxy
177
- return
178
- conn = await get_or_add_gateway_connection(session, gateway_id)
179
- job_submission = jobs_services.job_model_to_job_submission(job_model)
180
- try:
181
- logger.debug("%s: registering replica for service %s", fmt(job_model), run.id.hex)
182
- async with conn.client() as client:
183
- await client.register_replica(
184
- run=run,
185
- job_spec=JobSpec.__response__.parse_raw(job_model.job_spec_data),
186
- job_submission=job_submission,
187
- ssh_head_proxy=ssh_head_proxy,
188
- ssh_head_proxy_private_key=ssh_head_proxy_private_key,
189
- )
190
- logger.info("%s: replica is registered for service %s", fmt(job_model), run.id.hex)
191
- except (httpx.RequestError, SSHError) as e:
192
- logger.debug("Gateway request failed", exc_info=True)
193
- raise GatewayError(repr(e))
176
+ if gateway_id is not None:
177
+ conn = await get_or_add_gateway_connection(session, gateway_id)
178
+ job_submission = jobs_services.job_model_to_job_submission(job_model)
179
+ try:
180
+ logger.debug("%s: registering replica for service %s", fmt(job_model), run.id.hex)
181
+ async with conn.client() as client:
182
+ await client.register_replica(
183
+ run=run,
184
+ job_spec=JobSpec.__response__.parse_raw(job_model.job_spec_data),
185
+ job_submission=job_submission,
186
+ ssh_head_proxy=ssh_head_proxy,
187
+ ssh_head_proxy_private_key=ssh_head_proxy_private_key,
188
+ )
189
+ except (httpx.RequestError, SSHError) as e:
190
+ logger.debug("Gateway request failed", exc_info=True)
191
+ raise GatewayError(repr(e))
192
+ except GatewayError as e:
193
+ if "already exists in service" in e.msg:
194
+ # Pre-0.19.25 servers never mark the job as `registered`, so 0.19.25+ servers may
195
+ # attempt to register a replica that is already registered on the gateway.
196
+ logger.warning(
197
+ (
198
+ "%s: could not register replica in gateway: %s."
199
+ " NOTE: if you just updated dstack from pre-0.19.25 to 0.19.25+,"
200
+ " expect to see this warning once for every running service replica"
201
+ ),
202
+ fmt(job_model),
203
+ e.msg,
204
+ )
205
+ else:
206
+ raise
207
+ job_model.registered = True
208
+ logger.info(
209
+ "%s: service replica registered to receive requests, gateway=%s",
210
+ fmt(job_model),
211
+ gateway_id is not None,
212
+ )
194
213
 
195
214
 
196
215
  async def unregister_service(session: AsyncSession, run_model: RunModel):
@@ -224,30 +243,30 @@ async def unregister_replica(session: AsyncSession, job_model: JobModel):
224
243
  .options(joinedload(RunModel.project).joinedload(ProjectModel.backends))
225
244
  )
226
245
  run_model = res.unique().scalar_one()
227
- if run_model.gateway_id is None:
228
- # not a service or served by in-server proxy
229
- return
230
-
231
- conn = await get_or_add_gateway_connection(session, run_model.gateway_id)
232
- try:
233
- logger.debug(
234
- "%s: unregistering replica from service %s", fmt(job_model), job_model.run_id.hex
235
- )
236
- async with conn.client() as client:
237
- await client.unregister_replica(
238
- project=run_model.project.name,
239
- run_name=run_model.run_name,
240
- job_id=job_model.id,
246
+ if run_model.gateway_id is not None:
247
+ conn = await get_or_add_gateway_connection(session, run_model.gateway_id)
248
+ try:
249
+ logger.debug(
250
+ "%s: unregistering replica from service %s", fmt(job_model), job_model.run_id.hex
241
251
  )
242
- logger.info(
243
- "%s: replica is unregistered from service %s", fmt(job_model), job_model.run_id.hex
244
- )
245
- except GatewayError as e:
246
- # ignore if replica is not registered
247
- logger.warning("%s: unregistering replica from service: %s", fmt(job_model), e)
248
- except (httpx.RequestError, SSHError) as e:
249
- logger.debug("Gateway request failed", exc_info=True)
250
- raise GatewayError(repr(e))
252
+ async with conn.client() as client:
253
+ await client.unregister_replica(
254
+ project=run_model.project.name,
255
+ run_name=run_model.run_name,
256
+ job_id=job_model.id,
257
+ )
258
+ except GatewayError as e:
259
+ # ignore if replica is not registered
260
+ logger.warning("%s: unregistering replica from service: %s", fmt(job_model), e)
261
+ except (httpx.RequestError, SSHError) as e:
262
+ logger.debug("Gateway request failed", exc_info=True)
263
+ raise GatewayError(repr(e))
264
+ job_model.registered = False
265
+ logger.info(
266
+ "%s: service replica unregistered from receiving requests, gateway=%s",
267
+ fmt(job_model),
268
+ run_model.gateway_id is not None,
269
+ )
251
270
 
252
271
 
253
272
  def _get_service_https(run_spec: RunSpec, configuration: GatewayConfiguration) -> bool:
@@ -1,3 +1,3 @@
1
1
  <!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><title>dstack</title><meta name="description" content="Get GPUs at the best prices and availability from a wide range of providers. No cloud account of your own is required.
2
2
  "/><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet"><meta name="og:title" content="dstack"><meta name="og:type" content="article"><meta name="og:image" content="/splash_thumbnail.png"><meta name="og:description" content="Get GPUs at the best prices and availability from a wide range of providers. No cloud account of your own is required.
3
- "><link rel="icon" type="image/x-icon" href="/assets/favicon.ico"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="48x48" href="/assets/favicon-48x48.png"><link rel="manifest" href="/assets/manifest.webmanifest"><meta name="mobile-web-app-capable" content="yes"><meta name="theme-color" content="#fff"><meta name="application-name" content="dstackai"><link rel="apple-touch-icon" sizes="57x57" href="/assets/apple-touch-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="/assets/apple-touch-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="/assets/apple-touch-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="/assets/apple-touch-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="/assets/apple-touch-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="/assets/apple-touch-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="/assets/apple-touch-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="/assets/apple-touch-icon-152x152.png"><link rel="apple-touch-icon" sizes="167x167" href="/assets/apple-touch-icon-167x167.png"><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon-180x180.png"><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/apple-touch-icon-1024x1024.png"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="apple-mobile-web-app-title" content="dstackai"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-640x1136.png"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1136x640.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-750x1334.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1334x750.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1125x2436.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2436x1125.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1170x2532.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2532x1170.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1179x2556.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2556x1179.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-828x1792.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1792x828.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2688.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2688x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2208.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2208x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1284x2778.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2778x1284.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1290x2796.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2796x1290.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1488x2266.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2266x1488.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1536x2048.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2048x1536.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1620x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1620.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1640x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1640.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2388.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2388x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2224.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2224x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-2048x2732.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2732x2048.png"><meta name="msapplication-TileColor" content="#fff"><meta name="msapplication-TileImage" content="/assets/mstile-144x144.png"><meta name="msapplication-config" content="/assets/browserconfig.xml"><link rel="yandex-tableau-widget" href="/assets/yandex-browser-manifest.json"><script defer="defer" src="/main-16813e4e1d1c4119eda3.js"></script><link href="/main-03e818b110e1d5705378.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div class="b-page-header" id="header"></div><div id="root"></div></body></html>
3
+ "><link rel="icon" type="image/x-icon" href="/assets/favicon.ico"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="48x48" href="/assets/favicon-48x48.png"><link rel="manifest" href="/assets/manifest.webmanifest"><meta name="mobile-web-app-capable" content="yes"><meta name="theme-color" content="#fff"><meta name="application-name" content="dstackai"><link rel="apple-touch-icon" sizes="57x57" href="/assets/apple-touch-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="/assets/apple-touch-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="/assets/apple-touch-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="/assets/apple-touch-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="/assets/apple-touch-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="/assets/apple-touch-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="/assets/apple-touch-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="/assets/apple-touch-icon-152x152.png"><link rel="apple-touch-icon" sizes="167x167" href="/assets/apple-touch-icon-167x167.png"><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon-180x180.png"><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/apple-touch-icon-1024x1024.png"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="apple-mobile-web-app-title" content="dstackai"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-640x1136.png"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1136x640.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-750x1334.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1334x750.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1125x2436.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2436x1125.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1170x2532.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2532x1170.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1179x2556.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2556x1179.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-828x1792.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1792x828.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2688.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2688x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2208.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2208x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1284x2778.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2778x1284.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1290x2796.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2796x1290.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1488x2266.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2266x1488.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1536x2048.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2048x1536.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1620x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1620.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1640x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1640.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2388.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2388x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2224.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2224x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-2048x2732.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2732x2048.png"><meta name="msapplication-TileColor" content="#fff"><meta name="msapplication-TileImage" content="/assets/mstile-144x144.png"><meta name="msapplication-config" content="/assets/browserconfig.xml"><link rel="yandex-tableau-widget" href="/assets/yandex-browser-manifest.json"><script defer="defer" src="/main-d151b300fcac3933213d.js"></script><link href="/main-aec4762350e34d6fbff9.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div class="b-page-header" id="header"></div><div id="root"></div><script src="https://widget.kapa.ai/kapa-widget.bundle.js" data-website-id="1c028b8e-609e-40e3-b792-f3939a461850" data-project-name="dstack" data-project-color="rgba(0, 0, 0, 0.87)" data-font-size-lg="0.78rem" data-button-hide="true" data-modal-image="/logo-notext.svg" data-modal-z-index="1100" data-modal-title="Ask me anything" data-project-logo="/assets/images/kapa.svg" data-modal-disclaimer="This is a custom LLM for dstack with access to Documentation, API references and GitHub issues. This feature is experimental - Give it a try!" data-user-analytics-fingerprint-enabled="true" async></script></body></html>
@@ -0,0 +1,116 @@
1
+ <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M10.0375 20.7569C5.49998 21.5736 2.19849 25.5225 2.19849 30.1329L2.19849 48H9.16032L9.16032 28.5801C9.16032 25.4656 9.70994 22.9007 11.3588 20.519L10.0375 20.7569Z" fill="url(#paint0_linear_9404_7273)"/>
3
+ <path d="M37.9625 27.2431C42.5 26.4264 45.8015 22.4775 45.8015 17.8671L45.8015 4.95911e-05H38.8397L38.8397 19.4199C38.8397 22.5344 38.2901 25.0993 36.6412 27.481L37.9625 27.2431Z" fill="url(#paint1_linear_9404_7273)"/>
4
+ <path d="M43.2362 5.86239C43.2362 6.46939 42.7442 6.96147 42.1372 6.96147C41.5302 6.96147 41.0381 6.46939 41.0381 5.86239C41.0381 5.25538 41.5302 4.76331 42.1372 4.76331C42.7442 4.76331 43.2362 5.25538 43.2362 5.86239Z" fill="#CF07D3"/>
5
+ <path d="M6.59513 42.1373C6.59513 42.7443 6.10306 43.2364 5.49605 43.2364C4.88905 43.2364 4.39697 42.7443 4.39697 42.1373C4.39697 41.5303 4.88905 41.0382 5.49605 41.0382C6.10306 41.0382 6.59513 41.5303 6.59513 42.1373Z" fill="#CF07D3"/>
6
+ <path d="M33.3023 7.001C32.9203 6.52927 32.993 5.83718 33.4647 5.45518C33.9365 5.07317 34.6286 5.14592 35.0106 5.61765L38.1308 9.4708C38.2581 9.62804 38.2339 9.85874 38.0766 9.98607L36.9378 10.9083C36.7805 11.0356 36.5498 11.0114 36.4225 10.8541L33.3023 7.001Z" fill="url(#paint2_linear_9404_7273)"/>
7
+ <path d="M36.8841 11.4241C36.7568 11.2669 36.781 11.0362 36.9383 10.9088L38.0771 9.98662C38.2344 9.85928 38.4651 9.88353 38.5924 10.0408L41.5201 13.6562C41.9021 14.1279 41.8294 14.82 41.3577 15.202C40.8859 15.584 40.1938 15.5113 39.8118 15.0396L36.8841 11.4241Z" fill="url(#paint3_linear_9404_7273)"/>
8
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M20.519 11.8124C20.519 7.20189 23.8205 3.25307 28.3581 2.43632L29.6793 2.19849C28.0305 4.58017 27.4809 7.14505 27.4809 10.2596V27.1145H20.519V11.8124ZM27.4809 36.1877C27.4809 40.7981 24.1794 44.747 19.6418 45.5637L18.3206 45.8015C19.9694 43.4199 20.519 40.855 20.519 37.7405V27.1145H27.4809V36.1877Z" fill="url(#paint4_linear_9404_7273)"/>
9
+ <path d="M5.82156 34.482C5.43956 34.0102 5.5123 33.3181 5.98403 32.9361C6.45576 32.5541 7.14785 32.6269 7.52985 33.0986L10.6501 36.9518C10.7774 37.109 10.7532 37.3397 10.5959 37.467L9.45705 38.3893C9.29981 38.5166 9.06911 38.4923 8.94178 38.3351L5.82156 34.482Z" fill="url(#paint5_linear_9404_7273)"/>
10
+ <path d="M9.40341 38.9051C9.27608 38.7478 9.30032 38.5171 9.45757 38.3898L10.5964 37.4676C10.7537 37.3402 10.9844 37.3645 11.1117 37.5217L14.0394 41.1372C14.4214 41.6089 14.3487 42.301 13.877 42.683C13.4052 43.065 12.7131 42.9922 12.3311 42.5205L9.40341 38.9051Z" fill="url(#paint6_linear_9404_7273)"/>
11
+ <path d="M8.02029 26.4204C7.63829 25.9487 7.71103 25.2566 8.18276 24.8746C8.65449 24.4926 9.34658 24.5654 9.72858 25.0371L15.5646 32.2439C15.6919 32.4012 15.6676 32.6318 15.5104 32.7592L14.3715 33.6814C14.2143 33.8087 13.9836 33.7845 13.8563 33.6273L8.02029 26.4204Z" fill="url(#paint7_linear_9404_7273)"/>
12
+ <path d="M14.318 34.1987C14.1906 34.0414 14.2149 33.8107 14.3721 33.6834L15.511 32.7612C15.6682 32.6338 15.8989 32.6581 16.0263 32.8153L21.5404 39.6247C21.9224 40.0965 21.8497 40.7886 21.3779 41.1706C20.9062 41.5526 20.2141 41.4798 19.8321 41.0081L14.318 34.1987Z" fill="url(#paint8_linear_9404_7273)"/>
13
+ <path d="M27.2431 37.9625C26.4264 42.5 22.4775 45.8015 17.8671 45.8015H4.57764e-05V38.8397H19.4199C22.5344 38.8397 25.0993 38.2901 27.481 36.6412L27.2431 37.9625Z" fill="url(#paint9_linear_9404_7273)"/>
14
+ <path d="M26.3411 8.46621C25.9591 7.99447 26.0318 7.30239 26.5036 6.92039C26.9753 6.53838 27.6674 6.61113 28.0494 7.08286L33.8854 14.2897C34.0127 14.4469 33.9884 14.6776 33.8312 14.805L32.6923 15.7272C32.5351 15.8545 32.3044 15.8303 32.1771 15.673L26.3411 8.46621Z" fill="url(#paint10_linear_9404_7273)"/>
15
+ <path d="M32.6388 16.2444C32.5114 16.0872 32.5357 15.8565 32.6929 15.7292L33.8318 14.8069C33.989 14.6796 34.2197 14.7038 34.3471 14.8611L39.8612 21.6705C40.2432 22.1422 40.1705 22.8343 39.6987 23.2163C39.227 23.5983 38.5349 23.5256 38.1529 23.0539L32.6388 16.2444Z" fill="url(#paint11_linear_9404_7273)"/>
16
+ <path d="M14.9817 24.9552C14.5997 24.4835 14.6725 23.7914 15.1442 23.4094C15.6159 23.0274 16.308 23.1001 16.69 23.5719L19.8102 27.425C19.9376 27.5823 19.9133 27.813 19.7561 27.9403L18.6172 28.8625C18.46 28.9899 18.2293 28.9656 18.1019 28.8084L14.9817 24.9552Z" fill="url(#paint12_linear_9404_7273)"/>
17
+ <path d="M18.5636 29.3783C18.4362 29.2211 18.4605 28.9904 18.6177 28.8631L19.7566 27.9408C19.9138 27.8135 20.1445 27.8377 20.2719 27.995L23.1996 31.6104C23.5816 32.0822 23.5088 32.7742 23.0371 33.1563C22.5654 33.5383 21.8733 33.4655 21.4913 32.9938L18.5636 29.3783Z" fill="url(#paint13_linear_9404_7273)"/>
18
+ <path d="M20.7569 10.0375C21.5736 5.49998 25.5224 2.19849 30.1329 2.19849H47.9999V9.16032H28.5801C25.4656 9.16032 22.9007 9.70994 20.519 11.3588L20.7569 10.0375Z" fill="url(#paint14_linear_9404_7273)"/>
19
+ <path d="M23.7757 16.5277C23.3937 16.056 23.4664 15.3639 23.9381 14.9819C24.4099 14.5999 25.102 14.6726 25.484 15.1444L28.6042 18.9975C28.7315 19.1548 28.7073 19.3855 28.55 19.5128L27.4112 20.435C27.2539 20.5624 27.0232 20.5381 26.8959 20.3809L23.7757 16.5277Z" fill="url(#paint15_linear_9404_7273)"/>
20
+ <path d="M27.3575 20.9509C27.2302 20.7936 27.2544 20.5629 27.4117 20.4356L28.5505 19.5133C28.7078 19.386 28.9385 19.4103 29.0658 19.5675L31.9935 23.1829C32.3755 23.6547 32.3028 24.3468 31.831 24.7288C31.3593 25.1108 30.6672 25.038 30.2852 24.5663L27.3575 20.9509Z" fill="url(#paint16_linear_9404_7273)"/>
21
+ <path d="M24.9157 24.1831C24.9157 24.7901 24.4236 25.2821 23.8166 25.2821C23.2096 25.2821 22.7175 24.7901 22.7175 24.1831C22.7175 23.5761 23.2096 23.084 23.8166 23.084C24.4236 23.084 24.9157 23.5761 24.9157 24.1831Z" fill="#22BADB"/>
22
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M36.1876 27.4808C40.7981 27.4808 44.7469 24.1794 45.5637 19.6418L45.8015 18.3205C43.4198 19.9694 40.8549 20.519 37.7404 20.519L20.8855 20.519V27.4808L36.1876 27.4808ZM11.8123 20.519C7.20185 20.519 3.25302 23.8205 2.43626 28.358L2.19843 29.6793C4.58012 28.0305 7.145 27.4808 10.2595 27.4808L20.8855 27.4808V20.519H11.8123Z" fill="url(#paint17_linear_9404_7273)"/>
23
+ <defs>
24
+ <linearGradient id="paint0_linear_9404_7273" x1="3.84734" y1="50.0152" x2="4.03055" y2="20.519" gradientUnits="userSpaceOnUse">
25
+ <stop offset="0.0428911" stop-color="#B019E6"/>
26
+ <stop offset="0.195594" stop-color="#9C2B9A"/>
27
+ <stop offset="0.430184" stop-color="#DC46D3"/>
28
+ <stop offset="0.627832" stop-color="#BD23CB"/>
29
+ <stop offset="1" stop-color="#570995"/>
30
+ </linearGradient>
31
+ <linearGradient id="paint1_linear_9404_7273" x1="42.5038" y1="25.6489" x2="42.3206" y2="-1.83202" gradientUnits="userSpaceOnUse">
32
+ <stop stop-color="#F139D2"/>
33
+ <stop offset="0.303464" stop-color="#D143B9"/>
34
+ <stop offset="0.501827" stop-color="#8226C9"/>
35
+ <stop offset="1" stop-color="#BF15DB"/>
36
+ </linearGradient>
37
+ <linearGradient id="paint2_linear_9404_7273" x1="33.0664" y1="6.62009" x2="37.3964" y2="10.6166" gradientUnits="userSpaceOnUse">
38
+ <stop stop-color="#5991D5"/>
39
+ <stop offset="1" stop-color="#11519E"/>
40
+ </linearGradient>
41
+ <linearGradient id="paint3_linear_9404_7273" x1="37.9233" y1="12.824" x2="41.0374" y2="12.2744" gradientUnits="userSpaceOnUse">
42
+ <stop stop-color="#C050E8"/>
43
+ <stop offset="1" stop-color="#8022A2"/>
44
+ </linearGradient>
45
+ <linearGradient id="paint4_linear_9404_7273" x1="23.9999" y1="2.19849" x2="23.9999" y2="45.8015" gradientUnits="userSpaceOnUse">
46
+ <stop stop-color="#3CBACB" stop-opacity="0.87"/>
47
+ <stop offset="0.154499" stop-color="#0886BC"/>
48
+ <stop offset="0.334093" stop-color="#0CBCC7"/>
49
+ <stop offset="0.60681" stop-color="#14D6F0"/>
50
+ <stop offset="0.786865" stop-color="#0CA0C0"/>
51
+ <stop offset="1" stop-color="#0665BC"/>
52
+ </linearGradient>
53
+ <linearGradient id="paint5_linear_9404_7273" x1="10.9916" y1="37.3735" x2="5.04152" y2="35.2384" gradientUnits="userSpaceOnUse">
54
+ <stop stop-color="#C050E8"/>
55
+ <stop offset="1" stop-color="#8022A2"/>
56
+ </linearGradient>
57
+ <linearGradient id="paint6_linear_9404_7273" x1="9.16033" y1="39.5722" x2="14.6557" y2="41.404" gradientUnits="userSpaceOnUse">
58
+ <stop stop-color="#F77FF5"/>
59
+ <stop offset="1" stop-color="#A22CA0"/>
60
+ </linearGradient>
61
+ <linearGradient id="paint7_linear_9404_7273" x1="16.3043" y1="31.6935" x2="8.79388" y2="28.3963" gradientUnits="userSpaceOnUse">
62
+ <stop stop-color="#5991D5"/>
63
+ <stop offset="1" stop-color="#11519E"/>
64
+ </linearGradient>
65
+ <linearGradient id="paint8_linear_9404_7273" x1="13.3738" y1="33.7098" x2="22.3497" y2="40.4875" gradientUnits="userSpaceOnUse">
66
+ <stop stop-color="#77D3FB"/>
67
+ <stop offset="1" stop-color="#0A69C1"/>
68
+ </linearGradient>
69
+ <linearGradient id="paint9_linear_9404_7273" x1="27.481" y1="44.1527" x2="-0.732784" y2="44.1527" gradientUnits="userSpaceOnUse">
70
+ <stop stop-color="#055BAB" stop-opacity="0.49"/>
71
+ <stop offset="0.196658" stop-color="#0794C0" stop-opacity="0.88"/>
72
+ <stop offset="0.371414" stop-color="#05B4D0" stop-opacity="0.96"/>
73
+ <stop offset="0.536277" stop-color="#30C2D8" stop-opacity="0.86"/>
74
+ <stop offset="0.806654" stop-color="#1FBFD0" stop-opacity="0.8"/>
75
+ <stop offset="1" stop-color="#0CC6D9" stop-opacity="0.87"/>
76
+ </linearGradient>
77
+ <linearGradient id="paint10_linear_9404_7273" x1="34.6251" y1="13.7393" x2="27.1147" y2="10.442" gradientUnits="userSpaceOnUse">
78
+ <stop stop-color="#5991D5"/>
79
+ <stop offset="1" stop-color="#11519E"/>
80
+ </linearGradient>
81
+ <linearGradient id="paint11_linear_9404_7273" x1="31.6946" y1="15.7556" x2="40.6704" y2="22.5333" gradientUnits="userSpaceOnUse">
82
+ <stop stop-color="#77D3FB"/>
83
+ <stop offset="1" stop-color="#0A69C1"/>
84
+ </linearGradient>
85
+ <linearGradient id="paint12_linear_9404_7273" x1="20.633" y1="26.9772" x2="16.2515" y2="24.0391" gradientUnits="userSpaceOnUse">
86
+ <stop stop-color="#5991D5"/>
87
+ <stop offset="1" stop-color="#11519E"/>
88
+ </linearGradient>
89
+ <linearGradient id="paint13_linear_9404_7273" x1="18.3205" y1="30.0455" x2="23.8159" y2="31.8773" gradientUnits="userSpaceOnUse">
90
+ <stop stop-color="#FD7EFC"/>
91
+ <stop offset="1" stop-color="#3D57B5"/>
92
+ </linearGradient>
93
+ <linearGradient id="paint14_linear_9404_7273" x1="20.519" y1="6.59543" x2="50.5648" y2="6.59543" gradientUnits="userSpaceOnUse">
94
+ <stop stop-color="#0397C6" stop-opacity="0.73"/>
95
+ <stop offset="0.304027" stop-color="#31D0E1" stop-opacity="0.87"/>
96
+ <stop offset="0.526955" stop-color="#43E1ED" stop-opacity="0.82"/>
97
+ <stop offset="0.783942" stop-color="#1DB0C8" stop-opacity="0.71"/>
98
+ <stop offset="1" stop-color="#098A9F"/>
99
+ </linearGradient>
100
+ <linearGradient id="paint15_linear_9404_7273" x1="28.9458" y1="19.4193" x2="22.9956" y2="17.2842" gradientUnits="userSpaceOnUse">
101
+ <stop stop-color="#C050E8"/>
102
+ <stop offset="1" stop-color="#8022A2"/>
103
+ </linearGradient>
104
+ <linearGradient id="paint16_linear_9404_7273" x1="27.1144" y1="21.618" x2="32.6098" y2="23.4498" gradientUnits="userSpaceOnUse">
105
+ <stop stop-color="#C77FF7"/>
106
+ <stop offset="1" stop-color="#A22CA0" stop-opacity="0.25"/>
107
+ </linearGradient>
108
+ <linearGradient id="paint17_linear_9404_7273" x1="45.8015" y1="23.9999" x2="2.19843" y2="23.9999" gradientUnits="userSpaceOnUse">
109
+ <stop stop-color="#A724A5"/>
110
+ <stop offset="0.240046" stop-color="#E344E3" stop-opacity="0.76"/>
111
+ <stop offset="0.651048" stop-color="#FE7CE6" stop-opacity="0.76"/>
112
+ <stop offset="0.756859" stop-color="#EE6FEE" stop-opacity="0.93"/>
113
+ <stop offset="1" stop-color="#BE0595" stop-opacity="0.9"/>
114
+ </linearGradient>
115
+ </defs>
116
+ </svg>