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.
fonte
Respostas:
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.
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.
É 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.
fonte
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.
fonte
Primeiro, cito algumas citações de perguntas semelhantes:
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.
fonte