ML em FPGAs

sudoVitor

Power Member
Olá, malta!

Podem dizer-me se conhecem alguma framework que me permita utilizar algoritmos de ML (ou até só redes neuronais), em FPGAs?
Vi que a Xilinx tinha algum software (Vitis) para suportar e da Intel para os seus FPGAs, mas não me parece haver muito mais coisas.

Obrigado.
 
Soluções a funcionar com "1 click" nunca usei.

Assumo que vás fazer inferencia em FPGA. Para isso o que tens que fazer é passar os pesos, bias, inputs da rede para representação em virgula fixa (fixed point), que é muito mais eficiente a nível de recursos numa FPGA normal. E depois correr no teu design específico. Para este tipo de solução existem frameworks para quantizar redes neuronais.

Se tiveres um dispositivo com FPGA e mais um hardcore CPU (por exemplo um ARM) podes tecnicamente correr a rede no CPU mesmo em float. Mas a performance será fraquita. Progressivamente vais passando partes da rede para serem calculadas num design customizado na FPGA.

Acho que agora existem placas já com recursos especificos para correr redes neuronais, provavelmente para esses existam ferramentas proprietarias da Xilinx ou da Altera/Intel que permitam correr a rede nesse hardware. Imagino que seja mais proximo do que se faz para correr uma rede neuronal em GPU.

Sei que a minha resposta ficou um pouco generalista, mas se tiveres duvidas mais especificas pode ser que consiga ajudar melhor
 
Sim, a ideia será treinar uma rede numa GPU, por exemplo, e passar os pesos e bias para o FPGA.
Idealmente, usarei um SoC FPGA (ARM + FPGA).

A questão que se coloca é que não sei se existe alguma forma mais fácil de implementar a rede neuronal. Por exemplo, em algumas bibliotecas é possível definir que se quer usar uma GPU (usualmente, NVIDIA). Creio que o mesmo não acontece para FPGAs.

A ideia com que fiquei a ver as coisas da Xilinx e da Intel foi que nunca fugiria muita da implementação em C/C++, enquanto que soluções mais viáveis seriam obrigatoriamente em VHDL ou Verilog, o que vai tomar muito mais tempo no desenvolvimento.

Há alguma maneira mais direta de implementar uma rede neuronal diretamente no FPGA, que conheças? Talvez este campo ainda esteja demasiado verde.
 
A experiencia que tenho foi sempre a ter um CPU (ARM ou softcore) para correr a maior parte do programa e depois desenvolver um acelerador em FPGA para partes de maior numero de calculos, mas paralelizáveis. Por exemplo numa CNN o ideial é acelerar as convoluções.

Começas por desenvolver a rede em C/C++ onde tens que gerir as alocações de memória à mão (quando fiz isso não usei malloc nem OS, por isso tinha que estar sempre atento às regiões da memória que escrevia e lia).

Corres essa versão de software totalmente no ARM com ligação à DDR.

Depois podes pegar numa parte do programa e tentar criar um IP Core especifico para tirar partido de paralelismo.

Para desenvolver o acelerador podes usar uma linguagem de descrição de hardware como VHDL ou Verilog. Outra opção na Xilinx é usares o HDL (provavelmente a Altera/Intel tenha um equivalente). Com essa ferramente podes descrever o teu modulo quase como se estivesses a escrever o código em C++ com umas APIs e bibliotecas especificas para o ambiente da Xilinx. Depois a ferramenta com isso gera o custom IP. Mas depois não vais poder andar lá dentro a debuggar sinais, ficas quase com uma black box em que só podes ver as entradas e saídas.

Lá está, se a placa que usares tiver hardware específico para aceleração de redes neuronais, é possível que existam ferramentas mais automaticas para acelerar a rede, mas aí já estás a usar o pseudo-GPU/ AI accelerator do dispositivo e não a FPGA.

Sinceramente não conheço e duvido que haja uma ferramenta generica que faça tudo isto. Mas pode ser que te safes a encontrar ferramentas que faças alguns dos passos.

Mas é possível que encontres projetos online ou mesmo exemplos da Xilinx ou Altera para redes populares como a LeNet ou a Alexnet. E depois podes adaptar para o teu caso.
 
Boa, obrigado pela partilha!
Estou agora a explorar esta componente de uso de FPGA, principalmente para uso on-the-edge, e não é muito óbvio. Está tudo ainda muito verdinho, e torna-se confuso.

Vou procurar alguns projetos exemplo e experimentar. BTW, que hardware usaste?
 
ML em FPGAs o que já fiz foi:

Algoritmo de KNN (K-Nearest Neighbours) numa Basys3 (full custom IP em VHDL).

LeNet numa Zynq (CPU ARM e custom IP feito com HDL, a cena de descrever com C++ da Xilinx). Neste projeto usei o Vivado e o HDL SDK se não estou enganado. O Vitis acho que apareceu algum tempo depois de terminar o projeto e nunca cheguei a usar.

Tiny Yolov3 numa Ultrascale+ (softcore RISC-V + custom IPs em verilog, unica coisa parte "black box" da Xilinx é o IP para ligar o sistema à DDR)

Tudo "projetos de laboratório", nunca cheguei a fazer deployment num ambiente real.

Em todos os projetos parti do codigo em C/C++ e tive que fazer a adaptação para fixed-point, gestão de memória, etc "à mão". Apenas tenho conhecimento de algumas frameworks (exemplo o Ristretto), mas nunca cheguei a usar.
 
Back
Topo