MLflow 클라이언트 호환성
- GitLab 15.11에서 실험적으로 도입되었습니다. 기본으로 비활성화됨.
참고: 모델 레지스트리 및 모델 실험 추적은 실험입니다. 모델 실험 추적에 대한 피드백 제공. 모델 레지스트리에 대한 피드백 제공.
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에 실험, 실행, 모델, 모델 버전, 매개 변수, 메트릭, 메타데이터, 아티팩트를 만들 수 있습니다.
실험을 기록한 후, /v네 프로젝트/v―/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}"): # 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 클라이언트 메서드는 지원되지 않습니다.
- 실험 및 실행 생성 중에는 실험 태그가 저장되지만 표시되지는 않습니다.