MLflow 클라이언트 호환성

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
Status: Experiment
  • GitLab 15.11에서 실험 릴리즈로 도입됨 플래그 ml_experiment_tracking 이름으로. 기본적으로 비활성화됨.
note
모델 레지스트리 및 모델 실험 추적은 실험입니다.
모델 실험 추적에 대한 피드백을 제공하세요.
모델 레지스트리에 대한 피드백을 제공하세요.

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에 기록할 수 있습니다.

실험이 기록된 후, 이는 /<your project>/-/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}"):  
      # 훈련 코드  
    
      # 포함될 스니펫 시작  
      if os.getenv('GITLAB_CI'):  
        mlflow.set_tag('gitlab.CI_JOB_ID', os.getenv('CI_JOB_ID'))  
      # 포함될 스니펫 끝  
    

모델 레지스트리

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 = '<your_model_name>'
version = '<your_version>'
description = '새 설명'
client.update_model_version(model_name, version, description=description)

모델 버전 가져오기

client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_version>'
client.get_model_version(model_name, version)

모델의 최신 버전 가져오기

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

노트

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

모델 버전 로드하기

client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_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 = '<your_model_name>'
version = '<your_version>'
model_version = client.get_model_version(model_name, version)
run_id = model_version.run_id

# 훈련 코드

client.log_metric(run_id, '<metric_name>', '<metric_value>')
client.log_param(run_id, '<param_name>', '<param_value>')
client.log_batch(run_id, metric_list, param_list, tag_list)

모델 버전에 대한 로그 아티팩트

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

client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_version>'
model_version = client.get_model_version(model_name, version)
run_id = model_version.run_id

# 훈련 코드

client.log_artifact(run_id, '<local/path/to/file.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/<model_id>/versions/<version_id>에서 사용할 수 있습니다.

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

후보와 유사하게, 모델 버전을 CI/CD 작업에 연결하는 것도 가능합니다:

client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_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 15.11  
get_experiment_by_name 15.11  
delete_experiment 17.5  
set_experiment 15.11  
get_run 15.11  
delete_run 17.5  
start_run 15.11 (16.3) 이름이 제공되지 않으면 후보는 무작위 별명을 받습니다.
search_runs 15.11 (16.4) experiment_ids는 열 또는 메트릭으로 정렬된 단일 실험 ID만 지원합니다.
log_artifact 예, 주의사항 15.11 (15.11) artifact_path는 비어 있어야 합니다. 디렉토리는 지원되지 않습니다.
log_artifacts 예, 주의사항 15.11 (15.11) artifact_path는 비어 있어야 합니다. 디렉토리는 지원되지 않습니다.
log_batch 15.11  
log_metric 15.11  
log_metrics 15.11  
log_param 15.11  
log_params 15.11  
log_figure 15.11  
log_image 15.11  
log_text 예, 주의사항 15.11 (15.11) 디렉토리는 지원되지 않습니다.
log_dict 예, 주의사항 15.11 (15.11) 디렉토리는 지원되지 않습니다.
set_tag 15.11  
set_tags 15.11  
set_terminated 15.11  
end_run 15.11  
update_run 15.11  
log_model 부분 지원 15.11 (15.11) 아티팩트는 저장되지만 모델 데이터는 저장되지 않습니다. artifact_path는 비어 있어야 합니다.
load_model 17.5  

다른 MLflowClient 메서드:

메서드 지원 여부 추가된 버전 비고
create_registered_model 예, 주의사항 16.8 참고 사항 보기
get_registered_model 16.8  
delete_registered_model 16.8  
update_registered_model 16.8  
create_model_version 예, 주의사항 16.8 참고 사항 보기
get_model_version 16.8  
get_latest_versions 예, 주의사항 16.8 참고 사항 보기
update_model_version 16.8  
create_registered_model 16.8  
create_registered_model 16.8  

제한 사항

  • GitLab에서 지원하는 API는 MLflow 버전 2.7.1에서 정의된 것입니다.

  • 위에 나열되지 않은 MLflow 클라이언트 메서드는 지원되지 않습니다.

  • 실험 및 실행을 생성하는 동안 ExperimentTags가 저장되지만 표시되지는 않습니다.