LabHub
배우기 러닝패스 코스

AI 다이어트 실패 사건 · 그래프 최적화가 바꾸는 것 · 실습

노드가 여섯 개에서 두 개로 — 최적화가 바꾼 것 세어 보기

LabHub 에서 이어서 보기

목표

최적화가 손댈 거리를 모은 /root/onnxq-optimize/graph.onnx 를 직접 짓고, ORT 의 네 최적화 단계를 돌려 그래프를 파일로 꺼내 노드를 세는 도구 /root/onnxq-optimize/optlevel.py 를 만든다. 단계마다 무엇이 사라지고 무엇이 생기는지 적고, 답이 같은지 재고, 꺼낸 파일을 다른 기계로 옮기면 안 되는 이유를 도메인 이름으로 증명한다.

왜 중요한가

onnxruntime 은 세션을 열 때 그래프를 다시 쓴다. 상수만으로 계산되는 부분을 미리 접고, 없어도 되는 노드를 지우고, 자주 나오는 모양을 하나로 묶는다. 무엇이 어디까지 바뀌는지는 최적화 단계가 정한다.
양자화 전후 속도를 견줄 때 숫자가 안 맞는 원인이 여기 있는 경우가 많다. 두 측정의 최적화 단계가 다르면 그 비교는 양자화를 잰 것이 아니라 최적화를 잰 것이다. 기준선을 ORT_DISABLE_ALL 로 못 박아 두면 이 흔들림이 사라진다.
더 비싼 사고는 최적화된 파일을 저장해 배포하는 것이다. 그 파일에는 표준이 아닌 도메인의 노드가 들어 있어 다른 런타임이 열지 못한다. 그런데 onnx.checker 는 그 파일을 통과시킨다 — 검사기는 모르는 도메인을 지나가기 때문이다. 그래서 이식 가능 여부의 근거는 검사기가 아니라 노드의 도메인 목록이다.
이 실습은 시간을 재지 않는다. 이 기계는 에뮬레이션이라 같은 일도 두 배까지 흔들린다. 그래서 구조가 어떻게 바뀌었는지와 답이 같은지만 판정한다.
채점기는 여러분이 적어 낸 문구를 믿지 않는다. 임시 디렉터리에 채점기가 직접 지은 그래프를 차려 놓고 여러분의 도구를 실제로 실행해, 같은 파일을 채점기가 네 단계로 최적화해 얻은 값과 대조한다. 모양·가중치·난수 씨앗은 실행마다 바뀝니다.

단계

1. /root/onnxq-optimize/build_graph.py 를 만들어 실행해 /root/onnxq-optimize/graph.onnx 를 만드세요.
2. /root/onnxq-optimize/optlevel.pynodes 를 만들어 지금 그래프의 노드와 개수를 읽어 내게 하세요.
3. optimize 를 더해 주어진 단계로 최적화한 그래프를 파일로 꺼내게 하세요.
4. levels 를 더해 네 단계를 모두 돌려 노드를 세어 나란히 놓게 하세요.
5. fusion 을 더해 단계마다 무엇이 사라지고 무엇이 생겼는지 적게 하세요.
6. equal 을 더해 주어진 씨앗으로 만든 같은 입력을 네 단계에 넣어 답이 같은지 재게 하세요.
7. portable 을 더해 꺼낸 파일이 표준 연산자만 쓰는지 판정하게 하세요.
8. /root/onnxq-optimize/opt_report.json/root/onnxq-optimize/opt_report.md 로 보고서를 만드세요.

참고

단계 8개

  1. 최적화가 손댈 거리 모으기
  2. 지금 그래프를 세어 두기
  3. 최적화된 그래프를 파일로 꺼내기
  4. 네 단계를 나란히 놓기
  5. 무엇이 사라지고 무엇이 생겼나
  6. 그래프는 바뀌어도 답은 같은가
  7. 이 파일을 옮겨도 되나
  8. 네 단계를 한 장으로 보고하기