Samouczek: wdrażanie wstępnie wytrenowanego modelu klasyfikacji obrazów w usłudze Azure Functions przy użyciu rozwiązania PyTorch
Z tego artykułu dowiesz się, jak za pomocą języka Python, PyTorch i usługi Azure Functions załadować wstępnie wytrenowany model do 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 jest kosztowne.
- Zainicjuj środowisko lokalne do tworzenia usługi Azure Functions w języku Python.
- Zaimportuj wstępnie wytrenowany model uczenia maszynowego PyTorch do aplikacji funkcji.
- Utwórz bezserwerowy interfejs API HTTP do klasyfikowania obrazu jako jednej z 1000 klas ImageNet.
- Używanie interfejsu API z poziomu aplikacji internetowej.
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Środowisko Python w wersji 3.7.4 lub nowszej. (Języki Python 3.8.x i Python 3.6.x są również weryfikowane za pomocą usługi Azure Functions).
- Podstawowe narzędzia usługi 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-pytorch-tutorial.git
Przejdź do folderu i sprawdź jego zawartość.
cd functions-python-pytorch-tutorial
- Start to folder roboczy tego samouczka.
- end jest wynikiem końcowym i pełną implementacją dokumentacji.
- zasoby zawierają model uczenia maszynowego i biblioteki pomocnika.
- 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
.
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 usłudze Azure Functions projekt funkcji jest kontenerem dla co najmniej jednej pojedynczej funkcji, która odpowiada na określony wyzwalacz. Wszystkie funkcje w projekcie współdzielą te same konfiguracje lokalne i hostujące. W tej sekcji utworzysz projekt funkcji zawierający pojedynczą funkcję kociołową o nazwie classify
, która udostępnia punkt końcowy HTTP. W późniejszej sekcji dodasz bardziej szczegółowy kod.
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 startowy zawiera różne pliki dla projektu, w tym pliki konfiguracji o nazwie local.settings.json i host.json. Ponieważ 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 .
Napiwek
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 plik 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 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 lokalnego hosta środowiska uruchomieniowego usługi Azure Functions w folderze Start :
func start
Po wyświetleniu punktu końcowego
classify
w danych wyjściowych przejdź do adresu URL .http://localhost:7071/api/classify?name=Azure
Komunikat "Hello Azure!" powinien zostać wyświetlony w danych wyjściowych.Użyj Ctrl-C, aby zatrzymać hosta.
Importowanie modelu PyTorch i dodawanie kodu pomocniczego
Aby zmodyfikować funkcję w celu klasyfikowania classify
obrazu na podstawie jego zawartości, należy użyć wstępnie wytrenowanego modelu ResNet . Wstępnie wytrenowany model, który pochodzi z PyTorch, klasyfikuje obraz do 1 z 1000 klas ImageNet. Następnie dodasz do projektu kod pomocnika i zależności.
W folderze Start uruchom następujące polecenie, aby skopiować kod przewidywania i etykiety do folderu klasyfikuj.
cp ../resources/predict.py classify cp ../resources/labels.txt classify
Sprawdź, czy folder klasyfikacji zawiera pliki o nazwie predict.py i labels.txt. Jeśli nie, sprawdź, czy uruchomiono polecenie w folderze Start .
Otwórz plik start/requirements.txt w edytorze tekstów i dodaj zależności wymagane przez kod pomocnika, które powinny wyglądać następująco:
azure-functions requests -f https://download.pytorch.org/whl/torch_stable.html torch==1.13.0+cpu torchvision==0.14.0+cpu
Napiwek
Wersje torch i torchvision muszą być zgodne z wartościami wymienionymi w tabeli wersji repozytorium przetwarzania obrazów PyTorch.
Zapisz requirements.txt, a następnie uruchom następujące polecenie z folderu start, aby zainstalować zależności.
pip install --no-cache-dir -r requirements.txt
Instalacja może potrwać kilka minut. W tym czasie można kontynuować modyfikowanie funkcji w następnej sekcji.
Napiwek
W systemie Windows może wystąpić błąd "Nie można zainstalować pakietów z powodu błędu environmentError: [Errno 2] Brak takiego pliku lub katalogu:" i długiej ś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ę za długa. W tym przypadku ustaw klucz
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled
rejestru, aby1
włączyć długie ścieżki. Alternatywnie sprawdź, gdzie jest zainstalowany 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ą.
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 pomocników przewidywania :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
bibliotekę pomocnika w celu pobrania i sklasyfikowania obrazu przy użyciu modelu PyTorch. 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, aby dodać zabezpieczenia.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 zobaczysz błędy.func start
W przeglądarce otwórz następujący adres URL, aby wywołać funkcję z adresem URL obrazu Bernese Mountain Dog i potwierdzić, że zwrócony kod JSON klasyfikuje obraz 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
Zachowaj działanie hosta, ponieważ jest on używany w następnym kroku.
Uruchamianie frontonu lokalnej 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 opisem we wcześniejszej sekcji Tworzenie i aktywowanie środowiska wirtualnego języka Python).
Przejdź do folderu frontonu repozytorium.
Uruchom serwer HTTP przy użyciu języka Python:
python -m http.server
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-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
Wybierz pozycję Prześlij , aby wywołać punkt końcowy funkcji, aby sklasyfikować obraz.
Jeśli przeglądarka zgłasza 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 startowym bez wcześniejszego aktywowania utworzonego wcześniej środowiska wirtualnego. Jeśli nadal występują błędy, uruchom
pip install -r requirements.txt
ponownie przy użyciu aktywowanego środowiska wirtualnego i poszukaj błędów.
Czyszczenie zasobów
Ponieważ cały ten samouczek działa lokalnie na maszynie, nie ma żadnych zasobów ani usług platformy Azure do oczyszczenia.
Następne kroki
W tym samouczku przedstawiono sposób tworzenia i dostosowywania punktu końcowego interfejsu API HTTP za pomocą usługi Azure Functions w celu klasyfikowania obrazów przy użyciu modelu PyTorch. Przedstawiono również sposób wywoływania interfejsu API z poziomu aplikacji internetowej. Korzystając z technik w tym samouczku, możesz tworzyć interfejsy API o dowolnej złożoności, a wszystko to podczas uruchamiania w modelu obliczeniowym bezserwerowym udostępnianym przez usługę Azure Functions.
Zobacz też: