Myo-Kyeong Tech Blog

[MLOps] MLOps에서 모델 재현성 보장 : 모델 환경 통제하기 (RandomSeed, Library Version 고정) 본문

MLOps

[MLOps] MLOps에서 모델 재현성 보장 : 모델 환경 통제하기 (RandomSeed, Library Version 고정)

myo-kyeong 2025. 7. 14. 23:55
728x90
반응형

같은 데이터를 넣었는데도 매번 다른 모델이 나온다?
MLOps에서 가장 골치 아픈 문제 중 하나는 바로 모델 재현성이다.
 

 

모델 재현성이 왜 중요한가?

  • 모델 재현성이란?
    • 같은 데이터를 사용하고, 같은 코드를 실행했을 때 언제나 같은 모델 결과가 만들어지는 것을 의미
  • 하지만 같은 데이터를 쓰더라도 실행 환경(Environment) 이 조금이라도 달라지면 모델 결과가 달라진다. 

 

[모델을 만드는 소프트웨어 4가지 요소]

  • 데이터 (Data)
  • 패키지 (Library / Package)
  • 코드 (Code)
  • 파라미터 (Parameter)

이 네 가지가 모두 동일해야 같은 모델을 재현할 수 있다.
그중에서도 특히 환경(Environment) 을 철저히 통제하지 않으면
=> 같은 데이터를 넣어도 서로 다른 모델이 만들어질 수 있다. 


모델 환경 통제 ① - 랜덤 시드 고정

  • 모델 학습 과정에서 랜덤시드 자주 사용
    • 데이터 train/test 로 나눌 때
    • 모델 초기 가중치를 설정할 떄
    • 샘플링 과정 등

랜덤 시드를 고정하지 않으면
=> 같은 코드, 같은 데이터여도 실행할 때마다 모델 결과가 달라진다. 


[예시① - 랜덤 시드를 고정하지 않은 경우]

예를 들어 Scikit-learn 에서 데이터를 분할 할 때:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
  • 실행 할 때마다 무작위로 데이터를 섞어 나누므로
    -> 매번 다른 train/test 데이터셋이 만들어진다.
    -> 모델 학습 결과도 매번 달라진다. 

[예시② -랜덤 시드를 고정한 경우]

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=2025
)
  • random_state 또는 random_seed를 설정
    -> 언제 실행해도 같은 무작위 순서가 유지
    -> 이제 실행할 때마다 같은 train/test 데이터셋이 생성


=> MLOps에서 재현성을 지키기 위해서는 난수(Randomness)가 반드시 통제되어야 한다!!

반응형

 

모델 환경 통제  ② - 라이브러리 버전 고정

  • 모델 개발할 때, 사용하는 라이브러리(Library/Package) 들은 계속 업데이트가 된다.
    -> 버전이 달라지면:
    • 함수 이름이나 사용법이 달라질 수 있고
    • 내부 알고리즘이 바뀔 수 있고
    • 심지어 같은 코드가 동작하지 않거나 다른 결과를 낼 수 있다. 

 

[예시 ① - 라이브러리 버전을 고정하지 않은 경우]

예를 들어 과거에 작성한 코드가 이렇게 있었다고 해보자

import xgboost as xgb

model = xgb.XGBClassifier(use_label_encoder=False)
  • 과거 버전(xgboost==0.90) 에서는 문제가 없지만
  • 최신 버전(xgboost>=1.3) 부터는 use_label_encoder 옵션이 추가되었고, 경고가 발생한다.

=> 버전이 달라지면, 같은 코드가 오류를 내거나 다른 방식으로 동작할 수 있다. 
=> 그래서 Docker로 버전을 명시해 환경을 통제하자

 

728x90
반응형