ONNX, 다양한 ML 프레임워크 간 모델의 상호운용 및 배포를 도와주는 프레임워크

ONNX, 다양한 ML 프레임워크 간 모델의 상호운용 및 배포를 도와주는 프레임워크
Photo by Shubham's Web3 / Unsplash

Onnx is

  • Open Neural Network Exchange의 약자로 Pytorchs나 Tensorflow 등 다양한 Framework를 통해 생성된 모델을 결합하여 사용할 수 있도록 일관성과 상호 운용성을 보장하는 오픈소스 프레임워크
  • ONNX는 표준화된 연산자 및 데이터 타입을 활용하여 다양한 플랫폼에서 호환성을 보장함

Motivation

  • Interoperability: 다양한 ML 프레임워크 간 모델을 호환해서 사용할 수 있도록 지원
  • Standardization: 표준화된 형식을 통해서 모델의 재사용성을 높일 수 있음
  • Productivity: 여러 환경에서 모델을 쉽게 배포할 수 있도록 함으로써 생산성 향상

Pros & Cons

Pros

  • 다양한 프레임워크 지원 → Tensorflow, Pytorch, Caffe2등 다양한 프레임워크 지원
  • 하드웨어 가속 → ONNX Runtime 등 툴을 이용해서 모델 실행 속도를 높일 수 있음
    • ONNX Runtime은 ONNX 형식의 모델을 실행하기 위한 고성능 엔진으로 ONNX가 모델을 정의하고 변화하는 기능에 초점을 맞추고 있다면 Runtime은 추론 속도 및 효율성 최적화에 초점을 맞추고 있음
      • ONNX는 Meta 및 MS를 포함, 여러 회사가 함께 개발하고 지원하는데 반해 ONNX Runtime은 MS가 주도
    • CPU, GPU, 그리고 TensorRT, OpenVINO, DirectML 등을 직접 지원
  • 오픈소스 커뮤니티 → 활발한 오픈소스 커뮤니티가 있어 지속 업데이트 가능

Cons

  • 제한된 연산자 지원 → 일부 연산자 호환이 되지 않을 수 있음
    • TensorFlow의 tf.image.non_max_suppression: 커스텀 구현이나 우회 방법이 필요할 수 있dㅡㅁ
    • PyTorch의 고급 인덱싱 또는 커스텀 CUDA 커널
    • Scikit-learn의 특정 전처리 단계
      • PolynomialFeatures:
      • FunctionTransformer: 사용자 정의 함수로 데이터를 변환할 수 있게 하는 이 도구는 ONNX에서 지원되지 않을 수 있음
      • ColumnTransformer: 여러 유형의 전처리를 열마다 다르게 적용할 수 있게 하는 이 도구는 ONNX로 변환 시 복잡성을 증가시킬 수 있습니다.
  • 복잡성 → 모델 변환과정에서 발생할 수 있는 호환성과 이를 해결하기 위한 디버깅이 어려을 수 있음
  • 성능저하 가능성: 프레임워크간 변환시 성능 저하될 수 있음

Alternative

  • Tensorflow SavedModel: Tensorflow에서 모델 저장 및 배포를 위한 표준 형식
  • TorchScript: Pytorch 모델을 저장하고 배포하기 위한 형식
  • PMML(Predictive Model Markup Language): 데이터 마이닝 및 예측 모델링을 위한 표준화된 XML기반 형식

Sample Code

import torch
import torch.onnx
import onnx
import onnxruntime
import matplotlib.pyplot as plt

# 간단한 PyTorch 모델 정의
class SimpleModel(torch.nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc = torch.nn.Linear(2, 1)

    def forward(self, x):
        return self.fc(x)

# 모델 인스턴스 생성 및 더미 입력 정의
model = SimpleModel()
dummy_input = torch.randn(1, 2)

# 모델을 ONNX 형식으로 변환 및 저장
torch.onnx.export(model, dummy_input, "simple_model.onnx", verbose=True)

# ONNX 모델 로드 및 확인
onnx_model = onnx.load("simple_model.onnx")
onnx.checker.check_model(onnx_model)

# ONNX Runtime을 사용하여 모델 실행
ort_session = onnxruntime.InferenceSession("simple_model.onnx")
ort_inputs = {ort_session.get_inputs()[0].name: dummy_input.numpy()}
ort_outs = ort_session.run(None, ort_inputs)

print("ONNX Runtime output:", ort_outs)

# 추가 설명을 위한 코드 예제 확장
print(f"PyTorch Model Output: {model(dummy_input).detach().numpy()}")
print(f"ONNX Model Output: {ort_outs[0]}")

🥤Source

Read more

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성(Multi Collinearity) * **Multi-Collinearity(다중공선성)**는 독립 변수들 간의 강한 상관관계가 존재할 때 발생합니다. 즉, 한 독립 변수가 다른 독립 변수에 의해 설명될 수 있을 정도로 상관관계가 높은 상황을 의미합니다. * 이 문제는 주로 회귀 분석에서 나타나며, 변수들 간의 관계를 해석하는 데 있어 큰 장애물이 될 수 있습니다. * 일반적인 회귀식을 $Y=

Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.

Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.

Bayesian P- Value * Bayesian P-Value는 **모델의 적합도(goodness-of-fit)**를 평가하는 데 사용됩니다. * 사후 분포(posterior distribution)를 이용하여 실제 데이터와 모델이 생성한 예상 데이터를 비교함으로써, 관측된 데이터가 모델에 의해 얼마나 잘 설명되는지를 평가합니다. * 빈도주의 p-값은 "관찰된 데이터보다 극단적인 데이터가 나올 확률"을 계산하지만, Bayesian P-Value는 "모델이 실제

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non Identifiability * Non-Identifiability는 주어진 데이터와 모델에 대해 특정 파라미터를 고유하게 식별할 수 없는 상황을 의미합니다. 즉, 여러 파라미터 값들이 동일한 데이터를 생성할 수 있으며, 이로 인해 특정 파라미터 값을 확정적으로 추정하기 어렵게 됩니다. * 베이지안 추론에서 Non-Identifiability는 사후 분포가 특정 파라미터 값에 대해 명확하게 수렴하지 않고, 여러 값들에 대해 비슷한 확률을

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram * 히스토그램의 변형으로 데이터가 비정규적이거나 큰 분산을 가지는 경우, 정확한 분포를 파악하기 위해 사용됩니다. * 일반적으로 히스토그램은 데이터의 빈도를 직접적으로 나타내기 때문에, 큰 값이 빈번하게 발생하는 경우 상대적으로 작은 값을 잘 드러내지 못하는 경향이 있습니다. 반면, Rootgram은 빈도를 제곱근 형태로 변환하여, 데이터 분포의 차이를 더 잘 시각화할 수 있도록 돕습니다 * 여기서