LabHub
배우기 러닝패스 코스

AI 다이어트 실패 사건 · 실행 공급자와 오차 누적 · 실습

쥔 것을 세어 본다 — 실행 공급자와 오차 누적

LabHub 에서 이어서 보기

목표

요청한 실행 공급자와 세션이 실제로 쥔 공급자를 재고, 지원 연산자 목록에 따라 그래프가 몇 조각으로 갈리는지 세고, 층 경계마다 양자화 오차가 어떻게 자라는지 표로 만드는 도구 eprun.py 를 만든다.

왜 중요한가

실행 공급자는 요청하는 것이지 보장받는 것이 아니다. 이 환경에서 직접 재어 보면, 없는 공급자를 목록에 넣어도 예외가 나지 않고 그대로 CPU 로 떨어져 돌아간다. 그래서 "가속기를 쓰고 있다" 는 착각이 로그에 아무 흔적도 남기지 않은 채 오래 간다. 확인하는 길은 하나뿐이다 — 세션에 물어본다.
공급자는 모델 전체를 맡는 것이 아니라 노드마다 맡을 수 있는 것만 가져간다. 그래서 지원 목록이 그래프 순서 위에서 끊기면 모델이 여러 조각으로 갈리고 조각 사이마다 값을 넘긴다. 조각이 다르게 갈리면 계산 순서가 달라지고, 같은 모델에 같은 입력을 넣어도 기계마다 다른 수가 나올 수 있다.
오차 쪽도 같은 태도가 필요하다. 양자화 오차는 층마다 새로 생기고 앞 층의 오차가 다음 층으로 들어간다. 다만 층마다 고르게 자라지는 않으므로, 이야기로 넘기지 말고 층 경계마다 재서 표로 만들어야 어느 층이 문제인지 보인다.
이 파드에는 공급자가 둘뿐입니다(AzureExecutionProvider · CPUExecutionProvider). 없는 가속기를 있는 것처럼 다루지 않고, 여기서 관찰할 수 있는 것만 다룹니다. 채점기는 매번 다른 모델·씨앗·지원 목록으로 여러분의 도구를 실제로 실행해 같은 계산을 다시 하고 대조합니다.

단계

1. /root/ep/gen_ep.py 를 만들어 실행해 /root/ep/fp32.onnx/root/ep/int8.onnx 를 만드세요. 층은 다섯 겹 이상입니다.
2. /root/ep/eprun.pyproviders 를 만들고, 요청 목록별 결과를 /root/ep/providers.json 에 적으세요.
3. partition 을 더해 지원 연산자 목록이 주어졌을 때 그래프가 몇 조각으로 갈릴지 세게 하세요.
4. expose 를 더해 층 경계 텐서를 그래프 출력으로 꺼낸 판을 만들고, /root/ep/fp32_exposed.onnx/root/ep/int8_exposed.onnx 를 저장하세요.
5. layers 를 더해 층 경계마다 최대 절대 오차·상대 오차·최소 코사인을 내게 하세요.
6. growth 를 더해 층을 거듭하며 오차가 자라는 비율을 내게 하고, 여러분 모델의 결과를 /root/ep/growth.json 에 적으세요.
7. settings 를 더해 같은 모델·같은 입력을 설정만 달리해 돌린 결과를 내게 하고, /root/ep/settings.json 에 적으세요.
8. /root/ep/ep_report.md 를 네 절로 쓰세요.

참고

단계 8개

  1. 층을 여러 겹 쌓은 모델과 그 정수 판 만들기
  2. 요청한 것과 쥔 것을 나란히 놓기
  3. 그래프가 몇 조각으로 갈리는지 세기
  4. 층 경계 텐서를 꺼내기
  5. 층 경계마다 오차 재기
  6. 자라는 비율을 표로 만들기
  7. 설정만 바꿔 같은 입력을 돌려 보기
  8. 무엇이 이 기계에서만 참인지 적기