Deep Learning com CUDA em tempos de crise

‘Neural Networks are cool again’ – Autor desconhecido

De quando em quando aparece uma notícia de um algoritmo mirabolante capaz de fazer alguma façanha que ninguém achava possível, porém ultimamente essas notícias estão ficando cada vez mais consistentes

Recentemente o Google anunciou algo que os especialistas achavam que demoraríamos pelo menos mais 10 anos para alcançar. Eles conseguiram montar um algoritmo capaz vencer um dos maiores campeões de GO do mundo.

http://www.wired.com/2016/03/googles-ai-wins-first-game-historic-match-go-champion/

Eu não conhecia o jogo GO a fundo. Joguei algumas vezes na infância porque alguém tinha o tabuleiro, mas nunca dei muita bola; e uma coisa que me deixou impressionado com essa notícia é a complexidade do GO em relação a outros jogos como jogo da velha e Xadrez.

https://en.wikipedia.org/wiki/Game_complexity#Complexities_of_some_well-known_games

‘Game-tree complexity’:
– Jogo da Velha = 10^5
– Xadrez = 10^123
– GO = 10^360

Só para se ter uma ideia, quando o Deep Blue venceu o Kasparov, apesar de ter sido um grande feito na época, ele ‘apenas’ buscava a melhor sequencia de jogadas dentro de um banco de jogadas, ou, para quem gosta de Excel, imagine um ‘super procv()’.

Já no caso do GO, isso ainda é uma impossibilidade por conta da complexidade do jogo, então o pessoal do DeepMind tentou outra abordagem onde eles ensinaram o computador a jogar GO olhando para milhares e milhares de partidas e até mesmo jogando contra outros computadores.

Usando a tecnologia
Diferente da postura usada pela IBM nos casos do Deepblue e mais recentemente do Watson, a tecnologia usada pelo Google está aí para brincarmos, principalmente agora que o Google abriu o código fonte das suas bibliotecas de Machine Learning

https://www.tensorflow.org/

Não é nada demais e é até inferior em alguns aspectos a bibliotecas que já estão por aí a algum tempo, como o Theano, mas o importante é que essas tecnologias estão aí, disponíveis para usarmos.

Na pratica:
As tecnologias estão disponíveis, mas um limitante para utiliza-las é o tempo de processamento,  por exemplo: Para um projeto que estou trabalhando eu preciso rodar diversos modelos e combina-los para fazer uma previsão. Uma das pernas desse processo é um modelo de Deep Learning, relativamente simples com 2 hidden layers, 2 dropout e alguns outros detalhes.

Considerando o problema inteiro o que eu teria que fazer é rodar esse modelo com 400 epochs, em um cross-validation de pelo menos 5 folds, com no mínimo 30 combinações diferentes de parâmetros. Com um tempo médio de processamento de 14.5s por epoch eu levaria 14.5 x 400 x 5 x 30 / 60 / 60 =~240 horas para rodar esse processo.

Processamento
Como as redes neurais são extremamente flexíveis e sua ‘profundidade’ pode afetar significativamente os resultados, chegamos em uma situação em que os recursos computacionais são limitadores na hora de criar redes maiores e mais complexas. Não são raros exemplos de pessoas que deixam suas redes treinando por dias ou semanas.

Uma solução para isso foi mudar o local de processamento das redes do processador para a Placa de vídeo pois como elas são feitas para trabalhar com gráficos pesados, são capazes de realizar muito mais operações por segundo chegando a ser até 20x mais rápidas que um processador equivalente.

Todo esse poder de processamento tem seu custo, é claro, geralmente a placa de vídeo é o componente mais caro de um PC e uma placa top não sai por menos de R$3.500,00

Ok, ok, estamos em crise e vai ser bem difícil arrumar R$10.000,00++ para comprar um PC novinho para brincar de Data Scientist, então o que dá para fazer?

CUDA on a Budget
CUDA é a Tecnologia usada pelas placas de video Nvidia que se comunica com as bibliotecas de Deep Learning (Theano ou Tensorflow) para mandar os cálculos para a GPU, então teoricamente qualquer PC com uma placa de vídeo que suporte CUDA pode ser usada para treinar uma rede Neural.

Tenho um notebook da Asus que por acaso vem com uma placa integrada GeForce 740m, que é uma porcaria de uma placa (do ponto de vista de um Gamer), mas é o que tem para hoje.

Instalando o CUDA no Linux
Eu já tinha visto diversos comentários sobre o quão chato é fazer esse troço funcionar, mas nada como testar na pele para ver como é.

Vou passar o passo a passo, mas já aviso que coisas podem ‘quebrar’ e isso vai variar por sistema, versão, hardware e etc, então tenha paciência, vai funcionar, mas nunca na primeira tentativa.

  • Faça o download do driver em:
    https://developer.nvidia.com/cuda-downloads
  • Vá para o terminal com CTRL+ALT+F1
  • Pare o ‘X server’, no meu caso ‘sudo service mdm stop’
  • sudo init 3
  • sudo sh cuda_7.5.18_linux.run

A partir de agora é só seguir a instalação e adicionar algumas linhas no .bashrc

export CUDA_HOME=/usr/local/cuda-7.5
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64

PATH=${CUDA_HOME}/bin:${PATH}
export PATH

Obviamente, no meu caso a instalação do Driver de vídeo falhou, tentei de tudo e não deu certo e acabei instalando pelo Driver Manager do Linux mesmo (versão 352.63).

Como eu uso o Theano como motor eu precisei configura-lo para aceitar minha GPU, as instruções não são muito claras, mas eu criei um arquivo no root chamado ‘.theanorc’ com o seguinte conteúdo:

[cuda]
root = /usr/local/cuda-7.5

[global]
floatX = float32
device = gpu0

Isso deve ser o suficiente, com exceção de um detalhe que está marcado como Bug no site da Nvidia, mas eu não consegui resolver que é o seguinte, independente do programa que você usar (R ou Python) você deve abri-lo como administrador (sudo), caso contrário ele não reconhece a placa.

Resultados:
Na média, por epoch, consegui obter desta plaquinha uma velocidade 6x mais rápida para treinar minha network. Para diminuir o tempo de processamento de 10 dias para um pouco menos de 2 realmente fez valer a pena o trabalho com a instalação do CUDA.

chart1

Aquilo que não sei

Eu estava lendo o livro Rise of the “Robots: Technology and the Threat of a Jobless Future” e logo no começo o autor começa com a argumentação de que a produtividade do trabalho vem crescendo continuamente ao longo dos anos após a segunda guerra mundial.

us_productivity_and_real_wages

https://en.wikipedia.org/wiki/Workforce_productivity

Olhando para o gráfico, especialmente para a curva de produtividade (a de salários é um assunto para um outro momento) e pensando na maneira como trabalhamos hoje em dia é até difícil imaginar como era trabalhar na era ‘pre-Google’.

Vamos imaginar uma situação, você está em 1995 e precisa montar um report com alguns gráficos para seu chefe, porém você gostaria que os gráficos compartilhassem os eixos, mas você não faz ideia de como fazer isso. Você tinha basicamente três opções:

  • Perguntar para seus colegas de trabalho
  • Encontrar um livro
  • Tentativa e erro

Com um pouco de sorte existe um colega mais experiente ou você já possui um livro com a solução, mas a probabilidade era pequena, principalmente para problemas específicos.

Hoje em dia, por outro lado:

“matplotlib subplot”

O exemplo acima parece irrelevante, mas a quantidade de vezes que isso acontece é gigantesca, vou exemplificar:

Google Search History

O Google disponibiliza o histórico das suas pesquisas em:

https://history.google.com/history/

Nos últimos 1.000 dias eu realizei pouco mais de 17.000 pesquisas!!! E os sites mais acessados foram:

  1. stackoverflow.com
  2. en.wikipedia.org
  3. cran.r-project.org
  4. steamcommunity.com
  5. http://www.gamefaqs.com

Trabalho e jogos basicamente, porém é possível fazer o download de todas essas pesquisas, então é possível ir mais longe. Vamos analisar o número de pesquisas por dia da semana:

f1

f2

Bem, nenhuma novidade aqui, o número de pesquisas de Sábados e Domingos é menor e ao longo do mês as pesquisas são consistentes com exceção do dia 31, mas isso era esperado.

f3

A utilização desde 2013 aumentou consideravelmente, não só eu já utilizo bastante o Google como essa dependência tem aumentado ao longo do tempo.

Por fim, selecionei alguns dos termos que mais pesquisei para compara-los no tempo e o gráfico abaixo é o mesmo que dei como exemplo acima, onde eu apanhei um pouco para montar um gráfico que compartilhasse os eixos no Python (como vocês podem ver, eu só comecei a estudar Python recentemente)

f4

Alguns pontos são interessantes.

  • Wikipedia é uma constante em nossas vidas
  • Meu interesse pelo R provavelmente cresceu na mesma velocidade que a adoção do pacote ‘Dplyr’, que foi lançado no começo de 2014, até lá eu só o utilizava para rodar alguns modelos, mas não para ‘brincar’ com dados
  • Ultimamente, por conta do trabalho, tenho substituído o R pelo Python
  • As pesquisas sobre jogos costumam ter a mesma duração que meu interesse sobre eles e olhando para esse gráfico eu joguei muito mais Dota do que eu gostaria de admitir.
  • Apesar de parecer, não há correlação entre as pesquisas de jogos e trabalho, eu só não incluí mais gráficos…