LabHub
배우기 러닝패스 코스

AI 다이어트 실패 사건 · 축 하나가 굳으면 배치가 막힌다 · 실습

32개를 넣었더니 거절당했다 — 죽은 배치 축 되살리기

LabHub 에서 이어서 보기

목표

같은 가중치로 배치 축이 심볼인 /root/onnxq-shape/dyn.onnx 와 1로 굳은 /root/onnxq-shape/fixed.onnx 를 만들고, 축을 읽고 실제로 넣어 보는 도구 /root/onnxq-shape/axes.py 를 만든다. 마지막에는 상수 형이 박혀 배치 축이 죽은 모델을 찾아내 되살린다.

왜 중요한가

ONNX 의 축은 정수로 굳거나, 심볼 이름으로 열려 있거나, 아예 비어 있다. 셋은 전혀 다른 뜻인데 파일을 대충 보면 구분이 안 된다. 배치를 키워 처리량을 재려는 실험이 첫 줄에서 막히는 원인이 대개 여기 있다.
거절이 세션을 열 때가 아니라 값을 넣을 때 일어난다는 점도 중요하다. 세션이 열렸다고 모델 문제가 아니라고 결론 내리면 엉뚱한 곳을 파게 된다.
같은 심볼 이름이 두 입력에 쓰이면 그것은 "둘 다 동적" 이 아니라 "둘의 행수가 서로 같아야 한다" 는 제약이다. 어기면 거절당하는데, 런타임은 심볼 이름을 짚어 주지 않고 최적화를 거친 뒤의 노드 이름을 댄다. 원인과 증상 사이에 한 겹이 끼어 있다.
가장 조용한 사고는 Reshape 에 상수 형이 박힌 경우다. 입력은 심볼로 열려 있는데 그 지점부터 배치 축이 정수로 바뀐다. 오류도 경고도 없고, 모양 추론은 그 상수를 그대로 믿어 앞뒤가 맞는 답을 내놓는다.
채점기는 여러분이 적어 낸 문구를 믿지 않는다. 임시 디렉터리에 채점기가 직접 지은 파일을 차려 놓고 여러분의 도구를 실제로 실행해, 같은 파일을 채점기가 읽고 돌려 얻은 답과 대조한다. 축 이름과 모양, 박아 넣는 행수는 실행마다 바뀐다.

단계

1. /root/onnxq-shape/build_shapes.py 를 만들어 실행해 /root/onnxq-shape/dyn.onnx/root/onnxq-shape/fixed.onnx 를 만드세요.
2. /root/onnxq-shape/axes.pydims 를 만들어 입출력 축이 정수인지 심볼인지 읽어 내게 하세요.
3. feed 를 더해 주어진 행수로 값을 만들어 실제로 넣어 보고 결과나 거절을 적게 하세요.
4. infer 를 더해 onnx.shape_inference 가 채운 것과 못 채운 것을 가르게 하세요.
5. symbols 를 더해 같은 심볼 이름이 어디어디에 쓰였는지 모으게 하세요.
6. scan 을 더해 상수 형이 박힌 Reshape 를 찾아내게 하세요.
7. repair 를 더해 박힌 형의 배치 자리를 되돌리고 출력 축에 심볼 이름을 다시 붙이게 하세요.
8. /root/onnxq-shape/shape_report.json/root/onnxq-shape/shape_report.md 로 보고서를 만드세요.

참고

단계 8개

  1. 축 선언만 다른 두 판 만들기
  2. 축이 열려 있는지 굳어 있는지 읽기
  3. 실제로 넣어 보기
  4. 추론이 채운 것과 못 채운 것
  5. 같은 이름은 같은 값이다
  6. 상수 형이 박힌 Reshape 찾기
  7. 죽은 배치 축 되살리기
  8. 두 판을 나란히 놓고 보고하기