WIKI
ONNX
ONNX
모델을 범용 추론 그래프로 내보내는 형식은 무엇이며 어떤 제약이 있는가.
Scope
핵심 질문
ONNX는 서로 다른 ML framework와 runtime 사이에서 모델을 교환하기 위해 어떤 중간표현을 정의하는가?
Research
핵심 근거
- ONNX는 portable serialized computation graph format을 정의한다.
- ModelProto 안에 GraphProto와 operator, initializer, metadata 등이 저장된다.
- opset version은 operator semantics의 버전을 나타내며 runtime compatibility에서 중요하다.
- ONNX 자체는 특정 runtime implementation을 강제하지 않는다.
참고 자료
- ONNX IR specification: https://onnx.ai/onnx/repo-docs/IR.html
- ONNX concepts: https://onnx.ai/onnx/intro/concepts.html
Draft
ONNX(Open Neural Network Exchange)는 머신러닝 모델의 계산 그래프를 framework 독립적인 형태로 표현하기 위한 모델 형식과 operator specification이다.
계산 그래프
ONNX 모델은 입력, 출력, node, weight initializer로 구성된 계산 그래프를 저장한다. Node는 MatMul, Add, Softmax처럼 정의된 operator를 사용한다.
모델을 학습한 framework가 내부적으로 사용하는 representation과 ONNX graph는 같을 필요가 없다. Export 과정에서 framework 연산을 ONNX operator로 변환한다.
Opset
ONNX operator의 정의는 시간이 지나며 바뀔 수 있다. Opset version은 모델이 어떤 operator semantics를 기준으로 만들어졌는지 나타낸다.
Runtime이 해당 opset이나 operator를 지원하지 않으면 모델을 바로 실행할 수 없다. 그래서 ONNX export 문제의 상당 부분은 단순 파일변환보다 operator compatibility 문제다.
Runtime과 분리
ONNX는 특정 실행엔진을 지정하지 않는다. ONNX Runtime, TensorRT, OpenVINO 등 서로 다른 runtime이 같은 ONNX graph를 읽어 자신에게 맞게 최적화할 수 있다.
한계
모든 framework의 최신 연산이 즉시 ONNX 표준에 존재하는 것은 아니다. custom operator, 동적 shape, 복잡한 control flow가 exporter와 runtime 사이에서 문제를 일으킬 수 있다.
핵심
ONNX는 모델 실행엔진이 아니라 계산 그래프를 교환하기 위한 중간표현이다. 실제 portability는 모델이 사용하는 operator와 target runtime의 지원범위가 맞아야 얻어진다.