paint-brush
Como orquestrar dados para pipelines de aprendizado de máquinapor@bin-fan
884 leituras
884 leituras

Como orquestrar dados para pipelines de aprendizado de máquina

por Bin Fan9m2023/05/30
Read on Terminal Reader

Muito longo; Para ler

Cargas de trabalho de aprendizado de máquina exigem infraestrutura eficiente para gerar resultados rápidos. O treinamento do modelo depende muito de grandes conjuntos de dados. Canalizar esses dados do armazenamento para o cluster de treinamento é a primeira etapa de qualquer fluxo de trabalho de ML. Este artigo discutirá uma nova solução para orquestrar dados para aprendizado de máquina de ponta a ponta.
featured image - Como orquestrar dados para pipelines de aprendizado de máquina
Bin Fan HackerNoon profile picture
0-item
1-item

A imagem principal deste artigo foi gerada peloAI Image Generator do HackerNoon por meio do prompt "robôs olhando para computadores"


Cargas de trabalho de aprendizado de máquina (ML) exigem infraestrutura eficiente para gerar resultados rápidos. O treinamento do modelo depende muito de grandes conjuntos de dados. Canalizar esses dados do armazenamento para o cluster de treinamento é a primeira etapa de qualquer fluxo de trabalho de ML, o que afeta significativamente a eficiência do treinamento do modelo.


Os engenheiros de plataforma de dados e IA há muito se preocupam com o gerenciamento de dados com estas questões em mente:

  • Acessibilidade de dados : como tornar os dados de treinamento acessíveis quando os dados abrangem várias fontes e os dados são armazenados remotamente?
  • Pipelining de dados : como gerenciar dados como um pipeline que fornece dados continuamente no fluxo de trabalho de treinamento sem esperar?
  • Desempenho e utilização da GPU: como obter baixa latência de metadados e alta taxa de transferência de dados para manter a GPU ocupada?


Este artigo discutirá uma nova solução para orquestrar dados para pipelines de aprendizado de máquina de ponta a ponta que abordam as questões acima. Descreverei desafios e armadilhas comuns, seguidos pela proposta de uma nova técnica, orquestração de dados, para otimizar o pipeline de dados para aprendizado de máquina.

Desafios de dados comuns do treinamento de modelo

Um pipeline de aprendizado de máquina de ponta a ponta é uma sequência de etapas, desde o pré-processamento e limpeza de dados até o treinamento do modelo e a inferência. O treinamento é a parte mais crucial e intensiva em recursos de todo o fluxo de trabalho.


O diagrama a seguir mostra um pipeline típico de ML. Começa com a coleta de dados, depois vem a preparação dos dados e, finalmente, o treinamento do modelo. Durante a fase de coleta de dados, normalmente os engenheiros de plataforma de dados levam um tempo significativo para tornar os dados acessíveis aos engenheiros de dados, que preparam os dados para os cientistas de dados criarem e iterarem modelos.


Durante a fase de treinamento, volumes de dados sem precedentes são processados para garantir a alimentação contínua de dados para as GPUs que geram modelos. É imperativo que os dados sejam gerenciados para suportar a complexidade do ML e sua arquitetura executável. No pipeline de dados, cada etapa apresenta seus próprios desafios técnicos.


Desafio de coleta de dados – os dados estão em toda parte

O treinamento se beneficia de grandes conjuntos de dados, por isso é crucial coletar dados de todas as fontes relevantes. Não é mais viável combinar todos os dados em uma fonte monolítica quando os dados residem em data lakes, data warehouses e armazenamentos de objetos, seja no local, na nuvem ou distribuídos em vários locais geográficos. Com silos de dados, o acesso remoto pela rede inevitavelmente causa latência. Como tornar os dados acessíveis mantendo o desempenho desejado é um desafio significativo.


Desafio de preparação de dados - preparação de dados serializados

A preparação de dados começa com a ingestão de dados da fase de coleta e inclui limpeza, ETL e transformação antes de fornecer dados para treinar o modelo. Se esta fase for considerada isoladamente, o pipeline de dados é serializado e o tempo extra é desperdiçado enquanto aguarda os dados preparados para o cluster de treinamento. Portanto, os engenheiros de plataforma devem descobrir como criar um pipeline de dados paralelizado e permitir o compartilhamento eficiente de dados e o armazenamento eficiente de resultados intermediários.


Desafio de treinamento de modelo – I/O limitado com GPU subutilizada

O treinamento do modelo requer o processamento de centenas de terabytes de dados, geralmente um grande número de pequenos arquivos, como imagens e arquivos de áudio. O treinamento envolve iterações que exigem que as épocas sejam executadas várias vezes, tornando o acesso frequente aos dados. É necessário manter a GPU ocupada alimentando-a constantemente com dados. Não é fácil otimizar a E/S e manter a taxa de transferência exigida pela GPU.

Abordagens tradicionais e armadilhas comuns

Antes de falar sobre diferentes soluções, vamos montar um cenário simplificado, conforme ilustrado no diagrama abaixo. Aqui, estamos treinando na nuvem usando um cluster de GPU com vários nós executando o TensorFlow como estrutura de ML. Os dados pré-processados são armazenados no Amazon S3. Em geral, existem duas abordagens para obter esses dados para o cluster de treinamento. Discutiremos isso a seguir.

Abordagem 1: dados duplicados no armazenamento local


Na primeira abordagem, todo o conjunto de dados é replicado do armazenamento remoto para o armazenamento local de cada servidor para treinamento, conforme mostrado a seguir. Portanto, a localidade dos dados é garantida e os trabalhos de treinamento leem a entrada do local em vez de recuperá-la do armazenamento remoto.


Do pipeline de dados e da perspectiva de I/O, essa abordagem fornece a taxa de transferência de I/O mais alta, pois todos os dados são locais. As GPUs serão mantidas ocupadas, exceto no início, pois o treinamento deve esperar que os dados sejam totalmente copiados do armazenamento de objetos para o cluster de treinamento.


No entanto, esta abordagem não é apropriada para todas as situações.


Primeiro, o conjunto de dados deve caber no armazenamento local agregado. À medida que o tamanho do conjunto de dados de entrada aumenta, o processo de cópia de dados se torna mais longo e mais propenso a erros, levando mais tempo com o desperdício de recursos da GPU.


Em segundo lugar, copiar uma grande quantidade de dados para cada máquina de treinamento cria uma pressão significativa no sistema de armazenamento e na rede. Em situações em que os dados de entrada mudam frequentemente, a sincronização de dados pode ser muito complexa.


Por fim, fazer cópias manualmente dos dados é demorado e sujeito a erros, pois é um desafio manter os dados no armazenamento em nuvem sincronizados com os dados de treinamento.


Abordagem 2: acessar diretamente o armazenamento em nuvem


Outra abordagem comum é conectar o treinamento com o conjunto de dados de destino diretamente no armazenamento remoto, conforme mostrado abaixo. Com essa abordagem, o tamanho do conjunto de dados não é um problema, como na solução anterior. Mas enfrenta vários novos desafios.


Primeiro, da perspectiva de I/O e pipeline, os dados são processados em série. Todas as operações de acesso a dados devem passar pela rede entre o armazenamento de objetos e o cluster de treinamento, tornando a E/S um gargalo. Como resultado, as GPUs gastam ciclos esperando enquanto a taxa de transferência de E/S é limitada pela rede.


Em segundo lugar, quando a escala de treinamento é grande, todos os nós de treinamento acessam simultaneamente o mesmo conjunto de dados do mesmo armazenamento remoto, adicionando uma enorme pressão ao sistema de armazenamento. O armazenamento provavelmente ficará congestionado devido ao acesso altamente simultâneo, resultando em baixa utilização da GPU.


Em terceiro lugar, se o conjunto de dados consistir em um grande número de pequenos arquivos, as solicitações de acesso a metadados serão responsáveis por uma grande parte das solicitações de dados. Como resultado, recuperar diretamente os metadados de um grande número de arquivos ou diretórios do armazenamento de objeto torna-se o gargalo de desempenho, bem como aumenta o custo da operação de metadados.

Abordagem recomendada – orquestre seus dados


Para enfrentar esses desafios e armadilhas, precisamos repensar as arquiteturas da plataforma de dados ao lidar com I/O no pipeline de aprendizado de máquina. Aqui, recomendo uma nova abordagem, a orquestração de dados, para acelerar o pipeline de ML de ponta a ponta. As tecnologias de orquestração de dados abstraem o acesso a dados em sistemas de armazenamento, virtualizam todos os dados e apresentam os dados por meio de APIs padronizadas e um namespace global para aplicativos orientados a dados.


Unifique silos de dados usando abstração

Em vez de copiar e mover dados, deixe-os onde estão, seja no local ou na nuvem. A orquestração de dados pode ajudar a abstrair os dados para criar uma exibição unificada. Isso reduzirá significativamente a complexidade na fase de coleta de dados.


Como a orquestração de dados já pode se integrar aos sistemas de armazenamento, as estruturas de aprendizado de máquina só precisam interagir com uma única plataforma de orquestração de dados para acessar os dados de qualquer armazenamento conectado. Como resultado, o treinamento pode ser feito em todos os dados de qualquer fonte, levando a uma melhor qualidade do modelo. Não há necessidade de mover manualmente os dados para uma fonte central. Todas as estruturas de computação, incluindo Spark, Presto, PyTorch e TensorFlow , podem acessar os dados sem se preocupar com sua localização.


Use cache distribuído para localidade de dados

Em vez de duplicar todo o conjunto de dados em cada máquina, recomendo implementar o cache distribuído, onde os dados podem ser distribuídos uniformemente pelo cluster. O cache distribuído é especialmente vantajoso quando o conjunto de dados de treinamento é muito maior do que a capacidade de armazenamento de um único nó. Também ajuda quando os dados são remotos porque os dados são armazenados em cache localmente. O treinamento de ML se torna mais rápido e econômico porque não há E/S de rede ao acessar os dados.


A figura acima mostra um armazenamento de objeto onde todos os dados de treinamento são armazenados e dois arquivos para representar o conjunto de dados (/path1/file1 e /path2/file2). Em vez de armazenar todos os blocos de arquivo em cada máquina de treinamento, os blocos serão distribuídos em várias máquinas. Para evitar a perda de dados e melhorar a simultaneidade de leitura, cada bloco pode ser armazenado em vários servidores simultaneamente.


Otimize o compartilhamento de dados no pipeline

Há um alto grau de sobreposição entre as leituras e gravações de dados realizadas por um trabalho de treinamento de ML, dentro e entre os trabalhos. O compartilhamento de dados pode garantir que todas as estruturas de computação tenham acesso a dados armazenados em cache anteriormente para cargas de trabalho de leitura e gravação para a próxima etapa. Por exemplo, se você usar Spark para ETL na etapa de preparação de dados, o compartilhamento de dados pode garantir que os dados de saída sejam armazenados em cache e disponíveis para estágios futuros. Por meio do compartilhamento de dados, todo o pipeline de dados obtém melhor desempenho de ponta a ponta.


Orquestre o pipeline de dados paralelizando o pré-carregamento, o cache e o treinamento de dados

Orquestramos o pipeline de dados implementando pré-carregamento e cache sob demanda. A figura abaixo mostra que o carregamento de dados da fonte com cache de dados pode ser feito em paralelo com a tarefa de treinamento real. Como resultado, o treinamento se beneficia da alta taxa de transferência de dados ao acessar dados sem a necessidade de esperar para armazenar em cache todos os dados antes do treinamento.


Embora haja alguma latência de E/S no início, o tempo de espera diminuirá porque os dados já estão carregados no cache. Por meio dessa abordagem, você pode sobrepor as etapas. O carregamento de dados do armazenamento de objetos para o cluster de treinamento, o armazenamento em cache, o carregamento de dados sob demanda no treinamento e o treinamento podem ser feitos em paralelo, acelerando bastante todo o processo.


Vamos comparar a nova abordagem recomendada com as duas abordagens tradicionais. Ao orquestrar os dados nas etapas de um pipeline de aprendizado de máquina, eliminamos a execução serial e as ineficiências associadas à medida que os dados fluem de um estágio para o outro. Isso, por sua vez, produzirá uma alta taxa de utilização da GPU.


Dados duplicados no armazenamento local

Acesse diretamente o armazenamento em nuvem

Orquestração de dados

Localidade dos dados


Sem limitação para o tamanho do conjunto de dados


Não há necessidade de copiar dados completos manualmente antes do treinamento

A consistência dos dados é garantida


A utilização da GPU é alta



Como orquestrar dados para suas cargas de trabalho de ML


Vamos usar o Alluxio como exemplo aqui para mostrar como usar a orquestração de dados. Novamente, usaremos o mesmo cenário simplificado. Para agendar trabalhos do TensorFlow, você pode usar Kubernetes ou usar serviços de nuvem pública.

O uso do Alluxio para orquestrar o aprendizado de máquina e o treinamento de aprendizado profundo normalmente consiste em três etapas:


  1. Implante o Alluxio no cluster de treinamento.
  2. Monte o Alluxio como uma pasta local para trabalhos de treinamento.
  3. Carregue dados de pastas locais (com suporte do Alluxio) usando um script de treinamento.


Os dados em diferentes sistemas de armazenamento podem ser acessados através do Alluxio imediatamente após a montagem e podem ser acessados de forma transparente através dos scripts de benchmark sem modificar o TensorFlow. Isso simplifica significativamente o desenvolvimento do aplicativo, que de outra forma precisaria da integração de cada sistema de armazenamento específico, bem como das configurações das credenciais.


Você pode seguir o guia aqui para executar o reconhecimento de imagem usando Alluxio com TensorFlow.


Como não existe uma abordagem única para todos, é melhor usar a orquestração de dados nos seguintes cenários:

  • Você precisa de treinamento distribuído.
  • Há uma grande quantidade de dados de treinamento (10 TB ou mais), especialmente se houver muitos arquivos pequenos e imagens nos dados de treinamento.
  • Seus recursos de GPU não estão suficientemente ocupados pela E/S da rede.
  • Seu pipeline usa muitas fontes de dados e várias estruturas de treinamento/computação.
  • O armazenamento subjacente precisa ser estável enquanto você lida com solicitações de treinamento adicionais.
  • O mesmo conjunto de dados é usado por vários nós ou tarefas de treinamento.


À medida que as técnicas de aprendizado de máquina continuam a evoluir e as estruturas executam tarefas mais complexas, nossos métodos para gerenciar o pipeline de dados também serão aprimorados. Ao estender a orquestração de dados para o pipeline de dados, você pode obter melhor eficiência e utilização de recursos para seu pipeline de treinamento de ponta a ponta.


Reimpresso com permissão. © IDG Communications, Inc., 2022. Todos os direitos reservados. https://www.infoworld.com/article/3651453/orchestrating-data-for-machine-learning-pipelines.html .