HuggingFace SpaceをAPIサーバーとして使う その1
前提
この記事では、HuggingFace SpaceをappとしてではなくAPIサーバーとして使う方法を扱う。
もともとインターンでHuggingFace Inference Endpointsを使ってモデルのAPI提供を行っていたのだが、エンドポイントを起動するたびに0からビルドしなくてはならず時間がかかっていたためビルドキャッシュが残るHuggingFace SpaceのDockerSDKを使ったAPIサーバーの構築に着手した。
必要知識
- HuggingFace Spaceの利用
- Dockerのセットアップ
今回のゴール
- HuggingFace SpaceでAPIサーバーを建てて外部から叩く
- 今回はGPUは取り扱わない(次回以降)
HuggingFace Spaceを作成する
作成する際にDockerSDKを選択する。また今回はPublicで作成する。
HuggingFace Spaceのセットアップ
Spaceのリポジトリをcloneする
git clone https://huggingface.co/spaces/${ユーザー名}/${Space名}
requirements.txtの作成
fastapi
uvicorn
...必要なパッケージ
app.pyの作成
from fastapi import FastAPI
app = FastAPI()
@app.get("/generate")
def generate(text: str):
return {"output": text}
今回はテストのために/generate
で受け取ったテキストをそのまま返すAPIとする
Dockerfileの作成
FROM python:3.9
RUN useradd -m -u 1000 user
USER user
ENV PATH="/home/user/.local/bin:$PATH"
WORKDIR /app
COPY ./requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade -r requirements.txt
COPY . /app
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
GPUを利用する場合はここでcudaを使える環境にする必要がある(今回は取り扱わない)
ここまで出来たらpushする。Dockerのビルドとコンテナの作成が行われるので待機
終わるとステータスがRunningになって以下のようになる
ルートページは何も設定してないので{"detail":"Not Found"}
になる
これでHuggingFace Spaceの設定は完了
APIを叩いてみる
実際にPythonからAPIを叩いてみる
import requests
user_name = ""
repo_name = ""
res = requests.get(
f'https://{user_name}-{repo_name}.hf.space/generate',
params={
'text': 'Hello, World!'
}
)
print(res.json())
BaseURLはhttps://${user_name}-${repo_name}.hf.space
のようになっているので適宜設定
実行してみると
$ python main.py
{'output': 'Hello, World!'}
ちゃんとパラメータのtextに設定した文字列が返ってきた。完成
まとめ
本記事では、HuggingFace SpaceのDockerSDKを使ったAPIサーバーの作成を行った。
今後は、実際に今までのInference Endpointから移行するため、cudaの環境作成とモデルの動作するAPIとしてこれを改良していく。
Discussion