자유게시판

에필로그
2022. 10. 13 (목) 18:46 자작공작소 조회 68 좋아요 1 스크랩 1 댓글 5

마지막 Quest 진행하며 느낀 것을 적어봅니다.

과제 진행 중 X-CUBE-AI의 버전에 따라서 Python, Keras, Tensorflow, librosa등의 버전을 잘 맞추는 과정이 필요했습니다.

또한, Keras모델을 C코드로 변환 후 CubeIDE에서 빌드시 힙메모리 부족 이슈로 인해 가중치 테이블의 크기를 줄이려고 양자화 모델인 TFlite을 C코드로 변환 과정에서 X-CUBE-AI버전도 여러변 변경해 보고 그에따라 Python, Keras, Tensorflow, librosa도 여러 버전으로 설치해 보았습니다.

과제 진행 중 개발 환경의 궁합을 맞추는 일이 어려웠습니다.

추후에 다시 과제를 이어간다면 개발 환경을 유지하는 것이 관건이라고 생각했습니다.

Docker Compose등 개발환경 프로비저닝툴을 고려해봐야 겠습니다.

ASC모델을 간단하지만 만들어서 동작이 되는것을 보니 여러 가지 응용할 수 있는 아이템이 떠오릅니다.

여기서 멈추지 않고 여러가지 시도를 해봐야 겠습니다.

 

[추가 사항]

이번 마지막 과제에 사용한 CNN모델은 다음과 같습니다.

model = models.Sequential()
model.add(layers.Conv2D(16, (3, 3), activation='relu', input_shape=(30, 32, 1), data_format='channels_last'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(16, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(9, activation='relu'))
model.add(layers.Dense(3, activation='softmax'))

각 부분의 filters, pool_size, units 값을 조절하면 모델의 가중치 파라미터를 대폭 줄일 수 있으며 힙메모리 관련 문제도 해결할 수 있습니다.

파라미터의 크기와 성능, 자원소비 등의 trade-off가 필요합니다.

참고하십시오.

 

[수상소감]

수상 결과는 프로젝트의 완성도와는 크게 상관이 없는 것도 있네요.

포장이 중요할때도...

아무튼 좋은 기회에 많이 배웠습니다.

칩헤드 2022.10.13 20:13 답글  |  신고
자작공작소님, 힙메모리 부족이슈는 제가 접근 했던 방법들을 시도해보세요. 어짜피 주어진 IOT 개발보드에서 사용가능한 RAM의 총 용량이 96KB이므로, GCC 컴파일러로 빌드할때요, (1) .O파일에 포함되는 Debug 심볼의 memory footpirnt 제거하기 위해 Os + No -Debug으로 빌드한다. (2) Heap Chunk 최소 단위를 기존보다 더 낮춰서 .O파일들의 링킹을 수행시킨다.
자작공작소 2022.10.14 10:07 신고
댓글
우선 의견 주셔서 고맙습니다. 지난번 힙메모리 이슈로 어떻게 해결하셨나 궁금해서 문의 드렸을때 ASC 모델에서 사용하는 FLOAT형 가중치 파라미터를 임의로 줄이신 것(이럴경우 추론 프로세싱이 제대로 동작하기 힘들겠죠)과 추가로 무슨 기법을 말씀하신것이 이 방법이셨군요. 일반적으로 빌드환경을 만들때 Release/Debug 환경을 주로 사용합니다. 말씀하신 내용은 Release 환경으로 저도 물론 Release모드에서 빌드는 하였으나 이것은 최종 빌드물인 바이너리파일(elf)의 크기를 줄이는 효과가 있고 따라서 FLASH메모리를 줄이는 효과는 있으나 RAM영역 확보에는 도움이 되지 않습니다. 두번째 말씀하신 부분도 _Min_Heap_Size를 말씀하시는것으로 보이는데 기본 0x800에서 0x400으로 변경하여 사용하고 있습니다.
칩헤드 2022.10.14 11:04 신고
댓글
넵, Heap 사이즈를 더 줄여 보셔도 되지 싶어요. 제 경우엔 _Min_Heap_Size를 0x100 (256 bytes)으로 run하고 있고, malloc 실패이슈가 다행히 발생안하고 있습니다. 거기에 가중치 데이타를 더 늘리면 accuracy가 개선되는 효과를 기대해보기 위해, 아예 _Min_Stack_size도 과감히 0x100 (256bytes)으로 run중인데, 프로세스/쓰레드의 stack 사용량이 256byte 미만이라 seg. fault는 발생치 않고 있습니다.
칩헤드 2022.10.14 11:06 신고
댓글
"... RAM영역 확보에는 도움이 되지 않습니다." 무슨 말씀인지 이해를 못했습니다. 왜 RAM 영역 확보에 도움이 안된다고 생각하시는 것인지요? :)
자작공작소 2022.10.14 11:31 신고
댓글
빌드시 Release모드는 RAM영역 확보에 거의 영향을 주지 않는 다는 내용이었고(물론 -O2나 -Os등 최적화 옵션에 따라 미묘하게 차이는 있습니다.) _Min_Heap_Size는 영향이 있어서 변경해서 사용했었습니다. 모델의 가중치 파라미터를 온전하게 사용하고 ASC 프로세싱을 정상적으로 수행하기 위해서 _Min_Heap_Size변경외에 불필요한 메모리 사용을 줄이는 방법이 추가 되었습니다.

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