MLflow 클라이언트 호환성

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated Status: Experiment

참고: 모델 레지스트리 및 모델 실험 추적은 실험입니다. 모델 실험 추적에 대한 피드백 제공. 모델 레지스트리에 대한 피드백 제공.

MLflow는 기계 학습 실험 추적을 위한 인기 있는 오픈 소스 도구입니다. GitLab 모델 실험 추적 및 GitLab 모델 레지스트리는 MLflow 클라이언트와 호환됩니다. 설정에는 기존 코드를 최소한으로 변경해야 합니다.

GitLab은 MLflow 서버의 역할을 합니다. mlflow server를 실행할 필요가 없습니다.

MLflow 클라이언트 통합 활성화

전제 조건:

  • 적어도 개발자 역할과 api 권한을 가진 개인, 프로젝트, 또는 그룹 액세스 토큰.
  • 프로젝트 ID. 프로젝트 ID 찾는 방법:
    1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
    2. 설정 > 일반을 선택합니다.

로컬 환경에서 MLflow 클라이언트 호환성을 사용하려면:

  1. 코드를 실행하는 호스트에서 추적 URI 및 토큰 환경 변수를 설정합니다. 로컬 환경, CI 파이프라인 또는 원격 호스트가 될 수 있습니다. 예:

    export MLFLOW_TRACKING_URI="<your gitlab endpoint>/api/v4/projects/<your project id>/ml/mlflow"
    export MLFLOW_TRACKING_TOKEN="<your_access_token>"
    
  2. 교육 코드에 mlflow.set_tracking_uri() 호출이 포함되어 있으면 제거합니다.

모델 레지스트리에서 작업할 때, 오른쪽 상단의 오버플로 메뉴에서 추적 URI를 복사할 수 있습니다 ( 선택).

모델 실험

교육 코드를 실행할 때, MLflow 클라이언트를 사용하여 GitLab에 실험, 실행, 모델, 모델 버전, 매개 변수, 메트릭, 메타데이터, 아티팩트를 만들 수 있습니다.

실험을 기록한 후, /v네 프로젝트/v―/ml/experiments에 나열됩니다.

실행은 후보로 등록되며, 실험, 모델 또는 모델 버전을 선택하여 탐색할 수 있습니다.

후보를 CI/CD 작업에 연결

교육 코드가 CI/CD 작업에서 실행 중이면, GitLab은 해당 정보를 사용하여 후보 메타데이터를 향상시킵니다. 후보를 CI/CD 작업에 연결하려면:

  1. 프로젝트 CI 변수에 다음 변수를 포함시킵니다:

    • MLFLOW_TRACKING_URI: "<your gitlab endpoint>/api/v4/projects/<your project id>/ml/mlflow"
    • MLFLOW_TRACKING_TOKEN: <your_access_token>
  2. 실행 컨텍스트 내에서 교육 코드에 다음 코드 조각을 추가합니다:

    with mlflow.start_run(run_name=f"Candidate {index}"):
      # Your training code
    
      # Included snippet start
      if os.getenv('GITLAB_CI'):
        mlflow.set_tag('gitlab.CI_JOB_ID', os.getenv('CI_JOB_ID'))
      # Included snippet end
    

모델 레지스트리

MLflow 클라이언트를 사용하여 모델 및 모델 버전도 관리할 수 있습니다. 모델은 /<your project>/-/ml/models에 등록됩니다.

모델

모델 생성

client = MlflowClient()
model_name = '<your_model_name>'
description = '모델 설명'
model = client.create_registered_model(model_name, description=description)

참고

  • create_registered_model 인수 tags는 무시됩니다.
  • name은 프로젝트 내에서 고유해야 합니다.
  • name은 기존 실험의 이름일 수 없습니다.

모델 검색

client = MlflowClient()
model_name = '<your_model_name>'
model = client.get_registered_model(model_name)

모델 업데이트

client = MlflowClient()
model_name = '<your_model_name>'
description = '새로운 설명'
client.update_registered_model(model_name, description=description)

모델 삭제

client = MlflowClient()
model_name = '<your_model_name>'
client.delete_registered_model(model_name)

후보를 모델에 로깅

각 모델에는 동일한 이름으로 [model]로 접두사가 붙은 실험이 연결됩니다. 후보/실행을 모델에 기록하려면 올바른 이름을 사용하여 실험을 사용합니다:

client = MlflowClient()
model_name = '<your_model_name>'
exp = client.get_experiment_by_name(f"[model]{model_name}")
run = client.create_run(exp.experiment_id)

모델 버전

모델 버전 생성

client = MlflowClient()
model_name = '<your_model_name>'
description = '모델 버전 설명'
model_version = client.create_model_version(model_name, source="", description=description)

버전 매개변수가 전달되지 않으면, 최신 업로드된 버전에서 자동 증가됩니다. 모델 버전 생성 중 SemVer 형식을 따라야 합니다.

client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_version>'
tags = { "gitlab.version": version }
client.create_model_version(model_name, version, description=description, tags=tags)

참고

  • 인수 run_id는 무시됩니다. 각 모델 버전은 후보/실행처럼 동작합니다. 실행에서 모델 버전을 생성하는 것은 아직 지원되지 않습니다.
  • 인수 source는 무시됩니다. GitLab은 모델 버전 파일을 위한 패키지 위치를 생성합니다.
  • 인수 run_link는 무시됩니다.
  • 인수 await_creation_for는 무시됩니다.
client = MlflowClient()
model_name = '<모델_이름>'
version = '<버전_번호>'
description = '새로운 설명'
client.update_model_version(model_name, version, description=description)

모델 버전 업데이트

client = MlflowClient()
model_name = '<모델_이름>'
version = '<버전_번호>'
client.get_model_version(model_name, version)

모델의 최신 버전 가져오기

client = MlflowClient()
model_name = '<모델_이름>'
client.get_latest_versions(model_name)

참고

  • stages 인수는 무시됩니다.
  • 버전은 가장 높은 의미론적 버전순으로 정렬됩니다.

모델 버전 로딩

client = MlflowClient()
model_name = '<모델_이름>'
version = '<버전_번호'  # 예: '1.0.0'

# 또는 버전 검색
version = mlflow.search_registered_models(filter_string="name='{model_name}'")[0].latest_versions[0].version

model = mlflow.pyfunc.load_model(f"models:/{model_name}/{latest_version}")

# 또는 최신 버전 로드
model = mlflow.pyfunc.load_model(f"models:/{model_name}/latest")

모델 버전에 메트릭 및 매개변수 기록

각 모델 버전은 후보/실행도 되며, 사용자가 매개변수와 메트릭을 기록할 수 있습니다. 실행 ID는 GitLab의 모델 버전 페이지에서 찾을 수 있거나 MLflow 클라이언트를 사용하여 찾을 수 있습니다.

client = MlflowClient()
model_name = '<모델_이름>'
version = '<버전_번호>'
model_version = client.get_model_version(model_name, version)
run_id = model_version.run_id

# 귀하의 훈련 코드

client.log_metric(run_id, '<메트릭_이름>', '<메트릭_값>')
client.log_param(run_id, '<매개변수_이름>', '<매개변수_값>')
client.log_batch(run_id, metric_list, param_list, tag_list)

모델 버전에 아티팩트 기록

GitLab은 MLflow 클라이언트가 파일을 업로드하는 데 사용할 수 있는 패키지를 생성합니다.

client = MlflowClient()
model_name = '<모델_이름>'
version = '<버전_번호>'
model_version = client.get_model_version(model_name, version)
run_id = model_version.run_id

# 귀하의 훈련 코드

client.log_artifact(run_id, '<로컬/파일/경로/파일.txt>', artifact_path="")
client.log_figure(run_id, figure, artifact_file="my_plot.png")
client.log_dict(run_id, my_dict, artifact_file="my_dict.json")
client.log_image(run_id, image, artifact_file="image.png")

아티팩트는 이후 <https://your project>/-/ml/models/<모델_id>/versions/<버전_id>에서 사용할 수 있습니다.

모델 버전을 CI/CD 작업에 연결하기

후보와 마찬가지로 모델 버전을 CI/CD 작업에 연결하는 것도 가능합니다.

client = MlflowClient()
model_name = '<모델_이름>'
version = '<버전_번호>'
model_version = client.get_model_version(model_name, version)
run_id = model_version.run_id

# 귀하의 훈련 코드

if os.getenv('GITLAB_CI'):
    client.set_tag(model_version.run_id, 'gitlab.CI_JOB_ID', os.getenv('CI_JOB_ID'))

지원되는 MLflow 클라이언트 메서드 및 주의사항

GitLab은 MLflow 클라이언트의 이러한 메서드를 지원합니다. 다른 메서드는 지원될 수 있지만 테스트되지 않았습니다. 자세한 내용은 MLflow 문서에서 확인할 수 있으며, 아래 메서드의 MlflowClient 상용어는 동일한 주의사항을 가집니다.

메서드 지원 여부 추가된 버전 주의사항
get_experiment Yes 15.11  
get_experiment_by_name Yes 15.11  
delete_experiment Yes 17.5  
set_experiment Yes 15.11  
get_run Yes 15.11  
delete_run Yes 17.5  
start_run Yes 15.11 (16.3) 이름이 제공되지 않으면 후보는 임의의 닉네임을 받습니다.
search_runs Yes 15.11 (16.4) experiment_ids는 오름차순으로 정렬된 단일 실험 ID만 지원합니다.
log_artifact Yes with caveat 15.11 (15.11) artifact_path는 비어 있어야 합니다. 디렉터리를 지원하지 않습니다.
log_artifacts Yes with caveat 15.11 (15.11) artifact_path는 비어 있어야 합니다. 디렉터리를 지원하지 않습니다.
log_batch Yes 15.11  
log_metric Yes 15.11  
log_metrics Yes 15.11  
log_param Yes 15.11  
log_params Yes 15.11  
log_figure Yes 15.11  
log_image Yes 15.11  
log_text Yes with caveat 15.11 (15.11) 디렉터리를 지원하지 않습니다.
log_dict Yes with caveat 15.11 (15.11) 디렉터리를 지원하지 않습니다.
set_tag Yes 15.11  
set_tags Yes 15.11  
set_terminated Yes 15.11  
end_run Yes 15.11  
update_run Yes 15.11  
log_model Partial 15.11 (15.11) 아티팩트를 저장하지만 모델 데이터는 저장하지 않습니다. artifact_path는 비어 있어야 합니다.
load_model Yes 17.5  

기타 MLflowClient 메서드:

메서드 지원 여부 추가된 버전 주의사항
create_registered_model Yes with caveats 16.8 참고
get_registered_model Yes 16.8  
delete_registered_model Yes 16.8  
update_registered_model Yes 16.8  
create_model_version Yes with caveats 16.8 참고
get_model_version Yes 16.8  
get_latest_versions Yes with caveats 16.8 참고
update_model_version Yes 16.8  
create_registered_model Yes 16.8  
create_registered_model Yes 16.8  

제한 사항

  • GitLab이 지원하는 API는 MLflow 버전 2.7.1에서 정의된 것입니다.
  • 위에 나열되지 않은 MLflow 클라이언트 메서드는 지원되지 않습니다.
  • 실험 및 실행 생성 중에는 실험 태그가 저장되지만 표시되지는 않습니다.