Моделі та платформи ШІ

Відстежування великих мовних моделей (LLM) за допомогою MLflow: Повний посібник

mm
Додайте Unite.AI до бажаних джерел у Google
div]:bg-bg-300 [&_pre]:-mr-4 md:[&_pre]:-mr-9″>

Як великі мовні моделі (LLM) зростають у складності та масштабі, відстежування їхньої продуктивності, експериментів та розгортань стає дедалі більш складним. Саме тут вступає в дію MLflow – надає комплексну платформу для управління всім життєвим циклом моделей машинного навчання, включаючи LLM.

У цьому докладному посібнику ми дослідимо, як використовувати MLflow для відстежування, оцінки та розгортання LLM. Ми розглянемо все, від налаштування середовища до просунутих методів оцінки, з багатьма прикладами коду та найкращими практиками на шляху.

Функціональність MLflow у великих мовних моделях (LLM)

MLflow став важливим інструментом у спільноті машинного навчання та науки про дані, особливо для управління життєвим циклом моделей машинного навчання. Що стосується великих мовних моделей (LLM), MLflow пропонує потужний набір інструментів, які суттєво спрощують процес розробки, відстежування, оцінки та розгортання цих моделей. Ось огляд того, як MLflow функціонує у сфері LLM та яких переваг він надає інженерам та науковцям.

Дізнайтесь про основні компоненти MLflow

Відстежування та управління взаємодією LLM

Система відстежування LLM у MLflow є розширенням існуючих можливостей відстежування, адаптованих до особливих потреб LLM. Вона дозволяє здійснювати комплексне відстежування взаємодії моделі, включаючи такі ключові аспекти:

  • Параметри: Регістр ключових пар, які деталізують вхідні параметри для LLM, такі як модель-специфічні параметри типу top_k та temperature. Це забезпечує контекст та конфігурацію для кожного запуску, забезпечуючи захоплення всіх аспектів конфігурації моделі.
  • Метрики: Кількісні міри, які забезпечують уявлення про продуктивність та точність LLM. Ці метрики можна оновлювати динамічно під час виконання, надаючи реальні або пост-процесні уявлення.
  • Прогнози: Захоплення вхідних даних, надісланих до LLM, та відповідних виходів, які зберігаються як артефакти у структурованому форматі для легкого відновлення та аналізу.
  • Артефакти: Окрім прогнозів, MLflow може зберігати різні вихідні файли, такі як візуалізації, серіалізовані моделі та структуровані дані, що дозволяє здійснювати докладний документування та аналіз продуктивності моделі.

Цей структурований підхід забезпечує, щоб усі взаємодії з LLM були ретельно записані, забезпечуючи комплексну лінію та якісне відстежування для тексто-генеруючих моделей.

Оцінка LLM

Оцінка LLM представляє особливі складності через їхню генеративну природу та відсутність єдиної істини. MLflow спрощує це за допомогою спеціалізованих інструментів оцінки, призначених для LLM. Ключові особливості включають:

  • Універсальна оцінка моделей: Підтримує оцінку різних типів LLM, незалежно від того, чи це модель MLflow pyfunc, URI, що вказує на зареєстровану модель MLflow, чи будь-яка Python-функція, що представляє вашу модель.
  • Комплексні метрики: Надає ряд метрик, адаптованих для оцінки LLM, включаючи як метрики, залежні від моделі (наприклад, відповідність відповідей), так і метрики, засновані на функціях (наприклад, ROUGE, Flesch Kincaid).
  • Предварньо визначені колекції метрик: У залежності від випадку використання, наприклад, питання-відповідь або текст-сумаризація, MLflow пропонує попередньо визначені метрики для спрощення процесу оцінки.
  • Створення користувальницьких метрик: Дозволяє користувачам визначати та реалізовувати користувальницькі метрики для задоволення конкретних потреб оцінки, підвищуючи гнучкість та глибину оцінки моделі.
  • Оцінка з статичними наборами даних: Дозволяє здійснювати оцінку статичних наборів даних без вказівки моделі, що корисно для швидких оцінок без повторного виконання моделі.

Розгортання та інтеграція

MLflow також підтримує безшовне розгортання та інтеграцію LLM:

  • Сервер розгортань MLflow: Виступає як уніфікований інтерфейс для взаємодії з декількома постачальниками LLM. Він спрощує інтеграцію, керує обліковими даними безпечно та пропонує послідовний API-досвід. Цей сервер підтримує ряд фундаментальних моделей від популярних постачальників SaaS, а також самохостовані моделі.
  • Уніфікований кінцевий пункт: Спрощує перемикання між постачальниками без змін коду, мінімізуючи простій та підвищуючи гнучкість.
  • Інтегрований вигляд результатів: Надає комплексні результати оцінки, які можна отримати безпосередньо у коді або через інтерфейс MLflow для докладного аналізу.

MLflow є комплексним набором інструментів та інтеграцій, що робить його надзвичайно цінним активом для інженерів та науковців, які працюють з просунутими моделями NLP.

Налаштування середовища

Перед тим, як ми почнемо відстежувати 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 запуск може представляти окреме запитання або пакет запитань, оброблених моделлю.

Ключові компоненти відстежування

  1. Параметри: Це вхідні конфігурації для вашої LLM, такі як температура, top_k або max_tokens. Ви можете реєструвати ці параметри за допомогою mlflow.log_param() або mlflow.log_params().
  2. Метрики: Кількісні міри продуктивності вашої LLM, як точність, затримка або користувальницькі оцінки. Використовуйте mlflow.log_metric() або mlflow.log_metrics() для відстежування цих метрик.
  3. Прогнози: Для LLM важливо реєструвати як вхідні запити, так і виходи моделі. MLflow зберігає ці дані як артефакти у форматі CSV за допомогою mlflow.log_table().
  4. Артефакти: Будь-які додаткові файли або дані, пов’язані з вашим запуском 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.

Тестування кінцевого пункту

Після створення кінцевого пункту ми можемо його протестувати:

&lt;div class=&quot;relative flex flex-col rounded-lg&quot;&gt;

<p>response = client.predict(
endpoint=endpoint_name,
inputs={&quot;prompt&quot;: &quot;Розкажіть про концепцію нейронних мереж коротко.&quot;, &quot;max_tokens&quot;: 100,},)</p>

print(response)

Це надішле запит до нашої розгорнутої моделі та поверне згенеровану відповідь.

Оцінка LLM з використанням MLflow

Оцінка є важливою для розуміння продуктивності та поведінки ваших LLM. MLflow пропонує комплексні інструменти для оцінки LLM, включаючи як вбудовані, так і користувальницькі метрики.

Підготовка LLM до оцінки

Для оцінки вашої LLM за допомогою mlflow.evaluate() ваша модель повинна бути у одному з таких форм:

  1. Інстанс mlflow.pyfunc.PyFuncModel або URI, що вказує на зареєстровану модель MLflow.
  2. Python-функція, яка приймає рядкові вхідні дані та повертає один рядковий вихід.
  3. URI кінцевого пункту розгортання MLflow.
  4. Встановіть 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 для візуалізації результатів:

  1. Запустіть інтерфейс MLflow: mlflow ui
  2. Відкрийте веб-браузер та перейдіть за адресою http://localhost:5000
  3. Виберіть свій експеримент та запуски, щоб переглянути метрики, параметри та артефакти

Користувальницькі візуалізації

Ви можете створювати користувальницькі візуалізації результатів оцінки за допомогою бібліотек типу 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"])

Ця функція створює лінійний графік порівняння певної метрики між декількома запусками та реєструє його як артефакт.

Альтернативи відкритому MLflow

Є численні альтернативи відкритому MLflow для керування потоками машинного навчання, кожна з яких пропонує унікальні функції та інтеграції.

Керований MLflow від Databricks

Керований MLflow, розміщений у Databricks, пропонує основні функціональності відкритого MLflow, але з додатковими перевагами, такими як безшовна інтеграція з екосистемою Databricks, просунуті функції безпеки та керовану інфраструктуру. Це робить його чудовим вибором для організацій, яким потрібна надійна безпека та масштабованість.

Azure Machine Learning

Azure Machine Learning пропонує комплексне рішення для машинного навчання на платформі Azure. Воно забезпечує сумісність з компонентами MLflow, такими як реєстр моделей та відстежувач експериментів, хоча й не базується на MLflow.

Виділені платформи ML

Декілька компаній пропонують керовані продукти з різними функціями:

  • neptune.ai: Зосереджується на відстежуванні експериментів та керуванні моделями.
  • Weights & Biases: Надає розширені можливості відстежування експериментів, версіонування наборів даних та інструменти співпраці.
  • Comet ML: Пропонує відстежування експериментів, моніторинг моделей у виробництві та реєстрацію даних.
  • Valohai: Спеціалізується на керуванні потоками машинного навчання та оркестрації.

Metaflow

Metaflow, розроблений компанією Netflix (NFLX ), є відкритою платформою для керування потоками даних та моделей машинного навчання. Хоча він добре підходить для великомасштабних розгортань, йому не вистачає комплексних функцій відстежування експериментів та керування моделями порівняно з MLflow.

Amazon SageMaker та Google Vertex AI

Обидві Amazon SageMaker (AMZN ) та Google Vertex AI (GOOGL ) пропонують комплексні рішення MLOps, інтегровані у свої відповідні платформи. Ці послуги забезпечують потужні інструменти для створення, навчання та розгортання моделей машинного навчання у великому масштабі.

Детальний порівняння

Керований MLflow проти відкритого MLflow

Керований MLflow від Databricks пропонує кілька переваг порівняно з відкритим варіантом, включаючи:

  • Налаштування та розгортання: Безшовна інтеграція з Databricks зменшує час та зусилля налаштування.
  • Масштабованість: Спроможний обробляти великомасштабні завдання машинного навчання легко.
  • Безпека та керування: Вбудовані функції безпеки, такі як рольове керування доступом (RBAC) та шифрування даних.
  • Інтеграція: Глибока інтеграція з сервісами Databricks, підвищуючи взаємодію та функціональність.
  • Збереження даних та резервне копіювання: Автоматичні стратегії резервного копіювання забезпечують безпеку та надійність даних.
  • Вартість: Користувачі платять за платформу, зберігання та ресурси обчислень.
  • Підтримка та технічне обслуговування: Ведена підтримка та технічне обслуговування від Databricks.

Висновок

Відстежування великих мовних моделей за допомогою MLflow забезпечує потужну основу для керування складностями розробки, оцінки та розгортання LLM. Використовуючи найкращі практики та просунуті функції, описані в цьому посібнику, ви можете створити більш організовані, повторювані та інформативні експерименти з LLM.

Пам’ятайте, що область LLM швидко розвивається, і нові методи оцінки та відстежування постійно з’являються. Залишайтеся в курсі останніх випусків MLflow та досліджень LLM, щоб постійно вдосконалювати процеси відстежування та оцінки.

Як ви застосовуєте ці техніки в своїх проектах, ви розвинете глибше розуміння поведінки та продуктивності ваших LLM, що призведе до більш ефективних та надійних мовних моделей.

Я провів останні п'ять років, занурючись у захопливий світ машинного навчання та глибокого навчання. Моя пристрасть та експертиза привели мене до внеску у понад 50 різних проектів програмної інженерії, з особливим акцентом на AI/ML. Моя тривала цікавість також привела мене до природної обробки мови, галузі, яку я бажаю дослідити далі.