본문 바로가기

Tech Stack/MLflow

MLOps - 데이터

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