Sistemas de ML de produção: monitoramento de pipelines

Parabéns! Você implantou o modelo de unicórnio. Seu modelo precisa ser executado 24 horas por dia, 7 dias por semana, sem problemas. Para garantir isso, é preciso monitorar o pipeline de machine learning (ML).

Escrever um esquema de dados para validar dados brutos

Para monitorar seus dados, verifique continuamente se eles correspondem aos valores estatísticos esperados escrevendo regras que os dados precisam obedecer. Esse conjunto de regras é chamado de esquema de dados. Defina um esquema de dados seguindo estas etapas:

  1. Entenda o intervalo e a distribuição dos seus recursos. Para recursos categóricos, entenda o conjunto de valores possíveis.

  2. Codifique seu entendimento no esquema de dados. Confira alguns exemplos de regras:

    • Verifique se as classificações enviadas pelos usuários estão sempre no intervalo de 1 a 5.
    • Verifique se a palavra the aparece com mais frequência (para um recurso de texto em inglês).
    • Verifique se cada atributo categórico está definido como um valor de um conjunto fixo de valores possíveis.
  3. Teste seus dados com o esquema de dados. Seu esquema precisa detectar erros de dados, como:

    • Anomalias
    • Valores inesperados de variáveis categóricas
    • Distribuições de dados inesperadas

Criar testes de unidade para validar a engenharia de atributos

Embora seus dados brutos possam passar pelo esquema de dados, seu modelo não é treinado com dados brutos. Em vez disso, o modelo é treinado com dados que foram projetados com recursos. Por exemplo, o modelo é treinado com atributos numéricos normalizados em vez de dados numéricos brutos. Como os dados de engenharia de recursos podem ser muito diferentes dos dados de entrada brutos, é necessário verificar os dados de engenharia de recursos separadamente das verificações nos dados de entrada brutos.

Escreva testes de unidade com base no seu entendimento dos dados de engenharia de atributos. Por exemplo, é possível escrever testes de unidade para verificar condições como as seguintes:

  • Todos os atributos numéricos são dimensionados, por exemplo, entre 0 e 1.
  • Os vetores com codificação one-hot contêm apenas um 1 e N-1 zeros.
  • As distribuições de dados após a transformação estão de acordo com as expectativas. Por exemplo, se você normalizou usando escores Z, a média deles deve ser 0.
  • Outliers são processados, por exemplo, por escalonamento ou limitação.

Verificar importantes frações de dados das métricas

Um todo bem-sucedido às vezes obscurece um subconjunto sem sucesso. Em outras palavras, um modelo com ótimas métricas gerais ainda pode fazer previsões ruins para determinadas situações. Exemplo:

Seu modelo de unicórnio tem um bom desempenho geral, mas não funciona bem ao fazer previsões para o deserto do Saara.

Se você for o tipo de engenheiro satisfeito com uma ótima AUC geral, talvez não perceba os problemas do modelo no deserto do Saara. Se for importante fazer boas previsões para todas as regiões, você precisará acompanhar a performance de cada uma delas. Subconjuntos de dados, como o correspondente ao deserto do Saara, são chamados de segmentos de dados.

Identifique as segmentações de dados de interesse. Em seguida, compare as métricas do modelo para essas fatias de dados com as do conjunto de dados inteiro. Verificar se o modelo tem um bom desempenho em todas as divisões de dados ajuda a remover o viés. Para mais informações, consulte Justiça: avaliação de viés.

Usar métricas do mundo real

As métricas do modelo não medem necessariamente o impacto dele no mundo real. Por exemplo, mudar um hiperparâmetro pode aumentar a AUC de um modelo, mas como isso afetou a experiência do usuário? Para medir o impacto no mundo real, é necessário definir métricas separadas. Por exemplo, você pode pesquisar os usuários do modelo para confirmar se eles realmente viram um unicórnio quando o modelo previu que isso aconteceria.

Verificar o desvio de treinamento e disponibilização

O desvio entre treinamento e disponibilização significa que os dados de entrada durante o treinamento são diferentes dos dados de entrada na disponibilização. A tabela a seguir descreve os dois tipos importantes de distorção:

Tipo Definição Exemplo Solução
Distorção de esquema Os dados de entrada de treinamento e disponibilização não estão em conformidade com o mesmo esquema. O formato ou a distribuição dos dados de exibição muda enquanto o modelo continua sendo treinado com dados antigos. Use o mesmo esquema para validar dados de treinamento e de serviço. Verifique separadamente as estatísticas não verificadas pelo esquema, como a fração de valores ausentes.
Distorção de atributos Os dados de engenharia são diferentes entre o treinamento e a disponibilização. O código de engenharia de recursos é diferente entre o treinamento e a disponibilização, produzindo dados de engenharia diferentes. Semelhante ao desvio de esquema, aplique as mesmas regras estatísticas aos dados de treinamento e de serviço. Acompanhe o número de recursos enviesados detectados e a proporção de exemplos enviesados por recurso.

As causas do desvio entre treinamento e disponibilização podem ser sutis. Sempre considere quais dados estão disponíveis para seu modelo no momento da previsão. Durante o treinamento, use apenas os recursos que estarão disponíveis na exibição.

Exercício: teste de conhecimentos

Imagine que você tenha uma loja on-line e queira prever quanto dinheiro vai ganhar em um determinado dia. Sua meta de ML é prever a receita diária usando o número de clientes como um atributo.

Qual problema você pode encontrar?
Clique aqui para conferir a resposta

Verificar vazamento de rótulos

O vazamento de rótulos significa que os rótulos de informações empíricas que você está tentando prever entraram inadvertidamente nos seus atributos de treinamento. Às vezes, é muito difícil detectar o vazamento de rótulos.

Exercício: teste de conhecimentos

Suponha que você crie um modelo de classificação binária para prever se um novo paciente de hospital tem câncer. Seu modelo usa recursos como:

  • Idade do paciente
  • Gênero do paciente
  • Condições médicas anteriores
  • Nome do hospital
  • Sinais vitais
  • Resultados do teste
  • Hereditariedade

O rótulo é este:

  • Booleano: o paciente tem câncer?

Você particiona os dados com cuidado, garantindo que o conjunto de treinamento esteja bem isolado dos conjuntos de validação e de teste. O modelo tem um desempenho muito bom nos conjuntos de validação e teste, e as métricas são fantásticas. Infelizmente, o modelo tem um desempenho péssimo com novos pacientes no mundo real.

Por que esse modelo, que se destacou no conjunto de teste, falhou miseravelmente no mundo real?
Clique aqui para conferir a resposta

Monitorar a idade do modelo em todo o pipeline

Se os dados de veiculação evoluírem com o tempo, mas o modelo não for treinado novamente com regularidade, a qualidade dele vai diminuir. Acompanhe o tempo desde que o modelo foi retreinado com novos dados e defina uma idade mínima para alertas. Além de monitorar a idade do modelo na disponibilização, é importante monitorar a idade do modelo em todo o pipeline para detectar paralisações.

Teste se os pesos e as saídas do modelo são numericamente estáveis.

Durante o treinamento do modelo, os pesos e as saídas da camada não podem ser NaN (não um número) ou Inf (infinito). Escreva testes para verificar valores NaN e Inf de seus pesos e saídas de camada. Além disso, teste se mais da metade das saídas de uma camada não é zero.

Monitorar a performance do modelo

Seu preditor de aparição de unicórnios fez mais sucesso do que o esperado! Você está recebendo muitas solicitações de previsão e ainda mais dados de treinamento. Você acha isso ótimo até perceber que seu modelo está consumindo cada vez mais memória e tempo para ser treinado. Você decide monitorar a performance do modelo seguindo estas etapas:

  • Acompanhe o desempenho do modelo por versões de código, modelo e dados. Esse rastreamento permite identificar a causa exata de qualquer degradação de desempenho.
  • Teste as etapas de treinamento por segundo de uma nova versão do modelo em comparação com a versão anterior e com um limite fixo.
  • Detecte vazamentos de memória definindo um limite para o uso de memória.
  • Monitore os tempos de resposta da API e acompanhe os percentis deles. Embora os tempos de resposta da API possam estar fora do seu controle, respostas lentas podem causar métricas ruins no mundo real.
  • Monitore o número de consultas respondidas por segundo.

Testar a qualidade do modelo ativo nos dados veiculados

Você validou seu modelo. Mas e se cenários do mundo real, como o comportamento de unicórnios, mudarem depois da gravação dos dados de validação? A qualidade do modelo veiculado vai diminuir. No entanto, é difícil testar a qualidade na veiculação porque os dados do mundo real nem sempre são rotulados. Se os dados de veiculação não estiverem rotulados, considere estes testes:

  • Gerar rótulos usando avaliadores humanos.

  • Investigue modelos que mostram um viés estatístico significativo nas previsões. Consulte Classificação: viés de previsão.

  • Rastreie métricas reais para seu modelo. Por exemplo, se você estiver classificando spam, compare suas previsões com o spam denunciado pelos usuários.

  • Reduza a possível divergência entre os dados de treinamento e de disponibilização veiculando uma nova versão do modelo em uma fração das suas consultas. À medida que você valida o novo modelo de disponibilização, mude gradualmente todas as consultas para a nova versão.

Ao usar esses testes, monitore a degradação repentina e lenta na qualidade da previsão.

Aleatório

Torne seu pipeline de geração de dados reproduzível. Digamos que você queira adicionar um recurso para ver como ele afeta a qualidade do modelo. Para um experimento justo, seus conjuntos de dados precisam ser idênticos, exceto por esse novo recurso. Nesse sentido, verifique se qualquer randomização na geração de dados pode ser feita de forma determinista:

  • Inicialize seus geradores de números aleatórios (RNGs). A inclusão de sementes garante que o RNG gere os mesmos valores na mesma ordem sempre que você o executa, recriando seu conjunto de dados.
  • Use chaves de hash invariantes. O hashing é uma maneira comum de dividir ou amostrar dados. É possível fazer hash de cada exemplo e usar o número inteiro resultante para decidir em qual divisão colocar o exemplo. As entradas da função de hash não podem mudar a cada execução do programa de geração de dados. Não use o horário atual ou um número aleatório no hash, por exemplo, se quiser recriar os hashes sob demanda.

As abordagens anteriores se aplicam tanto à amostragem quanto à divisão dos dados.

Considerações sobre hash

Imagine novamente que você estava coletando consultas de pesquisa e usando hash para incluir ou excluir consultas. Se a chave de hash usou apenas a consulta, em vários dias de dados, você vai sempre incluir ou sempre excluir essa consulta. Incluir ou excluir sempre uma consulta é ruim porque:

  • Seu conjunto de treinamento vai receber um conjunto menos diversificado de consultas.
  • Seus conjuntos de avaliação serão artificialmente difíceis porque não vão se sobrepor aos dados de treinamento. Na realidade, no momento da veiculação, você já terá visto parte do tráfego ativo nos dados de treinamento, então sua avaliação precisa refletir isso.

Em vez disso, você pode fazer hash na consulta + data da consulta, o que resultaria em um hash diferente para cada dia.

Figura 7. Visualização animada mostrando como o hash somente na consulta faz com que os dados entrem no mesmo bucket todos os dias, mas o hash na consulta mais o tempo da consulta faz com que os dados entrem em buckets diferentes todos os dias. Os três grupos são "Treinamento", "Avaliação" e "Ignorado".
Figura 7. Hash na consulta x hash na consulta + data da consulta.