Lerner – usando agentes RL para agendamento de casos de teste

Blog da Tecnologia Netflix em Netflix TechBlog Segue 22 de maio · 8 min ler

Por: Stanislav Kirdey , Kevin Cureton , Rick Scott , Sankar Ramanathan

Introdução

A Netflix traz experiências agradáveis aos clientes para residências em diversos dispositivos que continuam a crescer a cada dia. O ecossistema de dispositivos é rico em parceiros que vão desde fabricantes de SoC (Silicon-on-Chip), fabricantes de design original (ODM) e fabricantes de equipamentos originais (OEM).

Parceiros em todo o mundo utilizam o processo de certificação de dispositivos da Netflix continuamente para garantir que produtos e experiências de qualidade sejam entregues aos seus clientes. O processo de certificação envolve a verificação da implementação dos recursos fornecidos pelo SDK da Netflix pelo parceiro.

A organização do ecossistema de dispositivos parceiros da Netflix é responsável por garantir a integração e o teste bem-sucedidos do aplicativo Netflix em todos os dispositivos parceiros. Os engenheiros da Netflix realizam uma série de testes e benchmarks para validar o dispositivo em várias dimensões, incluindo a compatibilidade do dispositivo com o SDK da Netflix, desempenho do dispositivo, qualidade de reprodução de áudio e vídeo, manipulação de licenças, criptografia e segurança. Tudo isso leva a uma infinidade de casos de teste, a maioria deles automatizados, que precisam ser executados para validar a funcionalidade de um dispositivo que executa o Netflix.

Problema

Com uma coleção de testes que, por natureza, consomem tempo para serem executados e, às vezes, exigem intervenção manual, precisamos priorizar e programar execuções de teste de forma a agilizar a detecção de falhas de teste. Existem vários problemas que um agendamento de teste eficiente pode nos ajudar a resolver:

  1. Detecte rapidamente uma regressão na integração do Netflix SDK em um dispositivo eletrônico de consumo ou MVPD (distribuidor de programação de vídeo multicanal).
  2. Detecte uma regressão em um caso de teste. Usando o aplicativo de referência Netflix e os dispositivos de boa qualidade, assegure-se de que o caso de teste continue a funcionar e teste o que é esperado.
  3. Quando o código do qual muitos casos de teste dependem mudou, escolha os casos de teste certos entre milhares de testes afetados para validar rapidamente a alteração antes de cometer e executar testes extensos e caros.
  4. Escolha o subconjunto de testes mais promissor dentre os milhares de casos de teste disponíveis ao executar a integração contínua em um dispositivo.
  5. Recomende um conjunto de casos de teste para executar no dispositivo que aumentaria a probabilidade de falha do dispositivo em tempo real.

Resolver os problemas acima pode ajudar a Netflix e nossos parceiros a economizar tempo e dinheiro durante todo o ciclo de vida do projeto, construção, teste e certificação de dispositivos.

Esses problemas podem ser resolvidos de várias maneiras diferentes. Em nossa busca para ser objetivo, científico e alinhado com a filosofia da Netflix de usar dados para direcionar soluções para problemas intrigantes, prosseguimos alavancando o aprendizado de máquina.

Nossa inspiração foi a descoberta em um artigo de pesquisa “ Aprendizado por reforço para priorização e seleção de casos de teste automático em integração contínua ”, de Helge Spieker, et. al. Pensamos que o aprendizado por reforço seria uma abordagem promissora que poderia fornecer grande flexibilidade no processo de treinamento. Da mesma forma, tem requisitos muito baixos sobre a quantidade inicial de dados de treinamento.

No caso de testar continuamente uma integração do Netflix SDK em um novo dispositivo, geralmente não temos dados relevantes para o treinamento do modelo nas fases iniciais da integração. Nessa situação, o treinamento de um agente é um ótimo ajuste, pois permite iniciar com muito poucos dados de entrada e permitir que o agente explore e explore os padrões que aprende no processo de integração e teste de regressão do SDK. O agente no aprendizado por reforço é uma entidade que toma uma decisão sobre qual ação tomar, considerando o estado atual do ambiente, e obtém uma recompensa baseada na qualidade da ação.

Solução

Criamos um sistema chamado Lerner que consiste em um conjunto de microsserviços e uma biblioteca python que permite o treinamento escalável de agentes e a inferência para o agendamento de casos de teste. Também fornecemos um cliente de API no Python.

A Lerner trabalha em conjunto com nossa estrutura de integração contínua que executa testes no dispositivo usando a plataforma Netflix Test Studio . Os testes são executados em aplicativos de referência da Netflix (sendo executados como contêineres no Titus ), bem como em dispositivos físicos.

Houve várias motivações que levaram à criação de uma solução personalizada:

  1. Queríamos manter as APIs e integrações o mais simples possível.
  2. Precisávamos de uma maneira de executar agentes e vincular as execuções à infraestrutura interna para análises, relatórios e visualizações.
  3. Queríamos que a ferramenta to estivesse disponível como uma biblioteca independente, bem como serviço de API escalonável.

A Lerner fornece a capacidade de configurar qualquer número de agentes, tornando-se o primeiro componente em nossa estrutura de aprendizado de reforço reutilizável para certificação de dispositivos.

O Lerner, como um serviço da Web, conta com o Amazon Web Services (AWS) e as ferramentas Open Source Software (OSS) da Netflix. Usamos o Spinnaker para implantar instâncias e hospedar os contêineres da API no Titus, o que permite tempos de implantação mais rápidos e escalabilidade rápida. A Lerner usa serviços da AWS para armazenar versões binárias dos agentes, configurações de agentes e dados de treinamento. Para manter a qualidade das APIs da Lerner, estamos usando o paradigma sem servidor para o teste de integração da Lerner utilizando o AWS Lambda .

A biblioteca de treinamento de agentes é escrita em Python e suporta as versões 2.7, 3.5, 3.6 e 3.7. A biblioteca está disponível no repositório artifactory para facilitar a instalação. Ele pode ser usado em notebooks Python – permitindo uma rápida experimentação em ambientes isolados sem a necessidade de realizar chamadas de API. A biblioteca de treinamento de agentes expõe diferentes tipos de agentes de aprendizado que utilizam redes neurais para aproximar a ação.

O agente baseado em rede neural (NN) usa uma rede profunda com camadas totalmente conectadas. O NN obtém o estado de um determinado caso de teste (a entrada) e gera um valor contínuo, em que um número maior significa uma posição anterior em um cronograma de execução de teste. As entradas para a rede neural incluem: características históricas gerais, como as últimas N execuções e vários recursos específicos do domínio, que fornecem informações meta sobre um caso de teste.

As APIs do Lerner são divididas em três áreas:

  1. Armazenando resultados de execução.
  2. Obtendo recomendações com base no estado atual do ambiente.
  3. Atribuir recompensa ao agente com base no resultado da execução e nas recomendações previstas.

Um processo de obter recomendações e recompensar o agente usando APIs consiste em 4 etapas:

  1. Fora de todos os casos de teste disponíveis para um trabalho específico – forme um pedido que possa ser interpretado por Lerner. Isso envolve a agregação de resultados históricos e recursos adicionais.
  2. Lerner retorna uma recomendação identificada com um ID de episódio exclusivo.
  3. Um sistema de CI pode executar a recomendação e enviar os resultados da execução para Lerner com base no ID do episódio.
  4. Chame uma API para atribuir uma recompensa com base no ID do agente e no ID do episódio.

Abaixo está um diagrama das camadas de serviços e persistência que suportam a funcionalidade da API do Lerner.

A natureza de autoatendimento da ferramenta facilita a integração dos proprietários de serviços com a Lerner, cria agentes, solicita recomendações aos agentes e os recompensa após a disponibilidade dos resultados da execução.

As métricas relevantes para o processo de treinamento e recomendação são relatadas ao Atlas e visualizadas usando o Lumen da Netflix. Os usuários do serviço podem rastrear as estatísticas específicas dos agentes que eles configuram e implantam, o que permite que eles criem seus próprios painéis.

Identificamos alguns padrões interessantes ao fazer o aprendizado de reforço on-line.

  • O ciclo de recompensa de recomendação / execução pode acontecer sem quaisquer dados de treinamento anteriores.
  • Podemos inicializar vários jobs de IC que usariam agentes com diferentes funções de recompensa e obter uma percepção adicional com base no desempenho dos agentes. Isso pode nos ajudar a projetar e implementar funções de recompensa mais direcionadas.
  • Podemos manter uma pequena quantidade de dados históricos para treinar agentes. Os dados podem ser truncados após cada execução e transferidos para um armazenamento de longo prazo para análise posterior.

Algumas das desvantagens:

  • Pode levar algum tempo para um agente parar de explorar e começar a explorar a experiência acumulada.
  • Como agentes armazenados em um formato binário no banco de dados, uma atualização de um agente de várias tarefas poderia causar uma condição de corrida em seu estado. Lidar com a simultaneidade no processo de treinamento é complicado e requer negociações. Conseguimos o estado desejado contando com os mecanismos de bloqueio da camada de persistência subjacente que armazena e serve os binários dos agentes.

Assim, temos o luxo de treinar tantos agentes quanto desejamos que possam priorizar e recomendar casos de teste com base em suas experiências de aprendizado únicas.

Resultado

No momento, estamos testando o sistema e temos agentes ativos exibindo previsões para várias execuções de IC. No momento, executamos CIs baseados em Lerner em paralelo com CIs que executam casos de teste em ordem aleatória ou usam heurística simples como classificação de casos de teste por tempo e executam tudo o que falhou anteriormente.

O sistema foi criado com simplicidade e desempenho em mente, portanto, o conjunto de APIs é mínimo. Desenvolvemos bibliotecas de clientes que permitem uma integração perfeita, mas com opinião, com a Lerner.

Coletamos várias métricas para avaliar o desempenho de uma recomendação, com as principais métricas sendo o tempo necessário para a primeira falha e o tempo necessário para concluir uma execução planejada inteira.

As recomendações baseadas em Lerner provam ser diferentes e mais perspicazes do que as execuções aleatórias, pois permitem ajustar um orçamento de tempo específico e detectar padrões como casos que tendem a falhar juntos em um cluster, casos que não foram executados em um cluster. muito tempo, e assim por diante.

Os gráficos abaixo mostram mais ou menos um caso artificial quando um cronograma de mais de 100 casos de teste continha vários testes escamosos. O eixo Y representa quantos minutos foram necessários para concluir o agendamento ou atingir um primeiro caso de teste com falha. Em azul, temos recomendações aleatórias sem restrições orçamentárias de tempo. Em verde, você pode ver execuções com base nas recomendações de Lerner com uma restrição de tempo de 60 minutos. Os picos verdes representam Lerner explorando o ambiente, onde as linhas curvas em torno de 0 são as execuções que falharam rapidamente quando Lerner estava explorando sua política.

Execução de agendamentos que foram gerados aleatoriamente. O eixo Y representa o tempo para concluir a execução ou alcançar a primeira falha. Execução de cronogramas baseados em Lerner. Você pode ver momentos em que Lerner estava explorando o ambiente, e as linhas onduladas representam quando o cronograma foi gerado com base na exploração do conhecimento existente.

Próximos passos

As próximas fases do projeto se concentrarão em:

  • Recompense as funções que estão cientes de um contexto de domínio abrangente, como atribuir recompensas apropriadas a estados em que a infraestrutura é frágil e o caso de teste não pode ser executado adequadamente.
  • Interface de usuário administrativa para gerenciar agentes.
  • Estrutura mais genérica, simples e fácil de usar para o aprendizado de reforço e a implantação de agentes.
  • Usando o Lerner em todos os jobs de ICs disponíveis em todas as versões do SDK.
  • Experimentar diferentes arquiteturas de redes neurais.

Se você gostaria de fazer parte do nosso time, venha se juntar a nós.

Texto original em inglês.