HuggingFace SpaceをAPIサーバーとして使う その1

前提

この記事では、HuggingFace Space を app としてではなく API サーバーとして使う方法を扱う。

もともとインターンで HuggingFace Inference Endpoints を使ってモデルの API 提供を行っていたのだが、エンドポイントを起動するたびに0からビルドしなくてはならず時間がかかっていたためビルドキャッシュが残る HuggingFace Space の DockerSDK を使った API サーバーの構築に着手した。

https://huggingface.co/docs/hub/spaces-sdks-docker

必要知識

  • HuggingFace Space の利用
  • Docker のセットアップ

今回のゴール

  • HuggingFace Space で API サーバーを建てて外部から叩く
  • 今回は GPU は取り扱わない(次回以降)

HuggingFace Space を作成する

作成する際に DockerSDK を選択する。また今回は Public で作成する。

HuggingFace Space のセットアップ

Space のリポジトリを clone する

1git clone https://huggingface.co/spaces/${ユーザー名}/${Space名}

requirements.txt の作成

1fastapi
2uvicorn
3...必要なパッケージ

app.py の作成

1from fastapi import FastAPI
2
3app = FastAPI()
4
5@app.get("/generate")
6def generate(text: str):
7    return {"output": text}

今回はテストのために/generateで受け取ったテキストをそのまま返す API とする

Dockerfile の作成

1FROM python:3.9
2
3RUN useradd -m -u 1000 user
4USER user
5ENV PATH="/home/user/.local/bin:$PATH"
6
7WORKDIR /app
8
9COPY --chown=user ./requirements.txt requirements.txt
10RUN pip install --no-cache-dir --upgrade -r requirements.txt
11
12COPY --chown=user . /app
13CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]

GPU を利用する場合はここで cuda を使える環境にする必要がある(今回は取り扱わない)

ここまで出来たら push する。Docker のビルドとコンテナの作成が行われるので待機

終わるとステータスが Running になって以下のようになる ルートページは何も設定してないので{"detail":"Not Found"}になる

これで HuggingFace Space の設定は完了

API を叩いてみる

実際に Python から API を叩いてみる

1import requests
2
3user_name = ""
4repo_name = ""
5
6res = requests.get(
7    f'https://{user_name}-{repo_name}.hf.space/generate',
8    params={
9        'text': 'Hello, World!'
10    }
11)
12print(res.json())

BaseURL はhttps://${user_name}-${repo_name}.hf.spaceのようになっているので適宜設定 実行してみると

1$ python main.py
2{'output': 'Hello, World!'}

ちゃんとパラメータの text に設定した文字列が返ってきた。完成

まとめ

本記事では、HuggingFace Space の DockerSDK を使った API サーバーの作成を行った。 今後は、実際に今までの Inference Endpoint から移行するため、cuda の環境作成とモデルの動作する API としてこれを改良していく。