Samouczek: stosowanie modeli uczenia maszynowego w Azure Functions przy użyciu języków Python i TensorFlow
Z tego artykułu dowiesz się, jak używać języka Python, TensorFlow i Azure Functions z modelem uczenia maszynowego w celu klasyfikowania obrazu na podstawie jego zawartości. Ponieważ wszystkie zadania są wykonywane lokalnie i nie są tworzone żadne zasoby platformy Azure w chmurze, ukończenie tego samouczka nie wiąże się z żadnymi kosztami.
- Inicjowanie środowiska lokalnego na potrzeby tworzenia Azure Functions w języku Python.
- Zaimportuj niestandardowy model uczenia maszynowego TensorFlow do aplikacji funkcji.
- Utwórz bezserwerowy interfejs API HTTP do klasyfikowania obrazu jako zawierającego psa lub kota.
- Używanie interfejsu API z poziomu aplikacji internetowej.
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz bezpłatne konto.
- Python 3.7.4. (Języki Python 3.7.4 i Python 3.6.x są weryfikowane przy użyciu Azure Functions; Język Python 3.8 i nowsze wersje nie są jeszcze obsługiwane.
- Podstawowe narzędzia Azure Functions
- Edytor kodu, taki jak program Visual Studio Code
Sprawdzanie wymagań wstępnych
- W terminalu lub oknie polecenia uruchom polecenie
func --version
, aby sprawdzić, czy narzędzia Azure Functions Core Tools są w wersji 2.7.1846 lub nowszej. - Uruchom polecenie
python --version
(Linux/MacOS) lubpy --version
(Windows), aby sprawdzić raporty wersji języka Python 3.7.x.
Klonowanie repozytorium samouczka
W oknie terminalu lub polecenia sklonuj następujące repozytorium przy użyciu narzędzia Git:
git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
Przejdź do folderu i sprawdź jego zawartość.
cd functions-python-tensorflow-tutorial
- start to folder roboczy tego samouczka.
- end to końcowy wynik i pełna implementacja dla Twojego odwołania.
- zasoby zawierają model uczenia maszynowego i biblioteki pomocnicze.
- fronton to witryna internetowa, która wywołuje aplikację funkcji.
Tworzenie i aktywowanie środowiska wirtualnego języka Python
Przejdź do folderu start i uruchom następujące polecenia, aby utworzyć i aktywować środowisko wirtualne o nazwie .venv
. Pamiętaj, aby użyć języka Python 3.7, który jest obsługiwany przez Azure Functions.
cd start
python -m venv .venv
source .venv/bin/activate
Jeśli język Python nie zainstalował pakietu venv w dystrybucji systemu Linux, uruchom następujące polecenie:
sudo apt-get install python3-venv
Wszystkie kolejne polecenia są uruchamiane w tym aktywowanym środowisku wirtualnym. (Aby zamknąć środowisko wirtualne, uruchom polecenie deactivate
.
Tworzenie projektu funkcji lokalnych
W Azure Functions projekt funkcji jest kontenerem dla co najmniej jednej funkcji, która odpowiada na określony wyzwalacz. Wszystkie funkcje w projekcie współdzielą te same konfiguracje lokalne i hostingowe. W tej sekcji utworzysz projekt funkcji zawierający pojedynczą funkcję standardowy o nazwie classify
, która zapewnia punkt końcowy HTTP. Dodasz bardziej szczegółowy kod w późniejszej sekcji.
W folderze start użyj narzędzi Azure Functions Core Tools, aby zainicjować aplikację funkcji języka Python:
func init --worker-runtime python
Po zainicjowaniu folder start zawiera różne pliki projektu, w tym pliki konfiguracji o nazwach local.settings.json i host.json. Ponieważ plik local.settings.json może zawierać wpisy tajne pobrane z platformy Azure, plik jest domyślnie wykluczony z kontroli źródła w pliku gitignore .
Porada
Ponieważ projekt funkcji jest powiązany z określonym środowiskiem uruchomieniowym, wszystkie funkcje w projekcie muszą być napisane przy użyciu tego samego języka.
Dodaj funkcję do projektu przy użyciu następującego polecenia, gdzie
--name
argument jest unikatową nazwą funkcji, a--template
argument określa wyzwalacz funkcji.func new
Utwórz podfolder pasujący do nazwy funkcji zawierającej plik kodu odpowiedni dla wybranego języka projektu i pliku konfiguracji o nazwie function.json.func new --name classify --template "HTTP trigger"
To polecenie tworzy folder pasujący do nazwy funkcji , klasyfikuj. W tym folderze znajdują się dwa pliki: __init__.py, który zawiera kod funkcji i plik function.json, który opisuje wyzwalacz funkcji oraz powiązania wejściowe i wyjściowe. Aby uzyskać szczegółowe informacje na temat zawartości tych plików, zobacz Model programowania w przewodniku dla deweloperów języka Python.
Lokalne uruchamianie funkcji
Uruchom funkcję, uruchamiając lokalny host środowiska uruchomieniowego Azure Functions w folderze start:
func start
Po wyświetleniu
classify
punktu końcowego w danych wyjściowych przejdź do adresu URL .http://localhost:7071/api/classify?name=Azure
W danych wyjściowych powinien zostać wyświetlony komunikat "Hello Azure!".Użyj klawiszy Ctrl-C , aby zatrzymać hosta.
Importowanie modelu TensorFlow i dodawanie kodu pomocniczego
Aby zmodyfikować classify
funkcję w celu sklasyfikowania obrazu na podstawie jego zawartości, należy użyć wstępnie skompilowanego modelu TensorFlow, który został wytrenowany i wyeksportowany z usługi Azure Custom Vision Service. Model, który znajduje się w folderze resources sklonowanego wcześniej przykładu, klasyfikuje obraz na podstawie tego, czy zawiera psa, czy kota. Następnie dodasz kod pomocnika i zależności do projektu.
Aby utworzyć własny model przy użyciu warstwy Bezpłatna usługi Custom Vision Service, postępuj zgodnie z instrukcjami w repozytorium przykładowego projektu.
Porada
Jeśli chcesz hostować model TensorFlow niezależnie od aplikacji funkcji, możesz zamiast tego zainstalować udział plików zawierający model w aplikacji funkcji systemu Linux. Aby dowiedzieć się więcej, zobacz Instalowanie udziału plików w aplikacji funkcji języka Python przy użyciu interfejsu wiersza polecenia platformy Azure.
W folderze start uruchom następujące polecenie, aby skopiować pliki modelu do folderu classify . Pamiętaj, aby uwzględnić
\*
polecenie .Sprawdź, czy folder classify zawiera pliki o nazwach model.pb i labels.txt. Jeśli nie, sprawdź, czy uruchomiono polecenie w folderze Start .
W folderze start uruchom następujące polecenie, aby skopiować plik z kodem pomocnika do folderu klasyfikuj :
Sprawdź, czy folder classify zawiera teraz plik o nazwie predict.py.
Otwórz plik start/requirements.txt w edytorze tekstów i dodaj następujące zależności wymagane przez kod pomocnika:
tensorflow==1.14 Pillow requests
Zapisz requirements.txt.
Zainstaluj zależności, uruchamiając następujące polecenie w folderze start . Instalacja może potrwać kilka minut. W tym czasie można kontynuować modyfikowanie funkcji w następnej sekcji.
pip install --no-cache-dir -r requirements.txt
W systemie Windows może wystąpić błąd "Nie można zainstalować pakietów z powodu błędu środowiska: [Errno 2] Brak takiego pliku lub katalogu:", po którym następuje długa nazwa ścieżki do pliku, takiego jak sharded_mutable_dense_hashtable.cpython-37.pyc. Zazwyczaj ten błąd występuje, ponieważ głębokość ścieżki folderu staje się zbyt długa. W takim przypadku ustaw klucz
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled
rejestru, aby1
włączyć długie ścieżki. Możesz też sprawdzić, gdzie zainstalowano interpreter języka Python. Jeśli ta lokalizacja ma długą ścieżkę, spróbuj ponownie zainstalować plik w folderze z krótszą ścieżką.
Porada
Podczas wywoływania predict.py w celu utworzenia pierwszego przewidywania funkcja o nazwie _initialize
ładuje model TensorFlow z dysku i zapisuje go w pamięci podręcznej w zmiennych globalnych. Buforowanie przyspiesza kolejne przewidywania. Aby uzyskać więcej informacji na temat używania zmiennych globalnych, zapoznaj się z przewodnikiem dla deweloperów języka Python Azure Functions.
Aktualizowanie funkcji w celu uruchamiania przewidywań
Otwórz plik classify/__init__.py w edytorze tekstów i dodaj następujące wiersze po istniejących
import
instrukcjach, aby zaimportować standardową bibliotekę JSON i przewidywać pomocników:import logging import azure.functions as func import json # Import helper script from .predict import predict_image_from_url
Zastąp całą zawartość
main
funkcji następującym kodem: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)
Ta funkcja odbiera adres URL obrazu w parametrze ciągu zapytania o nazwie
img
. Następnie wywołujepredict_image_from_url
metodę z biblioteki pomocnika w celu pobrania i sklasyfikowania obrazu przy użyciu modelu TensorFlow. Następnie funkcja zwraca odpowiedź HTTP z wynikami.Ważne
Ponieważ ten punkt końcowy HTTP jest wywoływany przez stronę internetową hostowaną w innej domenie, odpowiedź zawiera
Access-Control-Allow-Origin
nagłówek spełniający wymagania dotyczące współużytkowania zasobów między źródłami (CORS) przeglądarki.W aplikacji produkcyjnej przejdź
*
do określonego źródła strony internetowej w celu zapewnienia dodanych zabezpieczeń.Zapisz zmiany, a następnie przy założeniu, że zależności zakończyły instalowanie, uruchom ponownie hosta funkcji lokalnej za pomocą polecenia
func start
. Pamiętaj, aby uruchomić hosta w folderze start z aktywowanym środowiskiem wirtualnym. W przeciwnym razie host zostanie uruchomiony, ale podczas wywoływania funkcji będą wyświetlane błędy.func start
W przeglądarce otwórz następujący adres URL, aby wywołać funkcję przy użyciu adresu URL obrazu kota i potwierdzić, że zwrócony kod JSON klasyfikuje obraz jako kota.
http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
Nie uruchamiaj hosta, ponieważ jest on używany w następnym kroku.
Uruchamianie lokalnego frontonu aplikacji internetowej w celu przetestowania funkcji
Aby przetestować wywoływanie punktu końcowego funkcji z innej aplikacji internetowej, w folderze frontonu repozytorium znajduje się prosta aplikacja.
Otwórz nowy terminal lub wiersz polecenia i aktywuj środowisko wirtualne (zgodnie z wcześniejszym opisem w sekcji Tworzenie i aktywowanie środowiska wirtualnego języka Python).
Przejdź do folderu frontonu repozytorium.
Uruchom serwer HTTP przy użyciu języka Python:
W przeglądarce przejdź do
localhost:8000
adresu , a następnie wprowadź jeden z następujących adresów URL zdjęć w polu tekstowym lub użyj adresu URL dowolnego publicznie dostępnego obrazu.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
Wybierz pozycję Prześlij , aby wywołać punkt końcowy funkcji, aby sklasyfikować obraz.
Jeśli przeglądarka zgłosi błąd podczas przesyłania adresu URL obrazu, sprawdź terminal, w którym jest uruchomiona aplikacja funkcji. Jeśli zostanie wyświetlony błąd taki jak "Nie znaleziono modułu PIL", być może aplikacja funkcji została uruchomiona w folderze start bez wcześniejszego aktywowania utworzonego wcześniej środowiska wirtualnego. Jeśli nadal występują błędy, uruchom ponownie przy
pip install -r requirements.txt
użyciu aktywowanego środowiska wirtualnego i poszukaj błędów.
Uwaga
Model zawsze klasyfikuje zawartość obrazu jako kota lub psa, niezależnie od tego, czy obraz zawiera, domyślnie dla psa. Obrazy tygrysów i panterów, na przykład, zazwyczaj klasyfikowane jako kot, ale obrazy słoni, marchew lub samolotów klasyfikują się jako pies.
Czyszczenie zasobów
Ponieważ cały ten samouczek działa lokalnie na maszynie, nie ma żadnych zasobów ani usług platformy Azure do wyczyszczenia.
Następne kroki
W tym samouczku przedstawiono sposób tworzenia i dostosowywania punktu końcowego interfejsu API HTTP przy użyciu Azure Functions do klasyfikowania obrazów przy użyciu modelu TensorFlow. Przedstawiono również sposób wywoływania interfejsu API z poziomu aplikacji internetowej. Techniki przedstawione w tym samouczku umożliwiają tworzenie interfejsów API o dowolnej złożoności, a wszystko to podczas uruchamiania w modelu obliczeniowym bezserwerowym udostępnianym przez Azure Functions.
Zobacz też: