Solução de problemas

Encontrar a causa dos erros que surgem durante o treinamento do seu modelo ou receber previsões na nuvem pode ser difícil. Nesta página, descrevemos como detectar e depurar problemas ocorridos no IA Platform Prediction. Caso você detecte problemas com o framework de machine learning que está usando, leia a documentação pertinente.

Ferramenta de linha de comando

ERROR: (gcloud) Invalid choice: 'ai-platform'.

Esse erro significa que é preciso atualizar a gcloud. Para isso, execute o seguinte comando:

gcloud components update
ERROR: (gcloud) unrecognized arguments: --framework=SCIKIT_LEARN.

Esse erro significa que é preciso atualizar a gcloud. Para isso, execute o seguinte comando:

gcloud components update
ERROR: (gcloud) unrecognized arguments: --framework=XGBOOST.

Esse erro significa que é preciso atualizar a gcloud. Para isso, execute o seguinte comando:

gcloud components update
ERROR: (gcloud) Failed to load model: Could not load the model: /tmp/model/0001/model.pkl. '\x03'. (Error code: 0)

Esse erro significa que uma biblioteca incorreta foi usada para exportar o modelo. Para corrigir isso, exporte novamente o modelo usando a biblioteca correta. Por exemplo, exporte modelos no formato model.pkl com a biblioteca pickle e modelos no formato model.joblib com a biblioteca joblib.

ERROR: (gcloud.ai-platform.jobs.submit.prediction) argument --data-format: Invalid choice: 'json'.

Esse erro significa que você especificou json como valor da sinalização --data-format ao enviar um job de previsão em lote. Para usar o formato de dados JSON, você precisa fornecer text como o valor da sinalização --data-format.

Versões do Python

ERROR: Bad model detected with error: "Failed to load model: Could not load the
model: /tmp/model/0001/model.pkl. unsupported pickle protocol: 3. Please make
sure the model was exported using python 2. Otherwise, please specify the
correct 'python_version' parameter when deploying the model. Currently,
'python_version' accepts 2.7 and 3.5. (Error code: 0)"
Esse erro significa que um arquivo de modelo exportado com o Python 3 foi implantado em um recurso de versão do modelo do AI Platform Prediction com uma configuração do Python 2.7.

Para solucioná-lo:

  • crie um novo recurso de versão de modelo e defina 'python_version' como 3.5;
  • Implante o mesmo arquivo no novo recurso de versão do modelo.

Comando virtualenv não encontrado

Se você recebeu esse erro ao tentar ativar virtualenv, uma solução possível é adicionar o diretório contendo virtualenv à sua variável de ambiente $PATH. Quando essas variáveis são modificadas, você consegue usar os comandos do virtualenv sem digitar o caminho completo do arquivo.

Primeiro, instale virtualenv executando o seguinte comando:

pip install --user --upgrade virtualenv

O instalador solicita que você modifique a variável de ambiente $PATH e fornece o caminho para o script virtualenv. No macOS, isso é semelhante a /Users/[YOUR-USERNAME]/Library/Python/[YOUR-PYTHON-VERSION]/bin.

Abra o arquivo em que o shell carrega variáveis de ambiente. Normalmente, é ~/.bashrc ou ~/.bash_profile no macOS.

Adicione a seguinte linha, substituindo [VALUES-IN-BRACKETS] pelos valores apropriados:

export PATH=$PATH:/Users/[YOUR-USERNAME]/Library/Python/[YOUR-PYTHON-VERSION]/bin

Por fim, execute o seguinte comando para carregar .bashrc (ou .bash_profile):

source ~/.bashrc

Como usar registros de jobs

Um bom local para iniciar a solução de problemas é nos registros de jobs capturados pelo Cloud Logging.

Como gerar registros para os diferentes tipos de operação

A experiência de geração de registros varia de acordo com o tipo de operação, conforme mostrado nas seções a seguir.

Registros de previsão em lote

Todos os jobs de predição em lote são registrados.

Registros de predição on-line

As solicitações de previsão on-line não geram registros por padrão. É possível ativar o Cloud Logging ao criar o recurso do modelo:

gcloud

Inclua a sinalização --enable-logging ao executar gcloud ai-platform models create.

Python

Defina onlinePredictionLogging para True no recurso Modelque você usa em sua chamada para projects.models.create.

Como encontrar registros

Os registros dos jobs contêm todos os eventos para a operação, incluindo eventos de todos os processos no cluster durante o uso do treinamento distribuído. Caso esteja executando um job de treinamento distribuído, os registros de nível de jobs serão relatados para o processo do worker mestre. Normalmente, a primeira etapa para corrigir erros é examinar os registros desse processo, filtrando eventos registrados para outros processos em seu cluster. Os exemplos desta seção mostram essa filtragem.

É possível filtrar os registros na linha de comando ou na seção Cloud Logging do Console do Google Cloud. Nos dois casos, use estes valores de metadados no seu filtro conforme necessário:

Item de metadados Filtro para mostrar quando o item for...
resource.type igual a "cloud_ml_job";
resource.labels.job_id igual ao nome do job;
resource.labels.task_name igual a "master-replica-0" para ler apenas as entradas de registros para o worker mestre;
severity maior que ou igual a ERROR para ler apenas as entradas de registros correspondentes a condições de erro.

Linha de comando

Use gcloud beta logging read para gerar uma consulta que atenda às suas necessidades. Veja alguns exemplos:

Cada exemplo depende destas variáveis de ambiente:

PROJECT="my-project-name"
JOB="my_job_name"

Se preferir, insira no lugar o literal de string.

Para imprimir os registros do job na tela
gcloud ai-platform jobs stream-logs $JOB

Veja todas as opções para gcloud ai-platform jobs stream-logs.

Imprimir o registro do worker mestre na tela
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\""
Para imprimir apenas erros registrados do worker mestre na tela:
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\" and severity>=ERROR"

Os exemplos anteriores representam os casos mais comuns de filtragem dos registros do seu job de treinamento do AI Platform Prediction. O Cloud Logging fornece muitas opções eficientes de filtragem que podem ser usadas para refinar sua pesquisa. Essas opções são descritas detalhadamente na documentação de filtragem avançada.

Console

  1. Abra a página Jobs do AI Platform Prediction no Console do Cloud.

    Abrir jobs no Console do Cloud

  2. Selecione o job com falha na lista da página Jobs para ver os detalhes.

Lista de jobs do AI Platform Prediction com um job que falhou.

  1. Clique em Ver registros para abrir o Cloud Logging.

A página de detalhes de um job com falha.

É possível ir diretamente ao Cloud Logging, mas é necessário adicionar uma etapa para encontrar seu job:

  1. Expanda o seletor de recursos.
  2. Expanda o job do AI Platform Prediction na lista de recursos.
  3. Encontre o nome do job na lista job_id. Insira as primeiras letras do nome dele na caixa de pesquisa para restringir os jobs exibidos.
  4. Expanda a entrada do job e selecione master-replica-0 na lista de tarefas.

Todos os seletores de filtro de registro expandidos.

Como conseguir informações dos registros

Depois de encontrar o registro correto para o job e filtrá-lo para master-replica-0, é possível examinar os eventos registrados para encontrar a origem do problema. Use o procedimento de depuração padrão do Python e lembre-se:

  • Os eventos têm diversos níveis de gravidade. Faça a filtragem para ver apenas eventos de um determinado nível, por exemplo, erros ou erros e avisos.
  • Um problema que faz com que seu treinador saia com uma condição de erro irrecuperável (código de retorno > 0) é registrado como uma exceção precedida pelo stack trace:

Uma entrada de registro sem seções expandidas

  • Veja mais informações expandindo os objetos na mensagem JSON registrada (denotada por uma seta para a direita e com conteúdo listado como {...}). Por exemplo, é possível expandir jsonPayload para ver o stack trace em um formato mais legível do que é fornecido na descrição do erro principal:

Uma entrada de registro com seção de payload JSON expandida

  • Alguns erros mostram instâncias de erros passíveis de repetição. Em geral, eles não incluem rastreamento de pilha e são mais difíceis de diagnosticar.

Como aproveitar ao máximo a geração de registros

O serviço de treinamento do AI Platform Prediction registra automaticamente estes eventos:

  • Informações de status internas ao serviço.
  • Mensagens que o aplicativo do treinador envia para stderr.
  • Texto de saída que o aplicativo do treinador envia para o stdout.

Simplifique a solução de erros no aplicativo do treinador seguindo as práticas recomendadas de programação:

  • Envie mensagens significativas para stderr (com logging, por exemplo, em inglês).
  • Crie a exceção mais lógica e descritiva quando algo der errado.
  • Adicione strings descritivas aos objetos de exceção.

A documentação do Python (em inglês) fornece mais informações sobre exceções.

Como resolver problemas de previsões

Veja nesta seção alguns problemas comuns encontrados ao receber predições.

Como lidar com condições específicas para predição on-line

Nesta seção, você encontra orientações sobre algumas condições de erro de predição on-line conhecidas por afetarem alguns usuários.

Predições com longo período de conclusão (de 30 a 180 segundos)

A causa mais comum de uma predição on-line lenta é o escalonamento de nós de processamento a partir do zero. Caso o modelo tenha solicitações de predição regulares feitas em relação a ele, o sistema mantém um ou mais nós prontos para veicular as predições. Quando o modelo não veicula nenhuma predição durante um longo período de tempo, o serviço "diminui" para zero nós prontos. A próxima solicitação de predição depois dessa redução de escala levará muito mais tempo para retornar do que o habitual, porque o serviço tem que providenciar nós para lidar com isso.

Códigos de status HTTP

Quando ocorre um erro com uma solicitação de previsão on-line, geralmente você recebe um código de status HTTP do serviço. Estes são alguns dos códigos comumente encontrados e os respectivos significados no contexto da predição on-line:

429 - Memória insuficiente

O nó de processamento ficou sem memória durante a execução do modelo. Não há como aumentar a memória alocada para os nós de predição nesse momento. Tente estas alternativas para a execução do modelo:

  • Reduza o tamanho do modelo:
    • usando variáveis menos precisas;
    • quantificando os dados contínuos;
    • reduzindo o tamanho de outros recursos de entrada (usando tamanhos menores de vocabulário, por exemplo);
    • enviando a solicitação novamente com um lote menor de instâncias.
429 - Muitas solicitações pendentes

O modelo está recebendo mais solicitações do que consegue processar. Se você estiver usando o escalonamento automático, as solicitações serão recebidas com mais rapidez do que o suportado pelo sistema.

Com o escalonamento automático, tente reenviar solicitações com retirada exponencial. Com isso, o sistema ganha tempo para se ajustar.

429: cota

Seu projeto do Google Cloud Platform é limitado a 10.000 solicitações a cada 100 segundos, ou seja, cerca de 100 por segundo. Se você receber esse erro em picos temporários, tente novamente com a retirada exponencial para processar todas as solicitações a tempo. Se você receber esse código constantemente, solicite um aumento de cota. Consulte a página de cotas para saber mais.

503 - Nossos sistemas detectaram tráfego incomum a partir de sua rede de computadores

A incidência de solicitações recebidas pelo modelo a partir de um único IP é tão alta que o sistema suspeita de um ataque de negação de serviço. Pare de enviar solicitações por um minuto e retome o envio com uma frequência mais baixa.

500 - Não foi possível carregar o modelo

O sistema teve problemas para carregar o modelo. Siga estas etapas:

Erros de formatação nas solicitações de previsão

Todas estas mensagens têm a ver com sua entrada de previsão.

"Empty or malformed/invalid JSON in request body"
O serviço não conseguiu analisar a JSON na sua solicitação ou a solicitação está vazia. Verifique se a mensagem contém erros ou omissões que invalidem a JSON.
"Missing 'instances' field in request body"
O corpo da solicitação não segue o formato correto. Ele precisa ser um objeto JSON com uma chave única chamada "instances" que contém uma lista com todas as suas instâncias de entrada.
Erro de codificação JSON ao criar uma solicitação

Sua solicitação inclui dados codificados em base64, mas não no formato JSON apropriado. Cada string codificada em base64 precisa ser representada por um objeto com uma chave única chamada "b64". Exemplo:

  {"b64": "an_encoded_string"}

Outro erro de base64 ocorre quando você tem dados binários não codificados em base64. Codifique os dados e formate-os da seguinte maneira:

  {"b64": base64.b64encode(binary_data)}

Veja mais informações sobre como formatar e codificar dados binários.

A predição na nuvem demora mais do que no computador

A predição on-line é projetada para ser um serviço escalonável que atende rapidamente uma alta taxa de solicitações. O serviço é otimizado para o desempenho agregado em todas as solicitações de disponibilização. A ênfase na escalonabilidade leva a características de desempenho diferentes em comparação com a geração de um pequeno número de predições na sua máquina local.

A seguir