IA fora da nuvem
Rodar o modelo no próprio dispositivo (a "borda") protege a privacidade e responde na hora, sem internet. Só que esses dispositivos têm pouca memória e pouca energia.
trabalho de conclusão / engenharia de computação, univasf
Inferência de CNNs INT8 num RISC-V com acelerador sistólico.
Celulares e câmeras cada vez mais rodam inteligência artificial no próprio aparelho, sem mandar dados para a nuvem. Neste TCC eu montei, numa placa FPGA de baixo custo, um pequeno sistema que faz isso: um processador RISC-V coordena e um acelerador que eu desenhei em VHDL faz as contas pesadas da rede neural. Tudo com números de 8 bits, para caber no hardware.
Rodar o modelo no próprio dispositivo (a "borda") protege a privacidade e responde na hora, sem internet. Só que esses dispositivos têm pouca memória e pouca energia.
Classificar uma única imagem de 28×28 pixels com esta rede exige 4,24 milhões de multiplicações seguidas de soma. Um processador simples faz uma de cada vez.
O acelerador é uma grade de 8×8 células. Cada uma guarda um peso da rede, multiplica pelo dado que chega e passa o resultado adiante. Assim, até 64 contas acontecem ao mesmo tempo.
Em vez de números com vírgula (32 bits), a rede usa inteiros de -128 a 127. O modelo fica 4 vezes menor e o hardware muito mais simples, perdendo quase nada de acurácia.
Desenhe no quadro ou escolha uma amostra. A rede roda aqui no seu navegador com exatamente a mesma aritmética inteira do firmware da placa: conferi camada por camada contra as saídas de referência, e os 120 de 120 estágios testados batem bit a bit.
desenhe um dígito
–aguardando uma imagem
Barras: saída INT8 de cada classe (o que o firmware imprime na serial), convertida em probabilidade.
Um arranjo sistólico funciona como uma linha de montagem. Os pesos da rede ficam parados, um em cada célula (weight-stationary). Os dados entram pela esquerda, um ciclo de atraso por linha, e as somas parciais descem pelas colunas. A cada batida do clock, todas as células trabalham ao mesmo tempo.
O firmware em C, no RISC-V, quebra cada camada em blocos de 8×8 pesos (tiling), carrega o bloco no acelerador pelo barramento Wishbone e recolhe os resultados.
| camada | linhas de dados | blocos 8×8 | multiplicações |
|---|
| conjunto | float32 | INT8 (firmware) |
|---|---|---|
| MNIST (dígitos) | 98,72% | 98,20% |
| Fashion-MNIST (roupas) | 91,78% | 91,85% |
Passar de 32 para 8 bits custou meio ponto percentual nos dígitos e nada nas roupas. Os pesos caíram para 422 KB, o que cabe na SDRAM da placa. Os dois modelos usam a mesma arquitetura, então trocar de tarefa é só trocar os pesos e as escalas, sem mudar o hardware.
INT8 medido na simulação bit-exata do firmware, em 2.000 imagens do conjunto de teste.
inference.c e o driver do acelerador, e gera as ativações esperadas de cada camada. A placa precisa produzir os mesmos bytes, e esta página também produz.