테크매니아
ONNX and ONNX Runtime 본문
반응형
출처 : https://www.microsoft.com/en-us/research/video/onnx-and-onnx-runtime/#!related_info
유튜브 : https://www.youtube.com/watch?v=Ij5MoUnLQ0E&ab_channel=MicrosoftResearch
위 세션을 정리한 자료입니다.
- ONNX시스템
- 고급 ML 워크플로우 : 데이터 -> 학습 -> 변환 -> 추론 -> 배포
- 프로세스 마다 하는 사람이 다름
- 데이터 사이언티스트는 모델 준비, ML엔지니어는 모델이 최고 속도로 실행하게 함
- MS의 고객사들 ML을 사용해 고객을 만족 시키려 함
- 하지만 현실은 서로 다른 팀이 사용하는 다양한 프레임워크를 사용 함
- 모델 프로덕션 배포를 최고 효율로 하드웨어를 최대한 쓰게 하려고 함
- 학습 측면과 배포 측면이 있음
- 많은 프레임워크가 등장하면서 특정 배포 대상(하드웨어)를 지원 하는지 확인 해야 함
- ONNX는 중간에 위치 함
- 원하는 프레임워크로 학습 하고 상호 운용 가능한 AI모델 형식(ONNX)로 변환 함
- ONNX는 개방형 신경망 교환(?)
- 훈련된 모델을 ONNX로 바꿔서 배포 함
- 각 배포 대상에 최적화 되어 있음
- ONNX는 개방형 신경망 교환
- 상호 운용 가능한 표준 형식, 오픈소스임
- 2017년 12월에 시작되었음
- 페이스북에서 먼저 시작했고, PyTorch와 Caffe를 가지고 시작 했음
- 이후 MS와 아마존이 합류 했고 세 회사의 컨소시엄이 되었음
- 모델 전체 연산자(CONV, ReLu, ...)를 지원함
- 이후로 40~50개 회사아 컨소시엄에 가업하고 적극적으로 참여, 투자 함
- 오픈 거버넌스를 갖고 있음
- ONNX 모델 갖고 오는 방법
- ONNX Model Zoo에서 학습된 모델을 갖고 오는 방법
- Azuer Custom Vision을 사용해서 ONNX 모델로 변환 하는 방법
- 오픈소스 이용해서 특정 프레임워크 모델을 ONNX로 바꾸는 방법
- PyTotch는 ONNX로 내보내는 기능이 학습 작업에 포함돼서 별도 변환이 필요 없음
- Azuer ML에서 변환하고 서비스 할 수 있음
- Olive라는 도구로 변환하고 최적화 할 수 있음
- 다양한 오픈소스들이 있음
- 다양하게 지원하고 있음
- 다음 단계는 정말 ONNX가 런타임에 들어오는 것
- ONNX모 모델을 선택한 장치에서 빠르게 실행하고 함
- ONNX 런타임은 표준이고, ONNX가 오픈소스 화 되었을 때 개발 되었음
- (2019년 12월 영상 기준) 1.0을 출시했고 모든 단일 연산자가 구현 되었음
- 모델을 완전히 추론 할 수 있음
- WinML은 ONNX 런타임 위에 있는 래퍼임, = WinML의 핵심 라이브러리는 ONNX 런타임
- (발표 당시 자료임, 지금은 더 많음)
- 많은 아키텍처와 가속기를 지원 함, 크로스 플랫폼임
- 각 아키텍처에 실핼 할 수 있는 기성 패키지로 제공되고 오픈소스로 빌드 할 수 있음
- 하드웨어 가속기 업체가 많은데, 앞으로 ONNX런타임에 통합할거다.
- TensorRT, DirectML 1.0은 Windows DirectX 기술울 사용하고 있음
- Intel MKL-DNN, mGraph, NUPHAR, OpenVINO도 있음
- ONNX 배포에 대해서.
- Azuer, VM, Edge 클라우드, Edge IoT 디바이스 중 하나에 배포하는 플로우가 있음
- Azuer ML, WinML, ML.NET은 이미 ONNX를 지원 함
- WinLM은 모든 단일 Windows 장치의 일부임
- 이미 여러 프로덕션에 배포 했음
- 약 60여개의 모델이 있음, 평균 3배의 성능 향상이 있음
- MS내에서 41%는 TF에 대한 모델 변환 이였음
- 오피스에서 문법 검사 하는 것에 사용되었음
- ONNX 런타임에서 14.6배 성능을 냈음
- 이미지 텍스트에서 Cognitive Service에서 약 3배 성능 향상 함
- ONNX 설계 원칙에 대해서
- 상호 운용이 가능 해야 함
- 형식은 간결해야 함
- 크로스 플랫폼 표현이여야 함
- 이전 버전과 호환되어야 함
- 데이터 흐름 그래프를 어떻게 표현하고 확장 할 수 있는가?
- 새로운 연산자, 타입을 추가할 수 있는가?
- 각 연산자가 입력 받는 표준 타입, 출력 및 그래프에 저장되는 속성
- ONNX 모델에 있는 모든 단일 연산자
- ONNX가 선택한 표현은 google protobuf임. 모델을 검사하고 내용을 확인하는데 씀
- 모델 파일 포맷임
- 시작하는 파일 형식에 대해 많은 속성이 있음
- 모델
- 버전, 메타데이터, 비순환 계산 그래프
- 비순환 계산 그래프가 가중 중요함
- 그래프
- 입력과 출력
- 계산 노드 목록
- 그래프 이름
- 계산 노드 (CONV, BN, ReLU,같은..)
- (...)
- MS에서 만든 Netron이 있음
- 텐서 지원 타입들...
- Sequence, Map같은 비-텐서 타입도 지원 함, zip map같은 전통적 기계학습 모델에 사용 됨
- 연산자 세트, ReLe를 예로 들면
- 버전이 있고, 이름이 있고, 입출력이 있고, ..
- 일반적인 가이드라인은 누구나 ONNX 연산자를 추가할 수 있음
- 버전은 모델과 런타임이 같아야
- 버전 관리는 3가지 수준으로 함
- IR 버전 (파일 포맷)
- Opset 버전
- Operator 버전
- ONNX 런타임의 주요 목표는 성능임
- 모델의 하이브리드 실행을 지원 해야 함(?)
- 모델을 런타임에 주면 무슨 가속기를 쓰던 알아서 실행 돼야(?)
- ONNX 런타임 내에서 실행되는 방식에 대한 아키텍처임
- 모델을 실행 하는데 기본적으로 두 단계가 있음
- 모델로 세션을 생성하고 모델을 로드, 그 후 Run API를 호출 함
- 모델을 로드 하고, Protobuf의 메모리 내 그래프를 표현, Protobuf을 풀고
- 메모리에 비효율적인 그래프 표현을 생성
- 그 뒤에 모델 최적화(=그래프 변환)을 함
- O1, O2, O3같은 컴파일러 최적화 처럼 L1, L2, L3 최적화 수준이 있음
- L1 변환은 추론과 상관없이 노드를 제거 함
- 컨볼루션 일괄 정규화, 곱셈과 덧셈이 융합되고, ...
- 그래프가 최적화 되면 그래프를 하드웨어 가속기로 분할 함
- ONNX 런타임은 일련의 순서로 처리 됨
- (??? 중간에 27:00 부터 29:00 까지 이해 안됨)
- 모델 분할이 끝나면 한 번 더 최적화 하고 하드웨어 가속기에 맞게 융합(?)
- 그 뒤에 실행 단계.. 순차적, 병렬로 실행 됨
- 모델이 병렬로 실행 될 수 있으면 병렬 실행 모드 활성화
- 그래프 최적화
- Node elimination(노드 제거)
- Node fusion, constant folding (노드 융합, 지속적인 폴딩), etc
모델 파티셔닝 (할당)
- 그래프 최적화의 세부 사항임
- 레벨 0, 1, 2가 있음
반응형