E quando é que o processamento paralelo acontece? No momento da atualização dos pesos; porque existem várias iterações, e uma iteração ainda atualiza todos os pesos e bias da rede neural.
Depois, na próxima iteração, todos os pesos e bias serão atualizados novamente, com base na nova quantidade de amostras de entrada que foi fornecida; ou seja, o tamanho do batch fornecido para a próxima iteração de treinamento.
Então, é esse momento onde ocorre a paralelização.
Paralelismo de uma rede neural
Se a nossa rede neural for pequena, e se temos um batch size pequeno, significa que cada iteração acontecerá com pequenas quantidades de variáveis e pequenas quantidades de valores.
Portanto, não é tão necessário um grande recurso computacional porque o paralelismo será pequeno e, talvez, haja muito mais etapas seriais do que paralelas; lembrando que o processo de uma rede neural não é 100% paralelizável. Não se pode paralelizar diferentes épocas de treinamento.
Por exemplo: a primeira época é totalmente diferente da última, porque cada época de treinamento possui pesos e bias em valores diferentes.
No momento em que uma atualização dos pesos acontece, aqueles pesos e bias ficam salvos e uma nova atualização ocorre; depois, esses pesos e bias são atualizados por um novo valor, aí uma nova iteração acontece.
Ou seja, se formos comparar diferentes épocas, os pesos e bias de uma rede neural estarão com diferentes valores: cada vez mais otimizados e mais calibrados para o nosso objetivo, aquilo que estamos treinando, o que queremos que a rede se especialize.
Não faz sentido pensar em paralelizar épocas: a primeira época está rodando ao mesmo tempo em que está rodando a última época. A décima época depende da nona, que depende da oitava, e assim por diante.
Existe um processamento serial no processo que acontece no treinamento da rede neural, e o processamento paralelo acontece na hora da atualização dos pesos: na hora que os pesos estão sendo atualizados, naquele momento estão sendo comparadas várias amostras.
O que pode ser paralelizado
Se lembrarmos do conceito de batch size, vemos que há uma amostra fornecida para rede, bem como um gabarito que servirá de referência; haverá também um erro associado à previsão que foi feita, aí calcula-se o gradiente da função de custo em relação a esse erro, para se atualizar os pesos.
Isso não será feito com uma amostra somente, mas considerando o erro nas várias amostras na mesma iteração, considerando-se o erro gerado e somando todas essas amostras para, aí, sim, com base nesse contexto, atualizar cada um dos pesos da rede neural para concluir uma iteração. Esse processo de uma iteração é paralelizável.
Podemos paralelizar as amostras, o erro gerado por todas elas e a soma que será feita depois, e a atualização dos pesos também. Tudo isso pode ser paralelizável, só que dentro de uma mesma iteração, porque depois que se faz a atualização dos pesos, a próxima iteração terá um processamento paralelo novamente.
Como o processamento paralelo acontece
O processamento paralelo ocorre em lotes que são assim definidos: a quantidade de recurso computacional que pode ser paralelizado vai depender do tamanho do batch size (tamanho do lote), quantas amostras irão rodar por vez, o tamanho dessas amostras que, por sua vez, vão definir, também, o tamanho da nossa rede neural.
Se cada amostra possui 784 variáveis, por exemplo, isto quer dizer que a nossa primeira camada da rede neural já terá 784 neurônios; ou seja, uma rede neural grande. Depois, se definirmos várias camadas ocultas com vários neurônios, isso também fará com que se tenha cada vez mais variáveis nessa rede neural e mais coisas para se atualizar em cada iteração!
Vamos pensar no paralelismo dessa forma: o que será paralelizável, a quantidade de variáveis – coisas que o tamanho da rede neural vai atualizar – e, também, a quantidade de amostras que vamos considerar em cada iteração.
Se o nosso batch size for muito grande, isto quer dizer que essa etapa de cada iteração terá que usar muito paralelismo e, se tivermos pouco recurso computacional, pode ser que o nosso treinamento fique bastante lento, principalmente se estivermos trabalhando com muitos dados (dataset com muitas variáveis).
No entanto, se nosso batch size for muito pequeno, talvez nem seja preciso paralelizar, sendo melhor usar uma CPU – por seu clock ser mais rápido – porque cada processo de paralelização será pequeno.
Então, se temos muitas iterações, talvez a velocidade do clock importe mais do que a quantidade de núcleos (que se refere à quantidade das operações em paralelo que poderemos fazer).
Afinal, quando utilizar GPU?
A ideia de quando uma GPU se torna útil, quando vamos precisar de uma, tem muito a ver com o tamanho do nosso dataset, quantas variáveis e amostras ele tem.
Porque a partir disso é que vamos definir o tamanho do nosso bath size e, sabendo o tamanho que será usado para o nosso batch, o tamanho do nosso dataset, e o tamanho da nossa rede neural, nós podemos pensar que vai demorar muito tempo se não tivermos nenhuma GPU; e trabalhando só com a CPU ela sofrerá e demorará muito para conseguir concluir todas as tarefas.
Nesse caso, há muita coisa que a CPU poderia paralelizar, porém, ela não terá condições porque ela mesma não tem recursos suficientes. Isso significa que há aplicações que são impossíveis de serem usadas com uma CPU? O conceito de impossível ou possível, na realidade, está totalmente limitado ao tempo.
Se você não tiver nenhuma GPU, poderá colocar estes algoritmos para rodar na sua CPU.
Isso poderá levar mais tempo pois, de repente, uma aplicação que será rodada em poucos minutos com auxílio de uma GPU, talvez demore horas sendo executada na sua CPU; o que não significa que não possa ser feito, mas que poderá levar mais tempo pelo fato de uma CPU não ter todo o recurso de paralelização de uma GPU.
Outro limitador também pode ser o tamanho da memória RAM do computador ou da memória VRAM da GPU.
Basicamente, é importante pensarmos que você pode começar fazendo suas aplicações, testando em CPU mesmo, ou assistindo aplicações em GPU e, depois, quando tiver condições, investir numa GPU para, então, rodar redes maiores e mais complexas, e assim extrair todo potencial de uma rede neural.
Deep Learning com GPU na prática
Para criar suas próprias redes neurais, utilizando CPU e GPU, confira nosso curso Redes Neurais, Deep Learning e Visão Computacional, onde abordamos, mesmo os conceitos mais complexos, de forma descomplicada e objetiva. Vamos do básico ao avançado, com explicações teóricas e muita prática.
Clique aqui para conferir todos os nossos cursos.
Leia também:
- Frameworks na prática das redes neurais
- O que é TensorFlow
- Seu primeiro código com Keras
- Introdução a Redes Neurais e Deep Learning
- Gradiente Descendente Estocástico
- Introdução a Redes Neurais Convolucionais
- Redes Neurais em Problemas de Regressão
- Visão Computacional e Processamento de Imagens
- Bibliotecas para processamento de imagens
- Detecção de Objetos
- Como funcionam as Redes Neurais Recorrentes
- Arquitetura de uma LSTM