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

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-tensorflow-tutorial.git
    
  2. 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.

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

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

  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 W danych wyjściowych powinien zostać wyświetlony komunikat "Hello Azure!".

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

  1. W folderze start uruchom następujące polecenie, aby skopiować pliki modelu do folderu classify . Pamiętaj, aby uwzględnić \* polecenie .

    cp ../resources/model/* classify
    
  2. Sprawdź, czy folder classify zawiera pliki o nazwach model.pb i labels.txt. Jeśli nie, sprawdź, czy uruchomiono polecenie w folderze Start .

  3. W folderze start uruchom następujące polecenie, aby skopiować plik z kodem pomocnika do folderu klasyfikuj :

    cp ../resources/predict.py classify
    
  4. Sprawdź, czy folder classify zawiera teraz plik o nazwie predict.py.

  5. 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
    
  6. Zapisz requirements.txt.

  7. 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, aby 1 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ń

  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 przewidywać pomocników:

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

  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 będą wyświetlane błędy.

    func start
    
  4. 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
    
  5. 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.

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

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

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