Vamos entender o que é uma GPU e um processamento paralelo, sua vantagem e importância no mundo das redes neurais e do deep learning, lembrando que as GPU’s ajudaram a potencializar e a levar a inteligência artificial para o patamar em que ela se encontra atualmente.
Inclusive, talvez as GPUs tenham sido as principais responsáveis por tirar a inteligência artificial do “Inverno da IA”, conseguindo catalisar e mostrar todas as aplicações e resultados práticos possíveis no ramo.
Procuraremos entender, de forma bem abrangente, o que é um processamento paralelo e como uma GPU funciona.
Três exemplos podem servir de ilustração para o processamento paralelo:
Processo Infinitamente Paralelizável
O primeiro seria imaginar a montagem de sanduíches para uma festa. Se houvesse uma única pessoa responsável por essa montagem, ela usaria uma fatia de pão e uma fatia de queijo por cima, depois um presunto, e mais acima uma segunda fatia de pão.
Isto seria feito de forma repetida, por essa mesma pessoa, muitas vezes, até que a totalidade necessária de sanduíches para a festa fosse concluída.
Se houvesse muitos convidados para essa festa, o ‘passo a passo’ de cada montagem seria repetido para cada sanduíche feito! Agora, essa pessoa poderia chamar outros para ajudarem na montagem dos sanduíches e, cada um faria o mesmo trabalho: pegaria uma fatia de pão e uma fatia de queijo por cima, depois um presunto, e mais acima uma segunda fatia de pão, até finalizarem cada sanduíche.
Assim, quanto mais pessoas ajudarem na montagem, mais rápida será a conclusão da tarefa. Este é um exemplo que poderíamos chamar de “infinitamente paralelizável”!
Processo Parcialmente Paralelizável
O segundo exemplo é o de uma sala que precisa ser varrida. Se uma pessoa só for varrê-la, o fará num certo tempo; enquanto se duas pessoas varrem a mesma sala o tempo da tarefa poderá ser bastante reduzido.
E, se houver uma boa organização do serviço e uma adequada distribuição do espaço a ser varrido, o tempo dispensado à tarefa poderá ser reduzido para a metade. Só que neste caso, a redução do tempo não será melhorada com o acréscimo de mais pessoas; isto porque o aumento do número de pessoas pode, na verdade, mais atrapalhar do que ajudar nesta situação!
Ou seja, o número de pessoas foi ótimo até determinado ponto da tarefa (até 3-4 pessoas ajudando, por exemplo) mas a partir daí, os muitos ajudantes não continuaram sendo favoráveis à adequada finalização do trabalho. Esse seria um tipo de processo paralelizável, mas só até certo ponto.
Processo Não Paralelizável
O terceiro cenário, mais extremo ainda, é onde não vai adiantar paralelizar, como no caso de uma cirurgia bem específica, pois o cirurgião não fará um melhor trabalho apenas acrescentando mais cirurgiões na sua execução.
O tempo despendido no processo não seria acelerado pelo aumento do número de cirurgiões, pois no caso de distribuição dos procedimentos cirúrgicos executáveis, cada médico teria que esperar o procedimento do outro para só, então, fazer a sua parte.
Uma coisa dependeria da outra de forma sequencial. Neste caso, não há necessidade do aumento do número de cirurgiões, pois isto não acelerará o processo e a execução do trabalho necessário.
É quase como aquele conceito: “uma mulher gera um bebê em 9 meses, mas 9 mulheres não geram um bebê em 1 mês“.
Esses são exemplos reais e bem práticos que mostram que algumas coisas podem ser totalmente paralelizáveis, outras podem até certo ponto, e outras, simplesmente, não o podem ser.
Processamento paralelo na programação
Na programação acontece a mesma coisa, e podemos citar alguns processos que são comumente conhecidos como sendo altamente paralelizáveis, como os pixels de uma tela.
A renderização de pixels pode ser totalmente paralelizável, pois um pixel não depende do outro; podemos executar essa função e ficar renderizando todos de forma paralela e independente.
Outro exemplo de processo usando programação que poderia ser facilmente paralelizável é quando vamos procurar uma palavra específica num texto.
Nesse caso, não precisamos procurar palavra por palavra de forma sequencial; podemos simplesmente ler todas as palavras ou frases de forma paralela e, assim, ver se encontramos aquela palavra no texto ou não.
Outro exemplo ainda seria testar possíveis combinações de aminoácidos para formar diferentes tipos de proteínas, pois cada teste de combinação pode ser feito de forma independente dos demais, não sendo necessário a forma sequencial.
GPU’s – Unidades de Processamento Gráfico
No mundo da ciência e da programação, há muita coisa que pode ser feita de forma paralela, e é por isso que as GPU’s – Unidades de Processamento Gráfico – são tão úteis. Elas fazem justamente isso: são especialistas em paralelizar processos.
Esta é a ideia de processamento paralelo, a qual precisamos ter em mente agora: a diferença disso comparado ao processamento serial.
As unidades de processamento gráfico – GPU – foram criadas originalmente para funções gráficas de pixels (telas e vídeos) e, depois, começaram a ser usadas para outros serviços.
Os games foram um dos ramos que estimularam muito a produção e o avanço tecnológico das GPU’s e, depois, em 2009, mais ou menos, essas unidades de processamento gráfico começaram a ser usadas massivamente, também, para o Deep Learning.
Hoje, se o nosso computador tem uma placa gráfica, nós temos os drivers que serão responsáveis por conectá-las e utilizá-las para a nossa aplicação.
Então, se temos uma GPU e um driver instalados, e rodamos um vídeo ou alguma aplicação que pode ser acelerada por uma GPU, o driver, automaticamente, reconhecerá a necessidade da aplicação, e usará a GPU para aquele processo.
Mas, também podemos usar e programar a GPU como quisermos, para paralelizar o nosso código; isto pensando em programação.
Para programá-las existem frameworks específicos – como o OpenACC e o OpenCL –, e, também, o mais comum e popular de todos – o Cuda –, que foi desenvolvido pela Nvídia.
Essa programação em Cuda pode ser feita usando a linguagem C e C++, mas para o desenvolvimento de inteligência artificial não será essa a melhor alternativa.
Isto porque temos outra forma de acessar nossa GPU para usar aplicações de deep learning, usando a biblioteca cuDNN que é a que contém códigos Cuda que a acessarão para aplicações em deep learning, e já estão integradas com frameworks como o TensorFlow, o Keras, que são largamente utilizados.
Isto facilita bastante a utilização direta da GPU para uma aplicação em deep learning, usando o cuDNN.
Utilizando uma GPU na prática
Em nosso curso de Redes Neurais, Deep Learning e Visão Computacional abordamos de maneira completa os conceitos necessários para utilização de GPU’s para deep learning, detalhando teoria e prática.
Nele você verá os temas mais quentes do Machine Learning e da Inteligência Artificial, de forma descomplicada e simples, com muita objetividade e didática.
Clique aqui e confira todos os nossos cursos. Temos opções gratuitas e completas, sempre com foco no aprendizado do aluno.
Leia também: