[Note] 이 핸즈온은 NVIDIA Jetson nano용이지만, 몇 줄의 코드만으로 NVIDIA Jetson Xavier 및 Raspberry Pi에서 원활하게 작동합니다.
이 핸즈은랩은 데이터 준비, 모델 훈련 및 모델 컴파일과 같은 기본적인 머신 러닝(이하 ML) 절차와 NVIDIA Jetson nano 디바이스에서 Greengrass v2 컴포넌트 및 레시피를 밑바닥부터 생성하고 배포하는 방법을 다룹니다. 각 폴더는 독립적으로 실행할 수 있으며, 이미 모델을 컴파일한 경우 ML 파트를 생략할 수 있습니다.
sm-model-train-compile
: ML part (Amazon SageMaker)ggv2-deploy-on-device
: IoT part (AWS IoT Greengrass 2.0, 온디바이스에 배포 시)ggv2-deploy-on-cloud
: IoT part (AWS IoT Greengrass 2.0, 클라우드 인스턴스로 배포 시)
ggv2-deploy-on-cloud
는 IoT/ML 워크샵에 활용됩니다.
ML 파트에서는 ML 초보자도 쉽게 자신의 모델을 훈련/컴파일할 수 있도록 여러본의 데이터를 자유롭게 준비하고 폴더를 구성 후 코드를 실행할 수 있습니다. 데이터가 기가바이트를 초과한다면 어떻게 해야 할까요? 대용량 데이터를 고려하여 PyTorch DDP 기반의 분산 훈련도 구현하였습니다.
raw 이미지 폴더를 구성하는 예시를 들어 보겠습니다.
Example 1) 개/고양이 분류 모델 훈련
raw
├── cat
└── dog
Example 2) 생산 라인에서의 양품/불량 분류 모델 훈련 (ggv2-deploy-on-device/raw
폴더에 포함되었습니다.)
raw
├── brown_abnormal_chinese: 갈색 제품에 한자가 적혀 있는 불량 박스입니다.
├── brown_abnormal_korean: 갈색 제품에 한글이 적혀 있는 불량 박스입니다.
├── brown_normal_chinese: 갈색 제품에 한자가 적혀 있는 양품 박스입니다.
├── brown_normal_korean: 갈색 제품에 한글이 적혀 있는 양품 박스입니다.
├── no_box: 박스가 없습니다. 하지만, 때때로 박스 일부분들을 볼 수 있습니다.
├── red_abnormal: 적색 제품이며 불량 박스입니다.
└── red_normal: 적색 제품이며 양품 박스입니다.
Note: 이 데이터셋은 AWS IoT Smart Factory 데모를 준비하기 위해 저자가 직접 NVIDIA Jetson nano CSI 카메라로 촬영했으며 인터넷 이미지는 전혀 사용하지 않았습니다. 데이터셋의 포장 박스 이미지는 광동 제약(http://www.ekdp.com) 협찬으로 제공된 우환청심원 포장 박스들이며, 데이터셋 촬영은 터크코리아(https://www.turck.kr) 후원으로 터크코리아 검사 장비에서 이루어졌습니다.
Example 2의 데이터셋 샘플은 raw 데이터셋 폴더(ggv2-deploy-on-device/raw
)를 참고하시기 바랍니다.
- Reference: AWS Smart Factory with Turck Korea
컴파일된 모델을 ML 파트에서 NVIDIA Jetson nano로 직접 복사하여 추론할 수 있지만 실제 프로덕션 환경에서는 한 번에 여러 디바이스들을 등록해야 합니다. 이 때, Greengrass-v2 컴포넌트를 등록하면 여러 에지 디바이스에 편리하게 배포할 수 있습니다. 향후 이를 기반으로 추론 데이터를 MQTT에 게시하여 Model/Data Drift를 감지하는 것도 가능합니다.
모든 코드는 정상적으로 동작하지만 수동 작업이 많기 때문에 향후 CDK(Cloud Development Kit)를 통한 자동화를 권장합니다.
- README_jetson_nano_setup.md를 참조하세요.
$ cd artifacts
# Single image inference
$ python3 test_dlr.py
# Camera w/ real-time inference
$ python3 test_camera_dlr.py
# Camera w/ real-time inference (write captured images)
$ python3 test_camera_dlr_write.py
# Flask Camera
$ export DEVICE_IP='[YOUR IP]'
$ python3 flask_camera.py
# Flask Camera w/ real-time inference
$ python3 flask_camera_dlr.py
$ cd artifacts
$ chmod +x run.sh run_flask.sh
# No Camera: Real-time inference for samples images
$ ./run.sh -c 0
# Camera: Real-time inference
$ ./run.sh -c 1
# Flask Camera w/ real-time inference
$ ./run_flask.sh -i [YOUR-DEVICE-IP] -p [YOUR-PORT]
# ./run_flask.sh -i 192.168.200.200 -p 2345
[주의] 이 방법은 보안에 취약하고 프로더션에 적합하지 않습니다. 더 적절한 설정은 AWS IoT 플릿 프로비저닝으로 AWS IoT Greengrass Core 소프트웨어 설치를 참조하세요.
- AWS CLI V2 (Linux ARM) 를 설치하세요.
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
- JDK를 설치하세요.
$ sudo apt install default-jdk
$ java -version
- AWS configure and access key, secret key environment variable setting
$ aws configure # Set up your credentials
$ export AWS_ACCESS_KEY_ID=[YOUR-KEY-ID]
$ export AWS_SECRET_ACCESS_KEY=[YOUR-SECRET-ACCESS-KEY]
- AWS IoT Greengrass V2 core software를 다운로드하고 설치하세요.
config.json
을 먼저 수정하세요.create_gg_component.sh
를 실행하세요. 만약 Macbook에서 실행한다면create_gg_component_mac.sh
을 실행하세요.
이 셀스크립트를 실행하면config.json
설정에서 변경된 내용을 반영하여 로컬의 json recipe와artifacts/config_utils.py
을 자동으로 수정해 주고artifacts
폴더의 파일을 zip으로 압축하여 여러분의 S3 버킷으로 업로드 후, 마지막으로 Greengrass 컴포넌트를 자동으로 등록합니다.
$ ./create_gg_component.sh
컴포넌트가 등록되었다면 AWS UI나 Greengrass CLI로 쉽게 배포할 수 있습니다. 개발자 가이드를 참조해 주세요.
아래의 실험 결과는 엄밀하지 않습니다. 대략적인 FPS(Frames Per Second)만 확인해 주세요.
- Model: MobileNet-v2 Image Classification
- Framework: PyTorch 1.6.0
- CSI Camera Input size: 1280 x 720 x 3
- DLR Runtime Version: 1.9.0
오버클러킹을 수행하면 약 4~5프레임이 향상됩니다. 하지만 오버클러킹은 충분한 쿨링 시스템을 갖춰야 합니다.
Vanilla PyTorch (Built-in OpenCV 4.1.1) | Compiled w/ SageMaker Neo (Built-in OpenCV 4.1.1) | Compiled w/ SageMaker Neo (Build OpenCV 4.5.3 from scratch) | ||||
---|---|---|---|---|---|---|
CPU/GPU | CPU | GPU | CPU | GPU | CPU | GPU |
Model Loading Time | ~50 secs | ~90 secs | 2~3 secs | ~40 secs | 2~3 secs | ~40 secs |
FPS | 0.16~0.18 | 8~9 | 5~6 | 16~17 | 8~10 | 23~25 |
![]() |
![]() |
Image classification w/ SageMaker Neo (GPU enabled, Gstreamer on OpenCV 4.5.3) |
Image classification w/ SageMaker Neo (GPU disenabled, Gstreamer on OpenCV 4.5.3) |
이 샘플 코드는 MIT-0 라이선스에 따라 제공됩니다. LICENSE 파일을 참조하십시오.