Rozwiązywanie problemów z wdrożeniem modelu zdalnegoTroubleshooting remote model deployment

Dowiedz się, jak rozwiązywać problemy i rozwiązywać te typowe błędy, które mogą wystąpić podczas wdrażania modelu w Azure Container Instances (ACI) i Azure Kubernetes Service (AKS) przy użyciu Azure Machine Learning.Learn how to troubleshoot and solve, or work around, common errors you may encounter when deploying a model to Azure Container Instances (ACI) and Azure Kubernetes Service (AKS) using Azure Machine Learning.

Uwaga

W przypadku wdrażania modelu w usłudze Azure Kubernetes Service (AKS) zaleca się włączenie Azure monitor dla tego klastra.If you are deploying a model to Azure Kubernetes Service (AKS), we advise you enable Azure Monitor for that cluster. Ułatwi to zrozumienie ogólnej kondycji klastra i użycia zasobów.This will help you understand overall cluster health and resource usage. Przydatne może być również znalezienie następujących zasobów:You might also find the following resources useful:

Jeśli próbujesz wdrożyć model w złej kondycji lub przeciążonym klastrze, oczekiwano problemów.If you are trying to deploy a model to an unhealthy or overloaded cluster, it is expected to experience issues. Jeśli potrzebujesz pomocy w rozwiązywaniu problemów z klastrem AKS, skontaktuj się z pomocą techniczną AKS.If you need help troubleshooting AKS cluster problems please contact AKS Support.

Wymagania wstępnePrerequisites

Kroki wdrażania modeli uczenia maszynowego w programie DockerSteps for Docker deployment of machine learning models

Po wdrożeniu modelu do obliczeń nielokalnych w Azure Machine Learning są wykonywane następujące czynności:When you deploy a model to non-local compute in Azure Machine Learning, the following things happen:

  1. Pliku dockerfile określony w obiekcie Environments w InferenceConfig jest wysyłany do chmury wraz z zawartością katalogu źródłowegoThe Dockerfile you specified in your Environments object in your InferenceConfig is sent to the cloud, along with the contents of your source directory
  2. Jeśli wcześniej skompilowany obraz nie jest dostępny w rejestrze kontenerów, nowy obraz platformy Docker zostanie skompilowany w chmurze i zapisany w domyślnym rejestrze kontenera obszaru roboczego.If a previously built image is not available in your container registry, a new Docker image is built in the cloud and stored in your workspace's default container registry.
  3. Obraz platformy Docker z rejestru kontenerów jest pobierany do obiektu docelowego obliczeń.The Docker image from your container registry is downloaded to your compute target.
  4. Domyślny magazyn obiektów BLOB obszaru roboczego jest instalowany w miejscu docelowym obliczeń, zapewniając dostęp do zarejestrowanych modeliYour workspace's default Blob store is mounted to your compute target, giving you access to registered models
  5. Serwer sieci Web jest inicjowany przez uruchomienie funkcji skryptu wejścia init()Your web server is initialized by running your entry script's init() function
  6. Gdy wdrożony model odbiera żądanie, run() funkcja obsługuje to żądanieWhen your deployed model receives a request, your run() function handles that request

Główną różnicą podczas korzystania z lokalnego wdrożenia jest to, że obraz kontenera jest zbudowany na komputerze lokalnym, co oznacza, że należy zainstalować platformę Docker na potrzeby lokalnego wdrożenia.The main difference when using a local deployment is that the container image is built on your local machine, which is why you need to have Docker installed for a local deployment.

Zrozumienie tych ogólnych kroków powinno ułatwić zrozumienie, gdzie występują błędy.Understanding these high-level steps should help you understand where errors are happening.

Pobierz dzienniki wdrożeniaGet deployment logs

Pierwszym krokiem w debugowaniu błędów jest pobieranie dzienników wdrożenia.The first step in debugging errors is to get your deployment logs. Najpierw postępuj zgodnie z instrukcjami w tym miejscu , aby połączyć się z obszarem roboczym.First, follow the instructions here to connect to your workspace.

Aby pobrać dzienniki ze wdrożonej usługi sieci Web, wykonaj następujące czynności:To get the logs from a deployed webservice, do:

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

Debuguj lokalnieDebug locally

Jeśli masz problemy podczas wdrażania modelu w programie ACI lub AKS, wdróż go jako lokalną usługę sieci Web.If you have problems when deploying a model to ACI or AKS, deploy it as a local web service. Korzystanie z lokalnej usługi internetowej ułatwia rozwiązywanie problemów.Using a local web service makes it easier to troubleshoot problems. Aby rozwiązać problem z wdrożeniem lokalnym, zobacz artykuł dotyczący rozwiązywania problemów lokalnych.To troubleshoot a deployment locally, see the local troubleshooting article.

Nie można zaplanować konteneraContainer cannot be scheduled

Podczas wdrażania usługi w docelowym elemencie obliczeniowym usługi Azure Kubernetes Service usługa Azure Machine Learning podejmie próbę zaplanowania usługi przy użyciu żądanej ilości zasobów.When deploying a service to an Azure Kubernetes Service compute target, Azure Machine Learning will attempt to schedule the service with the requested amount of resources. 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.If there are no nodes available in the cluster with the appropriate amount of resources after 5 minutes, the deployment will fail. Komunikat o błędzie to Couldn't Schedule because the kubernetes cluster didn't have available resources after trying for 00:05:00 .The failure message is 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.You can address this error by either adding more nodes, changing the SKU of your nodes, or changing the resource requirements of your service.

Komunikat o błędzie będzie zazwyczaj wskazywał zasób, którego potrzebujesz więcej — na przykład jeśli zostanie wyświetlony komunikat o błędzie informujący, że 0/3 nodes are available: 3 Insufficient nvidia.com/gpu usługa wymaga procesora GPU, a w klastrze istnieją trzy węzły, które nie mają dostępnych procesorów GPU.The error message will typically indicate which resource you need more of - for instance, if you see an error message indicating 0/3 nodes are available: 3 Insufficient nvidia.com/gpu that means that the service requires GPUs and there are three nodes in the cluster that do not have available GPUs. 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 włączoną obsługą procesora GPU, jeśli nie zmienisz środowiska, aby nie wymagały procesora GPU.This could be addressed by adding more nodes if you are using a GPU SKU, switching to a GPU enabled SKU if you are not or changing your environment to not require GPUs.

Uruchamianie usługi nie powiodło sięService launch fails

Po pomyślnym skompilowaniu obrazu system podejmie próbę uruchomienia kontenera przy użyciu konfiguracji wdrożenia.After the image is successfully built, the system attempts to start a container using your deployment configuration. W ramach procesu uruchamiania kontenera init() Funkcja w skrypcie oceniania jest wywoływana przez system.As part of container starting-up process, the init() function in your scoring script is invoked by the system. Jeśli w funkcji występują nieprzechwycone wyjątki init() , w komunikacie o błędzie może pojawić się błąd CrashLoopBackOff .If there are uncaught exceptions in the init() function, you might see CrashLoopBackOff error in the error message.

Skorzystaj z informacji znajdujących się w artykule Inspekcja dziennika platformy Docker .Use the info in the Inspect the Docker log article.

Niepowodzenie funkcji: get_model_path ()Function fails: get_model_path()

Często w init() funkcji w skrypcie oceniania funkcja model.get_model_path () jest wywoływana w celu zlokalizowania pliku modelu lub folderu plików modelu w kontenerze.Often, in the init() function in the scoring script, Model.get_model_path() function is called to locate a model file or a folder of model files in the container. Jeśli nie można znaleźć pliku lub folderu modelu, działanie funkcji kończy się niepowodzeniem.If the model file or folder cannot be found, the function fails. Najprostszym sposobem debugowania tego błędu jest uruchomienie poniższego kodu w języku Python w ramach powłoki kontenera:The easiest way to debug this error is to run the below Python code in the Container shell:

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

Ten przykład drukuje ścieżkę lokalną (względem /var/azureml-app ) w kontenerze, w którym skrypt oceniania oczekuje na znalezienie pliku lub folderu modelu.This example prints out the local path (relative to /var/azureml-app) in the container where your scoring script is expecting to find the model file or folder. Następnie można sprawdzić, czy plik lub folder jest naprawdę tam, gdzie jest oczekiwany.Then you can verify if the file or folder is indeed where it is expected to be.

Ustawienie poziomu rejestrowania na debugowanie może spowodować zarejestrowanie dodatkowych informacji, co może być przydatne podczas identyfikowania błędu.Setting the logging level to DEBUG may cause additional information to be logged, which may be useful in identifying the failure.

Niepowodzenie funkcji: Uruchom (input_data)Function fails: run(input_data)

Jeśli usługa została pomyślnie wdrożona, ale ulega awarii, gdy dane są ogłaszane w punkcie końcowym oceniania, można dodać instrukcję zwracającą błąd w run(input_data) funkcji tak, aby zamiast tego zwracała szczegółowy komunikat o błędzie.If the service is successfully deployed, but it crashes when you post data to the scoring endpoint, you can add error catching statement in your run(input_data) function so that it returns detailed error message instead. Na przykład:For example:

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 do celów debugowania.Note: Returning error messages from the run(input_data) call should be done for debugging purpose only. Ze względów bezpieczeństwa nie należy zwracać komunikatów o błędach w ten sposób w środowisku produkcyjnym.For security reasons, you should not return error messages this way in a production environment.

Kod stanu HTTP 502HTTP status code 502

Kod stanu 502 wskazuje, że usługa zgłosiła wyjątek lub uległa awarii w run() metodzie pliku Score.py.A 502 status code indicates that the service has thrown an exception or crashed in the run() method of the score.py file. Aby debugować plik, Skorzystaj z informacji w tym artykule.Use the information in this article to debug the file.

Kod stanu HTTP 503HTTP status code 503

Wdrożenia usługi Kubernetes platformy Azure obsługują Skalowanie automatyczne, co umożliwia dodawanie replik w celu obsługi dodatkowego obciążenia.Azure Kubernetes Service deployments support autoscaling, which allows replicas to be added to support additional load. Skalowanie automatyczne jest przeznaczone do obsługi stopniowych zmian obciążenia.The autoscaler is designed to handle gradual changes in load. Jeśli otrzymujesz duże liczby żądań na sekundę, klienci mogą otrzymać kod stanu HTTP 503.If you receive large spikes in requests per second, clients may receive an HTTP status code 503. Mimo że automatyczne skalowanie reaguje szybko, zajmie dużo czasu, aby utworzyć dodatkowe kontenery.Even though the autoscaler reacts quickly, it takes AKS a significant amount of time to create additional containers.

Decyzje dotyczące skalowania w górę/w dół opierają się na wykorzystaniu bieżących replik kontenerów.Decisions to scale up/down is based off of utilization of the current container replicas. Liczba replik, które są zajęte (przetwarzanie żądania) podzielona przez łączną liczbę bieżących replik jest bieżącym wykorzystaniem.The number of replicas that are busy (processing a request) divided by the total number of current replicas is the current utilization. Jeśli ta liczba przekroczy autoscale_target_utilization , zostanie utworzona więcej replik.If this number exceeds autoscale_target_utilization, then more replicas are created. Jeśli jest niższa, repliki są skracane.If it is lower, then replicas are reduced. Decyzje dotyczące dodawania replik to eager i Fast (około 1 s).Decisions to add replicas are eager and fast (around 1 second). Decyzje dotyczące usuwania replik są ostrożne (około 1 minutę).Decisions to remove replicas are conservative (around 1 minute). Domyślnie skalowanie użycia obiektów docelowych jest ustawione na 70%, co oznacza, że usługa może obsłużyć liczbę żądań na sekundę (RPS pliku) do 30%.By default, autoscaling target utilization is set to 70%, which means that the service can handle spikes in requests per second (RPS) of up to 30%.

Istnieją dwie rzeczy, które mogą pomóc w zapobieganiu kodów stanu 503:There are two things that can help prevent 503 status codes:

Porada

Te dwa podejścia mogą być używane pojedynczo lub w połączeniu.These two approaches can be used individually or in combination.

  • Zmień poziom wykorzystania, przy którym automatyczne skalowanie tworzy nowe repliki.Change the utilization level at which autoscaling creates new replicas. Cel wykorzystania można dostosować, ustawiając autoscale_target_utilization wartość na niższą.You can adjust the utilization target by setting the autoscale_target_utilization to a lower value.

    Ważne

    Ta zmiana nie powoduje szybszego tworzenia replik.This change does not cause replicas to be created faster. Zamiast tego są tworzone przy niższym progu wykorzystania.Instead, they are created at a lower utilization threshold. Zamiast czekać, aż usługa zostanie wykorzystana przez 70%, zmiana wartości na 30% powoduje utworzenie replik w przypadku wystąpienia 30%.Instead of waiting until the service is 70% utilized, changing the value to 30% causes replicas to be created when 30% utilization occurs.

    Jeśli usługa sieci Web już korzysta z bieżącej maksymalnej liczby replik i nadal widzisz 503 kodów stanu, zwiększ autoscale_max_replicas wartość, aby zwiększyć maksymalną liczbę replik.If the web service is already using the current max replicas and you are still seeing 503 status codes, increase the autoscale_max_replicas value to increase the maximum number of replicas.

  • Zmień minimalną liczbę replik.Change the minimum number of replicas. Zwiększenie minimalnych replik zapewnia większą pulę do obsługi przychodzących skoków.Increasing the minimum replicas provides a larger pool to handle the incoming spikes.

    Aby zwiększyć minimalną liczbę replik, ustaw autoscale_min_replicas wyższą wartość.To increase the minimum number of replicas, set autoscale_min_replicas to a higher value. Wymagane repliki można obliczyć przy użyciu następującego kodu, zastępując wartości wartościami charakterystycznymi dla projektu:You can calculate the required replicas by using the following code, replacing values with values specific to your project:

    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 odbierane są żądania większe niż w przypadku nowych replik minimalnych, może dojść do 503s.If you receive request spikes larger than the new minimum replicas can handle, you may receive 503s again. Na przykład w miarę wzrostu ruchu do usługi może być konieczne zwiększenie minimalnej liczby replik.For example, as traffic to your service increases, you may need to increase the minimum replicas.

Aby uzyskać więcej informacji na temat ustawiania autoscale_target_utilization , autoscale_max_replicas , i autoscale_min_replicas dla, zobacz odwołanie do modułu AksWebservice .For more information on setting autoscale_target_utilization, autoscale_max_replicas, and autoscale_min_replicas for, see the AksWebservice module reference.

Kod stanu HTTP 504HTTP status code 504

Kod stanu 504 wskazuje, że upłynął limit czasu żądania. Domyślny limit czasu wynosi 1 minutę.A 504 status code indicates that the request has timed out. The default timeout is 1 minute.

Można zwiększyć limit czasu lub spróbować przyspieszyć usługę, modyfikując score.py w celu usunięcia niepotrzebnych wywołań.You can increase the timeout or try to speed up the service by modifying the score.py to remove unnecessary calls. Jeśli te akcje nie rozrozwiązuje problemu, użyj informacji w tym artykule, aby debugować plik score.py.If these actions do not correct the problem, use the information in this article to debug the score.py file. Kod może być w stanie innym niż odpowiada lub nieskończona pętla.The code may be in a non-responsive state or an infinite loop.

Inne komunikaty o błędachOther error messages

Wykonaj następujące akcje dla następujących błędów:Take these actions for the following errors:

BłądError RozwiązanieResolution
Niepowodzenie kompilowania obrazu podczas wdrażania usługi sieci WebImage building failure when deploying web service Dodaj "pynacl = = 1.2.1" jako zależność PIP do pliku Conda na potrzeby konfiguracji obrazuAdd "pynacl==1.2.1" as a pip dependency to Conda file for image configuration
['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.Change the SKU for VMs used in your deployment to one that has more memory.
Niepowodzenie FPGAFPGA failure Nie będzie można wdrażać modeli w usłudze FPGA, dopóki nie zażądano i nie zatwierdzono do przydziału FPGA.You will not be able to deploy models on FPGAs until you have requested and been approved for FPGA quota. Aby zażądać dostępu, Wypełnij formularz żądania limitu przydziału: https://aka.ms/aml-real-time-aiTo request access, fill out the quota request form: https://aka.ms/aml-real-time-ai

Zaawansowane debugowanieAdvanced debugging

Może być konieczne interaktywne debugowanie kodu Python zawartego we wdrożeniu modelu.You may need to interactively debug the Python code contained in your model deployment. Na przykład, jeśli skrypt wejścia kończy się niepowodzeniem i powód nie może być określony przez dodatkowe rejestrowanie.For example, if the entry script is failing and the reason cannot be determined by additional logging. Za pomocą Visual Studio Code i debugpy można dołączyć do kodu działającego wewnątrz kontenera Docker.By using Visual Studio Code and the debugpy, you can attach to the code running inside the Docker container.

Aby uzyskać więcej informacji, zobacz interaktywny debugowanie w przewodniku vs Code.For more information, visit the interactive debugging in VS Code guide.

Forum użytkownika dotyczące wdrażania modeluModel deployment user forum

Następne krokiNext steps

Dowiedz się więcej o wdrażaniu:Learn more about deployment: