
Data drift 예시
- 더 이상 유행x상품
- 새로 유행하는 상품
- 장비에서 생산하는 직업의 변경
- 기기의 고장
지속적인 재학습
- real world에서는 데이터가 계속 변화
- 그래서 한번 개발 뒤 계속 같은성능 x
- 변화하는 데이터에 맞춰서 모델 재학습

Data versioning을 통해 데이터도 실험관리가 필요
Minio 구축
docker run -p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minio \
-e MINIO_ROOT_PASSWORD=miniostorage \
minio/minio \
server /data/minio --console-address :9001
-p
API 통신용 포트 9000:9000
web UI 용 포트 9001:9001
-e
환경 변수를 설정할 수 있습니다.
{key}:{value}로 지정해서 사용
server /data/minio --console-address :9001
이미지 이후 입력된 COMMAND입니다.
Minio를 실행하는 명령어를 입력합니다.



Access Key생성 가능

version관리를 위함으로 version만 우선 on

데이터를 올리면서 버전을 관리할 수 있음.
#
# dump data
#
iris = load_iris(as_frame=True)
X, y = iris["data"], iris["target"]
data = pd.concat([X, y], axis="columns")
data.sample(100).to_csv("iris.csv", index=None)
데이터를 덤프하는 과정
X,y를 columns으로 합침
to_csv를 활용하여 업로드
index가 생기지 않게 None으로 설정
우선 전체데이터가 아닌 100개의 데이터로만 덤프를 함
#
# minio client
#
url = "0.0.0.0:9000"
access_key = "minio"
secret_key = "miniostorage"
client = Minio(url, access_key=access_key, secret_key=secret_key, secure=False)
minio client로 접속할 수 있는 포트를 선언
#
# upload data to minio
#
bucket_name = "raw-data"
object_name = "iris"
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name)
config = client.set_bucket_versioning(bucket_name, VersioningConfig(ENABLED))
client.fput_object(bucket_name, object_name, "iris.csv")
config를 통해 버전관리를 함.
만약 버킷이없다면 버킷을 만들도록 함

데이터 다운로드
from minio import Minio
bucket_name = "raw-data"
object_name = "iris"
url = "0.0.0.0:9000"
access_key = "minio"
secret_key = "miniostorage"
client = Minio(url, access_key=access_key, secret_key=secret_key, secure=False)
object_stat = client.stat_object(bucket_name, object_name)
print(object_stat.version_id)
client.fget_object(bucket_name, object_name, file_path="download_data.csv")
위에 코드를 어느정도 가져와 사용한 후 fget_object를 통해 다운로드 함
이제 학습 코드를 수정하여 minio에서 데이터를 가져온 후 학습에 사용 가능
def download_data():
#
# minio client
#
url = "0.0.0.0:9000"
access_key = "minio"
secret_key = "miniostorage"
client = Minio(url, access_key=access_key, secret_key=secret_key, secure=False)
#
# data download
#
object_stat = client.stat_object(BUCKET_NAME, OBJECT_NAME)
data_version_id = object_stat.version_id
client.fget_object(BUCKET_NAME, OBJECT_NAME, file_path="download_data.csv")
return data_version_id
다운로드하는 함수
def load_data():
data_version_id = download_data()
df = pd.read_csv("download_data.csv")
X, y = df.drop(columns=["target"]), df["target"]
data_dict = {"data": X, "target": y, "version_id": data_version_id}
return data_dict
데이터를 로드하는 함수
데이터 프레임으로 만들어 준 후 X에서 target을 drop하고 y에 target을 줌

어떤 데이터를 이용해서 했는지 버전관리가 가능함.
'Tech Stack > MLflow' 카테고리의 다른 글
| MLOps - 배치서빙 (0) | 2024.02.29 |
|---|---|
| MLOps - 모델 저장 (1) | 2024.02.29 |
| MLOps - 교차검증 (0) | 2024.02.23 |
| MLOps - HPO 반영 (0) | 2024.02.22 |
| MLOps - Optuna (0) | 2024.02.22 |