TensorFlow 머신러닝 적용 시, 미리 알면 좋은 2가지 꿀팁

이것만 알면 TensorFlow 적용은 이지피지

Mike
DelightRoom
6 min readMay 20, 2024

--

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을 적용하고 나서야 더 이상 에러가 발생하지 않았다.

에러의 원인이 tensorflow-lite 버전 호환 이슈임을 발견한 두사람

이번 사건은 다행히 모델러와 함께 해결할 수 있었지만, 모델러 없이 직접 원인을 파악해야 하는 상황이라면 다음 사이트들을 통해 호환성을 체크해 볼 수 있겠다.

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 증가한 것이다.

기존 aab 파일의 lib 사이즈는 6.4MB
ops 라이브러리가 추가된 aab 파일의 lib 사이즈는 115.1MB (기존의 18배)

앱 배포를 고려했을 때 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라이브러리 의존 없이 모델이 개발되도록 제안하는 것을 추천한다.

끝으로

새로운 시도에는 늘 고생이 뒤따른다. 하지만 고생 끝에 낙이 오기 때문에 고생을 최대한 덜고자 한다. 오늘 소개한 글이 여러분의 고생을 조금이라도 덜 수 있기를 바란다.

⏰ 딜라이트룸에서 알라미와 함께 아침을 바꿀 분들을 모십니다

--

--