🤗

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

2025/02/05に公開

前提

この記事では、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する

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 --chown=user ./requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade -r requirements.txt

COPY --chown=user . /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