Kurz: Nasazení předem natrénovaného modelu klasifikace obrázků do Azure Functions pomocí PyTorchu
V tomto článku se dozvíte, jak pomocí Pythonu, PyTorchu a Azure Functions načíst předem natrénovaný model pro klasifikaci obrázku na základě jeho obsahu. Vzhledem k tomu, že všechno fungujete místně a nevytváříte žádné prostředky Azure v cloudu, není potřeba tento kurz dokončit.
- Inicializace místního prostředí pro vývoj Azure Functions v Pythonu
- Importujte předem natrénovaný model strojového učení PyTorch do aplikace funkcí.
- Sestavte bezserverové rozhraní HTTP API pro klasifikaci image jako jednu z 1 000 tříd ImageNet.
- Využijete rozhraní API z webové aplikace.
Požadavky
- Účet Azure s aktivním předplatným. Vytvoření účtu zdarma
- Python 3.7.4 nebo novější (Python 3.8.x a Python 3.6.x jsou také ověřeny pomocí Azure Functions.)
- Základní nástroje Azure Functions
- Editor kódu, jako je Visual Studio Code
Kontrola požadovaných součástí
- V terminálu nebo příkazovém okně spusťte kontrolu
func --version
, jestli jsou nástroje Azure Functions Core Tools verze 2.7.1846 nebo novější. - Spusťte
python --version
(Linux/macOS) nebopy --version
(Windows) a zkontrolujte sestavy verzí Pythonu 3.7.x.
Klonování úložiště kurzů
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-pytorch-tutorial.git
Přejděte do složky a prozkoumejte její obsah.
cd functions-python-pytorch-tutorial
- start is your working folder for the tutorial.
- end je konečný výsledek a úplná implementace vašeho odkazu.
- 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 spouštěcí složky 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ásledující příkazy. (Spuštěním příkazu .) ukončete deactivate
virtuální prostředí.
Vytvoření projektu místních funkcí
Ve službě Azure Functions je projekt funkcí kontejnerem pro jednu nebo více jednotlivých funkcí, které každá reaguje na konkrétní trigger. Všechny funkce v projektu sdílejí stejné místní a hostitelské konfigurace. V této části vytvoříte projekt funkce, který obsahuje jedinou častou funkci s názvem classify
, která poskytuje koncový bod HTTP. Do další části přidáte konkrétnější kód.
Ve složce Start použijte nástroje 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ů pojmenovaných local.settings.json a host.json. Protože local.settings.json může obsahovat tajné kódy stažené z Azure, soubor je 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ázaný s konkrétním modulem runtime, musí být všechny funkce v projektu zapsány ve stejném jazyce.
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 aktivační událost 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ímu souboru 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 aktivační událost funkce a její vstupní a výstupní vazby. Podrobnosti o obsahu těchto souborů najdete v programovacím modelu v příručce pro vývojáře Pythonu.
Místní spuštění funkce
Spusťte funkci spuštěním místního hostitele modulu runtime Azure Functions ve složce Start :
func start
Jakmile se
classify
koncový bod zobrazí ve výstupu, přejděte na adresu URLhttp://localhost:7071/api/classify?name=Azure
. Ve výstupu by se měla zobrazit zpráva "Hello Azure!".K zastavení hostitele použijte klávesu Ctrl-C.
Import modelu PyTorch 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žijte předem natrénovaný model ResNet . Předem natrénovaný model, který pochází z PyTorch, klasifikuje obrázek do 1 z 1 000 tříd ImageNet. Potom do projektu přidáte nějaký pomocný kód a závislosti.
Ve složce Start spusťte následující příkaz, který zkopíruje kód předpovědi a popisky do složky klasifikace.
cp ../resources/predict.py classify cp ../resources/labels.txt classify
Ověřte, že složka klasifikace obsahuje soubory s názvem predict.py a labels.txt. Pokud ne, zkontrolujte, že jste příkaz spustili ve složce Start .
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.
Uložte requirements.txt a potom 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 které 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ář:" následovaný dlouhým názvem cesty 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 tomto případě nastavte klíč
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled
registru tak, aby1
povolil dlouhé cesty. Případně zkontrolujte, kde je váš interpret Pythonu nainstalovaný. 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í
Otevřete klasifikovat/__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
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 volá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 je volán webovou stránkou hostovaným v jiné doméně, obsahuje odpověď 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 přejděte
*
ke konkrétnímu původu webové stránky pro zvýšení zabezpečení.Uložte změny a za předpokladu, že instalace závislostí skončila, spusťte hostitele místní funkce znovu pomocí
func start
. 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
V prohlížeči otevřete následující adresu URL pro vyvolání funkce s adresou URL obrázku Bernese Mountain Dog a potvrďte, že vrácený JSON klasifikuje obrázek jako Bernese Mountain Dog.
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
Nechte hostitele spuštěný, protože ho použijete v dalším kroku.
Spuštěním front-endu místní webové aplikace otestujte funkci.
K otestování volání koncového bodu funkce z jiné webové aplikace je v front-endové složce úložiště jednoduchá aplikace.
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).
Přejděte do front-endové složky úložiště.
Spusťte server HTTP pomocí Pythonu:
python -m http.server
V prohlížeči přejděte do
localhost:8000
textového pole a 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
Výběrem možnosti Odeslat vyvoláte koncový bod funkce pro klasifikaci obrázku.
Pokud prohlížeč hlásí chybu při odeslání adresy URL obrázku, zkontrolujte terminál, ve kterém spouštíte aplikaci funkcí. Pokud se zobrazí chyba typu Žádný modul nenalezl PIL, možná jste spustili aplikaci funkcí ve složce Start bez první aktivace virtuálního prostředí, které jste vytvořili dříve. Pokud se vám stále zobrazují chyby, spusťte
pip install -r requirements.txt
znovu virtuální prostředí aktivované 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, nejsou k dispozici žádné prostředky Ani služby Azure, které by bylo potřeba vyčistit.
Další kroky
V tomto kurzu jste se dozvěděli, jak pomocí Azure Functions sestavit a přizpůsobit koncový bod rozhraní HTTP API pro klasifikaci obrázků pomocí modelu PyTorch. Dozvěděli jste se také, 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 spouštění na bezserverovém výpočetním modelu poskytovaném službou Azure Functions.
Viz také: