Kurz: Použití modelů strojového učení v Azure Functions pomocí Pythonu a TensorFlowu

V tomto článku se dozvíte, jak pomocí Pythonu, TensorFlowu a Azure Functions s modelem strojového učení klasifikovat obrázek na základě jeho obsahu. Vzhledem k tomu, že veškerou práci provádíte místně a nevytváříte žádné prostředky Azure v cloudu, znamená to, že dokončení tohoto kurzu nemá žádné náklady.

  • Inicializace místního prostředí pro vývoj Azure Functions v Pythonu
  • Naimportujte vlastní model strojového učení TensorFlow do aplikace funkcí.
  • Vytvořte bezserverové rozhraní HTTP API pro klasifikaci obrázku, který obsahuje psa nebo kočku.
  • Využijete rozhraní API z webové aplikace.

Požadavky

Kontrola požadovaných součástí

  1. V terminálu nebo příkazovém okně spusťte příkaz func --version a zkontrolujte, jestli jsou nástroje Azure Functions Core Tools verze 2.7.1846 nebo novější.
  2. Spuštěním příkazu python --version (Linux/MacOS) nebo py --version (Windows) zkontrolujte sestavy verze Pythonu 3.7.x.

Naklonování úložiště tutorial

  1. V terminálu nebo příkazovém okně naklonujte pomocí Gitu následující úložiště:

    git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
    
  2. Přejděte do složky a prozkoumejte její obsah.

    cd functions-python-tensorflow-tutorial
    
    • start je vaše pracovní složka pro kurz.
    • end je konečný výsledek a úplná implementace pro vaši referenci.
    • Prostředky obsahují model strojového učení a pomocné knihovny.
    • front-end je web, který volá aplikaci funkcí.

Vytvoření a aktivace virtuálního prostředí Pythonu

Přejděte do složky Start a spuštěním následujících příkazů vytvořte a aktivujte virtuální prostředí s názvem .venv. Nezapomeňte použít Python 3.7, který Azure Functions podporuje.

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

Pokud Python nenainstaloval balíček venv do distribuce Linuxu, spusťte následující příkaz:

sudo apt-get install python3-venv

Všechny následné příkazy spustíte v tomto aktivovaném virtuálním prostředí. (Virtuální prostředí ukončíte spuštěním příkazu deactivate.)

Vytvoření projektu místních funkcí

V Azure Functions je projekt funkce kontejner pro jednu nebo více jednotlivých funkcí, z nichž každá reaguje na konkrétní aktivační událost. Všechny funkce v projektu sdílejí stejnou místní a hostující konfiguraci. V této části vytvoříte projekt funkce, který obsahuje jednu častou funkci s názvem classify , která poskytuje koncový bod HTTP. Konkrétnější kód přidáte v pozdější části.

  1. Ve složce Start použijte Azure Functions Core Tools k inicializaci aplikace funkcí Pythonu:

    func init --worker-runtime python
    

    Po inicializaci složka Start obsahuje různé soubory pro projekt, včetně konfiguračních souborů s názvy local.settings.json a host.json. Vzhledem k tomu, že soubor local.settings.json může obsahovat tajné kódy stažené z Azure, je soubor ve výchozím nastavení vyloučený ze správy zdrojového kódu v souboru .gitignore .

    Tip

    Vzhledem k tomu, že projekt funkce je svázán s konkrétním modulem runtime, musí být všechny funkce v projektu napsané ve stejném jazyce.

  2. Přidejte do projektu funkci pomocí následujícího příkazu, kde --name argument je jedinečný název funkce a --template argument určuje trigger funkce. func new Vytvořte podsložku odpovídající názvu funkce, která obsahuje soubor kódu odpovídající zvolenému jazyku projektu a konfigurační soubor function.json.

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

    Tento příkaz vytvoří složku odpovídající názvu funkce klasifikovat. V této složce jsou dva soubory: __init__.py, který obsahuje kód funkce, a function.json, který popisuje trigger funkce a její vstupní a výstupní vazby. Podrobnosti o obsahu těchto souborů najdete v části Programovací model v příručce pro vývojáře v Pythonu.

Místní spuštění funkce

  1. Spusťte funkci spuštěním místního hostitele modulu runtime Azure Functions ve složce Start:

    func start
    
  2. Jakmile se classify koncový bod zobrazí ve výstupu, přejděte na adresu URL http://localhost:7071/api/classify?name=Azure. Ve výstupu by se měla zobrazit zpráva "Hello Azure!" (Ahoj Azure!).

  3. Pomocí ctrl-C zastavte hostitele.

Import modelu TensorFlow a přidání pomocného kódu

Pokud chcete upravit classify funkci tak, aby klasifikovala obrázek na základě jejího obsahu, použijete předem připravený model TensorFlow, který se vytrénoval pomocí a exportoval ze služby Azure Custom Vision Service. Model, který je obsažen ve složce resources ukázky, kterou jste naklonovali dříve, klasifikuje obrázek podle toho, jestli obsahuje psa nebo kočku. Pak do projektu přidáte kód pomocné rutiny a závislosti.

Pokud chcete vytvořit vlastní model pomocí úrovně Free služby Custom Vision Service, postupujte podle pokynů v úložišti ukázkového projektu.

Tip

Pokud chcete model TensorFlow hostovat nezávisle na aplikaci funkcí, můžete místo toho k linuxové aplikaci funkcí připojit sdílenou složku obsahující váš model. Další informace najdete v tématu Připojení sdílené složky k aplikaci funkcí Pythonu pomocí Azure CLI.

  1. Ve složce start spusťte následující příkaz, který zkopíruje soubory modelu do složky klasifikace . Nezapomeňte do příkazu zahrnout \* .

    cp ../resources/model/* classify
    
  2. Ověřte, že složka klasifikace obsahuje soubory s názvy model.pb a labels.txt. Pokud ne, zkontrolujte, jestli jste spustili příkaz ve složce start .

  3. Ve složce start spusťte následující příkaz, který zkopíruje soubor s pomocným kódem do složky klasifikace :

    cp ../resources/predict.py classify
    
  4. Ověřte, že složka klasifikace nyní obsahuje soubor s názvem predict.py.

  5. Otevřete start/requirements.txt v textovém editoru a přidejte následující závislosti vyžadované pomocným kódem:

    tensorflow==1.14
    Pillow
    requests
    
  6. Uložte requirements.txt.

  7. Nainstalujte závislosti spuštěním následujícího příkazu ve složce start . Instalace může trvat několik minut. Během této doby můžete pokračovat ve změnách funkce v další části.

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

    Ve Windows se může zobrazit chyba "Nepodařilo se nainstalovat balíčky kvůli chybě environmentError: [Errno 2] Žádný takový soubor nebo adresář:" následovaná dlouhou cestou k souboru , jako je sharded_mutable_dense_hashtable.cpython-37.pyc. K této chybě obvykle dochází, protože hloubka cesty ke složce je příliš dlouhá. V takovém případě nastavte klíč HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled registru na , 1 abyste povolili dlouhé cesty. Případně zkontrolujte, kde je nainstalovaný interpret Pythonu. Pokud má toto umístění dlouhou cestu, zkuste přeinstalovat složku s kratší cestou.

Tip

Při volání predict.py k vytvoření první předpovědi načte funkce s názvem _initialize TensorFlow model z disku a uloží ho do mezipaměti v globálních proměnných. Toto ukládání do mezipaměti urychluje následné předpovědi. Další informace o používání globálních proměnných najdete v příručce pro vývojáře Azure Functions Pythonu.

Aktualizace funkce pro spouštění předpovědí

  1. Otevřete soubor classify/__init__.py v textovém editoru a přidejte následující řádky za existující import příkazy pro import standardní knihovny JSON a pomocných rutin predikce :

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. Celý obsah main funkce nahraďte následujícím kódem:

    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)
    

    Tato funkce obdrží adresu URL obrázku v parametru řetězce dotazu s názvem img. Potom zavolá predict_image_from_url z pomocné knihovny ke stažení a klasifikaci obrázku pomocí modelu TensorFlow. Funkce pak vrátí odpověď HTTP s výsledky.

    Důležité

    Vzhledem k tomu, že tento koncový bod HTTP volá webová stránka hostovaná v jiné doméně, odpověď obsahuje hlavičku Access-Control-Allow-Origin , která splňuje požadavky prohlížeče na sdílení prostředků mezi zdroji (CORS).

    V produkční aplikaci změňte * konkrétní původ webové stránky, aby se přidalo zabezpečení.

  3. Uložte změny a za předpokladu, že se instalace závislostí dokončila, spusťte hostitele místní funkce znovu pomocí func startpříkazu . Nezapomeňte spustit hostitele ve složce Start s aktivovaným virtuálním prostředím. V opačném případě se hostitel spustí, ale při vyvolání funkce se zobrazí chyby.

    func start
    
  4. V prohlížeči otevřete následující adresu URL, abyste funkci vyvolali s adresou URL obrázku kočky a ověřte, že vrácený kód JSON klasifikuje obrázek jako kočku.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    
  5. Nechte hostitele spuštěného, protože ho použijete v dalším kroku.

Spuštěním front-endu místní webové aplikace funkci otestujte.

Pokud chcete otestovat vyvolání koncového bodu funkce z jiné webové aplikace, je ve front-endové složce úložiště jednoduchá aplikace.

  1. Otevřete nový terminál nebo příkazový řádek a aktivujte virtuální prostředí (jak je popsáno výše v části Vytvoření a aktivace virtuálního prostředí Pythonu).

  2. Přejděte do front-endové složky úložiště.

  3. Spuštění serveru HTTP pomocí Pythonu:

    python -m http.server
    
  4. V prohlížeči přejděte na localhost:8000a pak do textového pole zadejte jednu z následujících adres URL fotek nebo použijte adresu URL libovolného veřejně přístupného obrázku.

    • 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. Vyberte Odeslat a vyvolejte koncový bod funkce pro klasifikaci image.

    Snímek obrazovky dokončeného projektu

    Pokud prohlížeč při odeslání adresy URL obrázku hlásí chybu, zkontrolujte terminál, ve kterém aplikaci funkcí spouštíte. Pokud se zobrazí chyba typu "Pil nebyl nalezen žádný modul", je možné, že jste spustili aplikaci funkcí ve složce Start , aniž byste nejprve aktivovali virtuální prostředí, které jste vytvořili dříve. Pokud se stále zobrazují chyby, spusťte pip install -r requirements.txt znovu s aktivovaným virtuálním prostředím a vyhledejte chyby.

Poznámka

Model vždy klasifikuje obsah obrázku jako kočku nebo psa bez ohledu na to, jestli obrázek obsahuje, výchozí hodnota je pes. Například obrázky tygrů a panterů se obvykle klasifikují jako kočky, ale obrázky slonů, mrkví nebo letadel klasifikují jako psy.

Vyčištění prostředků

Vzhledem k tomu, že celý tento kurz běží místně na vašem počítači, nejsou k dispozici žádné prostředky Ani služby Azure, které by bylo potřeba vyčistit.

Další kroky

V tomto kurzu jste zjistili, jak sestavit a přizpůsobit koncový bod rozhraní HTTP API s Azure Functions ke klasifikaci obrázků pomocí modelu TensorFlow. Také jste se dozvěděli, jak volat rozhraní API z webové aplikace. Techniky v tomto kurzu můžete použít k sestavení rozhraní API jakékoli složitosti, a to vše při spuštění na bezserverovém výpočetním modelu poskytovaném Azure Functions.

Viz také: