Bem-vindo, cuML… Adeus, Scikit-Learn!

ia.bb
8 min readFeb 14, 2023

--

Trabalho com Aprendizado de Máquina (Machine Learning — ML) desde 2018. Um problema que tive no BB nessa época, me fez escrever este post. Em 2018, não era possível ainda usar a placa gráfica (GPU) para treinar modelos tradicionais de ML (também conhecidos como Shallow Machine Learning). Até aquele momento, só era possível usar GPU para treinar modelos de Deep Learning (DL). A questão é que mesmo atualmente, há problemas cujos dados negociais (realidade da indústria) não possuem os requisitos técnicos ou legais (IA Explicável, ou Explainable AI — XAI) para serem usados no treinamento de um algoritmo de DL. Porém, esses dados possuem as características para serem treinados em algoritmos de ML convencional.

Há algum tempo descobri uma maneira fácil e rápida de fazer o que queria e precisava, treinar diferentes algoritmos de ML usando GPU. E qual o ganho disso? O tempo de treinamento de alguns modelos diminuiu drasticamente. No final desta matéria, há um exemplo em que o treinamento de um modelo de SVM (Support Vector Machines) usando GPU foi mais de 300 vezes mais rápido que usando a CPU. É esta descoberta que quero compartilhar e divulgar aqui.

Uma foto da natureza para diminuir a tensão do tema!

Apesar do assunto não ser novo na comunidade de Inteligência Artificial de língua inglesa, fiz buscas no Google pelo assunto sendo tratado em português e não encontrei nada (isso me surpreendeu!). E qual é esse assunto? Na verdade é um framework ou API (decida como chamar) cujo nome é RAPIDS, desenvolvido pela NVIDIA. Para incentivar as pessoas a conhecerem o RAPIDS, resolvi escrever posts sobre o assunto, basicamente fazendo benchmark com alguns de seus algoritmos concorrentes que rodam em CPU. Afinal, o que seria de mim sem o conhecimento de Computação e Inteligência Artificial compartilhado na Internet. Resolvi começar a pagar minha conta!

O RAPIDS possui vários componentes para treinamento de modelos, para análise de dados, para geração de gráficos, entre outros. Em relação ao treinamento de modelos, existe o cuML (provavelmente é um acrônimo para CUDA Machine Learning), que equivale ao consagrado scikit-learn (sklearn). Vou apresentar e comentar o código-fonte Python que usei para fazer as comparações entre cuMl e scikit-learn, vou explicar os experimentos e ao final apresentar uma tabela com os cenários testados.

A título de curiosidade, CUDA (Compute Unified Device Architecture) é o nome da tecnologia que permitiu treinar modelos de Inteligência Artificial (IA) em placas de vídeo da NVIDIA.

Tópicos deste post

1. Funções
2. Dataset 1
3. RandomForestClassifier
4. LinearSVC
5. Dataset 2
6. SVC
7. Decisões
8. Tabela com os resultados
9. Teaser! Quais algoritmos de classificação, regressão e agrupamento existem no cuML?
10. Como instalar o RAPIDS no notebook pessoal?
11. Notebook e log (GitHub)
12. Referências

Inicio mostrando a configuração da máquina e das bibliotecas utilizadas.

1. Funções

Para a tarefa, foram criadas algumas funções. As duas primeiras são utilizadas na contagem do tempo de processamento de cada experimento.

A próxima função serve para obter as métricas de cada experimento. Utilizei a medição da acurácia através do cuML e do SKLearn.

A função print_performance é utilizada para calcular a diferença de tempo entre dois experimentos.

A última função serve para carregar os diferentes datasets utilizados.

2. Dataset 1

Esse é o dataset utilizado na maioria dos experimentos.

Olhando para a função load_prepare_dataset e sua saída acima, vemos que o dataset tem 250.000 amostras e 102 features (colunas). A última coluna é a classe. A proposta foi uma tarefa multiclasse com 5 variáveis-alvo (targets/classes).

Para fazer o benchmark escolhi os algoritmos RandomForestClassifier, LinearSVC e SVC. Os detalhes do código de cada um será apresentado na sequência. Cada experimento usou os mesmos parâmetros. Foram todos realizados em janeiro/2023.

3. RandomForestClassifier

Começamos com a versão cuML e sua respectiva saída (output).

Agora a versão do sklearn usando 11 dos 12 núcleos do processador disponíveis na máquina (n_jobs=11). Na sequência temos a saída (output).

Eis o primeiro resultado da comparação cuML e sklearn:

No próximo experimento temos a versão do sklearn usando apenas 1 dos 12 núcleos do processador disponíveis na máquina (n_jobs=1) (configuração padrão do algoritmo). Segue também sua saída.

Eis o segundo resultado da comparação cuML e sklearn:

4. LinearSVC (uma versão do SVM)

Esses são os parâmetros utilizados nos 2 experimentos com LinearSVC.

Abaixo temos o experimento usando o cuML e sua saída:

Nas próximas duas células são apresentado o código na versão sklearn e seu output:

Eis o terceiro resultado da comparação cuML e sklearn (é o mais surpreendente!):

5. Dataset 2

Para os experimentos com o algoritmo SVC, foi utilizado um dataset menor, devido ao tempo de processamento da versão sklearn.

Ele possui as mesmas características do Dataset 1, exceto por possuir apenas 100.000 amostras.

6. SVC (outra versão do SVM)

Os parâmetros usados nos experimentos com o SVC são:

O código e a saída do SVC do cuML estão abaixo:

E para podermos fazer a comparação, temos o código do sklearn e sua saída:

Eis o quarto e último resultado da comparação cuML e SKLearn! Mais uma vez o cuML venceu…

7. Decisões

Talvez alguém esteja se perguntando por que escolhi o Random Forest e diferentes versões do SVM para fazer este benchmark. O primeiro foi escolhido por oferecer a possibilidade de ser executado com 1 ou mais núcleos do processador. Já o SVM foi o motivo do meu problema em 2018. Até hoje, não existem versões para GPU dele no sklearn. Alguns podem dizer que foi trauma (risos)! Fiquei muito feliz em saber que finalmente existe opção para GPU para o SVM no cuML.

8. Tabela com os resultados

A tabela com todos os experimentos é apresentada abaixo:

Tabela 1 — Resultados do desempenho dos algoritmos sobre as bases citadas e usando os frameworks avaliados (cuML e sklearn).

A primeira coisa que me chamou a atenção é a diferença na acurácia entre o Random Forest do cuML e do sklearn. Olhando a documentação de ambos, percebi que existe diferença na abordagem dos parâmetros de cada implementação.

9. Teaser! Quais algoritmos de classificação, regressão e agrupamento existem no cuML?

O mundo RAPIDS é muito maior que o que apresentei aqui. Existem várias opções de algoritmos para classificação, regressão e clusterização. E muito mais!

Digo com certeza e empolgação, vale a pena vasculhar a documentação do cuML (e do RAPIDS). Há muitas ferramentas úteis para quem trabalha ou estuda ciência de dados. Veja as referências ao final deste artigo!

10. Como instalar o RAPIDS no notebook pessoal?

*OBS: Essa orientação vale para notebook pessoal com placa de vídeo compatível com o RAPIDS.

1. Execute o comando “nvidia-smi”, para saber qual o CUDA Version (pode ser CUDA 11.2, CUDA 11.4 e CUDA 11.5) da sua máquina com placa de vídeo dedicada da NVIDIA (é necessário ter o CUDA Toolkit instalado);

2. Execute o comando “python –version”, para saber qual a versão do Python instalada na máquina (pode ser Python 3.8 ou 3.9);

3. Preencha os parâmetros em https://rapids.ai/start.html (STEP 3: INSTALL RAPIDS), no final você terá o comando para montar um ambiente Conda com o RAPIDS;

4. Divirta-se!

11. Notebook e log (GitHub)

O notebook e log das execuções estão disponíveis no meu GitHub (aqui).

Não pude colocar os datasets, pois os arquivos são maiores que o Git aceita. O arquivo medium1_dt1.csv tem 313,4 MB e o arquivo medium1_dt_100k.csv tem 125,3 MB.

Porém, isso não prejudica o post, pois o objetivo dele é que você teste o cuML com o dataset que quiser, ou seu hardware aguentar.

Try it out!

12. Referências

https://rapids.ai/about.html

https://rapids.ai/start.html

https://docs.rapids.ai/api/cuml/stable/api.html#cuml.ensemble.RandomForestClassifier

https://docs.rapids.ai/api/cuml/stable/api.html#support-vector-machines

https://www.linkedin.com/pulse/introduction-shallow-machine-learning-ayman-mahmoud/

https://www.kaggle.com/code/nuka137/perfomance-cuml-vs-scikit-learn

https://developer.nvidia.com/cuda-zone

Autor:

Rafael Faria de Azevedo é Bacharel em Sistemas de Informação pela PUC-PR. Mestre em Ciência da Computação (área de Machine Learning) pela PUC-PR. Há 10 anos no BB, sendo os últimos 5 anos no Centro de IA da Diretoria de Tecnologia do Banco, trabalhando principalmente com Processamento de Texto (NLP). Até o presente momento, atuou em diversos projetos como em chatbots, análise de textos em documentos digitais, assistentes cognitivos de e-mails, e no projeto Minhas Finanças do BB.

Além de TI, gosta de Filosofia, Natureza, corrida e tocar contrabaixo.

--

--

ia.bb

AI enthusiasts, friends and researchers, mainly from Banco do Brasil.