Desde a última década, temos visto as GPUs aparecerem com mais frequência em campos como HPC(High-Performance Computing) e o campo mais popular, ou seja, o jogo. As GPUs têm melhorado ano após ano e agora são capazes de fazer algumas coisas incrivelmente boas, mas nos últimos anos, estão chamando ainda mais atenção devido ao aprendizado profundo.

>

Como os modelos de aprendizado profundo passam uma grande quantidade de tempo em treinamento, mesmo as CPUs poderosas não eram eficientes o suficiente para lidar com muitas computações em um determinado momento e esta é a área onde as GPUs simplesmente superaram as CPUs devido ao seu paralelismo. Mas antes de mergulhar na profundidade permite primeiro entender algumas coisas sobre a GPU.

O que é a GPU?

Uma GPU ou ‘Graphics Processing Unit’ é uma mini versão de um computador inteiro, mas dedicada apenas a uma tarefa específica. É diferente de uma CPU que executa várias tarefas ao mesmo tempo. A GPU vem com seu próprio processador que é embutido em sua própria placa-mãe acoplado a v-ram ou video ram, e também um projeto térmico adequado para ventilação e resfriamento.

GPUs for Deep Learning

source(Gamers Nexus)

No termo ‘Graphics Processing Unit’, ‘Graphics’ refere-se à renderização de uma imagem em coordenadas especificadas em um espaço 2d ou 3d. Um viewport ou viewpoint é uma perspectiva do observador de olhar para um objeto, dependendo do tipo de projeção utilizada. Rasterização e Ray-tracing são algumas das formas de renderizar cenas 3d, ambos os conceitos se baseiam num tipo de projecção chamado projecção em perspectiva. O que é a projecção em perspectiva?

Em suma, é a forma como uma imagem é formada num plano de visão ou tela onde as linhas paralelas convergem para um ponto convergente chamado ‘centro de projecção’ também à medida que o objecto se afasta do ponto de vista que parece ser menor, exactamente como os nossos olhos retratam no mundo real e isto ajuda a compreender a profundidade também numa imagem, esta é a razão pela qual produz imagens realistas.

Mais GPUs também processam geometria complexa, vetores, fontes de luz ou iluminações, texturas, formas, etc. Como agora temos uma idéia básica sobre GPU, vamos entender porque ela é muito usada para aprendizado profundo.

Por que as GPUs são melhores para aprendizado profundo?

Uma das características mais admiradas de uma GPU é a capacidade de computar processos em paralelo. Este é o ponto onde o conceito de computação paralela entra em ação. Uma CPU em geral completa sua tarefa de forma sequencial. Uma CPU pode ser dividida em núcleos e cada núcleo ocupa uma tarefa de cada vez. Suponha que se uma CPU tiver 2 núcleos. Então dois processos de tarefas diferentes podem ser executados nesses dois núcleos, alcançando assim o multitarefa.

Mas ainda assim, esses processos são executados em série.

GPUs for Deep Learning
source(Sample Examples)

Isto não significa que as CPUs não sejam suficientemente boas. Na verdade, as CPUs são realmente boas em lidar com diferentes tarefas relacionadas a diferentes operações como manusear sistemas operacionais, entregar planilhas, reproduzir vídeos HD, extrair grandes arquivos zip, tudo ao mesmo tempo. Estas são algumas coisas que uma GPU simplesmente não pode fazer.

Onde está a diferença?

GPUs for Deep Learning
source(NVIDIA)

Como discutido anteriormente, uma CPU é dividida em vários núcleos para que eles possam assumir várias tarefas ao mesmo tempo, enquanto que a GPU terá centenas e milhares de núcleos, todos eles dedicados a uma única tarefa. Estes são cálculos simples que são realizados com mais frequência e são independentes uns dos outros. E ambos armazenam dados frequentemente necessários na respectiva memória cache, seguindo assim o princípio de ‘referência de localidade’.

>262626>>GPUs for Deep Learning
source(NVIDIA)

Existem muitos softwares e jogos que podem tirar proveito das GPUs para execução. A idéia por trás disso é fazer algumas partes da tarefa ou código do aplicativo em paralelo, mas não o processo inteiro. Isto porque a maioria dos processos da tarefa tem que ser executada apenas de forma sequencial. Por exemplo, o login em um sistema ou aplicativo não precisa fazer paralelo.

Quando há parte da execução que pode ser feita em paralelo ela é simplesmente deslocada para a GPU para processamento onde ao mesmo tempo a tarefa é executada na CPU, então ambas as partes da tarefa são novamente combinadas juntas. No mercado de GPU, há dois players principais i.e. AMD e Nvidia. As GPUs Nvidia são amplamente utilizadas para o aprendizado profundo, pois possuem amplo suporte no software do fórum, drivers, CUDA e cuDNN. Assim, em termos de IA e aprendizado profundo, Nvidia é a pioneira por muito tempo.

As redes neurais são ditas embaraçosamente paralelas, o que significa que os cálculos em redes neurais podem ser executados em paralelo facilmente e são independentes uma da outra.

GPUs for Deep Learning

Alguns cálculos como cálculo de pesos e funções de ativação de cada camada, a retropropagação pode ser realizada em paralelo. Há muitos trabalhos de pesquisa disponíveis sobre ele também.
GPUs da NVidia vêm com núcleos especializados conhecidos como núcleos CUDA, o que ajuda a acelerar o aprendizado profundo.

O que é CUDA?

CUDA significa ‘Compute Unified Device Architecture’ (Arquitetura unificada de dispositivos), que foi lançado no ano de 2007, é uma forma de você conseguir computação paralela e render a maior parte da potência da sua GPU de forma otimizada, o que resulta em uma performance muito melhor durante a execução das tarefas.

Image for post
source(NVIDIA)

O conjunto de ferramentas CUDA é um pacote completo que consiste em um ambiente de desenvolvimento que é usado para construir aplicativos que fazem uso de GPUs. Este kit de ferramentas contém principalmente compilador c/c++, depurador e bibliotecas. Além disso, o runtime do CUDA tem seus drivers para que ele possa se comunicar com a GPU. A CUDA também é uma linguagem de programação feita especificamente para instruir a GPU a executar uma tarefa. Ela também é conhecida como programação da GPU.
Below é um simples programa do mundo do olá apenas para ter uma idéia de como o código CUDA se parece.

/* hello world program in cuda *\#include<stdio.h>#include<stdlib.h>#include<cuda.h>__global__ void demo() { printf("hello world!,my first cuda program");}int main() { printf("From main!\n"); demo<<<1,1>>>(); return 0;}
Image para post
output

O que é o cuDNN?

Imagem para post
Source(Hyper Linuxer)

cuDNNN é uma biblioteca de rede neural otimizada para GPU Nvidia e que pode tirar o máximo proveito da GPU Nvidia. Esta biblioteca consiste na implementação de convolução, propagação para frente e para trás, funções de ativação e pooling. É uma biblioteca obrigatória sem a qual você não pode usar a GPU para o treinamento de redes neurais.

Um grande salto com núcleos Tensor!

Back no ano de 2018, a Nvidia lançou uma nova linha de suas GPUs, ou seja, a série 2000. Também chamadas RTX, estas placas vêm com núcleos tensores que são dedicados ao aprendizado profundo e baseados na arquitetura Volta.

Image for post

Source(Anand Tech)

Núcleos tensores são núcleos particulares que realizam multiplicação matricial de matriz 4 x 4 FP16 e adição com 4 x 4 FP16 ou FP32 em meia-precisão, a saída resultará em 4 x 4 FP16 ou FP32 matrix com total precisão.
Note: ‘FP’ significa ponto flutuante para entender mais sobre o ponto flutuante e precisão verifique este blog.

Como declarado pela Nvidia, a nova geração de núcleos tensores baseados na arquitetura de voltagem é muito mais rápida que os núcleos CUDA baseados na arquitetura Pascal. Isto deu um grande impulso ao aprendizado profundo.

Image for post

source(NVIDIA)

No momento de escrever este blog, Nvidia anunciou a última série 3000 de sua linha de GPU que vem com arquitetura Ampere. Nisso, eles melhoraram a performance dos núcleos tensores em 2x. Trazendo também novos valores de precisão como TF32(tensor float 32), FP64(floating point 64). O TF32 funciona da mesma forma que o FP32 mas com velocidade até 20x, como resultado de toda essa Nvidia, afirma que a inferência ou tempo de treinamento dos modelos será reduzido de semanas para horas.

AMD vs Nvidia

Image para post
source(Tom’s Hardware)

AMD GPUs são decentes para jogos, mas assim que o aprendizado profundo entra em cena, então simplesmente Nvidia está muito à frente. Isso não significa que as GPUs AMD sejam ruins. É devido à otimização de software e drivers que não estão sendo atualizados ativamente, no lado da Nvidia eles têm drivers melhores com atualizações frequentes e no topo desse CUDA, o cuDNN ajuda a acelerar o cálculo.

Bibliotecas bem conhecidas como Tensorflow, suporte a PyTorch para CUDA. Isso significa que as GPUs de nível básico da série GTX 1000 podem ser usadas. No lado da AMD, ela tem muito pouco suporte a software para suas GPUs. No lado do hardware, a Nvidia introduziu núcleos tensores dedicados. A AMD tem ROCm para aceleração mas não é boa como núcleos tensores, e muitas bibliotecas de aprendizagem profunda não suportam ROCm. Nos últimos anos, nenhum grande salto foi notado em termos de performance.

Due a todos estes pontos, Nvidia simplesmente se sobressai no aprendizado profundo.

Sumário

Para concluir de tudo o que aprendemos é claro que a partir de agora Nvidia é a líder de mercado em termos de GPU, mas eu realmente espero que até mesmo a AMD pegue no futuro ou pelo menos faça algumas melhorias notáveis no próximo alinhamento de suas GPUs já que eles já estão fazendo um ótimo trabalho com relação às suas CPUs i.e a série Ryzen.

O escopo das GPUs nos próximos anos é enorme, pois fazemos novas inovações e avanços em aprendizado profundo, aprendizado de máquina e HPC. A aceleração da GPU será sempre útil para muitos desenvolvedores e estudantes para entrar neste campo, pois seus preços também estão se tornando mais acessíveis. Também graças à ampla comunidade que também contribui para o desenvolvimento de IA e HPC.

Sobre o Autor

Prathmesh PatilPrathmesh Patil

Entusiasta deML, Data Science, Python developer.

LinkedIn: https://www.linkedin.com/in/prathmesh

Deixe uma resposta

O seu endereço de email não será publicado.