[FEAT] 온디바이스 감정 분석 기능 추가 (KoELECTRA + TFLite) - #7
Conversation
토크나이저 설정 파일(tokenizer_config.json)이 리소스 번들에 빠져 있어서 함께 추가함.
- 토큰 수가 128을 초과할 때 토큰이 잘려나가 이슈 수정 - CI의 Test 환경 고정된 iPhone 16 시뮬레이터 실행 조건 제거하고, 실행 시점에 사용 가능한 iOS 18.1+ 시뮬레이터 UDID를 동적으로 찾아 사용하도록 변경
| guard (try? writeInputs(inputIds: inputIds, attentionMask: attentionMask, tokenTypeIds: tokenTypeIds)) != nil else { | ||
| throw EmotionAnalysisError.inferenceFailed | ||
| } |
There was a problem hiding this comment.
이 코드에서 try?가 원래 발생한 에러는 nil로 바꿔버려서 do-catch문으로 바꾸는게 읽기 쉬울꺼같은데 어떻게 생각하시나요 ?
There was a problem hiding this comment.
do-catch로 바꾸고 에러를 nil로 흘려보내지 않고 catch 구문에서 세팅해 주신 Log로 에러 원인을 출력하도록 수정했습니다.
| if tensor.name.contains("input_ids") { | ||
| roles.append(.ids) | ||
| } else if tensor.name.contains("attention_mask") { | ||
| roles.append(.mask) | ||
| } else if tensor.name.contains("token_type") { | ||
| roles.append(.tokenType) | ||
| } else { | ||
| throw EmotionAnalysisError.modelLoadFailed | ||
| } |
There was a problem hiding this comment.
이 분기문에서 모델이 하나뿐이라면 상관없겠지만 만약에 "my_input_ids"일 경우 통과되는 로직이라서 차라리 switch문으로 분기처리하는건 어떻게 생각하실까요 ?
There was a problem hiding this comment.
현재로서는 다르게 전달될 일이 없기는 한데, 다른 모델이 추가될 경우에는 또 어떤 형식으로 값이 전달될지 알 수 없어서 switch문으로 정확한 값을 바인딩하는 것도 애매한 것 같다고 판단했어요.
이부분은 다른 모델이 추가될 경우에 수정해 볼게요.
| } | ||
|
|
||
| var options = Interpreter.Options() | ||
| options.threadCount = 4 |
There was a problem hiding this comment.
여기서 모든 기종 전부 다 4로 고정인 이유가 궁금해요 !!
There was a problem hiding this comment.
적절한 기준값을 4로 고정한 것이었는데...
iOS 18.1 버전의 저사양 기기도 고려해야 해야 하고, 과도한 스레드 생성을 방지해야 해서 ProcessInfo.processInfo.activeProcessorCount API를 추가로 사용했고, 사용 가능한 코어 수가 동적으로 반영되도록 변경했습니다.
Describe
온디바이스 감정 분석 추론 엔진을 Core ML에서 TFLite(TensorFlowLiteSwift) 기반으로 구현합니다. Android와 동일 모델로 두 플랫폼이 같은 입력에 대해 같은 감정 라벨을 내도록 하는 것이 목적입니다.
Works made
모델: KoELECTRA 모델 사용
의존성: CocoaPods로 마이그레이션 필요
TensorFlowLiteSwift가 iOS용 SPM 패키지를 공식 지원하지 않아서(CocoaPods/Bazel만 공식 지원 — Google 공식 문서,google-ai-edge/LiteRT#125확인)Podfile을 신규 추가했습니다..xcodeproj가 아니라GAMSS.xcworkspace로 진행해야 합니다(pod install필요).테스트
Changes Made
As-Is
기존 로직
Jinuuuu/KoELECTRA_fine_tunning_emotion을 Core ML(FP32)로 변환해 온디바이스 추론To-Be
변경 로직
How to Test
pod install실행 후GAMSS.xcworkspace로 열기xcodebuild test -workspace GAMSS.xcworkspace -scheme GAMSS -destination '<시뮬레이터>'— 전체 유닛 테스트 통과 확인 (9/9)GAMSSApp.swift의WindowGroup내용을EmotionTestView로 임시 교체해 시뮬레이터에서 문장을 입력해본다footprint <PID>— physical footprint 약 50MB 확인됨Issues Resolved
Additional context
.github/workflows/ci.yml)에pod install단계가 추가되어, 이후-workspace GAMSS.xcworkspace기준으로 빌드/테스트합니다..tflite모델은 Git LFS로 관리됩니다 (.gitattributes에 패턴 추가, 기존.mlpackageLFS 설정 대체).References
Nexters/GAMSS-AndroidPR [Chore] Github Actions CI 구축 #5 (feature/emotion-on-develop)