跳到主要内容

模板

报价决定你拿到什么硬件。模板决定在上面跑什么。部署这两样都要有:你在市场里挑好报价,部署页面会把它带下去,同时你挑选模板。

模板是一份启动配方

模板是对“这台机器应该启动进入什么”这个问题的一份已保存答案。它包含:

组成部分它决定什么
镜像与标签要拉取的容器镜像,可以来自私有镜像仓库。
启动模式容器如何启动,以及随之带来哪些端口。
端口发布哪些容器端口,每个端口带一个标签。
环境交给容器的变量。值可以标记为机密。
启动脚本容器第一次启动时在容器内运行的命令。之后再启动不会重新运行它们。
约束最低 CUDA 版本、最低显存,以及部署页面在放你启动之前会检查的其他硬件下限。

模板从不指定某台机器。它的约束是下限——一个最低 CUDA 版本、一个最低显存——而不是绑定某台主机,所以同一个模板不用改就能部署到 1× RTX 4090 或 8× H100 PCIe 上,只要两者都过得了这些下限。这正是保存一个模板、而不是每次重填一遍相同设置的价值所在。

启动模式

启动模式是唯一一个改变实例形态而不是内容的字段。

模式你得到什么
ssh一个 SSH 服务器。端口 22 会自动为你加上。
jupyterJupyterLab 加一个 SSH shell。端口 22 和 8080 会自动为你加上。
args镜像自带的 entrypoint,用你提供的参数运行。无交互界面。
vm一台完整的 KVM 虚拟机。只能部署到支持 VM 的报价上。

sshjupyter 需要一个从 Superheat 基础镜像派生的镜像,因为这两种模式依赖基础镜像的 entrypoint 来拉起 SSH 守护进程和 JupyterLab。argsvm 可以跑任何镜像。参见 启动模式

无论你的模板设了什么,平台都会在其之上覆盖自己的环境,而且覆盖的一方胜出。你无法从模板里改掉 JupyterLab 令牌或 GPU 数量。环境变量 讲了平台控制哪些内容。

可见性

每个模板都有三种可见性级别之一。

可见性谁能看到谁能编辑
system所有人。这些是 Superheat 维护的精选起点。没有人。系统模板通过 API 是不可变的。
private只有拥有它的组织。这是你创建的任何模板的默认值。那个组织。
public所有人。任何账户都能读到这份配方。拥有它的组织。

机密环境值对拥有该模板的组织以外的人是遮蔽的,所以发布模板分享的是配方,而不会泄露烧进去的凭据。

你不能编辑不属于你的系统模板或公开模板,但你可以复制任何你能看到的模板。副本会以 private 落到你的组织里,随你改动。复制别人的模板会清空它的机密值和私有镜像仓库凭据——这些由你自己提供。

模板为什么有两个身份

模板有一个稳定的 id 和一个 hash_idhash_id 是与启动相关的那些字段的内容哈希——镜像、标签、仓库、模式、参数、启动脚本、环境、端口、约束、Jupyter 目录与 JupyterLab 开关,以及私有镜像仓库的用户名——并加上 th_ 前缀。

只要这些字段中任何一个发生变化,它就会重新生成;而当所有者修改名称、描述、readme、可见性或排序时,它保持不动。启动配方有自己的身份,与承载它的那一行记录分开。

这种拆分给了你两种指向模板的方式:

你分享的东西行为
id跟着模板走。如果所有者改了它启动的内容,你的链接就会启动新版本。
hash_id标识某一份确切的配方。如果所有者改了它启动的内容,旧的哈希就解析不出来了。

当别人需要复现你的运行时,该用的是第二种。一个过期的哈希链接会明确报错,而不是悄悄启动一个已经不是你测过的东西。API 在 GET /v1/templates/by-hash/{hash_id} 解析它。

相关内容