Hub 文件

Docker Spaces

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

Docker Spaces

Spaces 支援自定義 Docker 容器,適用於 Streamlit 和 Gradio 範圍之外的應用程式。Docker Spaces 允許使用者超越標準 SDK 之前的限制。從 FastAPI 和 Go 端點到 Phoenix 應用程式和 ML Ops 工具,Docker Spaces 可以在許多不同的設定中提供幫助。

設定 Docker Spaces

建立新 Space 時選擇 Docker 作為 SDK,將透過在 README.md 檔案的 YAML 塊中將 sdk 屬性設定為 docker 來初始化你的 Space。或者,對於現有 Space 儲存庫,在 Spaces README.md 檔案頂部的 YAML 塊內設定 sdk: docker。你還可以透過設定 app_port: 7860 來更改預設暴露埠 7860。之後,你可以建立一個常規的 Dockerfile

---
title: Basic Docker SDK Space
emoji: 🐳
colorFrom: purple
colorTo: gray
sdk: docker
app_port: 7860
---

在內部,你可以擁有任意數量的開放埠。例如,你可以在 Space 中安裝 Elasticsearch,並在其預設埠 9200 上內部呼叫它。

如果你想將多個埠上提供的應用程式暴露給外部世界,一個變通方法是使用反向代理(如 Nginx)將來自更廣泛網際網路的請求(在單個埠上)分派到不同的內部埠。

Secrets 和變數管理

你可以在 Space 設定中管理 Space 的環境變數。在此處閱讀更多內容

變數

構建時

構建 Docker Space 時,變數作為 build-arg 傳遞。閱讀 Docker 的專門文件,獲取如何在 Dockerfile 中使用此功能的完整指南。

	# Declare your environment variables with the ARG directive
	ARG MODEL_REPO_NAME

	FROM python:latest
	# [...]
	# You can use them like environment variables
	RUN predict.py $MODEL_REPO_NAME

執行時

變數在執行時注入到容器的環境中。

Secrets

構建時

在 Docker Spaces 中,出於安全原因,secrets 管理有所不同。在 Settings 選項卡中建立 secret 後,可以透過在 Dockerfile 中新增以下行來公開該 secret

例如,如果 SECRET_EXAMPLE 是你在 Settings 選項卡中建立的 secret 的名稱,則可以透過將其掛載到檔案,然後使用 $(cat /run/secrets/SECRET_EXAMPLE) 讀取它,在構建時讀取它。

參見以下示例

# Expose the secret SECRET_EXAMPLE at buildtime and use its value as git remote URL
RUN --mount=type=secret,id=SECRET_EXAMPLE,mode=0444,required=true \
 git init && \
 git remote add origin $(cat /run/secrets/SECRET_EXAMPLE)
# Expose the secret SECRET_EXAMPLE at buildtime and use its value as a Bearer token for a curl request
RUN --mount=type=secret,id=SECRET_EXAMPLE,mode=0444,required=true \
	curl test -H 'Authorization: Bearer $(cat /run/secrets/SECRET_EXAMPLE)'

執行時

與公共變數一樣,在執行時,你可以將 secrets 作為環境變數訪問。例如,在 Python 中,你將使用 os.environ.get("SECRET_EXAMPLE")。請檢視此示例,瞭解使用 secrets 的 Docker Space。

許可權

容器以使用者 ID 1000 執行。為避免許可權問題,你應該建立一個使用者並在任何 COPY 或下載之前設定其 WORKDIR

# Set up a new user named "user" with user ID 1000
RUN useradd -m -u 1000 user

# Switch to the "user" user
USER user

# Set home to the user's home directory
ENV HOME=/home/user \
	PATH=/home/user/.local/bin:$PATH

# Set the working directory to the user's home directory
WORKDIR $HOME/app

# Try and run pip command after setting the user with `USER user` to avoid permission issues with Python
RUN pip install --no-cache-dir --upgrade pip

# Copy the current directory contents into the container at $HOME/app setting the owner to the user
COPY --chown=user . $HOME/app

# Download a checkpoint
RUN mkdir content
ADD --chown=user https://<SOME_ASSET_URL> content/<SOME_ASSET_NAME>
始終在 `ADD` 和 `COPY` 中指定 `--chown=user`,以確保新檔案歸你的使用者所有。

如果仍然遇到許可權問題,你可能需要在 Dockerfile 中使用 chmodchown 來授予正確的許可權。例如,如果你想使用目錄 /data,你可以這樣做

RUN mkdir -p /data
RUN chmod 777 /data

應始終避免不必要的 chown。

更新檔案的元資料會建立儲存在新層中的新副本。因此,遞迴 chown 可能會導致影像非常大,因為所有受影響的檔案都會重複。

與其透過執行 chown 來修復許可權

COPY checkpoint .
RUN chown -R user checkpoint

你應始終這樣做

COPY --chown=user checkpoint .

ADD 命令也一樣)

資料永續性

除非你選擇持久儲存升級,否則只要 Docker Space 重啟,磁碟上寫入的資料就會丟失。

如果你選擇持久儲存升級,可以使用 /data 目錄來儲存資料。此目錄掛載在持久捲上,這意味著寫入此目錄的資料將在重啟後持久化。

目前,/data 卷僅在執行時可用,即在 Dockerfile 的構建步驟中不能使用 /data

你還可以將我們的資料集 Hub 用於特定情況,你可以在其中將狀態和資料儲存在 git LFS 儲存庫中。你可以在此處找到一個永續性示例,它使用 huggingface_hub以程式設計方式將檔案上傳到資料集儲存庫。此 Space 示例以及此指南將幫助你確定哪種解決方案最適合你的資料型別。

最後,在某些情況下,你可能希望從你的 Space 程式碼中使用外部儲存解決方案,例如外部託管資料庫、S3 等。

帶 GPU 的 Docker 容器

你可以透過使用我們支援 GPU 的 Spaces 硬體之一來執行帶 GPU 支援的 Docker 容器。

我們建議使用 Docker Hub 中的 nvidia/cuda 作為基礎映象,它預裝了 CUDA 和 cuDNN。

在 Docker 構建時,你無法訪問 GPU 硬體。因此,在 Dockerfile 的構建步驟中不應嘗試執行任何與 GPU 相關的命令。例如,你在構建映象時不能執行 `nvidia-smi` 或 `torch.cuda.is_available()`。在此處閱讀更多資訊:[此處](https://github.com/NVIDIA/nvidia-docker/wiki/nvidia-docker#description)。

閱讀更多

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.