Självstudie: Distribuera en förtränad bildklassificeringsmodell för att Azure Functions med PyTorch
I den här artikeln får du lära dig hur du använder Python, PyTorch och Azure Functions för att läsa in en förtränad modell för att klassificera en bild baserat på dess innehåll. Eftersom du arbetar lokalt och inte skapar några Azure-resurser i molnet kostar det ingenting att slutföra den här självstudien.
- Initiera en lokal miljö för att utveckla Azure Functions i Python.
- Importera en förtränad PyTorch-maskininlärningsmodell till en funktionsapp.
- Skapa ett serverlöst HTTP-API för att klassificera en avbildning som en av 1 000 ImageNet-klasser.
- Använda API:et från en webbapp.
Förutsättningar
- Ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.
- Python 3.7.4 eller senare. (Python 3.8.x och Python 3.6.x verifieras också med Azure Functions.)
- Azure Functions Core Tools
- En kodredigerare som t.ex. Visual Studio Code
Kravkontroll
- I en terminal eller ett kommandofönster kör
func --version
du för att kontrollera att Azure Functions Core Tools är version 2.7.1846 eller senare. - Kör
python --version
(Linux/MacOS) ellerpy --version
(Windows) för att kontrollera python-versionsrapporterna 3.7.x.
Klona självstudielagringsplatsen
I en terminal eller ett kommandofönster klonar du följande lagringsplats med git:
git clone https://github.com/Azure-Samples/functions-python-pytorch-tutorial.git
Navigera till mappen och granska dess innehåll.
cd functions-python-pytorch-tutorial
- start är din arbetsmapp för självstudien.
- end är slutresultatet och fullständig implementering för din referens.
- resurser innehåller maskininlärningsmodellen och hjälpbibliotek.
- frontend är en webbplats som anropar funktionsappen.
Skapa och aktivera en virtuell Python-miljö
Gå till startmappen och kör följande kommandon för att skapa och aktivera en virtuell miljö med namnet .venv
.
cd start
python -m venv .venv
source .venv/bin/activate
Om Python inte installerade venv-paketet på Linux-distributionen kör du följande kommando:
sudo apt-get install python3-venv
Du kör alla efterföljande kommandon i den här aktiverade virtuella miljön. (Om du vill avsluta den virtuella miljön kör deactivate
du .)
Skapa ett lokalt funktionsprojekt
I Azure Functions är ett funktionsprojekt en container för en eller flera enskilda funktioner som var och en svarar på en specifik utlösare. Alla funktioner i ett projekt delar samma lokala konfigurationer och värdkonfigurationer. I det här avsnittet skapar du ett funktionsprojekt som innehåller en enda exempelfunktion med namnet classify
som tillhandahåller en HTTP-slutpunkt. Du lägger till mer specifik kod i ett senare avsnitt.
I startmappen använder du Azure Functions Core Tools för att initiera en Python-funktionsapp:
func init --worker-runtime python
Efter initieringen innehåller startmappen olika filer för projektet, inklusive konfigurationsfiler med namnet local.settings.json och host.json. Eftersom local.settings.json kan innehålla hemligheter som laddats ned från Azure undantas filen som standard från källkontrollen i .gitignore-filen .
Tips
Eftersom ett funktionsprojekt är kopplat till en viss körning måste alla funktioner i projektet skrivas med samma språk.
Lägg till en funktion i projektet med hjälp av följande kommando, där
--name
argumentet är det unika namnet på din funktion och--template
argumentet anger funktionens utlösare.func new
skapa en undermapp som matchar funktionsnamnet som innehåller en kodfil som är lämplig för projektets valda språk och en konfigurationsfil med namnet function.json.func new --name classify --template "HTTP trigger"
Det här kommandot skapar en mapp som matchar namnet på funktionen, klassificera. I den mappen finns två filer: __init__.py, som innehåller funktionskoden, och function.json, som beskriver funktionens utlösare och dess indata- och utdatabindningar. Mer information om innehållet i dessa filer finns i Programmeringsmodell i Python-utvecklarguiden.
Köra funktionen lokalt
Starta funktionen genom att starta den lokala Azure Functions-körningsvärden i startmappen:
func start
När du ser
classify
slutpunkten i utdata navigerar du till URL:en,http://localhost:7071/api/classify?name=Azure
. Meddelandet "Hello Azure!" bör visas i utdata.Använd Ctrl-C för att stoppa värden.
Importera PyTorch-modellen och lägg till hjälpkod
Om du vill ändra classify
funktionen för att klassificera en bild baserat på dess innehåll använder du en förtränad ResNet-modell . Den förtränade modellen, som kommer från PyTorch, klassificerar en bild till 1 av 1 000 ImageNet-klasser. Sedan lägger du till hjälpkod och beroenden i projektet.
I startmappen kör du följande kommando för att kopiera förutsägelsekoden och etiketterna till mappen classify .
cp ../resources/predict.py classify cp ../resources/labels.txt classify
Kontrollera att mappen classify innehåller filer med namnet predict.py och labels.txt. Annars kontrollerar du att du körde kommandot i startmappen .
Öppna start/requirements.txt i en textredigerare och lägg till de beroenden som krävs av hjälpkoden, vilket bör se ut så här:
azure-functions requests -f https://download.pytorch.org/whl/torch_stable.html torch==1.13.0+cpu torchvision==0.14.0+cpu
Tips
Versionerna av torch och torchvision måste matcha värdena som anges i versionstabellen för PyTorch Vision-lagringsplatsen.
Spara requirements.txtoch kör sedan följande kommando från startmappen för att installera beroendena.
pip install --no-cache-dir -r requirements.txt
Installationen kan ta några minuter, under vilken tid du kan fortsätta med att ändra funktionen i nästa avsnitt.
Tips
I Windows kan du stöta på felet "Det gick inte att installera paket på grund av en EnvironmentError: [Errno 2] Ingen sådan fil eller katalog:" följt av ett långt sökvägsnamn till en fil som sharded_mutable_dense_hashtable.cpython-37.pyc. Det här felet inträffar vanligtvis eftersom mappsökvägens djup blir för långt. I det här fallet anger du registernyckeln
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled
till1
för att aktivera långa sökvägar. Du kan också kontrollera var Python-tolken är installerad. Om den platsen har en lång sökväg kan du prova att installera om i en mapp med en kortare sökväg.
Uppdatera funktionen för att köra förutsägelser
Öppna classify/__init__.py i en textredigerare och lägg till följande rader efter de befintliga
import
-instruktionerna för att importera JSON-standardbiblioteket och förutsägande hjälpkomponenter:import logging import azure.functions as func import json # Import helper script from .predict import predict_image_from_url
Ersätt hela innehållet i
main
funktionen med följande kod:def main(req: func.HttpRequest) -> func.HttpResponse: image_url = req.params.get('img') logging.info('Image URL received: ' + image_url) results = predict_image_from_url(image_url) headers = { "Content-type": "application/json", "Access-Control-Allow-Origin": "*" } return func.HttpResponse(json.dumps(results), headers = headers)
Den här funktionen tar emot en bild-URL i en frågesträngsparameter med namnet
img
. Den anroparpredict_image_from_url
sedan från hjälpbiblioteket för att ladda ned och klassificera bilden med hjälp av PyTorch-modellen. Funktionen returnerar sedan ett HTTP-svar med resultatet.Viktigt
Eftersom den här HTTP-slutpunkten anropas av en webbsida som finns på en annan domän innehåller svaret en
Access-Control-Allow-Origin
rubrik för att uppfylla webbläsarens cors-krav (Cross-Origin Resource Sharing).I ett produktionsprogram ändrar du
*
till webbsidans specifika ursprung för ökad säkerhet.Spara ändringarna och starta sedan den lokala funktionsvärden igen med
func start
under förutsättning att beroendena har installerats klart. Se till att köra värden i startmappen med den virtuella miljön aktiverad. Annars startar värden, men du får felmeddelanden när du anropar funktionen.func start
Öppna följande URL i en webbläsare för att anropa funktionen med URL:en för en Bernese Mountain Dog-bild och bekräfta att den returnerade JSON:en klassificerar bilden som en Bernese Mountain Dog.
http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
Håll värden igång eftersom du använder den i nästa steg.
Kör den lokala webbappens klientdel för att testa funktionen
Om du vill testa att anropa funktionsslutpunkten från en annan webbapp finns det en enkel app i lagringsplatsens klientdelsmapp .
Öppna en ny terminal eller kommandotolk och aktivera den virtuella miljön (enligt beskrivningen tidigare under Skapa och aktivera en virtuell Python-miljö).
Navigera till lagringsplatsens klientdelsmapp .
Starta en HTTP-server med Python:
python -m http.server
I en webbläsare navigerar du till
localhost:8000
och anger sedan någon av följande foto-URL:er i textrutan eller använder URL:en för en offentligt tillgänglig bild.https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
https://github.com/Azure-Samples/functions-python-pytorch-tutorial/blob/master/resources/assets/bald-eagle.jpg?raw=true
https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/penguin.jpg
Välj Skicka för att anropa funktionsslutpunkten för att klassificera bilden.
Om webbläsaren rapporterar ett fel när du skickar bild-URL:en kontrollerar du terminalen där du kör funktionsappen. Om du ser ett fel som "Ingen modul hittade PIL" kan du ha startat funktionsappen i startmappen utan att först aktivera den virtuella miljö som du skapade tidigare. Om du fortfarande ser fel kör
pip install -r requirements.txt
du igen med den virtuella miljön aktiverad och letar efter fel.
Rensa resurser
Eftersom hela den här självstudien körs lokalt på datorn finns det inga Azure-resurser eller tjänster att rensa.
Nästa steg
I den här självstudien har du lärt dig hur du skapar och anpassar en HTTP API-slutpunkt med Azure Functions för att klassificera bilder med hjälp av en PyTorch-modell. Du har också lärt dig att anropa API:et från en webbapp. Du kan använda teknikerna i den här självstudien för att bygga ut API:er av alla komplexiteter, allt medan du kör på den serverlösa beräkningsmodellen som tillhandahålls av Azure Functions.
Se även: