De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


GNA - um coprocessador para aceleração neural

Colaboração: Alessandro de Oliveira Faria

Data de Publicação: 28 de outubro de 2021

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

COMPILANDO E TESTANDO A BIBLIOTECA GNA

Sem muito BLÁ BLÁ BLÁ, para compilar a biblioteca e o respectivo exemplo, efetue o download dos fontes utilizando o comando abaixo (git clone), então teremos todo o código-fonte do repositório GitHub em nosso equipamento de trabalho.

$ git clone https://github.com/intel/gna
Cloning into 'gna'...
remote: Enumerating objects: 335, done.
remote: Counting objects: 100% (335/335), done.
remote: Compressing objects: 100% (255/255), done.
remote: Total 335 (delta 83), reused 329 (delta 77), pack-reused 0
Receiving objects: 100% (335/335), 405.07 KiB | 3.65 MiB/s, done.
Resolving deltas: 100% (83/83), done.

Agora entre na pasta recém-criada novamente e use o comando cmake e make como no exemplo abaixo.

$ cmake .
-- The C compiler identification is GNU 7.5.0
— The CXX compiler identification is GNU 7.5.0
— Check for working C compiler: /usr/bin/cc
— Check for working C compiler: /usr/bin/cc - works
— Detecting C compiler ABI info
— Detecting C compiler ABI info - done
— Detecting C compile features
— Detecting C compile features - done
— Check for working CXX compiler: /usr/bin/c++
— Check for working CXX compiler: /usr/bin/c++ - works
— Detecting CXX compiler ABI info
— Detecting CXX compiler ABI info - done
— Detecting CXX compile features
— Detecting CXX compile features - done
— Looking for pthread.h
— Looking for pthread.h - found
— Performing Test CMAKE_HAVE_LIBC_PTHREAD
— Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
— Looking for pthread_create in pthreads
— Looking for pthread_create in pthreads - not found
— Looking for pthread_create in pthread
— Looking for pthread_create in pthread - found
— Found Threads: TRUE
— Configuring done
— Generating done
— Build files have been written to: /home/cabelo/gna/gna-drv-mod.1.2.3/gna

$ make

Seguindo o exemplo abaixo, entre na pasta samples e use os comandos mkdir, cd e cmake para compilar o exemplo SDK.

$ cmake .
-- The C compiler identification is GNU 7.5.0
— The CXX compiler identification is GNU 7.5.0
— Check for working C compiler: /usr/bin/cc
— Check for working C compiler: /usr/bin/cc - works
— Detecting C compiler ABI info
— Detecting C compiler ABI info - done
— Detecting C compile features
— Detecting C compile features - done
— Check for working CXX compiler: /usr/bin/c++
— Check for working CXX compiler: /usr/bin/c++ - works
— Detecting CXX compiler ABI info
— Detecting CXX compiler ABI info - done
— Detecting CXX compile features
— Detecting CXX compile features - done
— Configuring done
— Generating done
— Build files have been written to: /tmp/gna/gna-drv-mod.1.2.3/gna/samples

$ make
-- Configuring done
— Generating done
— Build files have been written to: /tmp/gna/gna-drv-mod.1.2.3/gna/samples
Scanning dependencies of target sample01
[ 50%] Building CXX object src/sample01/CMakeFiles/sample01.dir/sample01.cpp.o
[100%] Linking CXX executable ../../bin/sample01/sample01
[100%] Built target sample01

Agora testaremos o brinquedo?

$ cd bin/sample01
$ ./sample01
GNA Hardware Device found: 32

Outputs:
-177    -85     29      28
96      -173    25      252
-160    274     157     -29
48      -60     158     -29
26      -2      -44     -251
-173    -70     -1      -323
99      144     38      -63
20      56      -103    10

Este texto foi escrito por Official oneAPI Innovator Intel e o membro do openSUSE Alessandro de Oliveira Faria com base nos tutoriais Intel. Mais informações veja a página oficial: https://github.com/intel/gna

"O próximo grande salto evolutivo da humanidade será a descoberta de que cooperar é melhor que competir... Pois colaborar atrai amigos, competir atrai inimigos!"

Sobre o autor

Alessandro de Oliveira Faria é sócio cofundador da empresa OITI TECHNOLOGIES, Pesquisador cujo primeiro contato com tecnologia foi em 1983 com 11 anos de idade. Leva o Linux a sério, pesquisa e trabalhos com biometria e visão computacional desde 1998. Experiência com biometria facial desde 2003, redes neurais artificiais e neurotecnologia desde 2009. Inventor da tecnologia CERTIFACE, mais de 100 palestras ministradas, 14 artigos impressos publicados, mais de 8 milhões de acessos nos 120 artigos publicados, Docente da FIA, Membro oficial Mozillians, Membro oficial e Embaixador OpenSUSE Linux América Latina, Chapter Leader OWASP SP, Contribuidor da biblioteca OpenCV e Global Oficial OneAPI Innovator Intel, Membro Notável I2AI, Fundador da iniciativa Global openSUSE Linux INNOVATOR e Mentor Cybersecuritygirls BR



Veja a relação completa dos artigos de Alessandro de Oliveira Faria