Dela via


Självstudie: Använda maskininlärningsmodeller i Azure Functions med Python och TensorFlow

I den här artikeln lär du dig hur du använder Python, TensorFlow och Azure Functions med en maskininlärningsmodell 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 anpassad TensorFlow-maskininlärningsmodell till en funktionsapp.
  • Skapa ett serverlöst HTTP-API för att klassificera en avbildning som innehåller en hund eller en katt.
  • 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-tensorflow-tutorial.git
    
  2. Navigera till mappen och granska dess innehåll.

    cd functions-python-tensorflow-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. Se till att använda Python 3.7, som stöds av Azure Functions.

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 Programmeringsmodell i Python-utvecklarguiden.

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 TensorFlow-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ördefinierad TensorFlow-modell som har tränats med och exporterats från Azure Custom Vision Service. Modellen, som finns i resursmappen för exemplet som du klonade tidigare, klassificerar en bild baserat på om den innehåller en hund eller en katt. Sedan lägger du till viss hjälpkod och beroenden i projektet.

Om du vill skapa en egen modell med hjälp av den kostnadsfria nivån för Custom Vision Service följer du anvisningarna i exempelprojektets lagringsplats.

Tips

Om du vill vara värd för din TensorFlow-modell oberoende av funktionsappen kan du i stället montera en filresurs som innehåller din modell till din Linux-funktionsapp. Mer information finns i Montera en filresurs i en Python-funktionsapp med Azure CLI.

  1. I startmappen kör du följande kommando för att kopiera modellfilerna till mappen classify . Se till att inkludera \* i kommandot .

    cp ../resources/model/* classify
    
  2. Kontrollera att mappen classify innehåller filer med namnet model.pb och labels.txt. Annars kontrollerar du att du körde kommandot i startmappen .

  3. I startmappen kör du följande kommando för att kopiera en fil med hjälpkod till mappen classify :

    cp ../resources/predict.py classify
    
  4. Kontrollera att mappen classify nu innehåller en fil med namnet predict.py.

  5. Öppna start/requirements.txt i en textredigerare och lägg till följande beroenden som krävs av hjälpkoden:

    tensorflow==1.14
    Pillow
    requests
    
  6. Spara requirements.txt.

  7. Installera beroendena genom att köra följande kommando i startmappen . Installationen kan ta några minuter, under vilken tid du kan fortsätta med att ändra funktionen i nästa avsnitt.

    pip install --no-cache-dir -r requirements.txt
    

    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.

Tips

När du anropar predict.py för att göra sin första förutsägelse läser en funktion med namnet _initialize in TensorFlow-modellen från disken och cachelagrar den i globala variabler. Cachelagringen påskyndar efterföljande förutsägelser. Mer information om hur du använder globala variabler finns i utvecklarguiden för Azure Functions Python.

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 hjälp av TensorFlow-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.

  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 kattbild och bekräfta att den returnerade JSON-koden klassificerar bilden som en katt.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    
  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-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat2.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog2.png
  5. Välj Skicka för att anropa funktionsslutpunkten för att klassificera avbildningen.

    Skärmbild av slutfört projekt

    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.

Anteckning

Modellen klassificerar alltid innehållet i bilden som en katt eller hund, oavsett om bilden innehåller någon av dem, som standard till hund. Bilder av tigrar och pantrar klassificeras till exempel vanligtvis som katt, men bilder av elefanter, morötter eller flygplan klassificeras som hund.

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 en TensorFlow-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: