Kurz: Nasazení předem natrénovaného modelu klasifikace obrázků pro Azure Functions pomocí PyTorchu

V tomto článku se dozvíte, jak pomocí Pythonu, PyTorchu a Azure Functions načíst předem vytrénovaný model pro klasifikaci obrázku na základě jeho obsahu. Vzhledem k tomu, že veškerou práci děláte místně a nevytváříte žádné prostředky Azure v cloudu, nemusíte tento kurz absolvovat.

  • Inicializace místního prostředí pro vývoj Azure Functions v Pythonu
  • Importujte předem vytrénovaný model strojového učení PyTorch do aplikace funkcí.
  • Vytvořte bezserverové rozhraní HTTP API pro klasifikaci image jako jedné z 1000 tříd ImageNet.
  • Využijete rozhraní API z webové aplikace.

Požadavky

Kontrola požadavků

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

Klonování úložiště kurzu

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

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

    cd functions-python-pytorch-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.

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 tomto aktivovaném virtuálním prostředí spustíte všechny následné příkazy. (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 kontejnerem pro jednu nebo více jednotlivých funkcí, z nichž každá reaguje na konkrétní trigger. Všechny funkce v projektu sdílejí stejnou místní a hostitelovou konfiguraci. V této části vytvoříte projekt funkcí, 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 obsahuje spouštěcí složka různé soubory projektu, včetně konfiguračních souborů s názvy local.settings.json a host.json. Vzhledem k tomu, že 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 s názvem 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 tématu 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 PyTorch a přidání pomocného kódu

Pokud chcete upravit classify funkci tak, aby klasifikovala obrázek na základě jeho obsahu, použijte předem natrénovaný model ResNet . Předtrénovaný model, který pochází z PyTorchu, klasifikuje obrázek do 1 z 1000 tříd ImageNet. Pak do projektu přidáte pomocný kód a závislosti.

  1. Ve složce Start spusťte následující příkaz, který zkopíruje kód předpovědi a popisky do složky klasifikovat .

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

  3. Otevřete start/requirements.txt v textovém editoru a přidejte závislosti vyžadované pomocným kódem, který by měl vypadat takto:

    azure-functions
    requests
    -f https://download.pytorch.org/whl/torch_stable.html
    torch==1.13.0+cpu
    torchvision==0.14.0+cpu
    

    Tip

    Verze torch a torchvision musí odpovídat hodnotám uvedeným v tabulce verzí úložiště PyTorch vision.

  4. Uložte requirements.txta pak spuštěním následujícího příkazu ze složky Start nainstalujte závislosti.

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

Instalace může trvat několik minut. Během této doby můžete pokračovat v úpravě funkce v další části.

Tip

Ve Windows se může zobrazit chyba "Nepodařilo se nainstalovat balíčky kvůli chybě environmentError: [Errno 2] Žádný takový soubor nebo adresář:", za kterou následuje dlouhá cesta 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 hodnotu, 1 aby se povolily 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.

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 predict :

    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. Pak zavolá predict_image_from_url z pomocné knihovny ke stažení a klasifikaci obrázku pomocí modelu PyTorch. 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 za účelem zvýšení zabezpečení změňte * na konkrétní původ webové stránky.

  3. Uložte změny a za předpokladu, že se instalace závislostí dokončila, znovu spusťte hostitele místní funkce pomocí func startpříkazu . Nezapomeňte spustit hostitele ve složce Start s aktivovaným virtuálním prostředím. Jinak 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 pro vyvolání funkce s adresou URL obrázku bernského horského psa a potvrďte, že vrácený kód JSON klasifikuje obrázek jako bernský horský pes.

    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. 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-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. 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 se nenašel žádný modul", je možné, že jste aplikaci funkcí spustili ve složce Start , aniž byste nejdřív 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.

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

Vzhledem k tomu, že celý tento kurz běží místně na vašem počítači, neexistují žá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 PyTorch. 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 libovolné 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é: