MLflow 클라이언트 호환성
Status: Experiment
MLflow는 머신러닝 실험 추적을 위한 인기 있는 오픈 소스 도구입니다.
GitLab 모델 실험 추적 및 GitLab
모델 레지스트리는 MLflow 클라이언트와 호환됩니다.
설정은 기존 코드에 최소한의 변경만 필요합니다.
GitLab은 MLflow 서버 역할을 합니다. mlflow server
를 실행할 필요는 없습니다.
MLflow 클라이언트 통합 활성화
전제 조건:
- 최소 개발자 역할 및
api
권한이 있는 개인, 프로젝트, 또는 그룹 액세스 토큰. - 프로젝트 ID. 프로젝트 ID를 찾으려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 설정 > 일반을 선택합니다.
로컬 환경에서 MLflow 클라이언트 호환성을 사용하려면:
-
코드를 실행하는 호스트에서 추적 URI 및 토큰 환경 변수를 설정합니다.
이 호스트는 로컬 환경, CI 파이프라인 또는 원격 호스트일 수 있습니다. 예를 들어:export MLFLOW_TRACKING_URI="<your gitlab endpoint>/api/v4/projects/<your project id>/ml/mlflow" export MLFLOW_TRACKING_TOKEN="<your_access_token>"
-
훈련 코드에
mlflow.set_tracking_uri()
호출이 포함되어 있으면 제거합니다.
모델 레지스트리에서 오른쪽 상단의 오버플로우 메뉴에서 추적 URI를 복사할 수 있습니다
세로 줄임표()를 선택하여.
모델 실험
훈련 코드를 실행할 때 MLflow 클라이언트를 사용하여 실험, 실행,
모델, 모델 버전, 매개변수, 메트릭, 메타데이터 및 아티팩트를 GitLab에 기록할 수 있습니다.
실험이 기록된 후, 이는 /<your project>/-/ml/experiments
에 나열됩니다.
실행은 후보로 등록되며, 실험, 모델 또는 모델 버전을 선택하여 탐색할 수 있습니다.
CI/CD 작업에 후보 연관시키기
훈련 코드가 CI/CD 작업에서 실행되고 있다면, GitLab은 그 정보를 사용하여
후보 메타데이터를 향상시킬 수 있습니다. 후보를 CI/CD 작업에 연관시키려면:
-
프로젝트 CI 변수에서 다음 변수를 포함합니다:
-
MLFLOW_TRACKING_URI
:"<your gitlab endpoint>/api/v4/projects/<your project id>/ml/mlflow"
-
MLFLOW_TRACKING_TOKEN
:<your_access_token>
-
-
실행 컨텍스트 내의 훈련 코드에 다음 코드 스니펫을 추가합니다:
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가 저장되지만 표시되지는 않습니다.