Crônicas de MicroZed: Deephi DNNDK – Deep Learning SDK

Adam Taylor Blocked Desbloquear Seguir Seguindo 9 de janeiro

Para aqueles que trabalham com aprendizado de máquina / inteligência artificial, a aquisição da Deephi pela Xilinx foi bastante emocionante. A tecnologia do Deephi simplifica significativamente a aceleração de redes neurais profundas em SoCs heterogêneos, como o Zynq e o Zynq MPSoC.

Isso é algo que é muito interessante para mim, e nas próximas semanas e meses, eu vou criar vários projetos do Hackster que usam a tecnologia do Deephi. No entanto, achei que um blog que apresentasse a abordagem do Deephi também seria uma boa ideia, apenas para lançar o trabalho de base.

Pilha DNNDK – fonte UG1327

Para acelerar aplicações de aprendizagem profunda para aplicações de visão computacional, como classificação de imagens, detecção e rastreamento de objetos, o Deephi fornece o DNNDK ( Deep Neural Network Development Kit ). O DNNDK é baseado em APIs C / C ++ e nos permite trabalhar com estruturas padrão comuns do setor e com redes populares, incluindo VGG, ResNet, GoogLeNet, YOLO, SSD e MobileNet.

No coração do DNNDK, que permite a aceleração dos algoritmos de aprendizagem profunda, está a unidade de processamento de aprendizagem profunda (DPU). Em nosso sistema Zynq ou Zynq MPSoC, o DPU reside na lógica programável. Para suportar diferentes acelerações de aprendizagem profunda, existem diversas variantes de DPUs que podem ser implementadas.

Unidade de processador de aprendizagem profunda (DPU) – fonte UG1327

Os estágios básicos da implementação de um aplicativo AI / ML em um MPSoC Zynq / Zynq usando DNNDK são:

  1. Comprimir o modelo de rede neural – Leva o modelo de rede (prototexto), pesos treinados (Caffe) e produz um modelo quantizado que usou a representação INT8. Para conseguir isso, um pequeno conjunto de treinamento de entrada também é normalmente necessário – isso contém de 100 a 1000 imagens.
  2. Compile o modelo de rede neural – Isso gera os arquivos ELF necessários para as instâncias do DPU. Ele também identificará elementos da rede que não são suportados pelo DPU para implementação na CPU.
  3. Crie o programa usando APIs DNNDK – Com os Kernels do DPU criados, agora podemos criar o aplicativo que gerencia as entradas e saídas, executa o gerenciamento do ciclo de vida do Kernel do DPU e o gerenciamento de tarefas do DPU. Durante este estágio, também precisamos implementar elementos de rede não suportados pelo DPU na CPU.
  4. Compile o aplicativo DPU híbrido – Quando o aplicativo estiver pronto, podemos executar o compilador híbrido, que fará o código da CPU e o vinculará aos ELFs para os DPUs dentro da lógica programável.
  5. Execute o executável do DPU híbrido em nosso destino.

Visão Geral de Compilação Híbrida – UG1327

Para executar essas cinco etapas, o DNNDK fornece várias ferramentas diferentes, que são divididas entre o host e o destino.

No lado do host, oferecemos as seguintes ferramentas:

  • DECENT – Ferramenta de compressão profunda, pré-forma a compressão do modelo de rede.
  • DNNC – compilador de rede neural profunda, realiza a compilação de rede. O DNNC tem um subcomponente DNNAS – assembler de rede neural profunda que gera os arquivos ELF para o DPU.

Enquanto no lado do alvo:

  • N2Cube – Este é o mecanismo de tempo de execução do DPU e fornece o carregamento de aplicativos DNNDK, programação e alocação de recursos. Os principais componentes do N2Cube incluem o driver DPU, o carregador DPU e o rastreador DPU.
  • DExplorer – Fornece informações da DPU durante o tempo de execução.
  • DSight – Ferramenta de criação de perfil que fornece dados de visualização com base nas informações do Dtracer.

Implantação – UG1327

Para continuar com o DNNDK , o Deephi tem vários designs de exemplo. Correndo através de um deles é realmente o melhor lugar é começar. Existem atualmente projetos de referência disponíveis para o ZCU102, ZCU104 e o Ultra96.

Os exemplos ZCU102 e ZCU104 são projetados para aplicativos de alto desempenho e alto rendimento. Esses exemplos fornecem desempenho de até 7,7 GOPS e 175 quadros por segundo ao implementar o ResNet.

Enquanto isso, o exemplo do Ultra96 foi projetado para mostrar um aplicativo de baixa potência (borda), que tem uma taxa de transferência menor de 25 quadros por segundo para a mesma implementação do ResNet.

Nas próximas semanas e meses, estarei trabalhando com o DNNDK para meus projetos da Hackster. Tenho certeza de que também voltaremos a isso nas Crônicas.

Texto original em inglês.