Repository navigation
[NM-628] 온디바이스 추론을 LiteRT 로 통일한다 — 세그 · 마크 · 각인 G5 - #83
Merged
Merged
Conversation
ML 이 정한 모델 7파일(136MB)과 실행 정밀도 계약을 그대로 옮긴다. - LiteRtModel: CompiledModel 하나 · 입출력 버퍼 재사용 · GPU(OpenCL) 실패 시 같은 파일을 CPU 로 - 세그: 입력 NHWC, 마스크는 쿼리가 마지막 축이라 검출된 쿼리만 건너뛰며 모은다 · GPU FP32 - 마크: 입력 NHWC · GPU FP32 · 임베딩 공간이 같아 MODEL_VERSION 은 그대로 - 각인: 다섯 조각을 24장 묶음 6개로 흘리고 조각마다 전용 스레드(G5) · p2 · p5 CPU, p3 FP32, p4 GPU+CPU - GpuPolicy: SoC 허용목록을 걷고 크래시 마커만 남긴다. 기록은 (앱 버전 · 빌드 지문) 단위. 자가 점검이 쓸 모델별 CPU 고정 자리를 둔다 - PillModelFile: 모델 하나가 여러 파일(각인 조각 다섯) - ORT EP 측정 테스트(EpMatrix · DetectorEp · ImprintVariant · OrtSessionOpen · DeviceProbe)를 지운다. ORT · QNN 의존과 모듈은 실기기 확인 뒤 따로 걷어낸다 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
S24(Exynos 2400)에서 검출이 GPU 만으로는 `Failed to compile model` 로 열리지 않아 CPU 로 대체됐다. ML 벤치도 단일 파일 모델을 GPU+CPU(gpucpu32)로 열어 잰 것이라 같게 맞춘다. S24 실측 - 검출: GPU 791ms · CPU 1,529ms, 6개 모두 IoU ≥ 0.99999 · 점수 1e-7 안 (DetectorParityTest 신설) - 마크: GPU 4개 대조 통과, 추론 157ms (ML 표 136ms · 이전 앱 WebGPU 257ms) - 각인: CPU 는 기준 YS 0.969883 에 1e-4 안. GPU 는 YS · pair YS 같고 점수 0.9723 — 계약상 p1 · p4 가 FP16 이라 GPU 허용 오차를 5e-3 으로 둔다. 추론 680ms (ML 634 · 이전 2,054) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LiteRT 는 GPU 로 못 열면 조용히 CPU 로 돈다 — 사용자에게는 느린 것 말고 증상이 없다. 앱 안 자가 점검 대신 출시 전 기기별 검증으로 막기로 했고(2026-10-19), 어느 기기를 재야 하는지를 운영에서 본다. - Android 전용 이벤트 ondevice_backend(model · backend · cause · soc_model), 모델 파일마다 앱 버전당 한 번 - VisionBackend.onModelOpened 로 열림 결과(OpenOutcome)를 알린다. 보고 실패는 열기를 막지 않는다 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LiteRT 로 바꾼 뒤 운영 경로에서 쓰지 않는다. S24 에서 검출 · 마크 · 각인 대조가 통과한 뒤 지운다. - QNN 조건부 전달 모듈 6개 · QnnFeatureConventionPlugin · 기기 그룹 설정 · enableDeviceTargetingConfigApi - onnxruntime-android · QNN 플러그인 · qnn-runtime 의존, OrtBackend · QnnPluginEp - QNN 전달 보고(qnn_delivery 이벤트) · QnnModuleProbeTest · ORT 텔레메트리 차단 매니페스트 블록 - useLegacyPackaging(QNN 이 실파일을 요구해서 켰다). LiteRT · OpenCV .so 는 16KB 정렬이다 - LiteRT AAR 에 딸린 퀄컴 NPU .so 2개(1.2MB)를 뺀다 — NPU 는 범위 밖 R8: liblitert_jni.so 가 LiteRtException · TensorBufferRequirements · TensorType(+ElementType · Layout)을 이름으로 찾는데 AAR 규칙이 지키지 않는다(⑩ 과 같은 부류). keep 을 LiteRT 로 바꾸고 매핑 가드 (verifyReleaseJniKeep)가 이 다섯을 본다. 문서: docs/RELEASE.md 모델 절차를 LiteRT 7파일로, 옛 WebGPU 수치를 적은 KDoc 을 S24 LiteRT 실측으로. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
에뮬레이터 릴리스 스모크에서 InitializationProvider 가 WorkDatabase 를 못 만들어 죽었다 — PR #21(Glance)과 같은 결함. 경로는 litert-api → play:ai-delivery(AI Pack, 알파) → asset-delivery → work-runtime. 같이 병합된 assetpacks 서비스 · 리시버와 FOREGROUND_SERVICE_DATA_SYNC 권한은 Play 포그라운드 서비스 신고까지 요구한다. - core:vision 의 litert · litert-gpu 에서 ai-delivery 를 뺀다. 그 패키지를 부르는 것은 deployment.AiPackModelProvider 하나이고 쓰지 않는다 — R8 은 -dontwarn - LiteRT 자체 매니페스트의 FOREGROUND_SERVICE_DATA_SYNC(「Android NPU Manager」)를 지운다 에뮬레이터 릴리스: 크래시 없이 로그인 화면, JNI 매핑 가드 9개 통과. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- GPU 흔적을 CompiledModel.create 앞에 남긴다(onGpuUse). 셰이더 준비 중 드라이버가 죽어도 다음 실행이 막는다 - 흔적은 GPU 모델이 열려 있는 동안만 둔다(onGpuReleased 로 수를 센다). 식별 뒤 무관한 네이티브 크래시를 GPU 탓으로 읽지 않게 - GPU 버퍼 할당까지 GPU 시도에 넣고, 실패하면 닫은 뒤 CPU 로 연다(새던 CompiledModel) - GPU 실행이 LiteRtException 을 던지면 CPU 로 다시 열어 한 번 더 돌리고 그 모델을 이 빌드에서 CPU 에 고정한다 (onGpuRunFailed → GpuPolicy.pinToCpu · 이벤트 cause=gpu_run_failed) - ondevice_backend 를 (모델 · 결과)마다 앱 버전당 한 번 — gpu_blocked · gpu_run_failed 가 「이미 보냄」에 묻히지 않게 - 각인: 한 묶음이 실패해도 나머지가 끝난 뒤 던진다. close 는 조각 스레드가 멈춘 뒤 별도 스레드에서 닫는다(메인 ANR 방지). 다섯 조각이 모두 CPU 면 겹치지 않고 차례로 돈다(4스레드 × 5 가 리틀코어로 넘친다) - GpuPolicy KDoc: 자가 점검은 하지 않는다 — 조용히 틀린 답은 출시 전 기기별 검증이 막는다 - 정리하다 지운 KDoc 두 개를 되살린다(마크 소프트맥스 순서 · 개발용 모델 우회) 세그 · 마크의 GPU+CPU 는 정본 표(GPU)와 다르다 — ML 에 확인 요청(_handoff/litert-gpu-cpu-contract.md). S24 대조 테스트 6개 통과. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
통과 기준 확인
남은 것: Test Lab 대표 기기(Adreno · Mali · MediaTek · 구형) 대조는 릴리스 전에 develop 에서 돈다. 그때까지 NM-628 은 열어 둔다. |
This was referenced Oct 19, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
무엇
ONNX Runtime · QNN · WebGPU 경로를 걷어내고 온디바이스 추론을 LiteRT 하나로 바꾼다. 전 기기 같은 모델 파일 7개(136MB), 기기별 분기 없음. 정본은
_handoff/litert-ondevice-migration.md(실행 정밀도 계약 · 입출력 · G5 파이프라인).바뀐 것
LiteRtModel: CompiledModel 하나 · 버퍼 재사용. GPU(OpenCL)로 열다 실패하거나, 열린 뒤 GPU 실행이 실패하면 같은 파일을 CPU 로 연다MODEL_VERSION은 그대로GpuPolicy(←WebGpuPolicy): SoC 허용목록 제거, 크래시 마커는 (앱 버전 · 빌드 지문) 단위, GPU 실행 실패 모델은 CPU 고정ondevice_backend(Android 전용) — 모델 · 가속기 · 까닭 · SoC, (모델 · 결과)마다 앱 버전당 한 번liblitert_jni.so가 이름으로 찾는 클래스 5개를 keep + 매핑 가드play:ai-delivery(→ WorkManager)를 뺀다 — 릴리스가 시작하자마자 죽었다(PR [NM-445] 처치 타이머 — 폰·워치 양방향 동기화 · 워치 화면 · 위젯 · 잠금화면 #21 과 같은 결함).FOREGROUND_SERVICE_DATA_SYNC도 지운다실측 (S24 · Exynos 2400)
정확도: 대조 테스트 6개 통과 — 검출 GPU = CPU(IoU ≥ 0.99999), 각인 CPU 는 기준
YS 0.969883±1e-4 · GPU 는 답 같고 점수 +0.0024(p1 · p4 FP16 계약), 마크 4개 통과.에뮬레이터 릴리스: 크래시 없이 로그인 화면, JNI 매핑 가드 9개 통과.
남은 것
_handoff/litert-gpu-cpu-contract.md)🤖 Generated with Claude Code