TensorFlow 머신러닝 적용 시, 미리 알면 좋은 2가지 꿀팁
이것만 알면 TensorFlow 적용은 이지피지
23년 12월 알라미(Android)는 머신러닝 기반의 코골이 기능을 배포하였다. 이것으로 5번째 Tensorflow Lite 머신러닝 기술이 알라미에 적용되었다.
여러 머신러닝 기술을 적용하면서 다양한 시행착오를 겪을 수 있었는데, 그중에서도 ‘이걸 미리 알았다면….’ 하며 아쉬움을 남긴 순간들이 있다. 미리 알았으면 좋았을 2가지 꿀팁을 여러분께 소개한다.
- Interpreter에서 런타임 에러가 발생하면, TensorFlow Lite 라이브러리 버전부터 체크하기
- tensorflow-lite-select-tf-ops 라이브러리를 쓰지 말자
1. Interpreter에서 런타임 에러가 발생하면, tensorflow-lite 라이브러리 버전부터 체크하기
버전 호환성을 체크하지 않으면 에러를 절대 해결할 수 없다.
Interpreter는 TensorFlow Lite에서 사용되는 컴포넌트로, TensorFlow Lite 모델을 실행하고 추론하는 데 사용
수면 분석 머신러닝 모델을 알라미(Android)에 첫 적용했을 때, Interpreter에서 런타임 에러가 발생하였다.
에러 메시지에서 NNAPI에 잘못된 인자를 보내고 있다지만, 왜 잘못된 인자를 보냈는지는 알 수가 없었다. Interpreter 설정을 변경해 보고, Input과 Ouput 형태도 바꿔봐도 에러는 해결되지 않았다.(사실 안드로이드에서 해볼 수 있는 시도는 그리 많지 않다.)
모델러께서 테스트 용으로 쓰고 계시던 Android Project 을 받고 나서야 에러의 원인을 파악할 수 있었다. 에러의 원인은 TensorFlow Lite 라이브러리 버전과 머신러닝 모델의 호환 이슈였다. 알라미가 사용 중인 tensorflow-lite v2.3.0에서 지원하지 않는 연산자를 모델이 사용하고 있었고, 모델이 연산자에 접근하는 시점에 에러가 발생한 것이었다. tensorflow-lite v2.13.0을 적용하고 나서야 더 이상 에러가 발생하지 않았다.
이번 사건은 다행히 모델러와 함께 해결할 수 있었지만, 모델러 없이 직접 원인을 파악해야 하는 상황이라면 다음 사이트들을 통해 호환성을 체크해 볼 수 있겠다.
- NETRON: 모델이 사용하고 있는 연산자를 시각적으로 표현해 주는 사이트
- TensorFlow Lite 및 TensorFlow 연산자 호환성: TensorFlow Lite 의 연산자 항목을 확인할 수 있는 사이트
- TensorFlow Release Note: TensorFlow의 Github 릴리즈 노트
TensorFlow 모델을 처음 도입하는 과정에서 Interpreter 런타임 에러를 만난다면, 묻지도 말고 따지지도 말고 일단 TensorFlow Lite 버전부터 체크해 보길 바란다.
2. tensorflow-lite-select-tf-ops 라이브러리를 쓰지 말자
앱 용량이 최대 110MB증가한다.
tensorflow-lite-select-tf-ops라이브러리는 TensorFlow Lite에서 제공하지 않는 복잡한 연산을 실행할 수 있게 돕고, 모델의 호환성을 개선하는 라이브러리.
단, 사용 시 앱의 크기 증가와 성능 저하를 초래할 수 있음.
수면 분석 초기 모델은 Tensorflow Lite에서 지원하지 않는 연산자를 사용하고 있었다. 연산자는 tensorflow-lite-select-tf-ops라이브러리를 통해야만 사용할 수 있어 고민할 것 없이 ops라이브러리를 도입하였다.
이후 머신러닝 모델은 무사히 정상 동작했지만 예상치 못한 곳에서 문제가 발생했다. 알라미 aab 파일 사이즈가 구글 콘솔에 업로드할 수 있는 최대치(150MB)를 넘어간 것이었다. 파일 사이즈 증가의 원인은 바로 tensorflow-lite-select-tf-ops라이브러리. 이 라이브러리를 적용하고 나서 aab 파일 사이즈가 약 110MB 증가한 것이다.
앱 배포를 고려했을 때 tensorflow-lite-select-tf-ops 라이브러리 제거는 불가피한 상황이었다. 라이브러리 제거는 어렵지 않지만, 문제는 이 라이브러리에 의존하고 있는 연산자는 어떻게 대체할 것인가였다.
다행히 인터넷에 이미 tensorflow-lite 의 미지원 연산자를 직접 구현한 코드들이 존재했고, 성능상으로 큰 문제가 없다는 것을 파악할 수 있었다. 이렇게 모델 내에서 연산을 직접 구현하는 방식을 통해 tensorflow-lite-select-tf-ops라이브러리와 모델 사이의 의존성을 제거하였고, aab 파일 사이즈를 원상복구하여 무사히 알라미를 배포할 수 있었다.
모델에서 직접 연산자를 직접 구현하는 방법이외에 ops라이브러리 용량 이슈를 해결하는 방법은 다음과 같다.
- ops라이브러리에서 필요한 연산자를 추출하여 커스텀 ops 라이브러리를 만드는 방법
- abiFilters 를 통해 CPU 아키텍처 범위를 좁히는 것
가장 좋은 상황은 모델이 tensorflow-lite 에서 제공하는 연산자만 사용하는 것이다. 따라서 모델 설계 단계부터 tensorflow-lite-select-tf-ops라이브러리 용량 이슈를 공유하여 ops라이브러리 의존 없이 모델이 개발되도록 제안하는 것을 추천한다.
끝으로
새로운 시도에는 늘 고생이 뒤따른다. 하지만 고생 끝에 낙이 오기 때문에 고생을 최대한 덜고자 한다. 오늘 소개한 글이 여러분의 고생을 조금이라도 덜 수 있기를 바란다.