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
- Účet Azure s aktivním předplatným. Vytvořte si zdarma účet.
- Python 3.7.4. (Python 3.7.4 a Python 3.6.x jsou ověřeny pomocí Azure Functions; Python 3.8 a novější verze se zatím nepodporují.)
- Nástroje Azure Functions Core Tools
- Editor kódu, například Visual Studio Code
Kontrola požadovaných součástí
- 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ší. - Spuštěním příkazu
python --version
(Linux/MacOS) nebopy --version
(Windows) zkontrolujte sestavy verze Pythonu 3.7.x.
Naklonování úložiště tutorial
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
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.
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.
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
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!" (Ahoj Azure!).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.
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
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 .
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
Ověřte, že složka klasifikace nyní obsahuje soubor s názvem predict.py.
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
Uložte requirements.txt.
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í
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
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í.Uložte změny a za předpokladu, že se instalace závislostí dokončila, spusťte hostitele místní funkce znovu pomocí
func start
pří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
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
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.
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ě.
Spuštění serveru HTTP pomocí Pythonu:
python -m http.server
V prohlížeči přejděte na
localhost:8000
a 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
Vyberte Odeslat a vyvolejte koncový bod funkce pro klasifikaci image.
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é: