Por que você não deveria jogar fora a Radeon se gosta de aprendizado de máquina?

imagem


Consegui coletar minha estação de trabalho como estudante. Logicamente, eu preferia as soluções de computação AMD. porque barato rentável em termos de preço / qualidade. Peguei os componentes por um longo tempo, no final, entrei com 40k com um conjunto de FX-8320 e RX-460 2GB. No começo, este kit parecia perfeito! Meu colega de quarto e eu extraímos Monero um pouco e meu set mostrou 650h / s contra 550h / s em um conjunto de i5-85xx e Nvidia 1050Ti. É verdade que do meu aparelho na sala estava um pouco quente à noite, mas isso foi decidido quando comprei um refrigerador de torre para a CPU.


A história acabou


Tudo era como em um conto de fadas exatamente até que me interessei pelo aprendizado de máquina no campo da visão computacional. Ainda mais precisamente - até que eu tive que trabalhar com imagens de entrada com uma resolução superior a 100x100px (até esse momento, meu FX de 8 núcleos lidava rapidamente). A primeira dificuldade foi a tarefa de determinar emoções. 4 camadas ResNet, insira imagens 100x100 e 3000 no conjunto de treinamento. E agora - 9 horas de treinamento 150 eras na CPU.
Obviamente, devido a esse atraso, o processo de desenvolvimento iterativo sofre. No trabalho, tínhamos a Nvidia 1060 6GB e treinando para uma estrutura semelhante (embora a regressão tenha sido treinada lá para localizar objetos), ela voou em 15 a 20 minutos - 8 segundos para uma era de 3,5 mil imagens. Quando você tem esse contraste embaixo do nariz, a respiração fica ainda mais difícil.


Bem, adivinha o meu primeiro passo depois de tudo isso? Sim, fui negociar 1050Ti com meu vizinho. Com argumentos sobre a inutilidade da CUDA para ele, com uma oferta para trocar meu cartão por um custo extra. Mas tudo em vão. E agora estou postando meu RX 460 no Avito e revendo o aclamado 1050Ti nos sites da Citylink e TechnoPoint. Mesmo no caso de uma venda bem-sucedida do cartão, eu precisaria encontrar outros 10 mil (eu sou um estudante, embora esteja trabalhando).


Google


Ok Vou ao google como usar o Radeon no Tensorflow. Sabendo que essa era uma tarefa exótica, não esperava encontrar nada sensato. Colete no Ubuntu, seja ele inicializado ou não, pegue frases com frases dos fóruns.


E então segui o outro caminho - não pesquisei no Tensorflow AMD Radeon, mas no Keras AMD Radeon. Ele instantaneamente me lança na página do PlaidML . Inicio em 15 minutos (embora eu tenha que fazer o downgrade do Keras para 2.0.5) e configurei a rede para aprender. A primeira observação - a era é de 35 segundos em vez de 200.


Suba para explorar


Os autores do PlaidML são vertex.ai , que faz parte do grupo de projetos da Intel (!). O objetivo de desenvolvimento é o máximo entre plataformas. Obviamente, isso adiciona confiança ao produto. O artigo deles diz que o PlaidML é competitivo com o Tensorflow 1.3 + cuDNN 6 devido à "otimização completa".


No entanto, continuamos. O artigo a seguir, em certa medida, nos revela a estrutura interna da biblioteca. A principal diferença de todas as outras estruturas é a geração automática de núcleos de cálculo (na notação Tensorflow, o "núcleo" é o processo completo de executar uma certa operação em um gráfico). Para a geração automática de kernel no PlaidML, as dimensões exatas de todos os tensores, constantes, etapas, tamanhos de convolução e valores de limite com os quais você precisará trabalhar mais tarde são muito importantes. Por exemplo, argumenta-se que a criação adicional de núcleos efetivos difere para 1 e 32 em lotes ou para convoluções dos tamanhos 3x3 e 7x7. Com esses dados, a própria estrutura gerará a maneira mais eficiente de paralelizar e executar todas as operações para um dispositivo específico com características específicas. Se você observar o Tensorflow, ao criar novas operações, também precisamos implementar o kernel para elas - e as implementações são muito diferentes para kernels de thread único, multi-thread ou compatíveis com CUDA. I.e. O PlaidML é claramente mais flexível.


Nós vamos além. A implementação é escrita no bloco de linguagem auto-escrita. Essa linguagem tem as seguintes vantagens principais - a proximidade da sintaxe com as notações matemáticas (mas enlouqueça!):


imagem


E diferenciação automática de todas as operações declaradas. Por exemplo, no TensorFlow, ao criar uma nova operação personalizada, é altamente recomendável que você escreva uma função para calcular os gradientes. Assim, ao criar nossas próprias operações na linguagem Tile, precisamos apenas dizer O QUE queremos calcular sem pensar em COMO considerar isso em relação aos dispositivos de hardware.


Além disso, é realizada a otimização do trabalho com DRAM e um análogo do cache L1 na GPU. Lembre-se do dispositivo esquemático:


imagem


Para otimização, todos os dados disponíveis sobre o equipamento são usados ​​- tamanho do cache, largura da linha de cache, largura de banda da DRAM, etc. Os métodos principais são fornecer leitura simultânea de blocos grandes o suficiente da DRAM (uma tentativa de evitar o endereçamento para áreas diferentes) e conseguir que os dados carregados no cache sejam usados ​​várias vezes (uma tentativa de evitar recarregar os mesmos dados várias vezes).


Todas as otimizações ocorrem durante a primeira era do treinamento, enquanto aumentam bastante o tempo da primeira execução:


imagem


Além disso, vale ressaltar que essa estrutura está vinculada ao OpenCL . A principal vantagem do OpenCL é que ele é um padrão para sistemas heterogêneos e nada impede que você execute o kernel na CPU . Sim, é aqui que reside um dos principais segredos do PlaidML de plataforma cruzada.


Conclusão


Obviamente, o treinamento no RX 460 ainda é 5-6 vezes mais lento que no 1060, mas você pode comparar as categorias de preço das placas de vídeo! Então eu recebi um RX 580 8gb (eles me emprestaram!) E o tempo que levou para correr a era foi reduzido para 20 segundos, o que é quase comparável.


O blog vertex.ai possui gráficos honestos (mais é melhor):


imagem


Pode-se observar que o PlaidML é competitivo com o Tensorflow + CUDA, mas certamente não é mais rápido nas versões atuais. Mas os desenvolvedores do PlaidML provavelmente não planejam entrar em uma batalha tão aberta. Seu objetivo é universalidade, multiplataforma.


Deixarei aqui uma tabela não comparativa com minhas medidas de desempenho:


Dispositivo de computaçãoTempo de execução da época (lote - 16), s
AMD FX-8320 tf200
RX 460 2GB xadrez35
RX 580 8 GB xadrez20
1060 6GB TF8
1060 6GB plaid10
Intel i7-2600 tf185
Intel i7-2600 plaid240
GT 640 plaid46.

A publicação mais recente do blog vertex.ai e as edições mais recentes do repositório estão datadas de maio de 2018. Parece que se os desenvolvedores dessa ferramenta não pararem de lançar novas versões e mais e mais pessoas ofendidas pela Nvidia estiverem familiarizadas com o PlaidML, elas falarão sobre o vertex.ai com muito mais frequência.


Descubra seus radeons!

Source: https://habr.com/ru/post/pt420989/


All Articles