跳至主要內容

環境變數

環境變數是範本用來設定其內部工作負載的方式:Hugging Face 權杖、模型名稱、日誌層級。請在範本表單的 環境變數 區段新增它們,每一列一組鍵與值,右邊有一個 機密 開關。

設定方式

項目規則
最多 256 個字元。鍵留白的列在儲存時會被捨棄。
任何字串。留白會把該項目存成未設定。
機密對擁有組織以外的任何人遮蔽這個值。

沒有值的項目根本不會注入容器。這讓它很適合當佔位項目:把 HF_TOKEN 宣告為沒有值的機密項目,範本就能說明租用者必須提供什麼,而不會把權杖送給每一個讀到它的人。

透過 API 時,env 在 POST /v1/templatesPATCH /v1/templates/{id} 上是一個物件清單:

{
"env": [
{ "key": "MODEL_ID", "value": "meta-llama/Llama-3-8B", "secret": false },
{ "key": "HF_TOKEN", "value": null, "secret": true }
]
}

在 PATCH 中送出 env 會取代整份清單。沒有逐鍵更新的做法。

機密值遮蔽

機密值只會回傳給擁有該範本的組織。其他所有人 —— 包括瀏覽你公開範本的人,也包括精選 system 範本的讀者 —— 拿到的是 value: null,而 secret 旗標保持不變。主控台會顯示鍵,並以隱藏的佔位符取代值。

遮蔽是跟著資料走,而不是跟著端點走:GET /v1/templatesGET /v1/templates/{id}GET /v1/templates/by-hash/{hash_id} 全都會套用。

有兩個值得知道的後果:

  • 複製一個不屬於你組織的範本時,副本中的每個機密值都會被清空。你從來就沒有讀取它們的權限,而成為副本的擁有者也不該改變這件事。複製你自己的範本則會保留這些值。
  • 把既有的值標示為機密,只會讓它從此之後被隱藏,並不會收回已經讀過它的人手上的資訊。請改為輪替該憑證。

部署時的租用者覆寫

部署時可以透過 POST /v1/instances 上的 env_overrides 新增或取代環境變數項目:

{
"offer_id": "…",
"template_id": "…",
"disk_gb": 100,
"env_overrides": [{ "key": "HF_TOKEN", "value": "hf_…", "secret": true }]
}

系統會先套用範本的環境變數,再套用覆寫值,依鍵比對 —— 覆寫值勝出。任一邊的值為 null 的項目會被捨棄,而不是以空字串注入。這就是你不必編輯範本就能填入機密佔位項目的方法,也讓你的權杖不會出現在分享出去的配方裡。

平台覆蓋層永遠優先

範本環境變數與租用者覆寫合併之後,Superheat 會套用一層平台覆蓋層,而且這層是 最後 套用的。覆蓋層裡的鍵無法被範本的值或 env_overrides 項目蓋過 —— 你設定的內容會被無聲地取代掉。

變數何時設定內容
CONTAINER_ID一律設定工作負載識別碼
GPU_COUNT一律設定指派給這個執行個體的 GPU 數量
SUPERHEAT_TCP_PORT_<n>每個已發布的 TCP 連接埠各一個容器連接埠 <n> 對應到的主機連接埠
PUBLIC_KEYsshjupyter,且你在部署時附加了 SSH 金鑰你的 SSH 公開金鑰
SUPERHEAT_SSH_PUBLIC_KEYSsshjupyter,且你在部署時附加了 SSH 金鑰同樣的金鑰內容,以換行分隔的形式
SUPERHEAT_ONSTARTsshjupyter,且有設定時啟動時指令碼的內容
OPEN_BUTTON_PORTsshjupyter,且有連接埠標籤為 open開啟按鈕的目標連接埠
JUPYTER_TOKENjupyter平台產生的存取權杖
JUPYTER_PORTjupyter8080
JUPYTER_DIRjupyter範本的 Jupyter 工作目錄
JUPYTER_LABjupytertrue 使用 JupyterLab,false 使用傳統 notebook

所以在範本上設定 JUPYTER_TOKEN 沒有任何作用:平台自己產生權杖才能組出開啟按鈕的網址,而這個權杖絕不會沿著連線往回傳。設定 GPU_COUNT 同樣沒有作用 —— 它反映的是你實際租到的切片,如果租用者能編輯它,信任這個值的程式就會被騙。

不要用覆蓋層的鍵當作範本變數的名稱

覆寫是無聲進行的。如果你的程式讀取 GPU_COUNT 並期待拿到自己設定的值,它拿到的會是平台的值,而且任何地方都不會出現錯誤。

你在容器內看到的內容

在衍生自基礎映像檔的映像檔上,sshd 與 Jupyter 啟動的登入 shell 不會繼承容器程序的環境,所以進入點會把環境寫入 /etc/environment/etc/profile.d/superheat-env.sh。當你以 SSH 連進去時,你的變數,加上 CONTAINER_IDGPU_COUNTSUPERHEAT_TCP_PORT_* 這些項目,全都在那裡。

佈建用的機密值刻意被排除在這兩個檔案之外:SUPERHEAT_ONSTARTJUPYTER_TOKENPUBLIC_KEYSUPERHEAT_SSH_PUBLIC_KEYS 由進入點取用後就不會再匯出。在 SSH 工作階段中 echo $JUPYTER_TOKEN 什麼也拿不到,這是設計如此。