Qual é a vantagem de manter o tamanho do lote com uma potência de 2?


14

Enquanto treinamos modelos em aprendizado de máquina, por que às vezes é vantajoso manter o tamanho do lote em uma potência de 2? Eu pensei que seria melhor usar um tamanho que seja o maior ajuste na sua memória GPU / RAM.

Esta resposta afirma que, para alguns pacotes, uma potência de 2 é melhor como um tamanho de lote. Alguém pode fornecer uma explicação detalhada / link para uma explicação detalhada para isso? Isso é verdade para todos os algoritmos de otimização (descida de gradiente, retropropagação etc.) ou apenas para alguns deles?

Respostas:


18

Esse é um problema de alinhamento dos processadores virtuais (VP) com os processadores físicos (PP) da GPU. Como o número de PP geralmente é uma potência de 2, o uso de um número de VP diferente de uma potência de 2 leva a um desempenho ruim.
Você pode ver o mapeamento do VP no PP como uma pilha de fatias de tamanho do número de PP .
Digamos que você tenha 16 PP.
Você pode mapear 16 VP neles: 1 VP é mapeado em 1 PP.
Você pode mapear 32 VP neles: 2 fatias de 16 VP, 1 PP será responsável por 2 VP.
Etc. Durante a execução, cada PP executará o trabalho do 1º vice-presidente pelo qual ele é responsável e, em seguida, o trabalho do 2º vice-presidente etc.
Se você usar 17 VP, cada PP executará o trabalho do seu 1º PP e, em seguida, 1 PP será executar o trabalho do dia 17 eos outros não farão nada (detalhados abaixo).
Isso se deve ao paradigma SIMD (chamado vetor nos anos 70) usado pelas GPUs. Isso geralmente é chamado de paralelismo de dados: todos os PP fazem a mesma coisa ao mesmo tempo, mas com dados diferentes. Veja https://en.wikipedia.org/wiki/SIMD .
Mais precisamente, no exemplo com 17 VP, uma vez concluído o trabalho da 1ª fatia (por todos os PPs fazendo o trabalho de seu 1º VP), todos os PP farão o mesmo trabalho (2º VP), mas apenas um tem algum dados para trabalhar .
Nada a ver com a aprendizagem. Isso é apenas coisas de programação.


seria mais preciso dizer que os tamanhos dos lotes devem ser múltiplos do número de PP? Ou seja, no seu exemplo, podemos mapear 16x3 = 48 VP para 16 PP?
1west

Sim. bem ... Se você faz o mapeamento de VP -> PP, você mesmo tem certeza de que está 100% certo. Se você usa uma biblioteca, peça 80 VP. Não tenho certeza. Não estou dizendo que você está errado. Se a proporção for uma potência de 2, você poderá usar otimizações muito clássicas e fáceis. Pense em acessos à memória. Se o número de vizinhos no andar de cima de um VP não for 2, digamos 5, a lib não poderá usar acessos clássicos O (log_2 (n)) à memória dos vizinhos com a mesma facilidade.
jcm69

@ jcm69 você pode explicar ou dar o link para log_2 (n) tempo de acesso para acesso à memória VP
Arayan Singh

Essa é apenas uma consideração geral sobre o manuseio de objetos na ciência da computação. Quando você tem certeza de que os objetos seguem o poder de 2 regras, eles podem ser gerenciados com facilidade e segurança por árvores de pesquisa binária, turnos binários etc. Quando você não tem certeza, bem, talvez seja necessário fazer alguns testes adicionais e algo mais complicado. De qualquer forma, isso é um pouco longe da pergunta inicial;)
jcm69
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.