メインコンテンツへスキップ

LeapcellでのHugging Faceアプリのデプロイ

このチュートリアルでは、Hugging Face ResNetモデルを使用して画像分類アプリケーションをデプロイする方法を紹介します。

他のHugging Faceモデルでも、モデル名とプロセッサ名を変更するだけで、デプロイプロセスは同様です。

情報

続行するにはGitHubアカウントが必要です。お持ちでない場合は、GitHubのウェブサイトで作成できます。

1. GitHubでHugging Face画像分類の例フォークします。

リポジトリ: Hugging Face画像分類の例

この例では、Hugging Faceのtransformersライブラリの事前学習済みモデルを使用して画像を分類します。そのリポジトリのmain.pyファイルは次のようになります。

まず、モデルとプロセッサをロードするためのload_model.pyファイルが必要です。

from transformers import AutoImageProcessor, ResNetForImageClassification

MODEL_PATH = "./model"

model_name = "microsoft/resnet-50"

model = ResNetForImageClassification.from_pretrained(model_name)
processor = AutoImageProcessor.from_pretrained(model_name)

# 指定されたパスに保存
model.save_pretrained(MODEL_PATH)
processor.save_pretrained(MODEL_PATH)

次に、Flaskアプリケーションを起動するためのapp.pyファイルが必要です。

from flask import Flask, request
from PIL import Image
from transformers import AutoImageProcessor, ResNetForImageClassification
import torch
import base64
from io import BytesIO
import time

app = Flask(__name__)

# ローカルに保存されたモデルへのパス
MODEL_PATH = "./model"

# HTMLテンプレート
INDEX_HTML = """
<!DOCTYPE html>
<html>
<body>
<form action="/predict" method="post" enctype="multipart/form-data">
<label>Select image to upload:</label>
<input type="file" name="image">
<input type="submit" value="Upload Image">
</form>
</body>
</html>
"""

RESPONSE_HTML = """
<!DOCTYPE html>
<html>
<body>
<img src="data:image/png;base64,{img_base64}" alt="image" width="500" height="600">
<form action="/predict" method="post" enctype="multipart/form-data">
<label>Select image to upload:</label>
<input type="file" name="image">
<input type="submit" value="Upload Image">
</form>
<p>Prediction: {prediction}</p>
<p>Score: {score:.2f}</p>
<p>Time taken: {time_taken:.2f} seconds</p>
</body>
</html>
"""

# ローカルパスからモデルとプロセッサをロード
model = ResNetForImageClassification.from_pretrained(MODEL_PATH)
processor = AutoImageProcessor.from_pretrained(MODEL_PATH)


@app.route("/")
def index():
"""アップロードページをレンダリングします。"""
return INDEX_HTML


@app.route("/predict", methods=["POST"])
def predict():
"""画像のアップロードを処理し、予測を行い、結果を返します。"""
start_time = time.time()

# アップロードされた画像ファイルを取得
img_file = request.files.get("image")
if not img_file:
return "No image uploaded. Please upload a valid image."

# 予測のために画像を処理
img = Image.open(img_file)
inputs = processor(img, return_tensors="pt")
with torch.no_grad():
logits = model(**inputs).logits
predicted_label = logits.argmax(-1).item()
confidence_score = torch.softmax(logits, dim=-1)[0, predicted_label].item()

# HTMLレスポンスで表示するために、画像をBase64でエンコード
buffer = BytesIO()
img.save(buffer, format="PNG")
img_base64 = base64.b64encode(buffer.getvalue()).decode("utf-8")

# 経過時間を計算
time_taken = time.time() - start_time

# 予測結果を含むHTMLを返す
return RESPONSE_HTML.format(
img_base64=img_base64,
prediction=predicted_label,
score=confidence_score,
time_taken=time_taken,
)


# Flaskアプリケーションを実行
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)

2. Leapcellダッシュボードでサービスを作成し、新しいリポジトリを接続します。

Leapcellダッシュボードに移動し、New Serviceボタンをクリックします。

"New Service"ページで、フォークしたリポジトリを選択します。

ヒント

リポジトリにアクセスするには、LeapcellをGitHubアカウントに接続する必要があります。

GitHubに接続するには、これらの指示に従ってください。

接続すると、リポジトリがリストに表示されます。

3. 作成時に次の値を指定します。

情報

Hugging FaceモデルはPyTorchに基づいているため、torchtransformersをインストールする必要があります。pip install torchtorchを直接インストールすると、多くのCUDA関連コンポーネントが含まれます。LeapcellマシンにはGPUがないため、これは不必要にイメージサイズを大きくします。代わりに、CPU専用バージョンのtorchをインストールします。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

さらに、モデルをロードする必要があります。

最終的なビルドコマンドは次のとおりです。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && pip install -r requirements.txt && python load_model.py

また、Gunicornを使用してアプリを実行します。**gunicorn**がrequirements.txtに含まれていることを確認してください。

フィールド
ランタイムPython(任意のバージョン)
ビルドコマンドpip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && pip install -r requirements.txt && python load_model.py
開始コマンドgunicorn -w 1 -b :8080 app:app
ポート8080

これらの値を対応するフィールドに入力します。

4. アプリにアクセスします。

デプロイされると、デプロイメントページにfoo-bar.leapcell.devのようなURLが表示されます。サービスページに表示されるドメインにアクセスしてください。

継続的デプロイメント

リンクされたブランチへのすべてのプッシュは、自動的にビルドとデプロイをトリガーします。ビルドが失敗した場合、現在のバージョンは次のデプロイが成功するまで安全にキャンセルされ実行されたままになります。

継続的デプロイメントの詳細をご覧ください。