pulse.huny.dev
HunyDev
Loading ONNX Models Directly from Memory in C and Java

Loading ONNX Models Directly from Memory in C and Java

모델 파일 경로 대신 “메모리 버퍼”에서 바로 ONNX 세션을 만드는 방법을 정리했다. 배포/보안/크로스플랫폼에서 꽤 유용하다.

Hun Jang
Hun Jang Nov 27, 2025

경로 대신 메모리에서 모델 불러오기

모델 파일 경로 대신 “메모리 버퍼”에서 바로 ONNX 세션을 만드는 방법을 정리했다. 배포/보안/크로스플랫폼에서 꽤 유용하다.

왜 메모리에서 세션을 만들까?

  • 경로 문제 회피: 윈도우는 wchar_t(ORTCHAR_T) 경로, 리눅스/맥은 char* 경로라서 코드가 갈라진다. 버퍼 로딩은 OS별 경로 인코딩 차이를 건드리지 않는다.
  • 보안/배포: 모델을 실행 전에 복호화/검증해서 RAM에만 올려두고, 디스크에 평문을 남기지 않는다.
  • 번들/임베드: 리소스 패키지(압축/아카이브)에서 꺼내 즉시 로드 가능. 서버리스(람다 등) 콜드스타트 최적화에도 도움.

C API (ONNX Runtime) — 바이트 배열로 세션 만들기

포인트

  • CreateSessionFromArray를 쓰면 파일 경로가 필요 없다.
  • 버퍼는 세션이 생성되는 동안만 유효하면 된다. 이후 해제해도 세션 내부로 로드된다(직접 커스텀 메모리 얼로케이터를 쓰지 않았다면 일반적으로 안전).
  • 모델이 큰 경우, 압축→해제→버퍼 로드 흐름으로 I/O 최소화.

Java (onnxruntime-java) — ByteBuffer로 세션 만들기

  • Direct ByteBuffer를 사용하면 네이티브 레이어에서 추가 복사를 줄인다.
  • JAR 내부 리소스를 읽을 때도 파일로 풀지 말고 버퍼로 바로 세션 생성 가능.

흔한 함정과 체크리스트

  • 경로 인코딩 이슈 제거: CreateSession(경로) 대신 CreateSessionFromArray를 쓰면 UTF-16(wchar) vs UTF-8 문제 사라진다.
  • 라이프사이클: C에선 세션 생성 성공 후 버퍼 해제 OK(일반적 케이스). Java는 DirectBuffer를 GC에 맡기지 말고 재사용/명확한 스코프 관리.
  • 모델 무결성: 로딩 전 해시/시그니처 검증 → 메모리 버퍼가 신뢰 가능한 상태인지 확인.
  • 옵션 튜닝: 스레드 수, 그래프 최적화, 메모리 Arena, CPU affinity 등을 세션 옵션에서 고정해 재현성/성능 확보.
  • 서버리스: 콜드스타트 시 버퍼를 압축 + 빠른 복호화로 준비해 CreateSessionFromArray로 즉시 세션화. 스냅샷/프리워밍 전략과 궁합이 좋다.

미니 벤치 가이드(실무용)

  • 파일 경로 로드 vs 메모리 로드를 동일 옵션으로 비교.
  • 로드 시간(init), 첫 추론 지연, RSS/Peak 메모리, QPS 기록.
  • 리눅스/윈도우 모두 측정해 경로 인코딩 회피로 인한 운영 이득 확인.

You might also like

BlogPro logo
Made with BlogPro

Tags