Hub 文件

你的第一個 Docker Space:使用 T5 進行文字生成

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

你的第一個 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 builddocker 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.htmlstyle.cssscript.js 檔案。此時,你的檔案結構應該如下所示

/static
/static/index.html
/static/script.js
/static/style.css
Dockerfile
main.py
README.md
requirements.txt

讓我們逐步完成所有步驟,使其正常工作。我們將跳過 CSS 和 HTML 的一些細節。你可以在 DockerTemplates/fastapi_t5 Space 的“檔案和版本”選項卡中找到所有程式碼。

  1. 編寫 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"]}
  1. 編寫 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>
  1. 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")
  1. 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);
});
  1. 授予正確的目錄許可權

許可權部分所述,容器以使用者 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 ImageScheduling Space

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

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

閱讀更多

< > 在 GitHub 上更新

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