MLflow로 DSPy 옵티마이저 추적하기

MLflow로 DSPy 옵티마이저 추적하기 (Tracking DSPy Optimizers with MLflow)

이 튜토리얼에서는 MLflow를 사용해 DSPy 최적화 과정을 추적하고 분석하는 방법을 알아볼게요. MLflow의 DSPy 내장 통합은 DSPy 최적화 경험에 추적성(traceability)과 디버깅 가능성(debuggability)을 제공해요. 최적화 중간의 시도(trial)를 이해하고, 최적화된 프로그램과 그 결과를 저장하며, 프로그램 실행에 대한 관찰성(observability)을 제공합니다.

autologging 기능을 통해 MLflow는 다음 정보를 추적해요:

  • 옵티마이저 매개변수 (Optimizer Parameters)

    • Few-shot 예제 수
    • 후보(candidate) 수
    • 기타 설정 값
  • 프로그램 상태 (Program States)

    • 초기 지침 및 few-shot 예제
    • 최적화된 지침 및 few-shot 예제
    • 최적화 중간의 지침 및 few-shot 예제
  • 데이터셋 (Datasets)

    • 사용된 학습 데이터
    • 사용된 평가 데이터
  • 성능 진행 (Performance Progression)

    • 전체 지표 진행
    • 각 평가 단계에서의 성능
  • 트레이스 (Traces)

    • 프로그램 실행 트레이스
    • 모델 응답
    • 중간 프롬프트

출처: 문서

본문

시작하기 (Getting Started)

1. MLflow 설치 (Install MLflow)

먼저 MLflow(버전 2.21.1 이상)를 설치해요:

pip install mlflow>=2.21.1

2. MLflow 추적 서버 시작 (Start MLflow Tracking Server)

다음 명령으로 MLflow 추적 서버를 띄워볼게요. 그러면 http://127.0.0.1:5000/에 로컬 서버가 시작됩니다:

# It is highly recommended to use SQL store when using MLflow tracing
mlflow server --backend-store-uri sqlite:///mydb.sqlite

3. Autologging 활성화 (Enable Autologging)

MLflow가 DSPy 최적화를 추적하도록 구성해요:

import mlflow
import dspy

# Enable autologging with all features
mlflow.dspy.autolog(
    log_compiles=True,    # Track optimization process
    log_evals=True,       # Track evaluation results
    log_traces_from_compile=True  # Track program traces during optimization
)

# Configure MLflow tracking
mlflow.set_tracking_uri("http://localhost:5000")  # Use local MLflow server
mlflow.set_experiment("DSPy-Optimization")

4. 프로그램 최적화 (Optimizing Your Program)

수학 문제 풀이기의 최적화 과정을 추적하는 완전한 예제를 살펴볼게요:

import dspy
from dspy.datasets.gsm8k import GSM8K, gsm8k_metric

# Configure your language model
lm = dspy.LM(model="openai/gpt-4o")
dspy.configure(lm=lm)

# Load dataset
gsm8k = GSM8K()
trainset, devset = gsm8k.train, gsm8k.dev

# Define your program
program = dspy.ChainOfThought("question -> answer")

# Create and run optimizer with tracking
teleprompter = dspy.teleprompt.MIPROv2(
    metric=gsm8k_metric,
    auto="light",
)

# The optimization process will be automatically tracked
optimized_program = teleprompter.compile(
    program,
    trainset=trainset,
)

5. 결과 보기 (Viewing Results)

최적화가 완료되면 MLflow의 UI를 통해 결과를 분석할 수 있어요. 최적화 실행을 탐색하는 방법을 살펴볼게요.

1단계: MLflow UI 접근 (Access the MLflow UI)

브라우저에서 http://localhost:5000으로 이동해 MLflow 추적 서버 UI에 접근하세요.

2단계: 실험 구조 이해 (Understanding the Experiment Structure)

실험 페이지를 열면 최적화 과정의 계층적 뷰를 볼 수 있어요. 부모 실행(parent run)은 전체 최적화 과정을 나타내고, 자식 실행(child run)들은 최적화 중에 생성된 각 중간 버전의 프로그램을 보여줘요.

Experiments

3단계: 부모 실행 분석 (Analyzing the Parent Run)

부모 실행을 클릭하면 최적화 과정의 큰 그림이 드러나요. 옵티마이저의 구성 매개변수와 평가 지표가 시간에 따라 어떻게 진행됐는지에 대한 상세 정보를 찾을 수 있어요. 부모 실행은 또한 사용된 지침, signature 정의, few-shot 예제를 포함한 최종 최적화된 프로그램도 저장해요. 추가로 최적화 과정에서 사용된 학습 데이터도 검토할 수 있어요.

Parent Run

4단계: 자식 실행 검토 (Examining Child Runs)

각 자식 실행은 특정 최적화 시도의 상세 스냅샷을 제공해요. 실험 페이지에서 자식 실행을 선택하면 해당 중간 프로그램의 여러 측면을 탐색할 수 있어요. 실행 매개변수 탭이나 아티팩트 탭에서 중간 프로그램에 사용된 지침과 few-shot 예제를 검토할 수 있어요. 가장 강력한 기능 중 하나는 Traces 탭인데, 프로그램 실행의 단계별 뷰를 제공해요. 여기서 DSPy 프로그램이 입력을 처리하고 출력을 생성하는 방식을 정확히 이해할 수 있어요.

Child Run

6. 추론을 위한 모델 로드 (Loading Models for Inference)

최적화된 프로그램을 MLflow 추적 서버에서 직접 로드해 추론에 사용할 수 있어요:

model_path = mlflow.artifacts.download_artifacts("mlflow-artifacts:/path/to/best_model.json")
program.load(model_path)

문제 해결 (Troubleshooting)

  • 트레이스가 나타나지 않으면 log_traces_from_compile=True인지 확인하세요
  • 대규모 데이터셋의 경우 메모리 문제를 피하기 위해 log_traces_from_compile=False를 고려하세요
  • mlflow.get_run(run_id)를 사용해 MLflow 실행 데이터에 프로그래밍 방식으로 접근하세요

더 많은 기능은 MLflow 문서를 참고하세요.

더 알아보기 (Learn more)