Pular para o conteúdo principal
InicioBlogPython

Primeiros passos com o mecanismo de GPU Polars: Consultas 13 vezes mais rápidas

Descubra como usar o recém-lançado mecanismo de GPU Polars, alimentado pelo NVIDIA RAPIDS cuDF, para obter um desempenho de consulta mais rápido em grandes conjuntos de dados.
Actualizado 20 de set. de 2024  · 26 min leer

Recentemente, tive o privilégio de obter acesso antecipado ao mecanismo de GPU Polars, desenvolvido pelo NVIDIA RAPIDS cuDF, antes do lançamento da versão beta aberta. lançamento da versão beta aberta. Esse recurso de ponta tem o potencial de transformar os fluxos de trabalho de dados, acelerando as operações do Polars em até 13 vezes com as GPUs NVIDIA. Se você trabalha com conjuntos de dados de grande escala em Python, este é um divisor de águas que você não vai querer perder.

Nesta publicação do blog, explicarei tudo o que você precisa saber sobre o novo mecanismo de GPU Polars e fornecerei um guia passo a passo para ajudá-lo a começar!

Imagem mostrando os logotipos da Polars e da NVIDIA lado a lado

Polares: Uma biblioteca DataFrame de alto desempenho

No centro da maioria dos fluxos de trabalho de ciência de dados está o DataFrame, uma estrutura de dados tabulares que é flexível e intuitiva para lidar com dados estruturados. Em resumo, todos os profissionais da ciência de dados já trabalharam com DataFrames.

Os DataFrames permitem a fácil manipulação, exploração e análise de dados, fornecendo uma interface familiar e consistente para limpeza, filtragem, agrupamento e transformação de dados.

No entanto, no contexto de big data, as bibliotecas DataFrame tradicionais podem não ter desempenho e escalabilidade, e é aí que o Polars entra em cena.

Polars é uma biblioteca DataFrame rápida e eficiente que se tornou rapidamente uma das principais opções para o processamento de dados de alto desempenho. Escrito do zero em Rust, o Polars foi projetado para operar próximo ao hardware, otimizando a velocidade e o uso de recursos sem depender de dependências externas.

A introdução Introdução ao Polars é um excelente recurso para você começar a usar a biblioteca em Python.

Imagem mostrando um gráfico comparando o desempenho das bibliotecas DataFrame mais populares

Comparando o desempenho das bibliotecas DataFrame mais populares. Fonte da imagem: Polares

Os resultados de benchmark publicados pela Polars, mostrados na imagem acima, demonstram que a Polars supera consistentemente o desempenho de outras bibliotecas, como Pandas, Modin, PySpark e Dask, em diferentes consultas. Esses resultados destacam a força do Polars como a opção mais rápida para o processamento de dados de alto desempenho.

Mas como isso é possível? Esses são alguns dos recursos que tornam o Polars extremamente rápido:

  • Escrito em Rust: Ele usa programação de baixo nível para executar operações, permanecendo próximo ao hardware.
  • Flexibilidade de E/S: Ele oferece suporte de primeira classe para todas as camadas comuns de armazenamento de dados, seja local, em armazenamento na nuvem ou conectado a bancos de dados.
  • API intuitiva: A API do Polars permite que você escreva consultas de forma intuitiva. O otimizador de consultas Polars determina internamente o plano de execução mais eficiente, minimizando o tempo e o uso da memória.
  • Processamento fora do núcleo: A API de streaming do Polars permite que você processe conjuntos de dados grandes demais para caber na memória.
  • Execução paralela: O Polars utiliza automaticamente todos os núcleos de CPU disponíveis, dividindo as cargas de trabalho entre eles sem a necessidade de configuração adicional, maximizando o poder computacional de sua máquina.
  • Mecanismo de consulta vetorizada: O Polars processa consultas de forma vetorizada usando o Apache Arrow, um formato de dados colunares e SIMD (Single Instruction, Multiple Data) para otimizar ainda mais o uso da CPU.

E com o recente anúncio da versão beta aberta do mecanismo de GPU Polars, ele está prestes a ficar ainda mais rápido!

Obter uma certificação Python

Mostre que você é um cientista de dados em Python pronto para o trabalho
Construir Minha Carreira De Dados

Entendendo a integração do NVIDIA RAPIDS cuDF

A demanda por processamento e análise de dados mais rápidos cresceu exponencialmente nos últimos anos, à medida que os conjuntos de dados aumentaram para centenas de milhões ou até bilhões de linhas. Para enfrentar esse desafio, o campo da ciência de dados tem visto uma mudança crescente do processamento tradicional baseado em CPU para a computação acelerada por GPU. É nesse ponto que o NVIDIA RAPIDS cuDF entra em ação.

NVIDIA RAPIDS é um conjunto de bibliotecas de código aberto que permite a ciência e a análise de dados aceleradas por GPU. Em sua essência, o RAPIDS foi projetado para simplificar os fluxos de trabalho de dados, utilizando o paralelismo maciço das GPUs NVIDIA para acelerar tarefas que normalmente são vinculadas à CPU. 

No RAPIDS, cuDF é a biblioteca responsável pelas operações do DataFrame. O cuDF estende a abstração familiar do DataFrame para a memória da GPU, permitindo a integração em fluxos de trabalho de dados sem grandes alterações no código. A biblioteca oferece suporte a todas as principais operações que os cientistas de dados realizam nos DataFrames: filtragem, agregação, mesclagem e classificação, tudo com o auxílio da GPU para aumentar a velocidade.

NVIDIA e Polars acabam de anunciar o lançamento da versão beta aberta do mecanismo de GPU Python Polars, com base no RAPIDS cuDF. Esse novo recurso representa um salto significativo para o processamento de dados de alto desempenho, proporcionando fluxos de trabalho até 13 vezes mais rápidos para os usuários do Polars com GPUs NVIDIA!

Imagem do design de alto nível da API Polars, incluindo um mecanismo de GPU

Projeto de alto nível da API Polars, incluindo um mecanismo de GPU. Fonte da imagem: Polares

Com a adição do mecanismo de GPU, os usuários do Polars podem decidir em qual mecanismo executar suas cargas de trabalho de dados. O otimizador Polars é compatível com todos os mecanismos, determinando dinamicamente quais consultas podem ser executadas na GPU ou na CPU.

O mecanismo de GPU da Polars: Um divisor de águas

Portanto, agora você tem algum contexto sobre o Polars e a biblioteca NVIDIA RAPIDS cuDF e como ambos se integram e são disponibilizados por meio da API Python Polars. Mas o que isso significa para os desenvolvedores e cientistas de dados?

Aqui está um resumo do que o mecanismo de GPU Polars permite:

  • Integração com a API Python Polars Lazy: Os usuários podem simplesmente passar engine="gpu" para a operação collect() na API Lazy do Polars, permitindo o processamento da GPU sem alterações significativas no código.
  • Processamento interativo de grandes conjuntos de dados: O mecanismo de GPU foi projetado para fazer com que o processamento de centenas de milhões de linhas de dados pareça interativo. Com uma única GPU, você pode lidar com grandes volumes de dados que exigiriam soluções mais complexas e mais lentas.
  • Otimizado para eficiência: O mecanismo de GPU Polars utiliza totalmente o otimizador Polars para garantir que a execução seja a mais eficiente possível, minimizando o tempo de processamento e o uso da memória.
  • Retorno gracioso da CPU: Nos casos em que consultas específicas não são compatíveis com a GPU, o mecanismo inclui um fallback de CPU. Isso garante que o fluxo de trabalho permaneça ininterrupto, revertendo automaticamente para o processamento da CPU quando necessário.

Então, quais são os resultados até agora? Vejamos. 

Imagem mostrando resultados de benchmark que demonstram que o mecanismo de GPU Polars acelera o processamento de dados em até 13 vezes

O Polars GPU Engine acelera o processamento de dados em até 13 vezes. Fonte da imagem: Polares

O benchmark acima demonstra os recursos impressionantes do mecanismo de GPU Polars, acelerando as consultas em até 13 vezes.

No entanto, é importante observar que nem sempre é garantido que o uso do Polars em uma GPU seja mais rápido do que em uma CPU, especialmente para consultas mais simples que não são computacionalmente intensivas. Nesses casos, o desempenho geralmente é limitado pela velocidade de leitura de dados do disco, o que significa que a aceleração da GPU oferece menos vantagens quando as operações de entrada/saída (E/S) são a principal restrição.

Dito isso, o mecanismo de GPU oferece aumentos de velocidade significativos para operações de dados mais complexas, o que o torna uma ferramenta valiosa para equipes que lidam com grandes conjuntos de dados ou consultas que envolvem uniões, agrupamentos e processamento de strings.

A interação entre a CPU e a GPU

Um dos recursos mais atraentes dessa nova integração é sua flexibilidade. Conforme mencionado anteriormente, o otimizador pode alternar entre a execução da CPU e da GPU com base na complexidade de suas consultas. Mas como exatamente essa transição funciona?

Polares sem aceleração de GPU

Ao executar o Polars na CPU, o mecanismo segue um pipeline estruturado e altamente otimizado para executar operações de dados. Esse processo envolve aproximadamente as seguintes etapas:

  1. DSL (linguagem específica de domínio): O mecanismo Polars cria primeiro um esboço de consulta estruturado a partir do seu código, semelhante a uma árvore de sintaxe de linguagem de programação. Esse esboço define a sequência de operações que você deseja executar, como filtragem, agrupamento e agregação.
  2. IR (representação intermediária): Em seguida, o Polars converte o esboço da consulta em um plano de execução detalhado, garantindo que todas as operações estejam corretas e que os esquemas de dados correspondam. Essa etapa estabelece a base de como a Polars processará os dados.
  3. Otimizador: O otimizador aprimora o plano de execução ao reordenar as operações e remover etapas desnecessárias. Por exemplo, a filtragem pode ser movida antes das uniões ou agregações para reduzir o tamanho do conjunto de dados no início do processo. Essa otimização garante que o plano seja o mais eficiente possível antes da execução.
  4. IR otimizado: Após a otimização, o plano de execução aprimorado é finalizado e está pronto para ser processado pelo mecanismo Polars. Esse plano é o modelo de como a Polars executará cada operação nos dados.
  5. Mecanismo Polars na memória (execução da CPU): Por fim, o mecanismo na memória do Polars executa o plano otimizado inteiramente na CPU. Apesar das otimizações de alto desempenho do Polars, essa etapa pode levar um tempo considerável se você estiver trabalhando com grandes conjuntos de dados, pois as CPUs processam os dados sequencialmente ou em paralelismo limitado.

Polares com aceleração de GPU

Quando você ativa a aceleração da GPU passando engine="gpu" para o método .collect(), o processo permanece essencialmente o mesmo na superfície, mas com verificações e otimizações adicionais nos bastidores para determinar quanto da carga de trabalho pode ser transferida para a GPU, por meio do cuDF:

  1. DSL (linguagem específica de domínio): Como no modo CPU, o Polars começa criando um esboço de consulta estruturada a partir do seu código. Esse esquema é o mesmo, quer você esteja executando na CPU ou na GPU, capturando as operações que deseja realizar.
  2. IR (representação intermediária): O Polars converte o esboço em um plano de execução, verificando a exatidão e garantindo que os esquemas de dados sejam válidos. O IR permanece neutro nesse estágio, pois o mecanismo ainda não decidiu se a CPU ou a GPU tratará das operações.
  3. Otimizador: O otimizador funciona como na execução da CPU, reordenando as operações para obter o máximo de eficiência e removendo etapas redundantes. Nesse ponto, o plano ainda está otimizado para execução geral.
  4. IR otimizado: O plano otimizado é finalizado como na execução da CPU. No entanto, com a aceleração da GPU ativada, o mecanismo agora verifica se partes desse plano podem ser transferidas para a GPU.
  5. retorno de chamada do cuDF (verificação da GPU): É aqui que a mágica acontece! A chamada de retorno cuDF determina se a GPU pode lidar com o plano de execução. Certas operações são naturalmente adequadas para a aceleração da GPU, enquanto outras podem não ser. A chamada de retorno modifica o plano para usar a GPU em operações compatíveis.
  6. IR acelerado (parcial): Quando as partes do plano compatíveis com a GPU são identificadas, o plano de execução é modificado para dividir a carga de trabalho. A GPU tratará das operações aceleradas, enquanto as operações não suportadas voltarão para a CPU.
  7. Mecanismo Polars na memória (execução de GPU e CPU): Por fim, o mecanismo na memória do Polars executa o plano. A GPU processa as consultas que podem ser aceleradas pela GPU, enquanto as consultas que a GPU não pode processar são transferidas para a CPU.

Esse modelo de execução híbrido, em que a GPU e a CPU são usadas em conjunto, torna o Polars altamente flexível. Você se beneficia da aceleração da GPU sem sacrificar a compatibilidade com consultas não compatíveis com a GPU. Os Polares publicação no blog de lançamento explica isso com mais detalhes técnicos.

Primeiros passos com o mecanismo de GPU Polars

Finalmente, a parte mais emocionante! Nesta seção, examinarei as etapas necessárias para configurar seu ambiente e começar a aproveitar o processamento de dados acelerado por GPU.

A maneira mais simples de começar a trabalhar é seguir este caderno do Google Colab.

O Colab oferece uso limitado e gratuito da GPU, o que é particularmente útil se você não tiver acesso imediato a uma GPU. Se você estiver usando o notebook fornecido, começaremos a partir da etapa 2 abaixo, portanto, você pode pular as etapas anteriores.

Pré-requisitos

Antes de instalar o mecanismo de GPU Polars, verifique se o seu sistema atende aos requisitos do NVIDIA RAPIDS cuDF. Você pode revisar as especificações necessárias do sistema, incluindo a compatibilidade da GPU e os requisitos de driver, na página de documentação do página de documentação do RAPIDS.

Para começar a usar o mecanismo de GPU Polars, a prática recomendada é criar um ambiente virtual para isolar as dependências do projeto. 

Eu usei o conda neste exemplo, mas você pode usar o gerenciador de pacotes de sua preferência.

Além do Python, você pode incluir o JupyterLab no ambiente para exploração e desenvolvimento de dados interativos, o que é especialmente útil para executar pequenos trechos de código e analisar conjuntos de dados em tempo real.

conda create -n polars-gpu -c conda-forge python=3.11 jupyterlab

Depois de criar o ambiente virtual, ative-o usando:

conda activate polars-gpu

Agora, vamos ativar a aceleração de GPU instalando o Polars e o mecanismo de GPU. Isso também configurará o cuDF e outras dependências necessárias para o uso de GPUs NVIDIA:

pip install -U polars[gpu] --extra-index-url=https://pypi.nvidia.com

Quando o mecanismo de GPU do Polars estiver instalado, você terá a mesma sensação de trabalhar com a CPU, mas com resultados muito mais rápidos para fluxos de trabalho complexos ou com muitos dados.

Conforme explicado anteriormente, o mecanismo Polars otimiza automaticamente o plano de execução, utilizando totalmente a GPU NVIDIA para acelerar as operações e minimizar o uso da memória. Para consultas que não são compatíveis com a aceleração de GPU, o mecanismo de GPU do Polars tem um fallback de CPU gracioso, garantindo que o fluxo de trabalho continue sem interrupções.

Vamos colocar o mecanismo em ação com alguns exemplos simples!

Executando algumas consultas com o mecanismo de GPU Polars

Para esta demonstração, usaremos um conjunto de dados de conjunto de dados de 22 GB de transações financeiras simuladas do Kaggle. A NVIDIA hospeda o conjunto de dados em um bucket do Google Cloud Storage (GCS), garantindo velocidades de download rápidas.

Para começar, faça o download do conjunto de dados:

!wget https://storage.googleapis.com/rapidsai/polars-demo/transactions.parquet -O transactions.parquet

Como esse conjunto de dados é proveniente do Kaggle, ele é regido por uma licença específica do conjunto de dados do Kaggle e pelos termos de uso.

Vamos carregar o conjunto de dados usando o Polars e inspecionar o esquema:

import polars as pl
from polars.testing import assert_frame_equal

transactions = pl.scan_parquet("transactions.parquet")
transactions.collect_schema()

Aqui está o resultado:

Schema([('CUST_ID', String),
        ('START_DATE', Date),
        ('END_DATE', Date),
        ('TRANS_ID', String),
        ('DATE', Date),
        ('YEAR', Int64),
        ('MONTH', Int64),
        ('DAY', Int64),
        ('EXP_TYPE', String),
        ('AMOUNT', Float64)])

Agora, vamos calcular o volume total de transações somando a coluna AMOUNT. Primeiro, vamos tentar sem a aceleração da GPU:

transactions.select(pl.col("AMOUNT").sum()).collect()

Saída:

AMOUNT
f64
3.6183e9

Esse é um grande volume total de transações! Vamos executar a mesma consulta na GPU:

transactions.select(pl.col("AMOUNT").sum()).collect(engine="gpu")

Saída:

AMOUNT
f64
3.6183e9

Para operações simples como essa, a CPU e a GPU produzem o mesmo resultado com velocidade semelhante, pois a consulta não é computacionalmente intensiva o suficiente para se beneficiar muito da aceleração da GPU. No entanto, a GPU se destacará ao lidar com consultas mais complexas.

Agora, vamos passar para uma consulta mais complexa. Nessa consulta, agrupamos as transações por ID de cliente (CUST_ID), somamos os valores totais das transações e, em seguida, classificamos os resultados pelos maiores gastadores. 

Primeiro, vamos executá-lo na CPU:

%%time
res_cpu = (
   transactions
   .group_by("CUST_ID")
   .agg(pl.col("AMOUNT").sum())
   .sort(by="AMOUNT", descending=True)
   .head()
   .collect()
)
res_cpu

Aqui está o resultado:

CPU times: user 4.63 s, sys: 3.75 s, total: 8.38 s
Wall time: 6.04 s
CUST_ID
AMOUNT
str
f64
"CA9UYOQ5DA"
2.0290e6
"CJUK2MTM5Q"
1.8115e6
"CYXX1NBIKL"
1.8082e6
"C6ILEYAYQ9"
1.7961e6
"CCNBC305GI"
1.7274e6

Agora, vamos executar a mesma consulta na GPU:

%%time
res_gpu = (
   transactions
   .group_by("CUST_ID")
   .agg(pl.col("AMOUNT").sum())
   .sort(by="AMOUNT", descending=True)
   .head()
   .collect(engine=”gpu”)
)
res_gpu

Saída:

CPU times: user 347 ms, sys: 0 ns, total: 347 ms
Wall time: 353 ms
shape: (5, 2)
CUST_ID
AMOUNT
str
f64
"CA9UYOQ5DA"
2.0290e6
"CJUK2MTM5Q"
1.8115e6
"CYXX1NBIKL"
1.8082e6
"C6ILEYAYQ9"
1.7961e6
"CCNBC305GI"
1.7274e6

Como podemos ver, o uso da GPU para consultas mais complexas oferece ganhos significativos de desempenho, reduzindo o tempo de execução de 6,04 segundos na CPU para apenas 353 milissegundos na GPU!

Esse exemplo demonstra o poderoso aumento de desempenho que o mecanismo de GPU Polars oferece para operações de dados em grande escala. 

Você pode encontrar exemplos mais avançados no Caderno do Colab.

Conclusão

O mecanismo de GPU Polars, alimentado pelo NVIDIA RAPIDS cuDF, traz melhorias de velocidade impressionantes, com processamento de dados até 13 vezes mais rápido para operações complexas. Para conjuntos de dados em grande escala, o Polars oferece uma clara vantagem sobre as bibliotecas DataFrame tradicionais.

Mesmo que nem todas as consultas se beneficiem igualmente da aceleração da GPU, o Polars continua sendo uma ferramenta poderosa para quem trabalha com grandes conjuntos de dados. A facilidade de integração, combinada com seu modelo de execução híbrido CPU-GPU, torna o Polars um forte concorrente para os fluxos de trabalho de dados modernos.

Se você estiver interessado em desenvolver suas habilidades de manipulação de dados, especialmente com o Pandas, recomendo vivamente que dê uma olhada nesses cursos:

Esses recursos darão a você uma base sólida que complementa os recursos avançados de ferramentas como o Polars!

Obtenha a certificação para a função de cientista de dados dos seus sonhos

Nossos programas de certificação ajudam você a se destacar e a provar que suas habilidades estão prontas para o trabalho para possíveis empregadores.

Obtenha Sua Certificação
Timeline mobile.png

Perguntas frequentes

Quais são os tipos de consultas que mais se beneficiam da aceleração de GPU no Polars?

A aceleração de GPU no Polars oferece os aumentos de velocidade mais significativos para consultas vinculadas à computação que envolvem operações como junções, agrupamentos e processamento de strings. Esses tipos de tarefas exigem computação pesada e é aí que o poder de processamento paralelo da GPU realmente se destaca, oferecendo acelerações de até 13 vezes em comparação com o processamento da CPU. No entanto, as consultas mais simples ou vinculadas a E/S podem não ter tanta melhoria.

A aceleração da GPU sempre será mais rápida do que usar a CPU?

Não, nem sempre. Embora a aceleração da GPU acelere muito as operações de computação pesada, como agregações e uniões complexas, as consultas vinculadas a E/S - em que o gargalo é a leitura e a gravação de dados no disco - podem não se beneficiar tanto. Nesses casos, a GPU não oferece vantagens significativas de desempenho em relação à CPU, e você verá tempos de execução semelhantes.

Preciso reescrever minhas consultas Polars para usar o mecanismo de GPU?

Não, você não precisa reescrever suas consultas. O mecanismo de GPU do Polars se integra perfeitamente aos fluxos de trabalho existentes do Polars. Tudo o que você precisa fazer é passar engine="gpu" para o métodocollect() para ativar a aceleração da GPU. Se alguma parte da consulta não for compatível com o mecanismo da GPU, ela voltará automaticamente para a CPU sem exigir nenhuma alteração da sua parte.

Posso usar o mecanismo de GPU Polars em qualquer máquina?

Para usar o mecanismo de GPU Polars, você precisa de uma máquina com GPUs NVIDIA compatíveis com o RAPIDS cuDF, parte das bibliotecas CUDA-X. Se a sua máquina não tiver uma GPU compatível, você poderá usar serviços de nuvem como o Amazon SageMaker Studio Lab, o Google Colab ou o PaperSpace, que oferecem acesso gratuito ou pago a recursos de GPU.


Photo of Thalia Barrera
Author
Thalia Barrera
LinkedIn

Thalia Barrera é editora sênior de ciência de dados da DataCamp, com mestrado em ciência da computação e mais de uma década de experiência em engenharia de software e dados. Thalia gosta de simplificar conceitos de tecnologia para engenheiros e cientistas de dados por meio de publicações em blogs, tutoriais e cursos em vídeo.

Temas

Aprenda mais sobre ciência de dados e Python com estes cursos!

Course

Intermediate Python for Developers

2 hr
9.7K
Dive into the Python ecosystem, discovering modules and packages along with how to write custom functions!
See DetailsRight Arrow
Start Course
Ver maisRight Arrow
Relacionado

blog

Uma introdução aos polares: Ferramenta Python para análise de dados em grande escala

Explore o Polars, uma biblioteca Python robusta para manipulação e análise de dados de alto desempenho. Saiba mais sobre seus recursos, suas vantagens em relação ao pandas e como ele pode revolucionar seus processos de análise de dados.
Moez Ali's photo

Moez Ali

9 min

R Project

blog

As 8 principais ideias de projetos de R para 2023

Descubra o que é o R e todos os benefícios de usá-lo, além de dar exemplos e novas ideias para um projeto.
Elena Kosourova's photo

Elena Kosourova

16 min

tutorial

Tutorial de como executar consultas SQL em Python e R

Aprenda maneiras fáceis e eficazes de executar consultas SQL em Python e R para análise de dados e gerenciamento de bancos de dados.
Abid Ali Awan's photo

Abid Ali Awan

13 min

tutorial

Tutorial do Pyspark: Primeiros passos com o Pyspark

Descubra o que é o Pyspark e como ele pode ser usado, com exemplos.
Natassha Selvaraj's photo

Natassha Selvaraj

10 min

tutorial

Tutorial de execução de scripts Python no Power BI

Descubra as diferentes maneiras de usar o Python para otimizar a análise, a visualização e a modelagem de dados no Power BI.
Joleen Bothma's photo

Joleen Bothma

9 min

tutorial

21 ferramentas essenciais do Python

Aprenda sobre as ferramentas Python essenciais para o desenvolvimento de software, raspagem e desenvolvimento da Web, análise e visualização de dados e aprendizado de máquina.
Abid Ali Awan's photo

Abid Ali Awan

6 min

See MoreSee More