Hub documentation
最初のDocker Space: T5によるテキスト生成
最初のDocker Space: T5によるテキスト生成
以下のセクションでは、Docker Spaceの作成、設定、およびコードのデプロイに関する基礎を学びます。FastAPIをサーバーとして使用し、入力テキストからテキストを生成できるgoogle/flan-t5-smallモデルのデモに使用する、DockerによるText Generation Spaceを作成します。
このホストされた完成版はこちらで確認できます。
新しいDocker Spaceを作成する
まず、新しいSpaceを作成し、SDKとしてDockerを選択します。

Hugging Face Spaces は Git リポジトリであり、コミットをプッシュすることで、Space を段階的(かつ協働的)に作業できます。続行する前に、ファイルの作成と編集の方法を学ぶために、リポジトリの入門ガイドをご覧ください。UI を使用して作業する方が好みであれば、ブラウザ上で直接作業することもできます。
新しいSpaceを作成する際にSDKとしてDockerを選択すると、README.mdファイルのYAMLブロック内のsdkプロパティがdockerに設定され、Docker Spaceが初期化されます。
sdk: dockerSpaceのデフォルトのアプリケーションポートを変更するには、README.mdファイルのYAMLブロックでapp_portプロパティを設定できます。デフォルトのポートは7860です。
app_port: 7860依存関係を追加します
Text Generation Space では、テキスト生成モデルである Flan T5 を紹介する FastAPI アプリを構築します。モデルの推論には、🤗 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
Secretsがある場合、docker buildxを使用して、シークレットをビルド引数として渡すことができます。
export SECRET_EXAMPLE="my_secret_value"
docker buildx build --secret id=SECRET_EXAMPLE,env=SECRET_EXAMPLE -t fastapi .docker run を実行し、シークレットを環境変数として渡します
export SECRET_EXAMPLE="my_secret_value"
docker run -it -p 7860:7860 -e SECRET_EXAMPLE=$SECRET_EXAMPLE fastapiアプリにMLを追加する
前述したように、テキスト生成にはFlan T5モデルを使用します。入力フィールド用のHTMLとCSSを追加したいので、index.html、style.css、script.jsというファイルを含むstaticというディレクトリを作成しましょう。この時点でのファイル構成は以下のようになるはずです。
/static /static/index.html /static/script.js /static/style.css Dockerfile main.py README.md requirements.txt
動作させるための手順をすべて確認しましょう。CSSやHTMLの詳細は省略します。DockerTemplates/fastapi_t5 SpaceのFiles and versionsタブで、コード全体を確認できます。
- 推論を行うための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 EndpointからShiny Appまで、限界は月です!公式の例をご覧ください。必要に応じて、SpaceをGPUにアップグレードすることもできます 😃
デバッグ
Spaceのデバッグには、BuildログとContainerログを確認できます。Open Logsボタンをクリックしてモーダルを開きます。

すべてが正常に進んだ場合、BuildタブにPushing ImageとScheduling Spaceが表示されます。

Containerタブでは、アプリケーションのステータスが表示されます。この場合、Uvicorn running on http://0.0.0.0:7860です。

また、Space で Dev Mode を有効にすることもできます。Dev Mode を使用すると、実行中の Space に VSCode または SSH 経由で接続できます。詳細はここを参照してください: https://huggingface.co/dev-mode-explorers