Udostępnij za pośrednictwem


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

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 polecenie python --version (Linux/macOS) lub py --version (Windows), aby sprawdzić raporty wersji języka Python 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 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.

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

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

  1. Uruchom funkcję, uruchamiając lokalnego hosta środowiska uruchomieniowego usługi Azure Functions w folderze Start :

    func start
    
  2. 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.

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

  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 klasyfikacji 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
    

    Napiwek

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

  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.

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, 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 ponownie zainstalować plik 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 predict_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.

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

  1. 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).

  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ł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ż: