Zelfstudie: Machine learning-modellen toepassen in Azure Functions met Python en TensorFlow

In dit artikel leert y hoe u Python, TensorFlow en Azure Functions gebruikt met een machine learning-model om een afbeelding te classificeren op basis van de inhoud ervan. Omdat u lokaal werkt en geen Azure-resources in de cloud maakt, zijn er geen kosten om deze zelfstudie te voltooien.

  • Initialiseer een lokale omgeving voor het ontwikkelen van Azure Functions in Python.
  • Een aangepast machine learning-model van TensorFlow importeren in een functie-app.
  • Bouw een serverloze HTTP API voor het classificeren van een afbeelding met een hond of kat.
  • De API van een web-app gebruiken.

Vereisten

Controle van vereisten

  1. Voer in een terminal- of opdrachtvenster func --version uit om te controleren of de Azure Functions Core Tools versie 2.7.1846 of hoger zijn.
  2. Voer python --version (Linux/MacOS) of py --version (Windows) uit om uw Python-versierapporten 3.7.x te controleren.

De zelfstudie-opslagplaats klonen

  1. Kloon in een terminal- of opdrachtvenster de volgende opslagplaats met Git:

    git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
    
  2. Navigeer naar de map en bekijk de inhoud ervan.

    cd functions-python-tensorflow-tutorial
    
    • start is de werkmap voor de zelfstudie.
    • end is het uiteindelijke resultaat en de volledige implementatie voor uw referentie.
    • resources bevatten het machine learning-model en de helper-bibliotheken.
    • frontend is een website die de functie-app aanroept.

Een virtuele Python-omgeving maken en activeren

Ga naar de start-folder en voer de volgende opdrachten uit om een virtuele omgeving met de naam .venv te maken en te activeren. Zorg ervoor dat u Python 3.7 gebruikt, die wordt ondersteund door Azure Functions.

cd start
python -m venv .venv
source .venv/bin/activate

Als Python het venv-pakket niet heeft geïnstalleerd in uw Linux-distributie, voert u de volgende opdracht uit:

sudo apt-get install python3-venv

U voert alle volgende opdrachten uit in deze geactiveerde virtuele omgeving. (om de virtuele omgeving te sluiten, voert u deactivate uit.)

Een lokaal Functions-project maken

In Azure Functions is een functieproject een container voor een of meer afzonderlijke functies die elk op een bepaalde trigger reageren. Alle functies in een project delen dezelfde lokale configuratie en hostingconfiguratie. In deze sectie maakt u een functieproject met een individuele standaardfunctie met de naam classify die een HTTP-eindpunt biedt. U kunt meer specifieke code toevoegen in een latere sectie.

  1. Gebruik in de map start de Azure Functions Core Tools om een Python-functie-app te initialiseren:

    func init --worker-runtime python
    

    Na initialisatie bevat de map start verschillende bestanden voor het project,waaronder configuratiebestanden met de naam local.settings.json en host.json. Omdat local.settings.json geheimen kan bevatten die zijn gedownload vanuit Azure, wordt het bestand standaard uitgesloten van broncodebeheer in het bestand .gitignore.

    Tip

    Omdat een functieproject is gekoppeld aan een specifieke runtime, moeten alle functies in het project met dezelfde taal worden geschreven.

  2. Voeg een functie toe aan uw project met behulp van de volgende opdracht, waarbij het argument --name de unieke naam van de functie is en het argument --template de trigger van de functie. Maak met func new een submap met de naam van de functie die een codebestand bevat dat geschikt is voor de taal van het project en een configuratiebestand met de naam function.json.

    func new --name classify --template "HTTP trigger"
    

    Met deze opdracht maakt u een map die overeenkomt met de naam van de functie, classify. In die map bevinden zich twee bestanden: __init__.py, dat de functiecode bevat, en function.json, waarin de trigger van de functie en de invoer- en uitvoerbindingen worden beschreven. Zie Programmeermodel in de Ontwikkelaarshandleiding voor Python voor meer informatie over de inhoud van deze bestanden.

De functie lokaal uitvoeren

  1. Start de functie door de lokale Azure Functions runtime host te starten in de map start:

    func start
    
  2. Zodra het eindpunt classify wordt weergegeven in de uitvoer, gaat u naar de URL, http://localhost:7071/api/classify?name=Azure. Het bericht 'Hallo Azure!' moet worden weergegeven in de uitvoer.

  3. Gebruik Ctrl-C om de host te stoppen.

Het TensorFlow-model importeren en helpercode toevoegen

Als u de functie classify wilt wijzigen om een afbeelding te classificeren op basis van de inhoud, gebruikt u een vooraf gebouwd TensorFlow-model dat is getraind en dat is geëxporteerd uit Azure Custom Vision Service. Het model, dat zich bevindt in de map resources van het voorbeeld dat u eerder hebt gekloond, classificeert een afbeelding op basis van het feit of het een hond of kat bevat. U voegt vervolgens een helpercode en afhankelijkheden toe aan uw project.

Als u uw eigen model wilt bouwen met behulp van de gratis laag van de Custom Vision Service, volgt u de instructies in de opslagplaats voor voorbeeldproject.

Tip

Als u uw TensorFlow-model onafhankelijk van de functie-app wilt hosten, kunt u in plaats daarvan een bestandsshare met uw model koppelen aan uw Linux-functie-app. Zie Een bestandsshare koppelen aan een Python-functie-app met behulp van Azure CLI voor meer informatie.

  1. Voer in de map start de volgende opdracht uit om de modelbestanden te kopiëren naar de map classify. Zorg ervoor dat u \* in de opdracht opneemt.

    cp ../resources/model/* classify
    
  2. Controleer of de map classify de bestanden bevat met de naam model.pb en labels.txt. Als dat niet het geval is, controleert u of u de opdracht hebt uitgevoerd in de map start.

  3. Voer in de map start de volgende opdracht uit om een bestand met de helpercode te kopiëren naar de map classify:

    cp ../resources/predict.py classify
    
  4. Controleer of de classify nu een bestand bevat met de naam predict.py.

  5. Open start/requirements.txt in een teksteditor en voeg de volgende afhankelijkheden toe die vereist zijn voor de helpercode:

    tensorflow==1.14
    Pillow
    requests
    
  6. Sla requirements.txt op.

  7. Installeer de afhankelijkheden door de volgende opdracht uit te voeren in map start. De installatie kan enkele minuten duren en intussen u kunt doorgaan met het wijzigen van de functie in de volgende sectie.

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

    In Windows kan de fout optreden "Kan pakketten niet installeren vanwege een EnvironmentError: [errno 2] Geen bestand of map met die naam:" gevolgd door een lange padnaam naar een bestand zoals sharded_mutable_dense_hashtable. cpython-37.pyc. Deze fout treedt meestal op omdat de diepte van het mappad te lang wordt. In dit geval moet u de registersleutel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled instellen op 1 om lange paden in te schakelen. U kunt ook controleren waar uw Python-interpreter is geïnstalleerd. Als deze locatie een lang pad heeft, moet u proberen het opnieuw te installeren in een map met een korter pad.

Tip

Bij het aanroepen van predict.py om de eerste voorspelling te maken, laadt een functie met de naam _initialize het TensorFlow-model van de schijf en slaat het de cache op in globale variabelen. Dit opslaan in cache versnelt de volgende voorspellingen. Raadpleeg de Ontwikkelaarshandleiding voor Azure Functions Python voor meer informatie over het gebruik van globale variabelen.

De functie bijwerken voor het uitvoeren van voorspellingen

  1. Open classify/__init__.py in een teksteditor en voeg de volgende regels toe na de bestaande import instructies om de standaard JSON-bibliotheek en de voorspellende helpers te importeren:

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. Vervang de volledige inhoud van de functie main door de volgende code:

    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)
    

    Deze functie ontvangt een afbeeldings-URL in een queryreeks parameter met de naam img. Vervolgens wordt predict_image_from_url aangeroepen vanuit de helperbibliotheek om de afbeelding te downloaden en classificeren met behulp van het TensorFlow-model. De functie retourneert vervolgens een HTTP-antwoord met de resultaten.

    Belangrijk

    Omdat dit HTTP-eindpunt wordt aangeroepen door een webpagina die wordt gehost op een ander domein, bevat het antwoord een Access-Control-Allow-Origin-header om te voldoen aan de vereisten voor CORS (Cross-Origin Resource Sharing) van de browser.

    Wijzig in een productietoepassing * naar de specifieke oorsprong van de webpagina voor extra beveiliging.

  3. Sla de wijzigingen op en controleer of de installatie van afhankelijkheden is voltooid, start de lokale functiehost opnieuw met func start. Zorg ervoor dat u de host uitvoert in de map starten met de virtuele omgeving geactiveerd. Anders wordt de host gestart, maar er worden fouten weergeven bij het aanroepen van de functie.

    func start
    
  4. Open in een browser de volgende URL om de functie aan te roepen met de URL van een afbeelding met een kat en te controleren of de geretourneerde JSON de afbeelding als een kat heeft geclassificeerd.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    
  5. Zorg ervoor dat de host actief blijft omdat u deze in de volgende stap gebruikt.

Voer de frontend van de lokale web-app uit om de functie te testen

Als u het aanroepen van het functie-eindpunt vanuit een andere web-app wilt testen, is er een eenvoudige app in de map frontend van de opslagplaats.

  1. Open een nieuwe terminal of opdrachtprompt en activeer de virtuele omgeving (zoals eerder beschreven onder Een virtuele Python-omgeving maken en activeren).

  2. Ga naar de map frontend van de opslagplaats.

  3. Een HTTP-server starten met Python:

    python -m http.server
    
  4. Ga in een browser naar localhost:8000 en voer een van de volgende foto-URL's in het tekstvak in of gebruik de URL van een openbaar toegankelijke afbeelding.

    • 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. Selecteer Verzenden om het functie-eindpunt aan te roepen voor het classificeren van de afbeelding.

    Schermopname van voltooid project

    Als de browser een fout meldt bij het verzenden van de afbeeldings-URL, controleert u de terminal waarin u de functie-app uitvoert. Als er een foutbericht wordt weergegeven als "Geen module gevonden 'PIL'", hebt u de functie-app mogelijk gestart in de map start zonder eerst de virtuele omgeving te activeren die u eerder hebt gemaakt. Als u nog steeds fouten ziet, voert u pip install -r requirements.txt opnieuw uit met de virtuele omgeving geactiveerd en zoekt u naar fouten.

Notitie

Het model classificeert de inhoud van de afbeelding altijd als kat of hond, ongeacht of de afbeelding de standaardinstelling hond bevat. Afbeeldingen van tijgers en panters worden bijvoorbeeld doorgaans geclassificeerd als kat, maar afbeeldingen van olifanten, wortels of vliegtuigen worden als hond ingedeeld.

Resources opschonen

Omdat deze hele zelfstudie lokaal op uw computer wordt uitgevoerd, zijn er geen Azure-resources of -services om op te schonen.

Volgende stappen

In deze zelfstudie hebt u geleerd hoe u een HTTP API-eindpunt kunt bouwen en aanpassen met Azure Functions om afbeeldingen te classificeren met behulp van een TensorFlow-model. U hebt ook geleerd hoe u de API aanroept vanuit een web-app. U kunt de technieken in deze zelfstudie gebruiken om meer en minder complexe API's te ontwikkelen, die alle worden uitgevoerd op het serverloze rekenmodel dat wordt geleverd door Azure Functions.

Zie ook: