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 としてこれを改良していく。