Rozwiązywanie problemów z wdrażaniem modelu zdalnego

Dowiedz się, jak rozwiązywać problemy i rozwiązywać typowe błędy, które mogą wystąpić podczas wdrażania modelu w usługach Azure Container Instances (ACI) i Azure Kubernetes Service (AKS) przy użyciu usługi Azure Machine Edukacja.

Uwaga

Jeśli wdrażasz model w usłudze Azure Kubernetes Service (AKS), zalecamy włączenie usługi Azure Monitor dla tego klastra. Pomoże to zrozumieć ogólną kondycję klastra i użycie zasobów. Przydatne mogą być również następujące zasoby:

Jeśli próbujesz wdrożyć model w klastrze, który jest w złej kondycji lub jest przeciążony, wystąpienie problemów jest bardzo prawdopodobne. Jeśli potrzebujesz pomocy w rozwiązywaniu problemów z klastrem usługi AKS, skontaktuj się z pomocą techniczną usługi AKS.

Wymagania wstępne

Kroki wdrażania modeli uczenia maszynowego na platformie Docker

Podczas wdrażania modelu w obliczeniach innych niż lokalne w usłudze Azure Machine Edukacja są wykonywane następujące czynności:

  1. Plik Dockerfile określony w obiekcie Environments w elemencie InferenceConfig jest wysyłany do chmury wraz z zawartością katalogu źródłowego
  2. Jeśli wcześniej utworzony obraz nie jest dostępny w rejestrze kontenerów, nowy obraz platformy Docker jest kompilowany w chmurze i przechowywany w domyślnym rejestrze kontenerów obszaru roboczego.
  3. Obraz platformy Docker z rejestru kontenerów jest pobierany do docelowego obiektu obliczeniowego.
  4. Domyślny magazyn obiektów blob obszaru roboczego jest instalowany w docelowym obiekcie obliczeniowym, co zapewnia dostęp do zarejestrowanych modeli
  5. Serwer internetowy jest inicjowany przez uruchomienie funkcji skryptu init() wejścia
  6. Gdy wdrożony model odbiera żądanie, run() funkcja obsługuje to żądanie

Główną różnicą w przypadku korzystania z wdrożenia lokalnego jest to, że obraz kontenera jest oparty na maszynie lokalnej, dlatego należy zainstalować platformę Docker na potrzeby wdrożenia lokalnego.

Zrozumienie tych kroków wysokiego poziomu powinno pomóc zrozumieć, gdzie występują błędy.

Pobieranie dzienników wdrażania

Pierwszym krokiem debugowania błędów jest pobranie dzienników wdrażania. Najpierw postępuj zgodnie z instrukcjami podanymi tutaj, aby nawiązać połączenie z obszarem roboczym.

DOTYCZY ROZSZERZENIA ML interfejsu wiersza polecenia platformy Azure w wersji 1

Aby pobrać dzienniki z wdrożonej usługi internetowej, wykonaj następujące czynności:

az ml service get-logs --verbose --workspace-name <my workspace name> --name <service name>

Lokalne debugowanie

Jeśli masz problemy podczas wdrażania modelu w usłudze ACI lub AKS, wdróż go jako lokalną usługę internetową. Korzystanie z lokalnej usługi internetowej ułatwia rozwiązywanie problemów. Aby rozwiązać problemy z wdrożeniem lokalnie, zobacz artykuł dotyczący lokalnego rozwiązywania problemów.

Serwer HTTP wnioskowania usługi Azure Machine Edukacja

Lokalny serwer wnioskowania umożliwia szybkie debugowanie skryptu wejścia (score.py). Jeśli podstawowy skrypt oceny zawiera usterkę, serwer nie może zainicjować lub obsłużyć modelu. Zamiast tego zgłasza wyjątek i lokalizację, w której wystąpiły problemy. Dowiedz się więcej o usłudze Azure Machine Edukacja wnioskowaniu serwera HTTP

  1. azureml-inference-server-http Zainstaluj pakiet ze źródła danych pypi:

    python -m pip install azureml-inference-server-http
    
  2. Uruchom serwer i ustaw go score.py jako skrypt wpisu:

    azmlinfsrv --entry_script score.py
    
  3. Wyślij żądanie oceniania do serwera przy użyciu polecenia curl:

    curl -p 127.0.0.1:5001/score
    

Uwaga

Zapoznaj się z często zadawanymi pytaniami dotyczącymi serwera HTTP wnioskowania usługi Azure Machine Learning.

Nie można zaplanować kontenera

Podczas wdrażania usługi w docelowym obiekcie obliczeniowym usługi Azure Kubernetes Service usługa Azure Machine Edukacja próbuje zaplanować usługę z żądaną ilością zasobów. Jeśli w klastrze nie ma dostępnych węzłów z odpowiednią ilością zasobów po 5 minutach, wdrożenie zakończy się niepowodzeniem. Komunikat o błędzie to Couldn't Schedule because the kubernetes cluster didn't have available resources after trying for 00:05:00. Ten błąd można rozwiązać, dodając więcej węzłów, zmieniając jednostkę SKU węzłów lub zmieniając wymagania dotyczące zasobów usługi.

Komunikat o błędzie zazwyczaj wskazuje, którego zasobu potrzebujesz więcej — na przykład jeśli zostanie wyświetlony komunikat o błędzie wskazujący 0/3 nodes are available: 3 Insufficient nvidia.com/gpu , że oznacza to, że usługa wymaga procesorów GPU, a w klastrze znajdują się trzy węzły, które nie mają dostępnych procesorów GPU. Można to rozwiązać, dodając więcej węzłów, jeśli używasz jednostki SKU procesora GPU, przełączając się do jednostki SKU z obsługą procesora GPU, jeśli nie jesteś lub zmieniasz środowisko, aby nie wymagać procesorów GPU.

Niepowodzenie uruchamiania usługi

Po pomyślnym skompilaniu obrazu system próbuje uruchomić kontener przy użyciu konfiguracji wdrożenia. W ramach procesu uruchamiania kontenera funkcja init() w skrypcie oceniania jest wywoływana przez system. Jeśli w init() funkcji występują nieprzechwycone wyjątki, w komunikacie o błędzie może zostać wyświetlony błąd CrashLoopBackOff .

Użyj informacji w artykule Inspekcja dziennika platformy Docker.

Niepowodzenie uruchomienia kontenera azureml-fe-aci

Podczas wdrażania usługi w docelowym obiekcie obliczeniowym usługi Azure Container Instance usługa Azure Machine Edukacja próbuje utworzyć kontener frontonu o nazwie azureml-fe-aci żądania wnioskowania. W przypadku azureml-fe-aci awarii dzienniki można wyświetlić, uruchamiając polecenie az container logs --name MyContainerGroup --resource-group MyResourceGroup --subscription MySubscription --container-name azureml-fe-aci. Aby rozwiązać ten problem, możesz postępować zgodnie z komunikatem o błędzie w dziennikach.

Najczęstszym błędem jest azureml-fe-aci to, że podany certyfikat SSL lub klucz jest nieprawidłowy.

Funkcja kończy się niepowodzeniem: get_model_path()

Często w init() funkcji skryptu oceniania funkcja Model.get_model_path() jest wywoływana w celu zlokalizowania pliku modelu lub folderu plików modelu w kontenerze. Jeśli nie można odnaleźć pliku lub folderu modelu, funkcja zakończy się niepowodzeniem. Najprostszym sposobem debugowania tego błędu jest uruchomienie poniższego kodu języka Python w powłoce kontenera:

DOTYCZY: Zestaw SDK języka Python azureml w wersji 1

from azureml.core.model import Model
import logging
logging.basicConfig(level=logging.DEBUG)
print(Model.get_model_path(model_name='my-best-model'))

W tym przykładzie jest drukowana ścieżka lokalna (względna względem /var/azureml-app) w kontenerze, w którym skrypt oceniania oczekuje znalezienia pliku lub folderu modelu. Następnie możesz sprawdzić, czy plik lub folder jest rzeczywiście tam, gdzie ma być.

Ustawienie poziomu rejestrowania na DEBUG może spowodować zarejestrowanie dodatkowych informacji, co może być przydatne podczas identyfikowania awarii.

Funkcja kończy się niepowodzeniem: run(input_data)

Jeśli usługa została pomyślnie wdrożona, ale ulega awarii podczas publikowania danych w punkcie końcowym oceniania, możesz dodać instrukcję przechwytywania błędów w run(input_data) funkcji, aby zamiast tego zwracała szczegółowy komunikat o błędzie. Na przykład:

def run(input_data):
    try:
        data = json.loads(input_data)['data']
        data = np.array(data)
        result = model.predict(data)
        return json.dumps({"result": result.tolist()})
    except Exception as e:
        result = str(e)
        # return error message back to the client
        return json.dumps({"error": result})

Uwaga: Zwracanie komunikatów o błędach z run(input_data) wywołania powinno odbywać się tylko w celu debugowania. Ze względów bezpieczeństwa nie należy zwracać komunikatów o błędach w środowisku produkcyjnym.

Kod stanu HTTP 502

Kod stanu 502 wskazuje, że usługa zgłosiła wyjątek lub uległa awarii w run() metodzie pliku score.py. Skorzystaj z informacji w tym artykule, aby debugować plik.

Kod stanu HTTP 503

Wdrożenia usługi Azure Kubernetes Service obsługują skalowanie automatyczne, co umożliwia dodawanie replik do obsługi dodatkowego obciążenia. Autoskalator został zaprojektowany tak, aby obsługiwał stopniowe zmiany obciążenia. Jeśli otrzymujesz duże skoki liczby żądań na sekundę, klienci mogą otrzymać kod stanu HTTP 503. Mimo że narzędzie do skalowania automatycznego szybko reaguje, utworzenie większej liczby kontenerów zajmuje usłudze AKS znaczną ilość czasu.

Decyzje dotyczące skalowania w górę/w dół są oparte na wykorzystaniu bieżących replik kontenerów. Liczba replik zajętych (przetwarzanie żądania) podzielona przez łączną liczbę bieżących replik jest bieżącym wykorzystaniem. Jeśli ta liczba przekroczy autoscale_target_utilizationwartość , zostanie utworzonych więcej replik. Jeśli jest niższa, repliki zostaną zmniejszone. Decyzje dotyczące dodawania replik są chętne i szybkie (około 1 sekundy). Decyzje o usunięciu replik są konserwatywne (około 1 minuta). Domyślnie użycie docelowego skalowania automatycznego jest ustawione na 70%, co oznacza, że usługa może obsługiwać skoki liczby żądań na sekundę (RPS) do 30%.

Istnieją dwie rzeczy, które mogą pomóc zapobiec kodom stanu 503:

Napiwek

Te dwa podejścia mogą być używane pojedynczo lub w połączeniu.

  • Zmień poziom wykorzystania, na którym autoskalowanie tworzy nowe repliki. Wartość docelową wykorzystania można dostosować, ustawiając autoscale_target_utilization wartość na niższą.

    Ważne

    Ta zmiana nie powoduje szybszego tworzenia replik. Zamiast tego są one tworzone przy niższym progu wykorzystania. Zamiast czekać, aż usługa zostanie wykorzystana w 70%, zmiana wartości na 30% powoduje utworzenie replik w przypadku wystąpienia 30% użycia.

    Jeśli usługa sieci Web używa już bieżących maksymalnych replik i nadal widzisz kody stanu 503, zwiększ autoscale_max_replicas wartość, aby zwiększyć maksymalną liczbę replik.

  • Zmień minimalną liczbę replik. Zwiększenie minimalnej liczby replik zapewnia większą pulę do obsługi przychodzących skoków.

    Aby zwiększyć minimalną liczbę replik, ustaw autoscale_min_replicas wartość wyższą. Wymagane repliki można obliczyć przy użyciu następującego kodu, zastępując wartości wartościami specyficznymi dla projektu:

    from math import ceil
    # target requests per second
    targetRps = 20
    # time to process the request (in seconds)
    reqTime = 10
    # Maximum requests per container
    maxReqPerContainer = 1
    # target_utilization. 70% in this example
    targetUtilization = .7
    
    concurrentRequests = targetRps * reqTime / targetUtilization
    
    # Number of container replicas
    replicas = ceil(concurrentRequests / maxReqPerContainer)
    

    Uwaga

    Jeśli otrzymasz skoki żądań większe niż nowe minimalne repliki, może zostać ponownie odebrane 503. Na przykład w miarę wzrostu ruchu do usługi może być konieczne zwiększenie minimalnej liczby replik.

Aby uzyskać więcej informacji na temat ustawiania autoscale_target_utilizationparametrów , autoscale_max_replicasi autoscale_min_replicas dla, zobacz dokumentację modułu AksWebservice .

Kod stanu HTTP 504

Kod stanu 504 wskazuje, że upłynął limit czasu żądania. Domyślny limit czasu to 1 minuta.

Możesz zwiększyć limit czasu lub spróbować przyspieszyć usługę, modyfikując score.py w celu usunięcia niepotrzebnych wywołań. Jeśli te akcje nie rozwiążą problemu, skorzystaj z informacji w tym artykule, aby debugować plik score.py. Kod może być w stanie braku odpowiedzi lub nieskończonej pętli.

Inne komunikaty o błędach

Wykonaj następujące akcje dla następujących błędów:

Błąd Rozwiązanie
Błąd konfliktu 409 Gdy operacja jest już w toku, każda nowa operacja w tej samej usłudze internetowej odpowiada z błędem konfliktu 409. Jeśli na przykład operacja tworzenia lub aktualizowania usługi internetowej jest w toku, a po wyzwoleniu nowej operacji Usuwania zgłasza błąd.
Niepowodzenie kompilowania obrazów podczas wdrażania usługi internetowej Dodaj plik "pynacl==1.2.1" jako zależność pip do pliku Conda na potrzeby konfiguracji obrazu
['DaskOnBatch:context_managers.DaskOnBatch', 'setup.py']' died with <Signals.SIGKILL: 9> Zmień jednostkę SKU dla maszyn wirtualnych używanych we wdrożeniu na taką, która ma więcej pamięci.
Awaria FPGA Nie można wdrażać modeli na układach FPGA, dopóki nie zażądano i nie zostało zatwierdzone dla limitu przydziału FPGA. Aby zażądać dostępu, wypełnij formularz żądania przydziału: https://aka.ms/aml-real-time-ai

Zaawansowane debugowanie

Może być konieczne interaktywne debugowanie kodu Python zawartego we wdrożeniu modelu. Jeśli na przykład skrypt wpisu kończy się niepowodzeniem i przyczyną nie można określić dodatkowego rejestrowania. Za pomocą programu Visual Studio Code i debugpy można dołączyć go do kodu uruchomionego w kontenerze platformy Docker.

Aby uzyskać więcej informacji, odwiedź przewodnik interaktywnego debugowania w programie VS Code.

Forum użytkowników wdrażania modelu

Następne kroki

Dowiedz się więcej o wdrażaniu: