LabHub
배우기 러닝패스 코스

AI 다이어트 실패 사건 · 내보내기에서 굳는 것들 · 실습

이 파일은 무엇을 약속하고 있나 — 내보내기에서 굳는 것들

LabHub 에서 이어서 보기

목표

onnx.helper 로 MLP 를 직접 지어 /root/onnxq-export/mlp.onnx 를 만들고, ONNX 파일에서 굳어 있는 것들을 읽어 내는 도구 /root/onnxq-export/modelmeta.py 를 만든다. 판 번호를 갈아 끼우며 onnx.checker 와 onnxruntime 에 차례로 물어, 검사기는 통과하는데 런타임이 거절하는 자리를 직접 찾아 문서로 남긴다.

왜 중요한가

ONNX 파일은 그래프만 담지 않는다. 어느 연산자 집합 판으로 썼는지, IR 버전이 몇인지, 누가 만들었는지, 무엇이 입력이고 무엇이 이미 정해진 가중치인지가 내보내는 순간 함께 굳는다. 받는 쪽은 그 결정을 바꿀 수 없고, 바꾸려면 다시 내보내야 한다.
그래서 "우리 서버에서 안 열린다" 는 신고의 원인은 대개 변환 옵션이 아니라 파일 첫머리에 있다. 판 번호를 낮춰 다시 저장해도 연산자 정의가 따라 내려가지 않기 때문에, 검사기는 통과시키고 런타임만 거절하는 파일이 만들어진다. 오류 문구가 "판이 낮다" 가 아니라 "이 연산자의 구현이 없다" 로 나와서 원인이 더 안 보인다.
onnx.checker 도 한 겹이 아니다. 기본 검사는 구조만 보고, full_check=True 를 주어야 모양 추론까지 돈다. 곱셈이 성립하지 않는 MatMul 은 기본 검사를 그냥 통과한다. 그리고 두 검사 모두 등록되지 않은 도메인의 연산자를 막지 못한다.
채점기는 여러분이 적어 낸 문구를 믿지 않는다. 임시 디렉터리에 채점기가 직접 지은 ONNX 파일을 차려 놓고 여러분의 도구를 실제로 실행해, 같은 파일을 채점기가 읽어 얻은 답과 대조한다. 모양·이름·판 번호·활성 함수는 실행마다 바뀐다.

단계

1. /root/onnxq-export/build_mlp.py 를 만들어 실행해 /root/onnxq-export/mlp.onnx 를 만드세요.
2. /root/onnxq-export/modelmeta.pyinfo 를 만들어 판 번호·producer·입출력·initializer·노드를 읽어 내게 하세요.
3. infoinput_overridesruntime_inputs 를 더해 initializer 와 입력의 경계를 드러내게 하세요.
4. check 를 더해 onnx.checker 를 기본과 full_check=True 두 번 돌리고 판정을 따로 적게 하세요.
5. load 를 더해 onnxruntime 이 세션을 여는지, 못 열면 어떤 예외인지 적게 하세요.
6. stamp 를 더해 연산자를 그대로 두고 판 번호만 갈아 다시 저장하게 하세요.
7. scan 을 더해 이 런타임이 여는 판의 범위를 실제로 재게 하고, 자기 모델의 범위를 /root/onnxq-export/opset_range.json 에 적으세요.
8. /root/onnxq-export/export_report.json/root/onnxq-export/export_report.md 로 인수인계 문서를 만드세요.

참고

단계 8개

  1. 모델을 직접 짓기
  2. 파일에 굳어 있는 것들 읽어 내기
  3. 가중치는 입력이 아니다
  4. 검사기는 한 겹이 아니다
  5. 런타임에게 직접 물어보기
  6. 판 번호만 갈아 끼우기
  7. 이 런타임이 여는 판의 범위 재기
  8. 인수인계 한 장으로 남기기