스노우파크 모델 레지스트리로 모델관리하기
과거 영문으로 작성된 글을 Claude를 활용해서 국문으로 번역한 글입니다. 빠른 이해를 위해 약간수정하였습니다. Snowpark ML 모델링 시대가 도래함에 따라, 우리는 Snowpark 네이티브 방식으로 선형 회귀 모델을 개발했습니다. 이는 테이블에 대한 ML 모델링이 Snowpark 적용으로 얼마나 쉬운지 보여줍니다. 따라서 우리는 쉽게 모델을 만들 수 있고 여러 버전을 관리해야 하는 상황에 놓이게 되었습니다. Snowpark ML 모델 레지스트리를 통해 편리한 버전 관리와 모델 배포가 가능해졌습니다. 기술적 준비 외에도 Snowpark ML 모델링을 포함한 핵심 ML 프레임워크도 확실히지원됩니다. 우리는 다음과 같은 단계를 통해 모델 레지스트리를 ML 워크플로를 구현할예정입니다. 세션 생성 선형 회귀 모델구축 모델 평가 모델 레지스트리에 모델등록 등록된 모델을 이용한추론 요약 세션 생성 Snowpark를 활용한 선형 회귀 모델 개발 블로그 글과 같이 Snowpark를 사용하겠습니다. 다음과 같이 세션을 생성해 보겠습니다. getpass.getpass(f"Enter password:")를 통해 보안 문제로부터 더 잘 보호 받을 수있습니다. import getpass from snowflake.snowpark.session import Session from snowflake.ml.modeling.linear_model import LinearRegression from snowflake.ml.modeling.preprocessing import OneHotEncoder from snowflake.ml.registry import registry from snowflake.ml._internal.utils import identifier import snowflake.snowpark.functions as F import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from snowflake.ml.modeling.metrics import mean_absolute_error # Session connection_parameters = ( "account": "xxxxxxxxxxxx", "user": "xxxxxxxxxxxx", "role": "ACCOUNTADMIN", "warehouse": "COMPUTE_WH", "database": "SNOWPARK_ML_MODELING", "schema": "PUBLIC" ) # Establish and configure connection. connection_parameters["password"] = getpass.getpass(f"Enter password:") session = Session.builder.configs(connection_parameters).create() 선형 회귀 모델구축 다음 코드는 이전에 사용했던 테이블을 활용하여 선형 회귀 모델을학습시킵니다. # reaing a table df = session.table("NYC_ZIP_INCOME") # feature engineering ohe = OneHotEncoder(input_cols = ['ZIP'], output_cols = ['ZIP_OHE'], drop_input_cols=True) transformed_df = ohe.fit(df).transform(df) input_columns = transformed_df.columns[:-1] label_columns = transformed_df.columns[-1] output_columns = str('PREDICTED_ANNUAL_INCOME') # model fitting regr = LinearRegression( input_cols = input_columns, label_cols = label_columns, output_cols = output_columns ) regr.fit(transformed_df) 학습된 모델이 확인하기 위해 2025년에 10001 우편번호에 거주하는 사람들의 총 연간 소득을 예측하는지 확인해보겠습니다. # inferencing without model registry def annual_income_predictor(zip_code, year): # create snowpark dataframe input = session.create_dataframe([(str(zip_code), year)], schema = ['ZIP', 'YEAR']) # one hot encode input transformed_input = ohe.transform(input) # predict prediction = regr.predict(transformed_input) return prediction.select('PREDICTED_ANNUAL_INCOME').show() # result = 3040481376.845398 annual_income_predictor(10001, 2025) 모델 평가 평균 절대 오차(Mean Absolute Error)는 선형 모델을 사용하더라도 xgboost나 랜덤 포레스트 같은 회귀 모델을 평가하는 간단하고 효과적인 지표 중 하나 입니다. 이 코드에서는 mean_absolute_error 함수를 사용하여 모델의 평균 절대 오차를 계산하고 결과를 출력합니다. 평균 절대 오차는 실제값과 예측값의 차이를 절대값으로 계산하여 평균을 낸 것으로, 모델의 정확도를 간단하게 확인할 수 있는지표입니다. transformed_df = regr.predict(transformed_df) transformed_df.select(F.col(label_columns), F.col(output_columns)).show() mae = mean_absolute_error(df = transformed_df, y_true_col_names = label_columns, y_pred_col_names = output_columns) print(f"Mean Absolute Error: (mae)") 모델 레지스트리에 모델등록 Snowpark 모델 레지스트리는 테이블 형태로 구성되어 있어 익숙하고 사용하기 쉽습니다. 또한 필수 인자와 선택 인자가 있어 환경 의존성과 중요한 메모를 저장할 수있습니다. 학습된 모델과 함께 샘플 데이터를 레지스트리에 등록하면 모델 구축 및 데이터 준비 과정을 더 잘 이해할 수 있습니다. 따라서 샘플 데이터를 등록하는 것으로 시작해보겠습니다. 데이터 프레임을 잘라내는 것 만으로도충분합니다. # Get sample input data to pass into the registry logging function sample_data = transformed_df.select(input_columns).limit(100) 다음과 같이 데이터베이스, 스키마, 모델 이름, 모델 버전, 모델 자체를 설정할 수 있습니다.이 코드에서는 다음과 같은 변수들을설정합니다: database_name: 모델을 저장할 데이터베이스이름 schema_name: 모델을 저장할 스키마이름 model_name: 모델의이름 version_name: 모델의버전 model: 실제 모델객체 sample_input_data: 실제 활용한 데이터의샘플 이렇게 설정한 정보를 바탕으로 모델 레지스트리에 모델을 등록할 수있습니다 # database and schema db = identifier._get_unescaped_name(session.get_current_database()) schema = identifier._get_unescaped_name(session.get_current_schema()) # model name model_name = "ZIPCODE_ANNUAL_INCOME_PREDICTION" # create a registry and log the model model_registry = registry.Registry(session=session, database_name=db, schema_name=schema) # log the fitted model model_ver = model_registry.log_model( model_name=model_name, version_name='V0', model=regr, sample_input_data=sample_data ) 또한 모델 평가 지표와 코멘트를 추가할 수 있습니다. 이 코드에서는 모델 평가 지표와 코멘트를 추가하고, 모델 레지스트리에 모델을 등록합니다. 모델 이름과 버전을 기반으로 레지스트리를 확인하여, 새로운 모델인 경우에만 등록을 진행합니다. 우리가 만든 모델이 제대로 레지스트리에 등록되었는지 확인해보겠습니다. # evaluation metric model_ver.set_metric(metric_name="mean_abs_err", value=mae) # comments model_ver.comment = "This is the first iteration of our ZIPCODE ANNUAL INCOME PREDICTION model." # check model_registry.get_model(model_name).show_versions() Snowflake의 모델 레지스트리는 테이블 형태로 구현되어 있습니다. 비록 최근에 GA(Generally Available) 버전이 출시되었지만, Pandas 데이터 프레임과 유사하게 보이기 때문에 친숙해보입니다. 등록된 모델을 이용한추론 모델 레지스트리를 활용하면 일반적인 머신러닝 모델 추론과 코드에서 몇 가지 차이점이 있습니다. 그러나 어렵지는 않습니다. get_model과 run 함수를 사용하면 모델 추론을 보다 쉽게 수행할 수있습니다. zip_code = 10001 year = 2025 # create snowpark dataframe input = session.create_dataframe([(str(zip_code), year)], schema = ['ZIP', 'YEAR']) # one hot encode input test_df = ohe.transform(input) # inference with model registry model_ver = model_registry.get_model(model_name).version('v0') result = model_ver.run(test_df, function_name="predict") result.show() 더 이상 필요하지 않은 모델이 있다면 모델 레지스트리를 정리할 수 있습니다. 모델 레지스트리를 정리하면 불필요한 모델 정보를 관리하지 않아도 되므로, 전체 시스템의 효율성을 높일 수 있습니다. 더 이상 사용되지 않는 모델은 정기적으로 삭제하는 것이좋습니다. # clean up model_registry.delete_model(model_name) # see it is empty model_registry.show_models() 요약 이번 블로그에서는 Snowflake의 Snowpark Model Registry에 대해 살펴보았습니다. 이 새로운 기능은 모델 배포와 추론 과정에 일부 차이점을 만들어냅니다. 그러나 기본적인 Python 프로그래밍 기술만 있다면 구현하는 것은 그리 어렵지않습니다. 주요 내용은 다음과같습니다: Snowpark를 활용하여 선형 회귀 모델을 구축하고평가했습니다. 모델 메타데이터와 샘플 데이터를 Snowpark 모델 레지스트리에등록했습니다. 데이터베이스, 스키마, 모델 이름 및 버전 등을 설정하여 모델을관리했습니다. 모델 레지스트리에서 모델을 로드하고 추론을수행했습니다. 더 이상 필요하지 않은 모델은 레지스트리에서삭제했습니다. Snowpark 모델 레지스트리는 모델 관리와 배포 과정을 편리하게 만들어줍니다. 테이블 형태의 인터페이스를 제공하여 개발자들에게 친숙한 환경을 제공하는 것이 특징입니다. 이를 활용하면 ML 모델 운영을 보다 효율적으로 수행할 수있습니다. 스노우파크 모델 레지스트리로 모델관리하기 was originally published in Cloud Villains on Medium, where people are continuing the conversation by highlighting and responding to this story.
