대규모 언어 모델(LLM)이 복잡하고 규모가 커짐에 따라 성능, 실험 및 배포를 추적하는 것이 점점 더 어려워지고 있습니다. 여기서 MLflow가 등장합니다. LLM을 포함한 머신 러닝 모델의 전체 수명 주기를 관리하기 위한 포괄적인 플랫폼을 제공합니다.
이 심층 가이드에서는 LLM을 추적, 평가 및 배포하기 위해 MLflow를 활용하는 방법을 살펴보겠습니다. 환경 설정부터 고급 평가 기술까지 모든 것을 다루며, 그 과정에서 많은 코드 예제와 모범 사례를 제공합니다.
대규모 언어 모델(LLM)의 MLflow 기능
ML플로우 머신 러닝 및 데이터 과학 커뮤니티에서 핵심 도구가 되었으며, 특히 머신 러닝 모델의 수명 주기를 관리하는 데 유용합니다. 대규모 언어 모델(LLM)과 관련하여 MLflow는 이러한 모델을 개발, 추적, 평가 및 배포하는 프로세스를 상당히 간소화하는 강력한 도구 모음을 제공합니다. MLflow가 LLM 공간에서 어떻게 기능하는지와 엔지니어와 데이터 과학자에게 제공하는 이점에 대한 개요는 다음과 같습니다.
LLM 상호작용 추적 및 관리
MLflow의 LLM 추적 시스템은 LLM의 고유한 요구 사항에 맞춰 기존 추적 기능을 향상시킨 것입니다. 다음과 같은 주요 측면을 포함하여 모델 상호 작용의 포괄적인 추적이 가능합니다.
매개변수: LLM에 대한 입력 매개변수(예: 모델별 매개변수)를 자세히 설명하는 키-값 쌍 로깅 top_k 그리고 temperature. 이는 각 실행에 대한 컨텍스트와 구성을 제공하여 모델 구성의 모든 측면이 캡처되도록 보장합니다.
메트릭: LLM의 성과와 정확성에 대한 통찰력을 제공하는 양적 측정. 이는 실행이 진행됨에 따라 동적으로 업데이트되어 실시간 또는 사후 프로세스 통찰력을 제공할 수 있습니다.
예측: LLM에 전송된 입력과 해당 출력을 캡처하여 쉽게 검색하고 분석할 수 있도록 구조화된 형식의 아티팩트로 저장합니다.
유물: 예측 이외에도 MLflow는 시각화, 직렬화된 모델, 구조화된 데이터 파일 등 다양한 출력 파일을 저장할 수 있어 모델 성능에 대한 상세한 문서화와 분석이 가능합니다.
이러한 구조화된 접근 방식은 LLM과의 모든 상호작용이 세심하게 기록되도록 보장하여 텍스트 생성 모델에 대한 포괄적인 계보 및 품질 추적을 제공합니다.
LLM 평가
LLM 평가는 생성적 특성과 단일한 기본 진실의 부족으로 인해 고유한 과제를 안겨줍니다. MLflow는 LLM을 위해 설계된 특수 평가 도구로 이를 간소화합니다. 주요 기능은 다음과 같습니다.
다양한 모델 평가: MLflow pyfunc 모델, 등록된 MLflow 모델을 가리키는 URI 또는 모델을 나타내는 Python 호출 가능 모델 등 다양한 유형의 LLM을 평가하는 것을 지원합니다.
종합적인 지표: SaaS 모델 기반 측정 항목(예: 답변 관련성)과 기능 기반 측정 항목(예: ROUGE, Flesch Kincaid)을 포함하여 LLM 평가에 맞춰 조정된 다양한 측정 항목을 제공합니다.
미리 정의된 메트릭 컬렉션: 질문 답변이나 텍스트 요약과 같은 사용 사례에 따라 MLflow는 평가 프로세스를 단순화하기 위해 미리 정의된 메트릭을 제공합니다.
사용자 정의 메트릭 생성: 사용자가 특정 평가 요구 사항에 맞춰 사용자 정의 메트릭을 정의하고 구현하여 모델 평가의 유연성과 심층성을 향상시킬 수 있습니다.
정적 데이터 세트를 사용한 평가: 모델을 지정하지 않고도 정적 데이터 세트를 평가할 수 있으므로 모델 추론을 다시 실행하지 않고도 빠르게 평가하는 데 유용합니다.
배포 및 통합
MLflow는 또한 LLM의 원활한 배포 및 통합을 지원합니다.
MLflow 배포 서버: 여러 LLM 공급자와 상호 작용하기 위한 통합 인터페이스 역할을 합니다. 통합을 간소화하고, 자격 증명을 안전하게 관리하며, 일관된 API 경험을 제공합니다. 이 서버는 인기 있는 SaaS 공급업체의 다양한 기본 모델과 자체 호스팅 모델을 지원합니다.
통합 엔드포인트: 코드 변경 없이 공급자 간을 쉽게 전환할 수 있어 다운타임이 최소화되고 유연성이 향상됩니다.
통합 결과 보기: 포괄적인 평가 결과를 제공하며, 코드에서 직접 액세스하거나 자세한 분석을 위해 MLflow UI를 통해 액세스할 수 있습니다.
MLflow는 포괄적인 도구와 통합 기능을 갖추고 있어 고급 NLP 모델을 사용하는 엔지니어와 데이터 과학자에게 매우 귀중한 자산입니다.
환경 설정하기
MLflow로 LLM을 추적하기 전에 개발 환경을 설정해 보겠습니다. MLflow와 몇 가지 다른 주요 라이브러리를 설치해야 합니다.
이 코드는 Azure OpenAI를 사용하여 GPT-3.5-turbo 모델에 대한 엔드포인트를 설정합니다. 안전한 API 키 관리를 위해 Databricks secrets를 사용하는 것을 참고하세요.
엔드포인트 테스트
엔드포인트가 생성되면 테스트할 수 있습니다.
response = client.predict(endpoint=endpoint_name,inputs={"prompt": "Explain the concept of neural networks briefly.","max_tokens": 100,},)print(response)
이렇게 하면 배포된 모델에 프롬프트가 전송되고 생성된 응답이 반환됩니다.
MLflow를 사용한 LLM 평가
평가는 LLM의 성과와 행동을 이해하는 데 필수적입니다. MLflow는 기본 제공 및 사용자 지정 메트릭을 포함하여 LLM을 평가하기 위한 포괄적인 도구를 제공합니다.
LLM 평가를 위한 준비
LLM을 평가하려면 mlflow.evaluate()모델은 다음 형식 중 하나여야 합니다.
안 mlflow.pyfunc.PyFuncModel 인스턴스 또는 로그인된 MLflow 모델을 가리키는 URI입니다.
문자열을 입력받아 단일 문자열을 출력하는 Python 함수입니다.
MLflow 배포 엔드포인트 URI입니다.
세트 model=None 평가 데이터에 모델 출력을 포함합니다.
로깅된 MLflow 모델을 사용하는 예를 살펴보겠습니다.
import mlflowimport openaiwith mlflow.start_run(): system_prompt = "Answer the following question concisely." logged_model_info = mlflow.openai.log_model( model="gpt-3.5-turbo", task=openai.chat.completions, artifact_path="model", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": "{question}"}, ], )# Prepare evaluation dataeval_data = pd.DataFrame({ "question": ["What is machine learning?", "Explain neural networks."], "ground_truth": [ "Machine learning is a subset of AI that enables systems to learn and improve from experience without explicit programming.", "Neural networks are computing systems inspired by biological neural networks, consisting of interconnected nodes that process and transmit information." ]})# Evaluate the modelresults = mlflow.evaluate( logged_model_info.model_uri, eval_data, targets="ground_truth", model_type="question-answering",)print(f"Evaluation metrics: {results.metrics}")
이 예제에서는 OpenAI 모델을 기록하고, 평가 데이터를 준비한 다음, 질문 답변 작업을 위한 MLflow의 기본 제공 메트릭을 사용하여 모델을 평가합니다.
사용자 정의 평가 지표
MLflow를 사용하면 LLM 평가를 위한 사용자 정의 메트릭을 정의할 수 있습니다. 다음은 응답의 전문성을 평가하기 위한 사용자 정의 메트릭을 만드는 예입니다.
from mlflow.metrics.genai import EvaluationExample, make_genai_metricprofessionalism = make_genai_metric( name="professionalism", definition="Measure of formal and appropriate communication style.", grading_prompt=( "Score the professionalism of the answer on a scale of 0-4:n" "0: Extremely casual or inappropriaten" "1: Casual but respectfuln" "2: Moderately formaln" "3: Professional and appropriaten" "4: Highly formal and expertly crafted" ), examples=[ EvaluationExample( input="What is MLflow?", output="MLflow is like your friendly neighborhood toolkit for managing ML projects. It's super cool!", score=1, justification="The response is casual and uses informal language." ), EvaluationExample( input="What is MLflow?", output="MLflow is an open-source platform for the machine learning lifecycle, including experimentation, reproducibility, and deployment.", score=4, justification="The response is formal, concise, and professionally worded." ) ], model="openai:/gpt-3.5-turbo-16k", parameters={"temperature": 0.0}, aggregations=["mean", "variance"], greater_is_better=True,)# Use the custom metric in evaluationresults = mlflow.evaluate( logged_model_info.model_uri, eval_data, targets="ground_truth", model_type="question-answering", extra_metrics=[professionalism])print(f"Professionalism score: {results.metrics['professionalism_mean']}")
이 맞춤형 지표는 GPT-3.5-turbo를 사용하여 응답의 전문성을 평가하고, LLM 자체를 어떻게 활용하여 평가할 수 있는지 보여줍니다.
고급 LLM 평가 기술
LLM이 더욱 정교해짐에 따라 이를 평가하는 기술도 정교해지고 있습니다. MLflow를 사용하여 몇 가지 고급 평가 방법을 살펴보겠습니다.
검색 증강 생성(RAG) 평가
RAG 시스템은 검색 기반 모델과 생성 모델의 힘을 결합합니다. RAG 시스템을 평가하려면 검색 및 생성 구성 요소를 모두 평가해야 합니다. 다음은 MLflow를 사용하여 RAG 시스템을 설정하고 평가하는 방법입니다.
from langchain.document_loaders import WebBaseLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import Chromafrom langchain.chains import RetrievalQAfrom langchain.llms import OpenAI# Load and preprocess documentsloader = WebBaseLoader(["https://mlflow.org/docs/latest/index.html"])documents = loader.load()text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)texts = text_splitter.split_documents(documents)# Create vector storeembeddings = OpenAIEmbeddings()vectorstore = Chroma.from_documents(texts, embeddings)# Create RAG chainllm = OpenAI(temperature=0)qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever(), return_source_documents=True)# Evaluation functiondef evaluate_rag(question): result = qa_chain({"query": question}) return result["result"], [doc.page_content for doc in result["source_documents"]]# Prepare evaluation dataeval_questions = [ "What is MLflow?", "How does MLflow handle experiment tracking?", "What are the main components of MLflow?"]# Evaluate using MLflowwith mlflow.start_run(): for question in eval_questions: answer, sources = evaluate_rag(question) mlflow.log_param(f"question", question) mlflow.log_metric("num_sources", len(sources)) mlflow.log_text(answer, f"answer_{question}.txt") for i, source in enumerate(sources): mlflow.log_text(source, f"source_{question}_{i}.txt") # Log custom metrics mlflow.log_metric("avg_sources_per_question", sum(len(evaluate_rag(q)[1]) for q in eval_questions) / len(eval_questions))
이 예제에서는 LangChain과 Chroma를 사용하여 RAG 시스템을 설정한 다음, 질문, 답변, 검색된 소스, 사용자 정의 메트릭을 MLflow에 기록하여 이를 평가합니다.
청킹 전략 평가
문서를 청크하는 방식은 RAG 성능에 상당한 영향을 미칠 수 있습니다. MLflow는 다양한 청크 전략을 평가하는 데 도움이 될 수 있습니다.
import mlflowfrom langchain.text_splitter import CharacterTextSplitter, TokenTextSplitterdef evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class): splitter = splitter_class(chunk_size=chunk_size, chunk_overlap=chunk_overlap) chunks = splitter.split_documents(documents) with mlflow.start_run(): mlflow.log_param("chunk_size", chunk_size) mlflow.log_param("chunk_overlap", chunk_overlap) mlflow.log_param("splitter_class", splitter_class.__name__) mlflow.log_metric("num_chunks", len(chunks)) mlflow.log_metric("avg_chunk_length", sum(len(chunk.page_content) for chunk in chunks) / len(chunks)) # Evaluate retrieval performance (simplified) correct_retrievals = sum(1 for _ in range(100) if simulate_retrieval(chunks)) mlflow.log_metric("retrieval_accuracy", correct_retrievals / 100)# Evaluate different strategiesfor chunk_size in [500, 1000, 1500]: for chunk_overlap in [0, 50, 100]: for splitter_class in [CharacterTextSplitter, TokenTextSplitter]: evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class)# Compare resultsbest_run = mlflow.search_runs(order_by=["metrics.retrieval_accuracy DESC"]).iloc[0]print(f"Best chunking strategy: {best_run['params.splitter_class']} with size {best_run['params.chunk_size']} and overlap {best_run['params.chunk_overlap']}")
이 스크립트는 청크 크기, 중복, 분할 방법의 다양한 조합을 평가하고 결과를 MLflow에 기록하여 쉽게 비교할 수 있도록 합니다.
LLM 평가 결과 시각화
MLflow는 LLM 평가 결과를 시각화하는 다양한 방법을 제공합니다. 다음은 몇 가지 기술입니다.
MLflow UI 사용
평가를 실행한 후 MLflow UI를 사용하여 결과를 시각화할 수 있습니다.
MLflow UI 시작: mlflow ui
웹 브라우저를 열고 이동하세요 http://localhost:5000
실험과 실행을 선택하여 메트릭, 매개변수 및 아티팩트를 확인하세요.
사용자 정의 시각화
Matplotlib 또는 Plotly와 같은 라이브러리를 사용하여 평가 결과의 사용자 정의 시각화를 만든 다음 이를 아티팩트로 기록할 수 있습니다.
import matplotlib.pyplot as pltimport mlflowdef plot_metric_comparison(metric_name, run_ids): plt.figure(figsize=(10, 6)) for run_id in run_ids: run = mlflow.get_run(run_id) metric_values = mlflow.get_metric_history(run_id, metric_name) plt.plot([m.step for m in metric_values], [m.value for m in metric_values], label=run.data.tags.get("mlflow.runName", run_id)) plt.title(f"Comparison of {metric_name}") plt.xlabel("Step") plt.ylabel(metric_name) plt.legend() # Save and log the plot plt.savefig(f"{metric_name}_comparison.png") mlflow.log_artifact(f"{metric_name}_comparison.png")# Usagewith mlflow.start_run(): plot_metric_comparison("answer_relevance", ["run_id_1", "run_id_2", "run_id_3"])
이 함수는 여러 번의 실행에 걸쳐 특정 지표를 비교하는 선형 플롯을 만들어 아티팩트로 기록합니다.