DeepFreeze é a ferramenta usada para modelar a PPA e gerar RTL para o projeto Fixynn . Os scripts são incluídos para gerar RTL a partir de um gráfico de tensorflow e para sintetizar/simular esse design. Para trabalhar com um gráfico não-tensorflow, você deve escrever sua própria estrutura de dados da camada para alimentar um objeto veriloggenerator (consulte o final do gen_verliog.py
, por exemplo, uso).
Para obter mais informações sobre o Fixynn , incluindo uma descrição do DeepFreeze no contexto, consulte o seguinte artigo: Fixynn: hardware eficiente para a visão computacional móvel por meio de aprendizado de transferência.
Esta ferramenta foi construída e testada usando o Python 2.7.15 e o TensorFlow 1.10.1.
Os pacotes Python necessários são Numpy e Tensorflow. Para instalar:
pip install numpy tensorflow
cd deep_freeze/
bash run.sh
Para adicionar um modelo para geração ou modelagem RTL, você precisa fornecer:
mobilenet_base
retorna em https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py)Cada camada em uma rede fixa é definida por um módulo verilog gerado ou por uma instanciação parametrizada de um módulo manuscrito. Qualquer camada com variáveis treináveis é gerada e todos os outros são instanciados. As variáveis treináveis são codificadas no RTL com precisão variável e são implementadas em um design sintetizado como escalares fixos. O que tradicionalmente seria implementado em uma unidade MAC em um acelerador programável é composto por escalares fixos, seguidos por uma árvore de adder de transporte em um design de peso fixo. Isso é muito eficiente em energia, mas requer uma grande área de silício. A área de silício cresce aproximadamente linearmente com o nuber de variáveis fixas.
Para obter alta utilização de dados fixos, nós unem camadas de pipeline. Isso requer ativações buffers entre camadas. Podemos evitar o buffer de toda a ativação de uma camada utilizando um buffer de linha. Este artigo fornece uma explicação fundamental que buffers de linha e como eles são usados.
Nossa implementação de um buffer de linha é composta por duas partes: um buffer SRAM e um buffer de registro. O SRAM armazena ativações para tantas linhas quanto precisam ser sumoradas por vez (igual à altura do kernel a seguir). O buffer de registro segue o buffer SRAM e armazena ativações MXN para os seguintes kernels MXN. Isso elimina leituras desnecessárias do buffer SRAM.
O tamanho do SRAM necessário para uma camada é IM_HEIGHT * IM_WIDTH * NCHANNELS * NBITS
. Isso é dividido em IM_HEIGHT * IM_WIDTH
palavras de tamanho NCHANNELS * NBITS
. O tamanho do buffer de registro é K_HEIGHT * K_WIDTH * NCHANNELS * NBITS
.
A fixação de camadas no hardware oferece uma oportunidade para uma variedade de otimizações agressivas (otimizações de hardware e otimizações no design do modelo).
Melhorias na arquitetura de rede podem resultar em melhorias de PPA de hardware. Por exemplo, camadas separáveis em profundidade são capazes de obter uma precisão semelhante às camadas convolucionais tradicionais com 8-9x menos pesos. Essas camadas têm um desempenho muito bom em Fixynn devido aos custos reduzidos da área. Quaisquer outras técnicas que reduzam o tamanho do modelo ou melhorem a precisão podem beneficiar o Fixynn.
A fixação de pesos no silício nos permite nos beneficiar da complexidade reduzida de certos valores. Os pesos de valor zero são um exemplo: eles podem ser explicitamente removidos do hardware sem sobrecarga. Isso torna a poda especialmente poderosa e atraente.
Além disso, valores com pesos baixos de hamming, ou seja, o número de bits diferentes de zero em sua representação binária, são baratos de implementar em hardware fixo. Isso ocorre porque os escalares fixos são implementados como uma série de turnos e acrescenta. Quanto menos bits diferentes de zero do multiplicando fixo, menos turnos e adicionar necessários. A ferramenta de síntese também é capaz de aproveitar os valores com alto peso em hamming em relação ao número total de bits necessários para representar o número. Por exemplo, um escalar x * 239
(peso de hamming = 7, nbits = 8) pode ser implementado como x << 8 - x << 5
no hardware.
Para imagens de alta resolução, cada linha de um buffer de linha requer uma área significativa do SRAM. Podemos eliminar parte desse SRAM, buffer apenas frações de uma linha de cada vez e fazendo vários passes pela imagem. Isso tem o custo do aumento do hardware de controle e algum cálculo redundante de ativações nos limites da faixa de buffer de linha. Esse cálculo redundante incorre no custo mínimo de energia e latência porque o hardware de peso fixo é muito eficiente.
Qualquer kernel 1x1 não requer buffer que o prevente, pois pode consumir diretamente as ativações geradas pela camada anterior. Isso resulta em camadas separáveis profundas que não exigem qualquer buffer entre as convoluções profundas e pontuais. Portanto, podemos fundir essas duas operações em um bloco cambinacional.
As camadas conv2d são eficazes nesse projeto porque exibem reutilização de alto peso, o que resulta em um custo de área relativamente baixo. Camadas densas não exibem reutilização de peso. Portanto, camadas densas resultam em um uso muito ineficiente da área. Além disso, camadas densas não permitem buffer de linha, o que resulta em áreas de registro bastante grandes.
Nosso trabalho para o SYSML 2019 (consulte sysml_2019/
) explora os extratores de características CNN totalmente fixados. O PPA para esse extrator de recurso é ótimo porque contém apenas camadas conv2d. Redes inteiras implementadas em hardware fixo devem pagar o custo da área que as camadas densas exigem. Isso pode ser aceitável para pequenos modelos de IoT.
Os CNNs normalmente exibem o comportamento em que as camadas front-end têm muitos pixels de entrada e um pequeno número de grãos, enquanto as camadas de back-end têm menos pixels de entrada e um grande número de grãos. Isso resulta na área de SRAM estar concentrada em direção à frente do pipeline de rede, enquanto a área combinacional está concentrada na parte traseira do pipeline de rede.
Qualquer camada com um passo maior que 1x1 produz menos pixels de ativação do que consome por imagem. Por exemplo, uma camada pool2d que passa 2x2 sobre uma imagem de 100x100 produz uma imagem de 50x50, que é uma redução de 4x em pixels. Isso resulta nas seguintes camadas com 1/4x do número de ciclos ativos (cada pixel de saída por camada requer 1 ciclo). Isso significa que pipelines de rede muito profundos, com muita amostragem de baixo, serão bastante gargalos pelas camadas front-end, resultando em baixa utilização de camadas de back-end.
Esse insight nos ajuda a selecionar modelos que se traduzem bem em hardware. Certas arquiteturas executam a redução precoce de ativações para reduzir a latência em uma CPU, reduzindo o número total de MACs (ao custo do tamanho do modelo) (consulte FD-MobileNet). Os modelos implementados em Fixynn desejam fazer o comércio oposto: reduzir o número de parâmetros ao custo da computação (pois a área é a principal limitação do desempenho em um sistema do mundo real).
Corrigir uma parte de uma CNN em hardware dificulta a reutilização desse hardware para algum outro objetivo. Nosso trabalho para o SYSML 2019 explora esse trade-off e demonstra que uma quantidade de hardware fixo é capaz de generalizar para muitos modelos diferentes. Trabalhos futuros se concentrarão em melhorar ainda mais a generalização do hardware fixo, adicionando alguma programação (enquanto ainda se beneficia da eficiência do hardware de peso fixo).
SAME
preenchimento modificando sram_controller.sv
flatten.sv
para ativar redes de classificação de imagem totalmente fixo, achatando uma imagem de camadas 2D para camadas densas.ker_size
de dados for gravado no SRAM.Os trabalhos publicados que utilizaram essa ferramenta foram apresentados no SYSML 2019 e no Neurips 2018 On-Device ML Workshop. O papel completo pode ser encontrado no ARXIV no Fixynn: Hardware eficiente para visão computacional móvel por meio de aprendizado de transferência.
Se você achar esse deepfreeze útil para sua pesquisa, use o seguinte Bibtex para nos citar,
@article{fixynn,
title={FixyNN: Efficient Hardware for Mobile Computer Vision via Transfer Learning},
author={Whatmough, Paul and Zhou, Chuteng and Hansen, Patrick and Venkataramanaiah, Shreyas Kolala and Seo, Jae-Sun and Mattina, Matthew},
journal={SysML},
year={2019}
}
Patrick Hansen, Arm ML Research Lab, Boston, MA
Shreyas Kolala Venkataramanaiah, Universidade Estadual do Arizona
Paul Whatmough, Arm ML Research Lab, Boston, MA
Este projeto está licenciado sob a licença do MIT - consulte o arquivo de licença para obter detalhes.