Pydantic, 데이터 서빙시, Interface Data Validation 관련 라이브러리

Pydantic, 데이터 서빙시, Interface Data Validation 관련 라이브러리
Photo by Daria Nepriakhina 🇺🇦 / Unsplash

Motivation

  • Pydantic은 Validation Check를 위한 라이브러리로, 잘못된 데이터가 시스템에서 유입되고 운용되는 것을 막기 위한 라이브러리
  • 비동기 웹 프레임워크인 FastAPI와 함께 많이 쓰임
@app.post("/items/")
async def create_item(item: Item):
    # 비동기 처리를 포함한 작업 수행
    return item

Pros & Cons

Pros

  • 데이터 모델을 정의 후에 자동으로 데이터 검증 후 변환
  • 타입힌트를 활용함으로써 코드 가독성이 높은 편
class Item(BaseModel):
    name: str
    price: float
    description: str = None
    tax: float = None

@app.post("/items/")
async def create_item(item: Item):
    return item
  • Cython을 이용해서 성능을 최적화하였음
  • FastAPI 통합이 원활하여 웹 어플리케이션 개발시 유용
import torch
import torch.nn as nn
import numpy as np

class PredictionRequest(BaseModel):
    data: list

class PredictionResponse(BaseModel):
    prediction: list

class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.layer1 = nn.Linear(10, 10)

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

model = SimpleModel()
model.load_state_dict(torch.load("simple_model.pth"))
model.eval()

@app.post("/predict/", response_model=PredictionResponse)
async def predict(request: PredictionRequest):
    data = torch.tensor(np.array(request.data), dtype=torch.float32)
    with torch.no_grad():
        prediction = model(data).numpy().tolist()
    return PredictionResponse(prediction=prediction)

Cons

  • 검증 및 Parsing 등 이슈로 다소 속도 저하에 영향이 있을 수 있음(참고, v2로 업데이트하고 테스트한 내용)
  • 복잡한 모델 구현시 Pydantic으로 하기 쉽지 않음
    • 중첩된 데이터 구조가 깊어질수록 모델의 정의가 복잡해지고, 이를 관리하기 어려워짐
    • 중첩된 필드 간의 상호 의존성을 고려한 유효성 검사를 수행하는 것이 복잡해질 수 있음
    • 필드 값에 따라 다른 필드의 유효성을 동적으로 검사해야 할 때, Pydantic 모델에서 이를 구현하기가 까다로울 수 있습니다.
  • 문서화 관련 기능이 좀 아쉬운 편임

Alternatives

  • Marshmallow: 데이터 검증 외에도 Serialization 지원, Flask와 함께 많이 쓰임
  • Cerberus: Dictionary 기반 검증하는 경량화된 라이브러리
  • attrs: 간단하고 가벼운 데이터 클래스 라이브러리로, 데이터 검증 기능도 포함

Sample

import torch
import torch.nn as nn
import torch.optim as optim

# PyTorch 모델 정의
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.layer1 = nn.Linear(10, 10)

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

# 데이터 생성 (임의의 데이터 사용)
X = torch.randn(100, 10)
y = torch.randn(100, 10)

# 모델 초기화
model = SimpleModel()

# 손실 함수 및 옵티마이저 정의
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 모델 학습
num_epochs = 100
for epoch in range(num_epochs):
    model.train()
    optimizer.zero_grad()
    outputs = model(X)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()

# 학습된 모델 저장
torch.save(model.state_dict(), "simple_model.pth")

from pydantic import BaseModel
from fastapi import FastAPI
import torch
import torch.nn as nn
import numpy as np

# Pydantic 데이터 모델 정의
class Item(BaseModel):
    name: str
    price: float
    description: str = None
    tax: float = None

class PredictionRequest(BaseModel):
    data: list

class PredictionResponse(BaseModel):
    prediction: list

# FastAPI 인스턴스 생성
app = FastAPI()

# PyTorch 모델 정의
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.layer1 = nn.Linear(10, 10)

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

# 학습된 모델 로드
model = SimpleModel()
model.load_state_dict(torch.load("simple_model.pth"))
model.eval()

@app.post("/items/")
async def create_item(item: Item):
    return item

@app.post("/predict/", response_model=PredictionResponse)
async def predict(request: PredictionRequest):
    data = torch.tensor(np.array(request.data), dtype=torch.float32)
    with torch.no_grad():
        prediction = model(data).numpy().tolist()
    return PredictionResponse(prediction=prediction)

# 서버 실행: uvicorn main:app --reload

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은 빈도를 제곱근 형태로 변환하여, 데이터 분포의 차이를 더 잘 시각화할 수 있도록 돕습니다 * 여기서