Escolhendo entre CPU e GPU para treinar uma rede neural


29

Vi discussões sobre a sobrecarga de uma GPU e, para redes 'pequenas', pode ser mais rápido treinar em uma CPU (ou rede de CPUs) do que em uma GPU.

O que se entende por 'pequeno'?

Por exemplo, um MLP de camada única com 100 unidades ocultas seria 'pequeno'?

Nossa definição de 'pequeno' muda para arquiteturas recorrentes?

Existem outros critérios que devem ser considerados ao decidir treinar na CPU ou GPU?

EDIT 1:

Acabei de encontrar uma postagem no blog (possivelmente desatualizada? É de 2014):

"... A maioria das placas de rede funciona apenas com a memória registrada na CPU e, portanto, a transferência de GPU para GPU entre dois nós seria assim: GPU 1 para CPU 1 para placa de rede 1 para placa de rede 2 para placa de rede 2 para CPU 2 à GPU 2. O que isso significa é que, se alguém escolher uma placa de rede lenta, pode não haver acelerações em um único computador.Com placas de rede rápidas, se o cluster for grande, nem se obterá acelerações das GPUs quando comparadas às CPUs, já que as GPUs trabalham rápido demais para que as placas de rede as acompanhem.

Essa é a razão pela qual muitas grandes empresas como Google e Microsoft estão usando CPU em vez de clusters de GPU para treinar suas grandes redes neurais. "

Então, em algum momento, de acordo com este post, poderia ter sido mais rápido usar CPUs. Ainda é esse o caso?

EDIÇÃO 2: Sim, essa postagem do blog pode muito bem estar desatualizada porque:

Agora parece que as GPUs dentro de um nó estão conectadas via barramento PCIe, de modo que a comunicação pode ocorrer em cerca de 6GiB / s. (Por exemplo: https://www.youtube.com/watch?v=el1iSlP1uOs , aproximadamente 35 minutos). O alto-falante implica que isso é mais rápido do que passar da GPU1 para a CPU e para a GPU2. Isso significaria que a placa de rede não é mais o gargalo.


Aquele cara com seu post no blog traz bons pontos. Eu não entendi todas as suas justificativas. No entanto, o fato de o Google, o Facebook, o Twitter e todos os principais grupos de aprendizado profundo da academia executarem seus códigos principalmente nas GPUs sugere que é uma boa ideia. Embora tendencioso: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Respostas:


28

Ao contrário de algumas das outras respostas, eu recomendaria altamente não treinar sempre em GPUs sem pensar duas vezes. Isso é impulsionado pelo uso de métodos de aprendizado profundo em imagens e textos, onde os dados são muito ricos (por exemplo, muitos pixels = muitas variáveis) e o modelo também possui muitos milhões de parâmetros. Para outros domínios, esse pode não ser o caso.

O que se entende por 'pequeno'? Por exemplo, um MLP de camada única com 100 unidades ocultas seria 'pequeno'?

Sim, isso é definitivamente muito pequeno para os padrões modernos. A menos que você tenha uma GPU adequada para treinamento (por exemplo, NVIDIA 1080 ou NVIDIA Titan), não ficaria surpreso ao descobrir que sua CPU era mais rápida.

Observe que a complexidade da sua rede neural também depende do número de recursos de entrada, não apenas do número de unidades na camada oculta. Se sua camada oculta tiver 100 unidades e cada observação em seu conjunto de dados tiver 4 recursos de entrada, sua rede será pequena (~ 400 parâmetros). Se cada observação tiver recursos de entrada de 1 milhão, como em alguns contextos médicos / biotecnológicos, sua rede será bastante grande em termos de número de parâmetros. Para o restante da minha resposta, suponho que você tenha muito poucos recursos de entrada pr. observação.

Um bom exemplo que encontrei de comparar o desempenho da CPU versus GPU foi quando treinei um bot de pôquer usando o aprendizado por reforço. Para o aprendizado por reforço, muitas vezes você não deseja tantas camadas em sua rede neural e descobrimos que precisávamos apenas de algumas camadas com poucos parâmetros. Além disso, o número de recursos de entrada era bastante baixo. Inicialmente, treinei em uma GPU (NVIDIA Titan), mas estava demorando muito tempo, pois o aprendizado por reforço exige muitas iterações. Felizmente, descobri que o treinamento na minha CPU fazia com que meu treinamento fosse 10x mais rápido! Isso é apenas para dizer que às vezes as CPUs podem ser melhores para o treinamento.

Existem outros critérios que devem ser considerados ao decidir treinar na CPU ou GPU?

É importante observar que, enquanto estiver em uma GPU, você sempre desejará preencher toda a memória da GPU aumentando o tamanho do lote, o que não acontece na CPU. Na CPU, um aumento no tamanho do lote aumentará o tempo pr. lote. Portanto, se é importante que você tenha um tamanho de lote muito grande (por exemplo, devido a um sinal muito barulhento), pode ser benéfico usar uma GPU. Não experimentei isso na prática e normalmente são preferidos tamanhos de lotes pequenos.


Obrigado @pir! Você tem alguma referência específica onde eu possa ler mais?
StatsSorceress

Você pode encontrar facilmente o número de parâmetros, por exemplo, do VGG para comparar e ver que sua rede é pequena em comparação.
Pir

3
Eu não vi um monte de comparações CPU / GPU em redes pequenas, porque não é isso que as grandes empresas e laboratórios de pesquisa está interessado.
pir

@StatsSorceress Se você quiser testá-lo por conta própria, por que não apenas configurar um simples Keras MLP e testar o desempenho em GPU vs. CPU? Veja também minha resposta atualizada wrt. o tamanho da sua rede.
pir

5

A CPU é o gerente da filial, ele pode fazer um pouco de tudo, mas ele não é muito bom, exceto delegar tarefas. No entanto, a GPU é um matemático dedicado escondido em sua máquina. Se você estiver executando algum processo pesado de matemática, use sua GPU. Sempre.

Se você estiver usando qualquer linguagem de programação popular para aprendizado de máquina, como python ou MATLAB, é um código de linha única para informar ao seu computador que você deseja que as operações sejam executadas na sua GPU.

Você também deve usar todos os núcleos da sua máquina. Isso significa fazer uso da computação paralela. Especialmente para redes neurais onde as operações podem ser realizadas de forma independente, isso aumentará imensamente sua velocidade.


4
Descobri que algumas vezes a sobrecarga de transferência de dados de e para a GPU apaga completamente o aumento de velocidade do paralelismo. Nem sempre é uma boa ideia ir para a GPU.
Adrian Keister

11
Depende da complexidade do seu modelo. Se você está treinando um K-NN simples, talvez não valha a pena. No entanto, se você estiver treinando qualquer modelo que exija uma matriz inversa ou uma rede neural que precise de muitas operações consequentes da matriz, é sempre uma boa ideia optar pela GPU.
precisa saber é o seguinte

11
@AdrianKeister Eu concordo. É isso que eu estava tentando entender na minha resposta. Para a rede mencionada pelo OP, isso provavelmente seria o gargalo.
pir

11
100 unidades ocultas são mais rápidas na GPU usando minha máquina. Eu precisaria de um número muito pequeno de unidades ocultas para que a CPU fosse mais rápida. Além disso, eu sempre costumo fazer meu treinamento em lotes. Nesse caso, duvido que uma CPU seja o gargalo, considerando dados suficientemente densos.
JahKnows 8/17/17

3

Primeiro, cito algumas citações de perguntas semelhantes:

Quando se trata de operações matriciais, você não pensa duas vezes, sempre opta por GPUs. fonte

A arquitetura paralela em uma GPU é bem adaptada para operações de vetores e matrizes. fonte

Portanto, se você ler essas perguntas, verá que elas recomendam o uso da GPU, independentemente do caso; sempre fornecerá algumas melhorias.

O motivo pelo qual você deve ter lido que redes 'pequenas' devem ser treinadas com CPU é porque implementar o treinamento da GPU para apenas uma pequena rede pode levar mais tempo do que simplesmente treinar com a CPU - isso não significa que a GPU será mais lenta.

Uma rede de 100 unidades ocultas é meio pequena , eu diria que é uma rede pequena em relação às grandes redes profundas por aí. As arquiteturas recorrentes (principalmente) têm mais sinapses do que redes de alimentação direta, portanto, uma RNN de 100 unidades ocultas é 'maior' que uma FFN de 100 unidades ocultas.


Não é verdade que, se você tem um MLP com uma única camada oculta de 100 unidades, esse número de parâmetros é igual a um RNN padrão com 100 unidades ocultas devido ao compartilhamento de peso? Tem mais 'sinapses' - mais 'ativações' - mas o mesmo número de parâmetros, certo?
StatsSorceress

não conheço o termo compartilhamento de peso. Ele tem a mesma quantidade de ativações, mas mais conexões para mais parâmetros ...
Thomas W

Compartilhamento de peso significa que a matriz de peso de uma camada oculta na RNN para a próxima camada oculta é a mesma; é a mesma matriz 'U', replicada ao longo do tempo. Além disso, os pesos da entrada à camada oculta são os mesmos ao longo do tempo.
StatsSorceress

@StatsSorceress Eu não estou familiarizado com o trabalho com matrizes. Sim, a matriz de peso de uma camada oculta para a próxima é a mesma. No entanto, há mais conexões no total (porque uma camada também pode ser conectada à camada ANTERIOR). Eu não sei como eu posso explicar, mas uma RNN sempre terá mais parâmetros como existem camadas mais conectados ..
Thomas W

Sim, entendo que existem fisicamente mais parâmetros, mas muitos desses parâmetros têm o mesmo valor, o que significa que o número efetivo de parâmetros em um MLP e um RNN com o mesmo número de dimensões de entrada e o mesmo número de dimensões ocultas será o mesmo.
StatsSorceress
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.