O artigo foi escrito por Rakshith Vasudev e John Lockmanm – Laboratório de inovação em IA e HPC em outubro de 2019
Como mencionado anteriormente, o CheXNet é um modelo de assistente de radiologia de IA que usa o DenseNet para identificar até 14 patologias em uma imagem específica de raios X do tórax. Várias abordagens foram exploradas para ampliar o treinamento de um modelo que poderia ter um desempenho tão bom ou melhor do que o CheXNet-121 original. O ResNet-50 se mostrou promissor tanto em escalabilidade quanto em maior precisão de treinamento (AUROC positivo). Os autores demonstraram a escalabilidade em sistemas de CPU. No entanto, estamos interessados em explorar o paralelismo das GPUs para acelerar o processo de treinamento. Neste artigo, descrevemos as práticas recomendadas para obter o desempenho máximo em treinamento ampliado distribuído do CheXNet utilizando GPUs Nvidia V100 SXM2 em servidores Dell EMC C4140. O Dell EMC PowerEdge C4140 oferece densidade e desempenho com quatro GPUs Nvidia V100 na configuração SXM2.
Configuração do hardware: | Configuração do software: |
---|---|
|
|
À medida que novos dispositivos de computação (como GPUs e TPUs) possibilitam o treinamento de redes neurais a uma taxa cada vez mais rápida, o processamento da CPU está propenso a se tornar o gargalo. A API tf.data fornece aos usuários componentes básicos para projetar pipelines de entrada que utilizam efetivamente a CPU, otimizando cada etapa do processo ETL.
Para executar uma etapa de treinamento, primeiro você deve extrair e transformar os dados de treinamento e, em seguida, inseri-los em um modelo em execução em um acelerador. No entanto, em uma implementação síncrona simples, enquanto a CPU está preparando os dados, o acelerador fica ocioso. Por outro lado, enquanto o acelerador está treinando o modelo, a CPU fica ociosa. O tempo da etapa de treinamento é, portanto, a soma do tempo de pré-processamento da CPU e do tempo de treinamento do acelerador
A criação do pipeline coincide com o pré-processamento e a execução do modelo de uma etapa de treinamento. Enquanto o acelerador está executando a etapa de treinamento N, a CPU está preparando os dados para a etapa N+1. Isso reduz ao máximo (em vez de aumentar) o tempo da etapa do treinamento e o tempo necessário para extrair e transformar os dados.
Sem a criação de pipeline, a CPU e a GPU/TPU ficam ociosas em grande parte do tempo:
Figura 1: A execução sequencial frequentemente deixa a GPU ociosa
Com a criação de pipeline, o tempo de inatividade diminui significativamente:
Figura 2: A criação do pipeline coincide com a utilização da CPU e da GPU, maximizando a utilização da GPU
A API tf.data fornece um mecanismo de criação de pipeline de software por meio da transformação tf.data.Dataset.prefetch, que pode ser usada para separar o momento em que os dados são produzidos do momento em que são consumidos. Especificamente, a transformação usa um thread de segundo plano e um buffer interno para pré-buscar elementos do conjunto de dados de entrada antes do momento em que eles são solicitados.
Você pode encontrar mais informações em: https://www.tensorflow.org/guide/performance/datasets
Ao seguir as diretrizes fornecidas pelo tensorflow, você pode obter um pipeline de dados semelhante a este (abordagem antiga):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py
Nesta abordagem, também conhecida como a abordagem antiga, o pipeline da tf data faz o seguinte (supondo que o conjunto de dados de raios X do tórax seja uma sequência de TFRecords):
No entanto, este não é o código mais eficaz. Ele causa paralisações e utilizações frequentes de 0% da gpu. Basicamente, ele não utiliza os aceleradores com eficiência.
Para configurar corretamente o pipeline da tf data, seguimos a abordagem adotada especificamente pelos modelos oficiais do tensorflow, a mesma do ResNet. A diferença entre a abordagem antiga e a nova é a forma como o pipeline de dados é configurado antes de ser inserido no modelo.
Veja como é a nova abordagem:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py
A abordagem de modelos oficial do TensorFlow, também conhecida como nova abordagem, é a seguinte:
Esta é uma comparação do desempenho das abordagens antiga e nova, usando os modelos TF oficiais.
Figura 3: Com a nova abordagem, é possível obter um dimensionamento quase linear.
Como pode-se perceber, há um impacto significativo no desempenho e não há nenhum dimensionamento com a abordagem antiga. As GPUs frequentemente são pouco utilizadas ou não são utilizadas, e o desempenho fica estagnado. Tornar a computação mais eficiente em uma GPU significa tornar a computação mais eficiente em várias GPUs em vários nós, se a comunicação for bem tratada.
Na nova abordagem, as CPUs realizam o pré-processamento paralelamente, pré-buscam os dados processados na memória e fazem o trabalho pesado de multiplicação de matriz com comunicação rápida. Isso torna essa nova abordagem mais atraente para ser utilizada em vários nós.
O ambiente que executa seus trabalhos é tão importante quanto seus trabalhos. Ter as bibliotecas e os módulos certos é importante, pois eles afetarão o desempenho do treinamento. Além disso, ter as bibliotecas mais recentes relacionadas ao CUDA pode ajudar a melhorar o desempenho.
Siga este tutorial de instalação, caso você não tenha um ambiente de trabalho definido.
MPI é uma biblioteca de comunicação que ajuda o horovod a distribuir trabalhos. Diferentes opções de parâmetros de vinculação e mapeamento foram exploradas e os melhores parâmetros para o C4140 foram o mapeamento por soquete. A configuração recomendada é a seguinte:mpirun --map-by socket -np x python pyfile.py --pyoptions
Se houver vários processos funcionando em uma GPU, eles podem competir por recursos de GPU, consumindo memória de GPU e deixando de incluir mais imagens por lote, isso faz com que o desempenho da GPU atinja o limite. O TensorFlow 1.13.1 foi considerado, mas ele apresentava algum tipo de falha. Ele estava iniciando mais de um processo por GPU.
Em resumo: