Udostępnij za pośrednictwem


Samouczek: stosowanie modeli uczenia maszynowego w usłudze Azure Functions przy użyciu języka Python i biblioteki TensorFlow

Z tego artykułu dowiesz się, jak używać języka Python, TensorFlow i usługi Azure Functions z modelem uczenia maszynowego 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 wiąże się z żadnymi kosztami.

  • Zainicjuj środowisko lokalne do tworzenia usługi 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 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. Pamiętaj, aby użyć języka Python 3.7, który jest obsługiwany przez usługę 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 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 TensorFlow i dodawanie kodu pomocniczego

Aby zmodyfikować classify funkcję w celu klasyfikowania obrazu na podstawie jego zawartości, należy użyć wstępnie utworzonego modelu TensorFlow, który został wytrenowany z usługą Azure Custom Vision Service i wyeksportowany z niego. 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 do projektu kod pomocnika i zależności.

Aby utworzyć własny model przy użyciu warstwy Bezpłatna usługi Custom Vision Service, postępuj zgodnie z instrukcjami w przykładowym repozytorium projektu.

Napiwek

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 klasyfikuj. Pamiętaj, aby dołączyć \* polecenie .

    cp ../resources/model/* classify
    
  2. Sprawdź, czy folder klasyfikuj 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 klasyfikuj teraz zawiera 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 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ą.

Napiwek

Podczas wywoływania predict.py w celu dokonania pierwszego przewidywania funkcja o nazwie _initialize ładuje model TensorFlow z dysku i buforuje go w zmiennych globalnych. Ta 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 usługi 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 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 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, 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 będą widoczne 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. 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-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ł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.

Uwaga

Model zawsze klasyfikuje zawartość obrazu jako kota lub psa, niezależnie od tego, czy obraz zawiera wartość domyślną dla psa. Obrazy tygrysów i panterów, na przykład, zazwyczaj klasyfikowane jako kot, ale obrazy słoni, marchew lub samolotów są klasyfikowane 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 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 TensorFlow. 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ż: