Моделі та платформи ШІ
Відстежування великих мовних моделей (LLM) за допомогою MLflow: Повний посібник
Як великі мовні моделі (LLM) зростають у складності та масштабі, відстежування їхньої продуктивності, експериментів та розгортань стає дедалі більш складним. Саме тут вступає в дію MLflow – надає комплексну платформу для управління всім життєвим циклом моделей машинного навчання, включаючи LLM.
У цьому докладному посібнику ми дослідимо, як використовувати MLflow для відстежування, оцінки та розгортання LLM. Ми розглянемо все, від налаштування середовища до просунутих методів оцінки, з багатьма прикладами коду та найкращими практиками на шляху.
Налаштування середовища
Перед тим, як ми почнемо відстежувати LLM за допомогою MLflow, давайте налаштуємо середовище розробки. Нам потрібно буде встановити MLflow та декілька інших ключових бібліотек:
pip install mlflow>=2.8.1 pip install openai pip install chromadb==0.4.15 pip install langchain==0.0.348 pip install tiktoken pip install 'mlflow[genai]' pip install databricks-sdk --upgrade
Після установки добре зробити перезапуск середовища Python, щоб забезпечити правильне завантаження всіх бібліотек. У блокноті Jupyter можна використовувати:
import mlflow
import chromadb
<p>print(f"Версія MLflow: {mlflow.__version__}")
print(f"Версія ChromaDB: {chromadb.__version__}")
Це підтвердить версії ключових бібліотек, які ми будемо використовувати.
Поняття про можливості відстежування LLM у MLflow
Система відстежування LLM у MLflow будується на існуючих можливостях відстежування, додаючи функції, спеціально розроблені для унікальних аспектів LLM. Давайте розберемося у ключових компонентах:
Запуски та експерименти
У MLflow “запуск” представляє окреме виконання вашого коду моделі, тоді як “експеримент” – це збірка пов’язаних запусків. Для LLM запуск може представляти окреме запитання або пакет запитань, оброблених моделлю.
Ключові компоненти відстежування
- Параметри: Це вхідні конфігурації для вашої LLM, такі як температура, top_k або max_tokens. Ви можете реєструвати ці параметри за допомогою
mlflow.log_param()абоmlflow.log_params(). - Метрики: Кількісні міри продуктивності вашої LLM, як точність, затримка або користувальницькі оцінки. Використовуйте
mlflow.log_metric()абоmlflow.log_metrics()для відстежування цих метрик. - Прогнози: Для LLM важливо реєструвати як вхідні запити, так і виходи моделі. MLflow зберігає ці дані як артефакти у форматі CSV за допомогою
mlflow.log_table(). - Артефакти: Будь-які додаткові файли або дані, пов’язані з вашим запуском LLM, такі як контрольні точки моделі, візуалізації чи зразки наборів даних. Використовуйте
mlflow.log_artifact()для збереження цих даних.
Давайте розглянемо базовий приклад реєстрації запуску LLM:
Цей приклад демонструє реєстрацію параметрів, метрик та вхідних/вихідних даних як артефакту таблиці.
import mlflow
import openai
<p>def query_llm(prompt, max_tokens=100):
response = openai.Completion.create(
engine="text-davinci-002",
prompt=prompt,
max_tokens=max_tokens
)
return response.choices[0].text.strip()</p>
<p>with mlflow.start_run():
prompt = "Розкажіть про концепцію машинного навчання простими словами."</p>
<p># Реєстрація параметрів
mlflow.log_param("model", "text-davinci-002")
mlflow.log_param("max_tokens", 100)</p>
<p># Запит до LLM та реєстрація результату
result = query_llm(prompt)
mlflow.log_metric("response_length", len(result))</p>
<p># Реєстрація запиту та відповіді
mlflow.log_table("prompt_responses", {"prompt": [prompt], "response": [result]})</p>
<p>print(f"Відповідь: {result}")
Розгортання LLM з використанням MLflow
MLflow пропонує потужні можливості для розгортання LLM, що полегшує служіння вашим моделям у виробничих середовищах. Давайте дослідимо, як розгорнути LLM за допомогою функцій розгортання MLflow.
Створення кінцевого пункту
Спочатку ми створимо кінцевий пункт для нашої LLM за допомогою клієнта розгортання MLflow:
import mlflow
from mlflow.deployments import get_deploy_client
<p># Ініціалізація клієнта розгортання
client = get_deploy_client("databricks")</p>
<p># Визначення конфігурації кінцевого пункту
endpoint_name = "llm-endpoint"
endpoint_config = {
"served_entities": [{
"name": "gpt-model",
"external_model": {
"name": "gpt-3.5-turbo",
"provider": "openai",
"task": "llm/v1/completions",
"openai_config": {
"openai_api_type": "azure",
"openai_api_key": "{{secrets/scope/openai_api_key}}",
"openai_api_base": "{{secrets/scope/openai_api_base}}",
"openai_deployment_name": "gpt-35-turbo",
"openai_api_version": "2023-05-15",
},
},
}],
}</p>
<p># Створення кінцевого пункту
client.create_endpoint(name=endpoint_name, config=endpoint_config)
Цей код налаштовує кінцевий пункт для моделі GPT-3.5-turbo за допомогою Azure OpenAI. Обратіть увагу на використання секретів Databricks для безпечного керування ключами API.
Тестування кінцевого пункту
Після створення кінцевого пункту ми можемо його протестувати:
<div class="relative flex flex-col rounded-lg">
<p>response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "Розкажіть про концепцію нейронних мереж коротко.", "max_tokens": 100,},)</p>
print(response)
Це надішле запит до нашої розгорнутої моделі та поверне згенеровану відповідь.
Оцінка LLM з використанням MLflow
Оцінка є важливою для розуміння продуктивності та поведінки ваших LLM. MLflow пропонує комплексні інструменти для оцінки LLM, включаючи як вбудовані, так і користувальницькі метрики.
Підготовка LLM до оцінки
Для оцінки вашої LLM за допомогою mlflow.evaluate() ваша модель повинна бути у одному з таких форм:
- Інстанс
mlflow.pyfunc.PyFuncModelабо URI, що вказує на зареєстровану модель MLflow. - Python-функція, яка приймає рядкові вхідні дані та повертає один рядковий вихід.
- URI кінцевого пункту розгортання MLflow.
- Встановіть
model=Noneта включіть виходи моделі до даних оцінки.
Давайте розглянемо приклад використання зареєстрованої моделі MLflow:
import mlflow
import openai
<p>with mlflow.start_run():
system_prompt = "Відповість на наступне запитання коротко."
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}"},
],
)</p>
<p># Підготовка даних оцінки
eval_data = pd.DataFrame({
"question": ["Що таке машинне навчання?", "Розкажіть про нейронні мережі."],
"ground_truth": [
"Машинне навчання - це підмножина штучного інтелекту, яка дозволяє системам навчатися та покращувати з досвідом без явного програмування.",
"Нейронні мережі - це обчислювальні системи, натхненні біологічними нейронними мережами, що складаються з взаємопов'язаних вузлів, які обробляють та передають інформацію."
]
})</p>
<p># Оцінка моделі
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
)</p>
<p>print(f"Метрики оцінки: {results.metrics}")
Цей приклад реєструє модель OpenAI, підготував дані оцінки, а потім оцінює модель за допомогою вбудованих метрик MLflow для завдань питання-відповідь.
Користувальницькі метрики оцінки
MLflow дозволяє визначати користувальницькі метрики для оцінки LLM. Ось приклад створення користувальницької метрики для оцінки професійності відповідей:
from mlflow.metrics.genai import EvaluationExample, make_genai_metric
<p>professionalism = make_genai_metric(
name="professionalism",
definition="Міра формальної та відповідальної комунікації.",
grading_prompt=(
"Оцініть рівень професійності відповіді за шкалою від 0 до 4:\n"
"0: Надзвичайно неформально або невідповідально\n"
"1: Неформально, але поважно\n"
"2: Помірно формально\n"
"3: Професійно та відповідально\n"
"4: Надзвичайно формально та експертно створено"
),
examples=[
EvaluationExample(
input="Що таке MLflow?",
output="MLflow - це відкрита платформа для життєвого циклу машинного навчання, включаючи експериментування, повторюваність та розгортання.",
score=4,
justification="Відповідь формальна, лаконічна та професійно сформульована."
),
],
model="openai:/gpt-3.5-turbo-16k",
parameters={"temperature": 0.0},
aggregations=["mean", "variance"],
greater_is_better=True,
)</p>
<p># Використання користувальницької метрики в оцінці
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
extra_metrics=[professionalism]
)</p>
<p>print(f"Оцінка професійності: {results.metrics['professionalism_mean']}")
Ця користувальницька метрика використовує GPT-3.5-turbo для оцінки професійності відповідей, демонструючи, як можна використовувати LLM самих для оцінки.
Просунуті методи оцінки LLM
Як LLM стають більш складними, так само стають і методи їхньої оцінки. Давайте розглянемо деякі просунуті методи оцінки за допомогою MLflow.
Оцінка генерації з використанням пошукових систем (RAG)
Системи RAG поєднують потужність пошукових та генеративних моделей. Оцінка систем RAG вимагає оцінки як пошукової, так і генеративної складових. Ось як ви можете налаштувати систему RAG та оцінити її за допомогою MLflow:
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
<p># Завантаження та попередня обробка документів
loader = 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)</p>
<p># Створення векторного сховища
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)</p>
<p># Створення ланцюга RAG
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
return_source_documents=True
)</p>
<p># Функція оцінки
def evaluate_rag(question):
result = qa_chain({"query": question})
return result["result"], [doc.page_content for doc in result["source_documents"]]</p>
<p># Підготовка даних оцінки
eval_questions = [
"Що таке MLflow?",
"Як MLflow обробляє відстежування експериментів?",
"Які основні компоненти MLflow?",
]</p>
<p># Оцінка за допомогою MLflow
with mlflow.start_run():
for question in eval_questions:
answer, sources = evaluate_rag(question)</p>
<p>mlflow.log_param(f"question", question)
mlflow.log_metric("num_sources", len(sources))
mlflow.log_text(answer, f"answer_{question}.txt")</p>
<p>for i, source in enumerate(sources):
mlflow.log_text(source, f"source_{question}_{i}.txt")</p>
<p># Реєстрація користувальницьких метрик
mlflow.log_metric("avg_sources_per_question", sum(len(evaluate_rag(q)[1]) for q in eval_questions) / len(eval_questions))
Цей приклад налаштовує систему RAG за допомогою LangChain та Chroma, а потім оцінює її, реєструючи питання, відповіді, джерела та користувальницькі метрики в MLflow.
Оцінка стратегії фрагментації
Спосіб фрагментації документів може суттєво вплинути на продуктивність RAG. MLflow може допомогти оцінити різні стратегії фрагментації:
import mlflow
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter
<p>def 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)</p>
<p>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__)</p>
<p>mlflow.log_metric("num_chunks", len(chunks))
mlflow.log_metric("avg_chunk_length", sum(len(chunk.page_content) for chunk in chunks) / len(chunks))</p>
<p># Оцінка продуктивності пошукової системи (спрощено)
correct_retrievals = sum(1 for _ in range(100) if simulate_retrieval(chunks))
mlflow.log_metric("retrieval_accuracy", correct_retrievals / 100)</p>
<p># Оцінка різних стратегій
for 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)</p>
<p># Порівняння результатів
best_run = mlflow.search_runs(order_by=["metrics.retrieval_accuracy DESC"]).iloc[0]
print(f"Найкраща стратегія фрагментації: {best_run['params.splitter_class']} з розміром {best_run['params.chunk_size']} та перекриттям {best_run['params.chunk_overlap']}")
Цей скрипт оцінює різні комбінації розмірів фрагментів, перекриттів та методів фрагментації, реєструючи результати в MLflow для легкого порівняння.
Візуалізація результатів оцінки LLM
MLflow пропонує різні способи візуалізації результатів оцінки вашої LLM:
Використання інтерфейсу MLflow
Після виконання оцінок ви можете використовувати інтерфейс MLflow для візуалізації результатів:
- Запустіть інтерфейс MLflow:
mlflow ui - Відкрийте веб-браузер та перейдіть за адресою
http://localhost:5000 - Виберіть свій експеримент та запуски, щоб переглянути метрики, параметри та артефакти
Користувальницькі візуалізації
Ви можете створювати користувальницькі візуалізації результатів оцінки за допомогою бібліотек типу Matplotlib або Plotly, а потім реєструвати їх як артефакти:
import matplotlib.pyplot as plt
import mlflow
<p>def 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))</p>
<p>plt.title(f"Порівняння {metric_name}")
plt.xlabel("Крок")
plt.ylabel(metric_name)
plt.legend()</p>
<p># Збереження та реєстрація графіка
plt.savefig(f"{metric_name}_comparison.png")
mlflow.log_artifact(f"{metric_name}_comparison.png")</p>
<p># Використання
with mlflow.start_run():
plot_metric_comparison("answer_relevance", ["run_id_1", "run_id_2", "run_id_3"])
Ця функція створює лінійний графік порівняння певної метрики між декількома запусками та реєструє його як артефакт.














