Solução de problemas

A tarefa de detectar a causa de erros que surgem durante o treinamento do seu modelo ou a realização de 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 relevante.

Ferramenta de linha de comando

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

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

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

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

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

Esse erro significa que é preciso atualizar o 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'. Código do erro: 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 do formato model.pkl com a biblioteca pickle e modelos do 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 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. Código do erro: 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 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 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 as variáveis de ambiente. Costuma ser ~/.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 o arquivo atualizado .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 Stackdriver 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

Por padrão, as solicitações de previsão on-line não geram registros. Ative o Stackdriver Logging ao criar o recurso do modelo:

gcloud

Inclua a sinalização --enable-logging ao executar gcloud ai-platform models create (em inglês).

Python

Defina onlinePredictionLogging como True no recurso Model que você usa na chamada para projects.models.create (links em inglês).

Como encontrar os registros

Os registros de jobs contêm todos os eventos referentes à operação, incluindo aqueles de todos os processos no cluster durante o uso do treinamento distribuído. Caso esteja executando um job de treinamento distribuído, os registros no nível de job serão relatados para o processo do worker mestre. Normalmente, a primeira etapa da solução de problemas é examinar os registros desse processo, filtrando eventos registrados de outros processos no cluster. Nos exemplos desta seção, mostramos essa filtragem.

É possível filtrar os registros da linha de comando ou na seção Stackdriver Logging do Console do Google Cloud. Nos dois casos, use estes valores de metadados no 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 registro referentes ao worker mestre;
severity maior ou igual a ERROR para ler apenas as entradas de registro 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 de jobs 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 Stackdriver Logging oferece muitas opções avançadas de filtragem para refinar a pesquisa. Essas opções estão descritas em detalhes 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 Stackdriver Logging.

Página de detalhes de um job com falha.

Também é possível acessar diretamente o Stackdriver Logging, mas há uma etapa extra 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, inserindo 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, examine os eventos registrados para descobrir a origem do problema. Use o procedimento de depuração padrão do Python e lembre-se do seguinte:

  • 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 o treinador saia com uma condição de erro irrecuperável (código de retorno > 0) é registrado como exceção precedida pelo rastreamento de pilha:

Uma entrada de registro sem seções expandidas

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

Uma entrada de registro com a 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 stdout.

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

  • Envie mensagens relevantes para stderr, por exemplo, com logging (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) apresenta mais informações sobre exceções.

Solução de problemas de previsões

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

Como lidar com condições específicas de previsão on-line

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

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

A causa mais comum de uma previsão on-line lenta é o escalonamento de nós de processamento a partir do zero. Caso o modelo receba solicitações de previsão regulares, o sistema manterá um ou mais nós prontos para exibi-las. Se o modelo não exibe nenhuma previsão há bastante tempo, o serviço "é reduzido" para zero nós prontos. A próxima solicitação de previsão depois dessa redução levará muito mais tempo para ser retornada do que o habitual, porque o serviço precisa provisionar nós para atender a essa situação.

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 mais encontrados e os respectivos significados no contexto da previsã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 previsão neste momento. Tente as seguintes alternativas para 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).
    • Envie 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 espera exponencial. Com isso, o sistema ganha tempo para se ajustar.

429: cota

O 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 a espera exponencial para processar todas as solicitações a tempo. Se você receber esse código constantemente, solicite um aumento da cota. Consulte a página de cotas para mais detalhes.

503: nossos sistemas detectaram tráfego incomum da sua rede de computadores

A incidência de solicitações recebidas pelo modelo 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:

  • Veja se o treinador está exportando o modelo certo.
  • Tente fazer uma previsão de teste com o comando gcloud ai-platform local predict (em inglês).
  • Exporte o modelo e tente novamente.

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

Todas estas mensagens estão relacionadas à sua entrada de previsão.

"Empty or malformed/invalid JSON in request body"
O serviço não conseguiu analisar o JSON na sua solicitação, ou a solicitação está vazia. Verifique se a mensagem contém erros ou omissões que invalidem o 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

A 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". Por 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 formatação e codificação de dados binários.

A previsão na nuvem demora mais do que no computador

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

A seguir