A utilização de modelos de inteligência artificial cada vez mais potentes levanta a questão de como tornar o treinamento desses algoritmos mais rápido. Para que os modelos de IA sejam mais precisos, é necessária uma quantidade significativa de dados para treinar os algoritmos, o que, por consequência, demanda mais tempo de processamento. Esse fator, somado à elevada complexidade dos algoritmos utilizados, incluindo várias estruturas de dados, recursões e diversos loops, resulta em um tempo de treinamento muito prolongado. Para isso, podemos utilizar um dos recursos mais interessantes e complexos da computação para solucionar esse problema, a paralelização.
GPU x CPU
A CPU (Central Processing Unit) é o cérebro dos computadores, responsável pelo processamento das instruções e cálculos de memória em frações de segundo, apresentando um excelente desempenho em processos sequenciais comuns em tarefas rotineiras. As CPUs mais modernas possuem múltiplos núcleos (cores), permitindo a execução paralela de tarefas, o que eleva a performance do sistema.
No entanto, o número de unidades de processamento paralelo em uma CPU não se compara à quantidade de núcleos presentes em uma GPU (Graphics Processing Unit), que pode chegar aos milhares. A GPU permite a execução de inúmeros cálculos em paralelo, especialmente operações matriciais, otimizando a renderização de gráficos no computador.
Essa capacidade de paralelização proporciona uma vantagem significativa para a GPU no treinamento de modelos de IA, permitindo o processamento de grandes volumes de dados de forma eficiente. Para ilustrar a diferença entre essas duas unidades de processamento, podemos utilizar a seguinte analogia: imagine a CPU como um carro esportivo e a GPU como um ônibus. Se precisamos transportar pessoas de um ponto A para um ponto B em um determinado período, o carro esportivo, apesar de ser mais rápido, só pode transportar uma pessoa por vez, enquanto o ônibus, embora mais lento, pode transportar 60 pessoas simultaneamente. Assim, a GPU, com sua capacidade de processamento paralelo, é mais adequada para tarefas que envolvem grandes quantidades de dados.
Porque a GPU tem performance melhor que a CPU em aplicações de IA?
A GPU tem performance melhor que a CPU em aplicações de IA devido a várias características arquitetônicas e funcionais que a tornam mais adequada para o processamento paralelo massivo e operações de alta intensidade de cálculo, que é explorada através das seguintes características:
- Múltiplos núcleos de processamento: As GPUs possuem milhares de núcleos de processamento, enquanto as CPUs geralmente têm de 2 a 64 núcleos. Esses núcleos de GPU são projetados para executar muitas operações simultaneamente, tornando-as ideais para tarefas que podem ser divididas em operações paralelas.
- Unidades de Cálculos: As GPUs têm muitas unidades aritméticas e lógicas (ALUs) e unidades de ponto flutuante (FPUs), que são essenciais para cálculos matemáticos intensivos, comuns em algoritmos de aprendizado profundo. Em comparação, as CPUs têm menos dessas unidades, focando mais na execução de tarefas sequenciais.
- Cache Compartilhado: As GPUs têm uma hierarquia de cache bem otimizada, com cache L2 compartilhado entre todos os núcleos, permitindo acesso rápido aos dados. Isso melhora a eficiência do processamento paralelo em comparação com as CPUs, que geralmente têm caches menores e menos otimizados para operações paralelas.
- Memória Principal: As GPUs são equipadas com memória de alta velocidade, como GDDR6 ou HBM2, que oferecem uma largura de banda muito maior em comparação com a memória DDR4 usada nas CPUs. Isso permite que as GPUs acessem e transfiram grandes volumes de dados rapidamente, essencial para o treinamento de modelos de IA que processam muitos dados simultaneamente.
Nvidia CUDA
NVIDIA CUDA é uma plataforma de computação paralela e um modelo de programação desenvolvido pela NVIDIA. Ele permite que desenvolvedores utilizem GPUs NVIDIA para realizar computação geral, não apenas para gráficos, mas também para uma ampla gama de aplicações computacionais intensivas.
A CUDA oferece um modelo de programação paralela onde os desenvolvedores podem escrever código para ser executado diretamente nas GPUs NVIDIA. Isso inclui não apenas operações gráficas, mas também cálculos científicos, simulações físicas, aprendizado de máquina, e muito mais.
CUDA é suportado pela linguagem de programação C/C++, permitindo que os desenvolvedores escrevam kernels CUDA (funções que serão executadas paralelamente na GPU) diretamente dentro de seu código C/C++ existente. Comparado às CPUs tradicionais, GPUs equipadas com CUDA podem realizar cálculos paralelos de forma muito mais rápida, especialmente em aplicações intensivas em cálculos.
No exemplo abaixo, é possível ganhar desempenho ao utilizar a GPU para rodar o código de forma paralela utilizando extensões da CUDA.
O que são tensores?
Um tensor é uma estrutura de dados que pode ser usada para representar dados multidimensionais. Essencialmente, é uma generalização de matrizes para dimensões superiores.As operações com tensores, como adição, multiplicação, transposição, etc., são essenciais para a construção e treinamento de modelos de IA. Essas operações são eficientes e podem ser paralelizadas, aproveitando a arquitetura das GPUs.
Um tensor pode se apresentar na seguinte forma:
- Escalar: Um único número (0ª ordem tensor).
- Vetor: Uma lista de números, ou uma matriz unidimensional (1ª ordem tensor).
- Matriz: Uma tabela de números, ou uma matriz bidimensional (2ª ordem tensor).
- Tensor de Ordem Superior: Matrizes de 3ª ordem ou superior.
Por exemplo, uma imagem colorida pode ser representada como um tensor tridimensional (altura, largura, canais de cor).
O TensorFlow é um framework de aprendizado de máquina que utiliza tensores para representar dados e operações. Tudo no TensorFlow é construído em torno do conceito de tensores e grafos computacionais.
Como utilizar GPUs gratuitamente no Google Colab:
O Google Colab fornece um serviço de hospedagem de Jupyter notebook interativo com python, além de prover acesso gratuito a recursos de computação como GPUs e TPUs. Para conseguir utilizar a GPU que o serviço oferece, você precisa primeiro criar um notebook. Após isso, vá até a opção “Alterar o tipo de ambiente de execução” e selecione o tipo de recurso que você deseja utilizar.
Utilizando o código em python abaixo, você poderá verificar se está com acesso a GPU do ambiente:
import tensorflow as tf
device_name = tf.test.gpu_device_name()
if device_name != '/device:GPU:0':
raise SystemError('GPU não encontrada')
print('Nome da GPU: {}'.format(device_name))
Utilizar a GPU no Google Colab é extremamente útil para acelerar o treinamento de modelos de aprendizado de máquina, especialmente aqueles que exigem processamento intensivo de dados.
Conclusão
A arquitetura paralela das GPUs, juntamente com a alta largura de banda de memória e eficiência energética, as torna superiores às CPUs em aplicações de IA. O suporte robusto a frameworks e bibliotecas de IA, como CUDA e TensorFlow, também contribui para sua adoção generalizada em tarefas de aprendizado de máquina e aprendizado profundo. As GPUs continuam a desempenhar um papel crucial na aceleração e evolução da inteligência artificial.