Bereitstellung einer Hugging Face App auf Leapcell
Dieses Tutorial zeigt, wie Sie eine Bildklassifizierungsanwendung mit dem Hugging Face ResNet-Modell bereitstellen.
Der Bereitstellungsprozess ist für andere Hugging Face-Modelle ähnlich; Sie müssen lediglich die Modell- und Prozessornamen ändern.
Sie benötigen ein GitHub-Konto, um fortzufahren. Wenn Sie noch keines haben, können Sie eines auf der GitHub-Website erstellen.
1. Forken Sie das Hugging Face-Beispiel zur Bildklassifizierung auf GitHub.
Repo: Hugging Face-Beispiel zur Bildklassifizierung
Dieses Beispiel verwendet ein vortrainiertes Modell aus der transformers
-Bibliothek von Hugging Face, um Bilder zu klassifizieren. Die Datei main.py
aus diesem Repository sieht wie folgt aus:
Zuerst benötigen Sie eine load_model.py
-Datei, um das Modell und den Prozessor zu laden:
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)
# Save to the specified path
model.save_pretrained(MODEL_PATH)
processor.save_pretrained(MODEL_PATH)
Als Nächstes benötigen Sie eine app.py
-Datei, um die Flask-Anwendung zu starten:
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__)
# Path to the locally saved model
MODEL_PATH = "./model"
# HTML templates
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>
"""
# Load the model and processor from the local path
model = ResNetForImageClassification.from_pretrained(MODEL_PATH)
processor = AutoImageProcessor.from_pretrained(MODEL_PATH)
@app.route("/")
def index():
"""Render the upload page."""
return INDEX_HTML
@app.route("/predict", methods=["POST"])
def predict():
"""Handle image upload, make predictions, and return results."""
start_time = time.time()
# Get the uploaded image file
img_file = request.files.get("image")
if not img_file:
return "No image uploaded. Please upload a valid image."
# Process the image for prediction
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()
# Encode the image in Base64 to display it in the HTML response
buffer = BytesIO()
img.save(buffer, format="PNG")
img_base64 = base64.b64encode(buffer.getvalue()).decode("utf-8")
# Calculate elapsed time
time_taken = time.time() - start_time
# Return the HTML with prediction results
return RESPONSE_HTML.format(
img_base64=img_base64,
prediction=predicted_label,
score=confidence_score,
time_taken=time_taken,
)
# Run the Flask application
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
2. Erstellen Sie einen Dienst im Leapcell-Dashboard und verbinden Sie Ihr neues Repository.
Gehen Sie zum Leapcell-Dashboard und klicken Sie auf die Schaltfläche Neuer Dienst.
Wählen Sie auf der Seite „Neuer Dienst“ das Repository aus, das Sie soeben geforkt haben.
Um auf Ihre Repositories zuzugreifen, müssen Sie Leapcell mit Ihrem GitHub-Konto verbinden.
Folgen Sie diesen Anweisungen, um eine Verbindung zu GitHub herzustellen.
Sobald die Verbindung hergestellt ist, werden Ihre Repositories in der Liste angezeigt.
3. Geben Sie bei der Erstellung die folgenden Werte an:
Da Hugging Face-Modelle auf PyTorch basieren, müssen wir torch
und transformers
installieren. Die direkte Installation von torch
über pip install torch
enthält viele CUDA-bezogene Komponenten. Da Leapcell-Maschinen keine GPUs haben, würde dies die Image-Größe unnötig erhöhen. Stattdessen installieren wir die CPU-Only-Version von torch
.
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
Darüber hinaus muss das Modell geladen werden.
Der endgültige Build-Befehl lautet wie folgt:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && pip install -r requirements.txt && python load_model.py
Wir verwenden auch Gunicorn, um die App auszuführen. Stellen Sie sicher, dass gunicorn
in Ihrer requirements.txt
enthalten ist.
Feld | Wert |
---|---|
Laufzeit | Python (beliebige Version) |
Build-Befehl | pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && pip install -r requirements.txt && python load_model.py |
Start-Befehl | gunicorn -w 1 -b :8080 app:app |
Port | 8080 |
Geben Sie diese Werte in die entsprechenden Felder ein.
4. Greifen Sie auf Ihre App zu:
Nach der Bereitstellung sollte eine URL wie foo-bar.leapcell.dev
auf der Bereitstellungsseite angezeigt werden. Besuchen Sie die auf der Dienstseite angezeigte Domain.
Kontinuierliche Bereitstellungen
Jeder Push in den verknüpften Branch löst automatisch einen Build und eine Bereitstellung aus. Fehlgeschlagene Builds werden sicher abgebrochen, sodass die aktuelle Version bis zur nächsten erfolgreichen Bereitstellung ausgeführt wird.
Erfahren Sie mehr über Kontinuierliche Bereitstellungen.