Självstudie: Distribuera en förtränad bildklassificeringsmodell till 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 avbildning 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

Kravkontroll

  1. I ett terminal- eller kommandofönster kör du func --version för att kontrollera att Azure Functions Core Tools är version 2.7.1846 eller senare.
  2. Kör python --version (Linux/MacOS) eller py --version (Windows) för att kontrollera python-versionsrapporterna 3.7.x.

Klona självstudielagringsplatsen

  1. I ett terminal- eller kommandofönster klonar du följande lagringsplats med Git:

    git clone https://github.com/Azure-Samples/functions-python-pytorch-tutorial.git
    
  2. Navigera till mappen och granska dess innehåll.

    cd functions-python-pytorch-tutorial
    
    • start är din arbetsmapp för självstudien.
    • slut är slutresultatet och fullständig implementering för din referens.
    • resurser innehåller maskininlärningsmodellen och hjälpbiblioteken.
    • 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 du deactivate.)

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.

  1. 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.

  2. 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 Granska filinnehållet i Python-snabbstarten.

Köra funktionen lokalt

  1. Starta funktionen genom att starta den lokala Azure Functions-körningsvärden i startmappen :

    func start
    
  2. När slutpunkten visas i utdata navigerar du classify till URL:en, http://localhost:7071/api/classify?name=Azure. Meddelandet "Hello Azure!" bör visas i utdata.

  3. 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 avbildning 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 viss hjälpkod och beroenden i projektet.

  1. 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
    
  2. Kontrollera att mappen classify innehåller filer med namnet predict.py och labels.txt. Annars kontrollerar du att du körde kommandot i startmappen .

  3. Ö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.5.0+cpu
    torchvision==0.6.0+cpu
    
  4. 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 till 1 för att aktivera långa sökvägar. Alternativt kontrollerar du 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

  1. Ö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 prediktionshjälparna :

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. 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 anropar predict_image_from_url sedan från hjälpbiblioteket för att ladda ned och klassificera avbildningen med pytorchmodellen. 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.

  3. Spara ändringarna och anta sedan att beroendena har installerats klart, starta den lokala funktionsvärden igen med func start. Se till att köra värden i startmappen med den virtuella miljön aktiverad. Annars startar värden, men du får fel när du anropar funktionen.

    func start
    
  4. Öppna följande URL i en webbläsare för att anropa funktionen med URL:en för en Bernese Mountain Dog-avbildning och bekräfta att den returnerade JSON klassificerar bilden som en bernesisk bergshund.

    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
    
  5. 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 .

  1. Öppna en ny terminal eller kommandotolk och aktivera den virtuella miljön (enligt beskrivningen tidigare under Skapa och aktivera en virtuell Python-miljö).

  2. Gå till lagringsplatsens klientdelsmapp .

  3. Starta en HTTP-server med Python:

    python -m http.server
    
  4. I en webbläsare navigerar du till localhost:8000och 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
  5. Välj Skicka för att anropa funktionsslutpunkten för att klassificera avbildningen.

    Screenshot of finished project

    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 all komplexitet, allt medan du kör på den serverlösa beräkningsmodellen som tillhandahålls av Azure Functions.

Se även: