GNA: um Coprocessador para Aceleração Neural

GNA é um coprocessador responsável pela aceleração Gausiana e processamento de inferência integrados em alguns modelos de processadores. O GNA é similar ao coprocessador matemático dos processadores 386 da década de 90. Neste texto veremos como utilizá-lo junto ao kernel do Linux.

[ Hits: 4.369 ]

Por: Alessandro de Oliveira Faria (A.K.A. CABELO) em 26/10/2021 | Blog: http://assuntonerd.com.br


Introdução



A Intel integrou diretamente no processador o recurso de aceleração para atender a crescente demanda de processamento de inferência no mercado de IA. Este recurso de aceleração foi batizado de GNA (biblioteca de aceleração neural e gausiana). Abaixo as instruções de como utilizar este recurso em sistemas operacionais Linux. A sintaxe foi baseada em openSUSE mas é facilmente adaptável para qualquer distribuição. O hardware utilizado foi o Beast Canyon NUC com um processador Core i9-11900KB.

O Intel GNA é um coprocessador neural de baixa potencia para inferência na borda. Quando a energia e desempenho são importantes, este recurso é ideal para soluções de mercado que exigem uma menor carga de trabalho para CPU. Mais detalhes estão disponíveis no texto que disponibilizei no blog da i2Ai (Associação Internacional de Inteligencia Artificial).

Requisitos

Precisaremos inicialmente instalar o pacote CMake, pkg-config, kernel devel e GNU Dev Tools para compilar os exemplos. Se a sua distribuição do Linux favorita não inclui os itens mencionado, é possível instalar manualmente os binários. Para instalar, no openSUSE por exemplo, os requisitos para todos os passos funcionar corretamente, abra uma sessão de terminal e digite os seguintes comandos:

sudo zypper update
sudo zypper --non-interactive install cmake pkg-config
sudo zypper --non-interactive install pattern devel_C_C++
sudo zypper --non-interactive install patterns-devel-base-devel_kernel

Verifique se a instalação foi concluída com sucesso, com o comando abaixo:

which cmake pkg-config make gcc g++

Se tudo estiver devidamente instalado, teremos o resultado a seguir:

/usr/bin/cmake
/usr/bin/pkg-config
/usr/bin/make
/usr/bin/gcc
/usr/bin/g++


Compilando o módulo do Kernel

Seguindo o exemplo abaixo, criaremos uma pasta para usar o comando wget com o objetivo de baixar o código-fonte do repositório Intel OpenVINO ToolKit.

mkdir gna
cd gna
wget https://storage.openvinotoolkit.org/drivers/gna/gna-drv-linux-1.2.3.zip
--2021-08-30 09:50:09-- https://storage.openvinotoolkit.org/drivers/gna/gna-drv-linux-1.2.3.zip
Resolvendo storage.openvinotoolkit.org (storage.openvinotoolkit.org)... 2600:9000:20ac:a800:8:6691:6300:93a1, 2600:9000:20ac:9c00:8:6691:6300:93a1, 2600:9000:20ac:8a00:8:6691:6300:93a1, ...
Conectando-se a storage.openvinotoolkit.org (storage.openvinotoolkit.org)|2600:9000:20ac:a800:8:6691:6300:93a1|:443... conectado.
A requisição HTTP foi enviada, aguardando resposta... 200 OK
Tamanho: 26542 (26K) [application/zip]
Salvando em: ?gna-drv-linux-1.2.3.zip?

gna-drv-linux-1.2.3.zip      100%[======================================================>]  25,92K   144KB/s em 0,2s    

2021-08-30 09:50:10 (144 KB/s) - ?gna-drv-linux-1.2.3.zip? salvo [26542/26542]


Agora, descompacte os arquivos conforme o exemplo abaixo:

unzip gna-drv-linux-1.2.3.zip
Archive:  gna-drv-linux-1.2.3.zip
  inflating: fromUpstreamV2.patch    
extracting: gna-drv-mod.1.2.3.tar.bz2  
  inflating: license.txt            
  inflating: release_notes.txt
      

tar -axvf gna-drv-mod.1.2.3.tar.bz2
gna-drv-mod.1.2.3/
gna-drv-mod.1.2.3/gna_driver.h
gna-drv-mod.1.2.3/gna_kcompat.h
gna-drv-mod.1.2.3/gna_device.c
gna-drv-mod.1.2.3/gna_request.h
gna-drv-mod.1.2.3/gna_ioctl.h
gna-drv-mod.1.2.3/gna_hw.c
gna-drv-mod.1.2.3/gna_score.h
gna-drv-mod.1.2.3/sample_install.sh
gna-drv-mod.1.2.3/readme
gna-drv-mod.1.2.3/gna_mem.c
gna-drv-mod.1.2.3/Makefile
gna-drv-mod.1.2.3/gna_ioctl.c
gna-drv-mod.1.2.3/gna_driver.c
gna-drv-mod.1.2.3/gna_hw.h
gna-drv-mod.1.2.3/gna_request.c
gna-drv-mod.1.2.3/gna_mem.h
gna-drv-mod.1.2.3/include/
gna-drv-mod.1.2.3/include/uapi/
gna-drv-mod.1.2.3/include/uapi/misc/
gna-drv-mod.1.2.3/include/uapi/misc/intel/
gna-drv-mod.1.2.3/include/uapi/misc/intel/gna.h
gna-drv-mod.1.2.3/gna_score.c
gna-drv-mod.1.2.3/gna.rst
gna-drv-mod.1.2.3/gna_device.h


Agora com os arquivos extraídos, entre na pasta recém-criada e execute o comando make e após execute o script_install.sh.

make
make -C /lib/modules/5.3.18-59.19-default/build M=/tmp/gna/gna-drv-mod.1.2.3
make[1]: Entering directory '/usr/src/linux-5.3.18-59.19-obj/x86_64/default'
  CC [M]  /tmp/gna/gna-drv-mod.1.2.3/gna_device.o
  CC [M]  /tmp/gna/gna-drv-mod.1.2.3/gna_driver.o
  CC [M]  /tmp/gna/gna-drv-mod.1.2.3/gna_hw.o
  CC [M]  /tmp/gna/gna-drv-mod.1.2.3/gna_ioctl.o
  CC [M]  /tmp/gna/gna-drv-mod.1.2.3/gna_mem.o
  CC [M]  /tmp/gna/gna-drv-mod.1.2.3/gna_request.o
  CC [M]  /tmp/gna/gna-drv-mod.1.2.3/gna_score.o
  LD [M]  /tmp/gna/gna-drv-mod.1.2.3/intel_gna.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /tmp/gna/gna-drv-mod.1.2.3/intel_gna.mod.o
  LD [M]  /tmp/gna/gna-drv-mod.1.2.3/intel_gna.ko
make[1]: Leaving directory '/usr/src/linux-5.3.18-59.19-obj/x86_64/default'


sudo ./sample_install.sh
[sudo] senha para root:
Warning: Unsupported kernel version. Proceed? y
Installing intel_gna driver module ...
make -C /lib/modules/5.3.18-59.19-default/build M=/tmp/gna/gna-drv-mod.1.2.3
make[1]: Entering directory '/usr/src/linux-5.3.18-59.19-obj/x86_64/default'
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: Leaving directory '/usr/src/linux-5.3.18-59.19-obj/x86_64/default'
intel_gna driver module installation completed successfully.


Para checar se o módulo foi compilado e instalado corretamente, utilize o comando lsmod como no exemplo a seguir:

sudo lsmod | grep gna
intel_gna              45056  0

    Próxima página

Páginas do artigo
   1. Introdução
   2. Compilando e testando a biblioteca GNA
Outros artigos deste autor

LINCE - A biblioteca de visão artificial open source

RealBasic 2005: Um Visual Basic multi-plataforma!

Compile programas para o PlayStation 3 em PC de 32 bits

Programe em Python no jogo Minecraft com seu filho ou sozinho

Utilize qualquer Tablet/Smartphone como monitor estendido sem fio no GNU/Linux

Leitura recomendada

Alocação dinâmica de memória em C

Desenvolvendo um plugin de visualização para o XMMS (Parte 1)

A mágica do polimorfismo e seus conceitos na ótica de C/C++

Desenvolvendo aplicativo para autenticação biométrica utilizando a Libfprint

A duplicação do buffer de saída na chamada de sistema fork() do Linux

  
Comentários
[1] Comentário enviado por maurixnovatrento em 27/10/2021 - 17:36h


Bom artigo.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]

[2] Comentário enviado por Bruuh em 07/11/2021 - 17:15h


Artigo fod@, projeto fod@. Mas não tenho coragem de testar não kkkk

"A emoção mais antiga e mais forte da humanidade é o medo, e o mais antigo e mais forte de todos os medos é o medo do desconhecido."


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts