질문과 답변

[퀘스트8] STM32 Cube.AI 로 딥러닝 기술 탐험하기
2020. 5. 14 (목) 22:14 칩헤드 조회 203 좋아요 2 스크랩 0 댓글 10

 

안녕하세요. 글제목을 퀘스트 08이라 적음으로써 자발적 탐험 (Quest) 단계의 의미를 부여해보았습니다. 

DK 보드를 사용하시는분들끼리 서로 정보들을 공유하면  "STM32 Cube.AI"에 대해

더 효율적이고 생산적으로 우리 모두가 고급 기술지식들을 얻을수 있을거라는 기대감이 있습니다. ^^

 

* Version History:

v0.1 (2020-04-26): STM32 Cube. AI  관련 자료 포스팅

v0.2 (2020-05-02): M4 기반 AI Character Recognition 자료 추가

v0.3 (2020-05-11): 딥러닝을 위해 동작하고 있는 galcore.ko 커널 모듈 내용 정보 추가

v0.4 (2020-05-13): STM에서 공식적으로 제공하고 있는 학습 동영상 사이트 추가

v0.5 (2020-05-19): VProfiler (Vivante Profiler)  사용 방법 내용 추가

v0.8 (2020-05-30): STM32MP157C (DK2)의 3D GPU (galcore.ko) 정보 추가 

 

 

* STM32MP157C-DK2보드의 하드웨어 스펙 

 

DK2 보드의 하드웨어 세부 스펙은 아래 주소에서 열람 가능합니다. 

https://www.st.com/en/evaluation-tools/stm32mp157c-dk2.html

 

  • STM32MP157 Arm dual Cortex-A7 32 bits + Cortex-M4 32 bits MPU in TFBGA361 package
  • ST PMIC STPMIC1
  • 4-Gbit DDR3L, 16 bits, 533 MHz
  • 1-Gbps Ethernet (RGMII) compliant with IEEE-802.3ab
  • USB OTG HS
  • Audio codec
  • 4 user LEDs
  • 2 user and reset push-buttons, 1 wake-up button
  • 5 V / 3 A USB Type-CTM power supply input (not provided)

 

시중의 온라인 쇼핑몰에서  130,000원 정도에 어려움 없이 구매가 가능합니다. 

 

 

 

 

* STM32MP157C-DK2보드의 AI 지원 장치는 무엇인가?

 

 

 

STM32MP157C-DK2보드를 실행하면 Hand-written글자를 

전통적인 프로래밍 코드가 아닌 딥러닝 기술로 인식합니다. 

  

galcore.ko  (Graphics of AmLogics CORE) 이라는 커널 모듈을 통해서

"AI_Character_Recognition.elf" 파일이 동작하는 것을 보았습니다. 

 

[  638.084575] remoteproc remoteproc0: powering up m4
[  638.104129] remoteproc remoteproc0: Booting fw image AI_Character_Recognition.elf, size 290188
[  638.112469]  m4@0#vdev0buffer: assigned reserved memory node vdev0buffer@10044000
[  638.126975] virtio_rpmsg_bus virtio0: rpmsg host is online
[  638.131382] virtio_rpmsg_bus virtio0: creating channel rpmsg-tty-channel addr 0x0
[  638.142738]  m4@0#vdev0buffer: registered virtio0 (type 7)
[  638.161440] rpmsg_tty virtio0.rpmsg-tty-channel.-1.0: new channel: 0x400 -> 0x0 : ttyRPMSG0
[  638.168655] remoteproc remoteproc0: remote processor m4 is now up

 

 

그리고, 몇 일전인가? 메이슨님이 

https://wiki.st.com/stm32mpu/wiki/STM32MP1_artificial_intelligence_expansion_packages  이 주소를

게시판에 포스팅하신 적이 있었습니다.

ubuntu$> bitbake st-image-ai-cv

 

 

잠시 시간 여유가 되어 관련 소프트웨어 모듈을 살펴보다가 리눅스 커널모듈 galcore.ko 파일을 좀더 보고 싶어졌습니다.  

 

 

그후, DK2 보드를 좀더 살펴보았습니다. 

DK2 (STM32MP157C) 에만 오직 3D GPU가 지원되는 것을 볼수 있습니다. 

이것이 galcore.ko 와 관련이 있습니다. 즉 3D GPU라고 하는 것이 VPU (Vision Processing Unit) 또는 NPU (Neural Processing Unit)이라고도 불리는 것 같습니다. 

전체 동작구조를 정리해보면, DK2 보드에서 우리가 Hand-Written Alphabet을 손으로 그리면 3d GPU를 이용하여 딥러닝 연산을 하는 것으로 보입니다. 이때 user space는 묘종의 low-level 라이브러리가 있을거구요. 이것은 커널의 galcore.ko 모듈을 통해서 3D GPU (VPU/NPU)에 접근하여 연산을 하고 있는것 같습니다. 

 

재미난 것은 DK2(STM32MP157c 보드 이전에는 3D GPU가 없었으니,  MCU (Corext-M4)를 통해서 딥러닝 관련 AI 앱을 dedicated되어 동작하는 구조로 설계 및실제 작동한것으로 보입니다. 그래서인지 DK2에 3D GPU가 장착이 되어 있으나, 이것을 이용하여 AI 앱을 동작시키는 방법들이나 관련 문서가 구글링을 하여도 거의 안보입니다. 아마도  ST MicroElectronics사에서 최근에 3D GPU (VPU/NPU)를 장착하기 때문에 열심히 관련 작업들을 준비중인게 아닌가? 싶습니다. 

 

 

 

 

아래는 DK2보드의 AI 기능 관련 논의하였으면 하는 사항들을 포스팅 해보았습니다. 

 

Discussion 01:

DK2 개발보드에서 아래와 같이 "modinfo galcore"명령을 실행하면,  galcore.ko 커널모듈의 소스 위치가 

/lib/modules/4.19.94/extra/ 폴더에 위치해 있다고 정보가 나옵니다. 

root@stm32mp1:~# dmesg | grep galcore
[    8.346220] galcore: loading out-of-tree module taints kernel.
root@stm32mp1:~# cat /proc/devices  | grep galcore
199 galcore

 

그런데,  https://github.com/STMicroelectronics/linux.git  주소에 들어가면 galcore.ko  (MIT+ GPLv2 라이센스)의 관련 소스가 보이지 않습니다.  ㅜㅜ 

(또는 https://www.st.com/content/ccc/resource/technical/sw-updater/firmware2/group0/73/ca/80/91/b4/13/45/f8/STM32cube_Standard_A7_BSP_components_kernel/files/SOURCES-kernel-stm32mp1-openstlinux-20-02-19.tar.xz/jcr:content/translations/en.SOURCES-kernel-stm32mp1-openstlinux-20-02-19.tar.xz ) 

 

혹시 galcore.ko 바이너리 파일의 리눅스 커널 소스가 보관되어 있는 공식 저장소 주소의 위치좀 알수 있을까요? 

 

root@stm32mp1:~# modinfo galcore
filename:       /lib/modules/4.19.94/extra/galcore.ko
license:        Dual MIT/GPL
description:    Vivante Graphics Driver
alias:          of:N*T*Cvivante,gcC*
alias:          of:N*T*Cvivante,gc
alias:          of:N*T*Cst,gcnanoC*
alias:          of:N*T*Cst,gcnano
depends:        
name:           galcore
vermagic:       4.19.94 SMP preempt mod_unload modversions ARMv7 p2v8 
parm:           major:major device number for GC device (uint)
parm:           irqLine:IRQ number of GC core (int)
parm:           registerMemBase:Base of bus address of GC core AHB register (ulong)
parm:           registerMemSize:Size of bus address range of GC core AHB register (ulong)
parm:           irqLine2D:IRQ number of G2D core if irqLine is used for a G3D core (int)
parm:           registerMemBase2D:Base of bus address of G2D core if registerMemBase2D is used for a G3D core (ulong)
parm:           registerMemSize2D:Size of bus address range of G2D core if registerMemSize is used for a G3D core (ulong)
parm:           irqLineVG:IRQ number of VG core (int)
parm:           registerMemBaseVG:Base of bus address of VG core (ulong)
parm:           registerMemSizeVG:Size of bus address range of VG core (ulong)
parm:           contiguousSize:Size of memory reserved for GC (ulong)
parm:           contiguousBase:Base address of memory reserved for GC, if it is 0, GC driver will try to allocate a buffer whose size defined by contiguousSize (ulong)
parm:           externalSize:Size of external memory, if it is 0, means there is no external pool (ulong)
parm:           externalBase:Base address of external memory (ulong)
parm:           fastClear:Disable fast clear if set it to 0, enabled by default (int)
parm:           compression:Disable compression if set it to 0, enabled by default (int)
parm:           powerManagement:Disable auto power saving if set it to 1, enabled by default (int)
parm:           gpuProfiler:Enable profiling support, disabled by default (int)
parm:           baseAddress:Only used for old MMU, set it to 0 if memory which can be accessed by GPU falls into 0 - 2G, otherwise set it to 0x80000000 (ulong)
parm:           physSize:Obsolete (ulong)
parm:           logFileSize:Size of buffer to store GC driver output messsage, if it is not 0, message is read from /sys/kernel/debug/gc/galcore_trace, default value is 0 (uint)
parm:           recovery:Recover GPU from stuck (1: Enable, 0: Disable) (uint)
parm:           stuckDump:Level of stuck dump content (1: Minimal, 2: Middle, 3: Maximal) (uint)
parm:           showArgs:Display parameters value when driver loaded (int)
parm:           mmu:Disable MMU if set it to 0, enabled by default (int)
parm:           irqs:Array of IRQ numbers of multi-GPU (array of int)
parm:           registerBases:Array of bases of bus address of register of multi-GPU (array of uint)
parm:           registerSizes:Array of sizes of bus address range of register of multi-GPU (array of uint)
parm:           chipIDs:Array of chipIDs of multi-GPU (array of uint)
parm:           type:0 - Char Driver (Default), 1 - Misc Driver (uint)

 

 

 

Discussion 02: 

그리고,  STM32MP157C-DK2 개발보드는  Machine Learning Processor (or NPU) 장치가 포함되어 있다는 
뜻이 되는데요. STm32MP157C-DK2 보드의 NPU 정보, TOPS 정보, 관련 소프트웨어 패키지 정보를
열람가능한 공식 사이트도 있을거 같아서 이에 대한 내용을 어디서 열람가능할까요?  

 

 

 

Discussion 03:
또한 지식의 신,  구글검색엔진 형을 통해서 구글링을 하다가, 아래의 웹페이지에서 
STM32Cube.AI를 활용한 센서노드 머신러닝 구현하기 강의도 열리고 있는 것을 볼수 있었습니다. 

https://www.e4ds.com/seminar_introduce.asp?idx=86

* 일정: 2020.06.19 (금) 09:00 ~ 18:00
* 참가비용: 230,000원
* 목차
1. 머신러닝 기법에 대한 이해
2. STM32Cube.AI의 이해및 실습 준비
3. STM32 IoT 센서 node에 AI 소스를 연결
4. STM32Cube.AI 프로젝트 구성과 실행
5. Neural Network 모델에 데이터를 입출력
6. 센서 데이터 입력 및 결과값 확인
7. 소스 디버깅 및 Q&A


DK2개발보드에 가장 따끈따끈한 칩이  NPU 장치 같아 보여요. 이 부분에 대해 좀더 재미있게 탐구 (Quest) 해보고 싶은데 말입니다.

이쪽으로 이미 개인적으로 탐구 (Quest) 해보신분이 계시면  지식함양을 위하여 우리 서로  정보 공유 부탁드려요.

 

 

부디, 직접적인 답변이 아니더라도, 힌트도 좋구요.  리누스 토발즈분의 철학처럼  어떠한 댓글도  대환영입니다유. ^^

 

아래는 제가 찾은 몇가지 힌트 정보들입니다. 결국 DK2보드에 차세대 핵심 기능으로 ST에서  AI 관련 SOC인 NPU장치와 소프트웨어 컴포넌트들이 포함하고 있습니다. 그냥 그져 그런 또하나의 임베디드 보드가 아닌거지요. 그야말로 광석을 찾은거 같은데  말입니다.  우리 모두 같이 퀘스트, 퀘스트, 퀘스트 해보아요. ^^

 

* https://community.st.com/s/topic/0TO0X0000003iUqWAI/machine-learning-ai  (STM32  공식 커뮤니티의 AI포럼 주소): 

https://www.st.com/resource/en/user_manual/dm00596663-stm32mp157-gpu-tool-kit-stmicroelectronics.pdf


stm32mp1 $> cat /proc/devices | grep galcore
stm32mp1 $> cd /lib/modules/
stm32mp1 $> grep "st,gcnano" modules.alias
 alias of:N*T*Cst,gcnano galcor

The Vivante GPU driver is built with the vProfiler capability. Add gpuProfiler=1 in the insmod command line to
activate the vProfiler functionality, as shown in the code below.
insmod /system/lib/modules/galcore.ko gpuProfiler=1 [OPTIONS]


Note: The GPU profiling mode requires the GPU power management (PM) functions to be disabled to get the precise
profiling data. When kernel module “galcore” is inserted with gpuProfiler=1, the PM functions in the driver
are not disabled. The PM functions are disabled when VIV_PROFILE is set to 1, 2, or 3, and the application
starts. The PM functions are enabled when VIV_PROFILE is set to 0 and the application starts again.


 

 

* 참고 자료: 

 

1.  STM32 Cube.AI : Neural Networks on STm32 (Simple, fast, optimized)

https://www.st.com/content/st_com/en/stm32-ann.html

 

2.  STM32. Cube.AI : Artificial Intelligence Solutions (PDF)

https://www.st.com/content/ccc/resource/sales_and_marketing/presentation/product_presentation/group0/69/82/bf/ae/5a/8b/40/91/STM32CubeAI_press_pres/files/STM32CubeAI_press_pres.pdf/jcr:content/translations/en.STM32CubeAI_press_pres.pdf


3.  STM32 solutions for Artificial Neural Networks

https://www.st.com/content/st_com/en/stm32-ann.html

 

 

4. STM32 Cube.AI 유투브 동영상:

https://www.youtube.com/playlist?list=PLnMKNibPkDnG9IC5Nl9vJg1CKMAO1kODW

 

 

 

자유롭게 댓글로 의견을 주시면 서로 유익한 정보 공유의 시간이 될것 같습니다. 

댓글 단다고 절대 헤치지 않으니 편하게 생각중이신 내용들을 댓글 올려주세요.^^ 

 

 

 

 

감사합니다. 

 
 
 
 
칩헤드 2020.05.30 09:51 답글  | 
* Version History: v0.1 (2020-04-26): STM32 Cube. AI 관련 자료 포스팅 v0.2 (2020-05-02): M4 기반 AI Character Recognition 자료 추가 v0.3 (2020-05-11): 딥러닝을 위해 동작하고 있는 galcore.ko 커널 모듈 내용 정보 추가 v0.4 (2020-05-13): STM에서 공식적으로 제공하고 있는 학습 동영상 사이트 추가 v0.5 (2020-05-19): VProfiler (Vivante Profiler) 사용 방법 내용 추가 v0.8 (2020-05-30): STM32MP157C (DK2)의 3D GPU (galcore.ko) 정보 추가
칩헤드 2020.05.18 10:53 답글  | 
FYI, STM32MP1157C: where is source code of galcore.ko?, https://forum.seeedstudio.com/t/stm32mp1157c-where-is-source-code-of-galcore-ko/251989
칩헤드 2020.05.15 14:51 답글  | 
https://www.hackerboards.com/lists/single-board-computers-npu-neural-ai/ 에 보면, AI NPU를 내장하고 있는 시중의 임베디드 개발보드 리스트라고 하네요.
디오마루 2020.05.15 13:36 답글  | 
무지 관심은 있는데, 우선 리눅스라는 것 부터 공부해야겠네요 ㅠㅠ, 여러분들과 임베디드 리눅스를 따라 갈려면 어떤 것을 공부하면 좋을지, 자료 책 링크 등등 부탁드립니다.
칩헤드 2020.05.15 14:13
댓글
우리 모두 같이 새로운 퀘스트 8 단계를 이루어 보아요. 소통의 힘. ^^
KHS 2020.05.17 20:51
댓글
저두 포스팅 보며 공부중인데 AI는 넘사벽이네요. ㄷㄷ
메이슨 2020.05.15 09:45 답글  | 
흥미가 샘솟네요 ㅎㅎ 퀘스트 5 끝나면 한번 연구해보도록 하겠습니다
칩헤드 2020.05.15 10:58
댓글
넵. 이쪽을 좀더 탐구해보면 뜻밖의 지식의 광맥이 있을거 같기도 합니다. ㅎㅎ
KHS 2020.05.14 23:06 답글  | 
AI를 제대로 배워보고 싶은데, 위의 내용들이 저한테는 어렵네요. ㅜㅜ
칩헤드 2020.05.15 07:12
댓글
댓글감솨. 우리모두 같이 DK2 AI를 퀘스트(quest) 해보아요. ^^

로그인 후
참가 상태를 확인할 수 있습니다.