Hub 文件
你的第一個 Docker Space:使用 T5 進行文字生成
並獲得增強的文件體驗
開始使用
你的第一個 Docker Space:使用 T5 進行文字生成
在以下章節中,你將學習建立 Docker Space、配置它以及部署程式碼的基礎知識。我們將使用 Docker 建立一個文字生成 Space,它將用於演示google/flan-t5-small模型,該模型可以使用 FastAPI 作為伺服器,根據一些輸入文字生成文字。
你可以在此處找到此託管的完整版本。
建立新的 Docker Space
我們將從建立一個全新的 Space 開始,並選擇 Docker 作為我們的 SDK。

Hugging Face Spaces 是 Git 儲存庫,這意味著你可以透過推送提交來增量(和協作)地處理你的 Space。請參閱儲存庫入門指南,瞭解如何在繼續之前建立和編輯檔案。如果你更喜歡使用 UI,你也可以直接在瀏覽器中完成工作。
在建立新 Space 時選擇 Docker 作為 SDK,將透過在 README.md
檔案的 YAML 塊中將 sdk
屬性設定為 docker
來初始化你的 Docker Space。
sdk: docker
你可以透過在 README.md
檔案的 YAML 塊中設定 app_port
屬性來更改 Space 的預設應用程式埠。預設埠是 7860
。
app_port: 7860
新增依賴項
對於文字生成 Space,我們將構建一個 FastAPI 應用程式來展示一個名為 Flan T5 的文字生成模型。對於模型推理,我們將使用 🤗 Transformers pipeline 來使用該模型。我們需要首先安裝一些依賴項。這可以透過在我們的儲存庫中建立一個 requirements.txt 檔案並向其中新增以下依賴項來完成
fastapi==0.74.*
requests==2.27.*
sentencepiece==0.1.*
torch==1.11.*
transformers==4.*
uvicorn[standard]==0.17.*
這些依賴項將安裝在我們稍後建立的 Dockerfile 中。
建立應用程式
讓我們從一個虛擬的 FastAPI 應用程式開始,看看我們是否能讓一個端點正常工作。第一步是建立一個應用程式檔案,在本例中,我們將其命名為 main.py
。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World!"}
建立 Dockerfile
Docker Space 的主要步驟是建立 Dockerfile。你可以在此處閱讀更多關於 Dockerfile 的資訊。儘管在本教程中我們使用 FastAPI,但 Dockerfile 為使用者提供了極大的靈活性,允許你構建新一代的 ML 演示。讓我們為我們的應用程式編寫 Dockerfile
# read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
# you will also find guides on how best to write your Dockerfile
FROM python:3.9
# The two following lines are requirements for the Dev Mode to be functional
# Learn more about the Dev Mode at https://huggingface.co/dev-mode-explorers
RUN useradd -m -u 1000 user
WORKDIR /app
COPY --chown=user ./requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade -r requirements.txt
COPY --chown=user . /app
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
儲存更改後,Space 將重新構建,你的演示應該在幾秒鐘後啟動!這裡是此時的示例結果。

本地測試
高階使用者提示(可跳過): 如果你在本地開發,現在是進行 docker build
和 docker run
以在本地除錯的好時機,但更簡單的是將更改推送到 Hub 並檢視它的效果!
docker build -t fastapi . docker run -it -p 7860:7860 fastapi
如果你有Secret,你可以使用 docker buildx
並將 Secret 作為構建引數傳遞
export SECRET_EXAMPLE="my_secret_value"
docker buildx build --secret id=SECRET_EXAMPLE,env=SECRET_EXAMPLE -t fastapi .
並使用 docker run
執行,將 secret 作為環境變數傳遞
export SECRET_EXAMPLE="my_secret_value"
docker run -it -p 7860:7860 -e SECRET_EXAMPLE=$SECRET_EXAMPLE fastapi
為我們的應用程式新增一些機器學習功能
如前所述,我們的想法是使用 Flan T5 模型進行文字生成。我們將為輸入欄位新增一些 HTML 和 CSS,所以讓我們建立一個名為 static 的目錄,其中包含 index.html
、style.css
和 script.js
檔案。此時,你的檔案結構應該如下所示
/static /static/index.html /static/script.js /static/style.css Dockerfile main.py README.md requirements.txt
讓我們逐步完成所有步驟,使其正常工作。我們將跳過 CSS 和 HTML 的一些細節。你可以在 DockerTemplates/fastapi_t5 Space 的“檔案和版本”選項卡中找到所有程式碼。
- 編寫 FastAPI 端點以進行推理
我們將使用 transformers
中的 pipeline
來載入 google/flan-t5-small 模型。我們將設定一個名為 infer_t5
的端點,該端點接收輸入並輸出推理呼叫的結果
from transformers import pipeline
pipe_flan = pipeline("text2text-generation", model="google/flan-t5-small")
@app.get("/infer_t5")
def t5(input):
output = pipe_flan(input)
return {"output": output[0]["generated_text"]}
- 編寫
index.html
以包含一個簡單的表單,其中包含頁面的程式碼。
<main>
<section id="text-gen">
<h2>Text generation using Flan T5</h2>
<p>
Model:
<a
href="https://huggingface.co/google/flan-t5-small"
rel="noreferrer"
target="_blank"
>google/flan-t5-small
</a>
</p>
<form class="text-gen-form">
<label for="text-gen-input">Text prompt</label>
<input
id="text-gen-input"
type="text"
value="German: There are many ducks"
/>
<button id="text-gen-submit">Submit</button>
<p class="text-gen-output"></p>
</form>
</section>
</main>
- 在
main.py
檔案中,掛載靜態檔案並在根路由中顯示 html 檔案
app.mount("/", StaticFiles(directory="static", html=True), name="static")
@app.get("/")
def index() -> FileResponse:
return FileResponse(path="/app/static/index.html", media_type="text/html")
- 在
script.js
檔案中,使其處理請求
const textGenForm = document.querySelector(".text-gen-form");
const translateText = async (text) => {
const inferResponse = await fetch(`infer_t5?input=${text}`);
const inferJson = await inferResponse.json();
return inferJson.output;
};
textGenForm.addEventListener("submit", async (event) => {
event.preventDefault();
const textGenInput = document.getElementById("text-gen-input");
const textGenParagraph = document.querySelector(".text-gen-output");
textGenParagraph.textContent = await translateText(textGenInput.value);
});
- 授予正確的目錄許可權
如許可權部分所述,容器以使用者 ID 1000 執行。這意味著 Space 可能會遇到許可權問題。例如,transformers
將模型下載並快取到 HF_HOME
路徑下的路徑中。解決此問題的最簡單方法是建立一個具有正確許可權的使用者,並使用它來執行容器應用程式。我們可以透過將以下行新增到 Dockerfile
來實現這一點。
# 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
最終的 Dockerfile
應該如下所示
# read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
# you will also find guides on how best to write your Dockerfile
FROM python:3.9
# The two following lines are requirements for the Dev Mode to be functional
# Learn more about the Dev Mode at https://huggingface.co/dev-mode-explorers
RUN useradd -m -u 1000 user
WORKDIR /app
COPY --chown=user ./requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade -r requirements.txt
COPY --chown=user . /app
USER user
ENV HOME=/home/user \
PATH=/home/user/.local/bin:$PATH
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
成功!你的應用程式現在應該可以正常工作了!檢視 DockerTemplates/fastapi_t5 以檢視最終結果。

真是一段旅程!請記住,Docker Spaces 給你提供了很大的自由,所以你不侷限於使用 FastAPI。從 Go 端點到 Shiny 應用程式,極限就是月球!檢視一些官方示例。如果需要,你還可以將你的 Space 升級到 GPU 😃
除錯
你可以透過檢視構建和容器日誌來除錯你的 Space。點選開啟日誌按鈕以開啟模態框。

如果一切順利,你將在構建選項卡上看到 Pushing Image
和 Scheduling Space

在容器選項卡上,你將看到應用程式狀態,在此示例中為 Uvicorn running on http://0.0.0.0:7860

此外,你可以在 Space 上啟用開發模式。開發模式允許你透過 VSCode 或 SSH 連線到你的執行中的 Space。在此處瞭解更多資訊:https://huggingface.co/dev-mode-explorers