Samouczek: wdrażanie wstępnie wytrenowanego modelu klasyfikacji obrazów w celu Azure Functions za pomocą narzędzia PyTorch

W tym artykule dowiesz się, jak używać języka Python, PyTorch i Azure Functions do ładowania wstępnie wytrenowanego modelu 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 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

Sprawdzanie wymagań wstępnych

  1. 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.
  2. Uruchom python --version polecenie (Linux/MacOS) lub py --version (Windows), aby sprawdzić raporty wersji języka Python w wersji 3.7.x.

Klonowanie repozytorium samouczka

  1. 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
    
  2. Przejdź do folderu i sprawdź jego zawartość.

    cd functions-python-pytorch-tutorial
    
    • start to folder roboczy dla tego samouczka.
    • koniec to końcowy wynik i pełna implementacja dla Twojego odwołania.
    • 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 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 jedną funkcję kociołową o nazwie classify , która udostępnia punkt końcowy HTTP. W dalszej sekcji dodasz bardziej szczegółowy kod.

  1. W folderze Start użyj 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ż 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.

  2. 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 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 deweloperów języka Python.

Lokalne uruchamianie funkcji

  1. Uruchom funkcję, uruchamiając lokalny host środowiska uruchomieniowego Azure Functions w folderze Start:

    func start
    
  2. Po wyświetleniu classify punktu końcowego w danych wyjściowych przejdź do adresu URL . http://localhost:7071/api/classify?name=Azure Komunikat "Hello Azure!" powinien pojawić się w danych wyjściowych.

  3. Użyj klawiszy Ctrl-C , aby zatrzymać hosta.

Importowanie modelu PyTorch i dodawanie kodu pomocniczego

Aby zmodyfikować classify funkcję w celu klasyfikowania 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 do projektu dodasz kod pomocnika i zależności.

  1. 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
    
  2. Sprawdź, czy folder klasyfikuj zawiera pliki o nazwie predict.py i labels.txt. Jeśli nie, sprawdź, czy uruchomiono polecenie w folderze Start .

  3. 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
    

    Porada

    Wersje torch i torchvision muszą być zgodne z wartościami wymienionymi w tabeli wersji repozytorium PyTorch vision.

  4. 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.

Porada

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:" 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ę za długa. W takim przypadku ustaw klucz HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled rejestru, aby 1 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 zainstalować ponownie w folderze z krótszą ścieżką.

Aktualizowanie funkcji w celu uruchamiania przewidywań

  1. 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
    
  2. 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łuje z predict_image_from_url biblioteki pomocnika pobieranie i klasyfikowanie 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 w celu zwiększenia bezpieczeństwa.

  3. Zapisz zmiany, a następnie przy założeniu, że zależności zakończyły instalację, 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 zostaną wyświetlone błędy.

    func start
    
  4. 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
    
  5. Zachowaj działanie hosta, ponieważ używasz go 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, istnieje prosta aplikacja w folderze frontonu repozytorium.

  1. Otwórz nowy terminal lub wiersz polecenia i aktywuj środowisko wirtualne (zgodnie z wcześniejszym opisem w obszarze Tworzenie i aktywowanie środowiska wirtualnego języka Python).

  2. Przejdź do folderu frontonu repozytorium.

  3. Uruchom serwer HTTP przy użyciu języka Python:

    python -m http.server
    
  4. W przeglądarce przejdź do localhost:8000adresu , 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
  5. Wybierz pozycję Prześlij, aby wywołać punkt końcowy funkcji, aby sklasyfikować obraz.

    Zrzut ekranu przedstawiający ukończony projekt

    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.

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 PROTOKOŁU HTTP przy użyciu Azure Functions do klasyfikowania obrazów przy użyciu modelu PyTorch. 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ż: