HOME
RECENT CHANGES

Setup ToyBrick RK3399PRO

HowTo

2019.03.18

장난감 삼아 구입한 NPU 개발보드. 2019년 03월 06일 주문해서 DHL로 18일에 배송되었다. 6GB+32GB 모델은 재고가 없어 3GB+16GB 모델로 주문하였다. 박스를 열자 한자로 쓰여진 부품 목록과 110v 어댑터(프리볼트)가 등장했다. 메뉴얼 하나 없는 불친절함을 뒤로하고 HDMI, USB키보드와 마우스를 연결하고 전원을 올리자 떠 오른 것은 Fedora 리눅스. 이왕이면 우분투를 설치해두었으면 좋았을 텐데. 패스워드는 toybrick이다. 모니터 연결 시 화면 깜빡임과 노이즈가 발생하는데, 여러 모니터에서 동일한 현상이 발생하는 것을 보아 커넥터 불량인 것 같다.

dnfdragora

Fedora는 익숙하지 않아서 불편하다. 패키지 매니저가 dnf, GUI 도구가 dnfdragora 인가보다. 우선 firefox를 설치하자. firefox for wayland 를 설치해야 안 죽는다. 얼른 우분투로 밀어야겠다. 근데 밀어버리려고 보니 바이두로 배포하는데 이게 회원가입을 해야되나보다. 흑. 일단 tensorflow-lite 빌드에 필요한 git, gcc, zlib을 검색해 설치한다.

libneuralnetworks.so

find / -name "libneuralnetworks.so"
/run/media/toybrick/system/lib/libneuralnetworks.so
/run/media/toybrick/system/lib64/libneuralnetworks.so

가장 궁금했던 것은 NNAPI 모듈이라 이것부터 검색해보았다. 기대와는 달리 안드로이드용만 제공하는지 안드로이드 파일시스템 마운트 해 둔 것 처럼 보이는 PATH에서만 검색되었다. 혹시나 싶어 TensorFlow-Lite를 빌드하여 시도해보았는데 dlopen 할 때 crash가 발생하고 libc 근방인 것으로 보아 안드로이드 용이 맞는 것 같다. 중국어 메뉴얼을 번역기 돌려 보니 안드로이드가 설치되어 있다고 한다. 내일 시도해보아야겠다.


2019.03.19

정면에서 바라보았을 때 왼쪽 버튼이 복구버튼이다. 얼마 동안 누르고 있어야 안드로이드로 진입하는지 써 있지 않아 몇 번 실패하다가 그냥 방치했더니 어느순간 안드로이드가 떠 있었다. 일반 ENG 모드로 빌드 된 안드로이드와 동일한데, 일단 설정에서 개발자 옵션 켜고 adb 붙인다음 su 커맨드를 주면 root 쉘을 얻을 수 있다. 다만 NNAPI(libneuralnetworks.so) 사용한 상태에서 MobileNetV1_1.0_224.tflite 모델의 Latency는 50~60ms로 기대했던 것 보다는 느린 편이었다.


2019.03.22

오늘은 타겟에서 파이썬 데모를 돌려보자. 영문 메뉴얼이 제공되기는 하지만 엉성하다.

git clone https://github.com/rockchip-toybrick/RKNPUTool
cd rknn-toolkit/package
pip3 install rknn_toolkit-0.9.9-cp36-cp36m-linux_aarch64.whl --user

설치하다 보면 여러 의존성 문제를 만나게 되는데, 찍어서 맞춘거라 불필요한 패키지가 있을 수도 있다. TX2 처럼 빠릿한 환경을 기대했지만 여러모로 느리고 불편하다. 클럭 셋팅이라도 변경할 수 있으면 좋을텐데.

sudo dnf install redhat-rpm-config gcc-gfortran python3-devel protobuf openblas-devel
pip3 install pgen --user

Note: 결국 잘 안되서 PC에서 빌드하고 adb 사용해서 타겟 push 후 실행하는 스크립트로만 테스트 함.


2019.03.27

ToyBrick RK3399PRO에서 TVM 벤치마킹 방법에 대한 정리.

OpenCL 유저 스페이스 드라이버 libOpenCL.so 구하기

cd /usr/lib64
sudo wget https://github.com/rockchip-linux/libmali/raw/29mirror/lib/aarch64-linux-gnu/libmali-midgard-t86x-r14p0-wayland.so
sudo ln -s libmali-midgard-t86x-r14p0-wayland.so libOpenCL.so

OpenCL 헤더 파일 다운로드 후 /usr/local/include 에 설치

git clone https://github.com/KhronosGroup/OpenCL-Headers ~/OpenCL-Headers
sudo cp -r ~/OpenCL-Headers/CL /usr/local/include/

호스트측 준비 ( tvm은 빌드 된 상태로 가정 )

python3 -m tvm.exec.rpc_tracker

타겟측 준비

git clone --recursive https://github.com/dmlc/tvm ~/tvm
cd tvm
vi CMakeList.txt > OpenCL 항목 ON
make runtime
export PYTHONPATH=~/tvm/python
python3 -m tvm.exec.rpc_server --tracker=HOST_IP:9190 --key=rk3399

호스트측에서 빌드 후 업로드

(python35) gomida@TITAN:~/tvm/apps/benchmark$ python3 arm_cpu_imagenet_bench.py --model rk3399 --rpc-key rk3399
--------------------------------------------------
Network Name         Mean Inference Time (std dev)
--------------------------------------------------
squeezenet_v1.1      49.86 ms            (1.00 ms)
mobilenet            78.50 ms            (0.59 ms)
resnet-18            169.15 ms           (1.95 ms)
vgg-16               1071.50 ms          (3.12 ms)
(python35) gomida@TITAN:~/tvm/apps/benchmark$ python3 mobile_gpu_imagenet_bench.py --model rk3399 --rpc-key rk3399
--------------------------------------------------
Network Name         Mean Inference Time (std dev)
--------------------------------------------------
squeezenet_v1.1      125.85 ms           (1.17 ms)
mobilenet            80.42 ms            (0.22 ms)
resnet-18            763.93 ms           (1.04 ms)
vgg-16               5668.42 ms          (4.41 ms)

FireFly RK3399 측정결과에 비해 GPU ResNet-18, vgg-16 두 모델은 차이가 커 보인다. 클럭? 메모리? 버전 차이 때문일까. https://github.com/dmlc/tvm/wiki/Benchmark