Entre em contato

Rastreando modelos de linguagem grande (LLM) com MLflow: um guia completo

Ferramentas de IA 101

Rastreando modelos de linguagem grande (LLM) com MLflow: um guia completo

mm
Avaliação do guia MLflow LLM

À medida que os Large Language Models (LLMs) crescem em complexidade e escala, monitorar seu desempenho, experimentos e implantações se torna cada vez mais desafiador. É aqui que entra o MLflow – fornecendo uma plataforma abrangente para gerenciar todo o ciclo de vida dos modelos de aprendizado de máquina, incluindo LLMs.

Neste guia detalhado, exploraremos como utilizar o MLflow para rastrear, avaliar e implantar LLMs. Abordaremos tudo, desde a configuração do seu ambiente até técnicas avançadas de avaliação, com diversos exemplos de código e práticas recomendadas ao longo do caminho.

Funcionalidade do MLflow em modelos de linguagem grande (LLMs)

Fluxo de ML tornou-se uma ferramenta essencial na comunidade de aprendizado de máquina e ciência de dados, especialmente para o gerenciamento do ciclo de vida de modelos de aprendizado de máquina. Quando se trata de Modelos de Linguagem de Grande Porte (LLMs), o MLflow oferece um conjunto robusto de ferramentas que agilizam significativamente o processo de desenvolvimento, rastreamento, avaliação e implantação desses modelos. Aqui está uma visão geral de como o MLflow funciona no espaço de LLM e os benefícios que ele oferece a engenheiros e cientistas de dados.

Aprenda sobre os principais componentes do MLflow

Rastreando e gerenciando interações LLM

O sistema de rastreamento LLM do MLflow é um aprimoramento de seus recursos de rastreamento existentes, adaptado às necessidades exclusivas dos LLMs. Ele permite o rastreamento abrangente das interações do modelo, incluindo os seguintes aspectos principais:

  • Parâmetros Técnicos : Registrando pares de valores-chave que detalham os parâmetros de entrada para o LLM, como parâmetros específicos do modelo, como top_k e temperature. Isso fornece contexto e configuração para cada execução, garantindo que todos os aspectos da configuração do modelo sejam capturados.
  • Métrica: Medidas quantitativas que fornecem insights sobre o desempenho e a precisão do LLM. Eles podem ser atualizados dinamicamente à medida que a execução avança, oferecendo insights em tempo real ou pós-processo.
  • Previsões: Captura das entradas enviadas ao LLM e das saídas correspondentes, que são armazenadas como artefatos em um formato estruturado para fácil recuperação e análise.
  • Artefatos:Além das previsões, o MLflow pode armazenar vários arquivos de saída, como visualizações, modelos serializados e arquivos de dados estruturados, permitindo documentação e análise detalhadas do desempenho do modelo.

Essa abordagem estruturada garante que todas as interações com o LLM sejam meticulosamente registradas, fornecendo uma linhagem abrangente e rastreamento de qualidade para modelos de geração de texto.

Avaliação de LLMs

A avaliação de LLMs apresenta desafios únicos devido à sua natureza generativa e à falta de uma verdade básica única. O MLflow simplifica isso com ferramentas de avaliação especializadas projetadas para LLMs. Os principais recursos incluem:

  • Avaliação de modelo versátil: oferece suporte à avaliação de vários tipos de LLMs, seja um modelo MLflow pyfunc, um URI apontando para um modelo MLflow registrado ou qualquer chamada Python que represente seu modelo.
  • Métricas Abrangentes: oferece uma variedade de métricas adaptadas para avaliação LLM, incluindo métricas dependentes do modelo SaaS (por exemplo, relevância da resposta) e métricas baseadas em funções (por exemplo, ROUGE, Flesch Kincaid).
  • Coleções de métricas predefinidas: dependendo do caso de uso, como resposta a perguntas ou resumo de texto, o MLflow fornece métricas predefinidas para simplificar o processo de avaliação.
  • Criação de métricas personalizadas: permite que os usuários definam e implementem métricas personalizadas para atender às necessidades específicas de avaliação, aumentando a flexibilidade e a profundidade da avaliação do modelo.
  • Avaliação com conjuntos de dados estáticos: permite a avaliação de conjuntos de dados estáticos sem especificar um modelo, o que é útil para avaliações rápidas sem reexecutar a inferência do modelo.

Implantação e integração

O MLflow também suporta implantação e integração perfeitas de LLMs:

  • Servidor de implantações MLflow: atua como uma interface unificada para interagir com vários provedores de LLM. Ele simplifica integrações, gerencia credenciais com segurança e oferece uma experiência de API consistente. Este servidor oferece suporte a uma variedade de modelos básicos de fornecedores populares de SaaS, bem como modelos auto-hospedados.
  • Ponto final unificado: facilita a troca entre provedores sem alterações de código, minimizando o tempo de inatividade e aumentando a flexibilidade.
  • Visualização integrada de resultados: fornece resultados de avaliação abrangentes, que podem ser acessados ​​diretamente no código ou por meio da IU do MLflow para análise detalhada.

MLflow é um conjunto abrangente de ferramentas e integrações que o torna um ativo inestimável para engenheiros e cientistas de dados que trabalham com modelos avançados de PNL.

Configurando seu ambiente

Antes de começarmos a rastrear LLMs com o MLflow, vamos configurar nosso ambiente de desenvolvimento. Precisaremos instalar o MLflow e várias outras bibliotecas importantes:

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

Após a instalação, é uma boa prática reiniciar seu ambiente Python para garantir que todas as bibliotecas sejam carregadas corretamente. Em um notebook Jupyter, você pode usar:

import mlflow
import chromadb

print(f"MLflow version: {mlflow.__version__}")
print(f"ChromaDB version: {chromadb.__version__}")

Isso confirmará as versões das principais bibliotecas que usaremos.

Compreendendo os recursos de rastreamento de LLM do MLflow

O sistema de acompanhamento de LLM da MLflow se baseia em seus recursos de acompanhamento existentes, adicionando recursos projetados especificamente para os aspectos únicos dos LLMs. Vamos analisar os principais componentes:

Execuções e Experimentos

No MLflow, uma “execução” representa uma única execução do código do seu modelo, enquanto um “experimento” é uma coleção de execuções relacionadas. Para LLMs, uma execução pode representar uma única consulta ou um lote de prompts processados ​​pelo modelo.

Principais componentes de rastreamento

  1. Parâmetros Técnicos : são configurações de entrada para seu LLM, como temperatura, top_k ou max_tokens. Você pode registrá-los usando mlflow.log_param() or mlflow.log_params().
  2. Métrica: Medidas quantitativas do desempenho do seu LLM, como precisão, latência ou pontuações personalizadas. Use mlflow.log_metric() or mlflow.log_metrics() para rastreá-los.
  3. Previsões: Para LLMs, é crucial registrar os prompts de entrada e as saídas do modelo. O MLflow os armazena como artefatos no formato CSV usando mlflow.log_table().
  4. Artefatos: quaisquer arquivos ou dados adicionais relacionados à execução do LLM, como pontos de verificação de modelo, visualizações ou amostras de conjunto de dados. Usar mlflow.log_artifact() para armazená-los.

Vejamos um exemplo básico de registro de uma execução de LLM:

Este exemplo demonstra parâmetros de registro, métricas e entrada/saída como um artefato de tabela.

import mlflow
import openai

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()

with mlflow.start_run():
    prompt = "Explain the concept of machine learning in simple terms."
    
    # Log parameters
    mlflow.log_param("model", "text-davinci-002")
    mlflow.log_param("max_tokens", 100)
    
    # Query the LLM and log the result
    result = query_llm(prompt)
    mlflow.log_metric("response_length", len(result))
    
    # Log the prompt and response
    mlflow.log_table("prompt_responses", {"prompt": [prompt], "response": [result]})
    
    print(f"Response: {result}")

Implantando LLMs com MLflow

O MLflow oferece recursos poderosos para a implantação de LLMs, facilitando a disponibilização dos seus modelos em ambientes de produção. Vamos explorar como implantar um LLM usando os recursos de implantação do MLflow.

Criando um ponto final

Primeiro, criaremos um endpoint para nosso LLM usando o cliente de implantação do MLflow:

import mlflow
from mlflow.deployments import get_deploy_client

# Initialize the deployment client
client = get_deploy_client("databricks")

# Define the endpoint configuration
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",
            },
        },
    }],
}

# Create the endpoint
client.create_endpoint(name=endpoint_name, config=endpoint_config)

Este código configura um ponto de extremidade para um modelo GPT-3.5-turbo usando o Azure OpenAI. Observe o uso de segredos do Databricks para gerenciamento seguro de chaves de API.

Testando o ponto final

Depois que o endpoint for criado, podemos testá-lo:

<div class="relative flex flex-col rounded-lg">

response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "Explain the concept of neural networks briefly.","max_tokens": 100,},)

print(response)

Isso enviará um prompt ao nosso modelo implantado e retornará a resposta gerada.

Avaliando LLMs com MLflow

A avaliação é crucial para compreender o desempenho e o comportamento dos seus LLMs. O MLflow fornece ferramentas abrangentes para avaliar LLMs, incluindo métricas integradas e personalizadas.

Preparando seu LLM para avaliação

Para avaliar seu LLM com mlflow.evaluate(), seu modelo precisa estar em um destes formatos:

  1. An mlflow.pyfunc.PyFuncModel instância ou um URI apontando para um modelo MLflow registrado.
  2. Uma função Python que recebe entradas de string e gera uma única string.
  3. Um URI de ponto de extremidade de implantações do MLflow.
  4. Conjunto model=None e incluir resultados do modelo nos dados de avaliação.

Vejamos um exemplo usando um modelo MLflow registrado:

import mlflow
import openai

with 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 data
eval_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 model
results = mlflow.evaluate(
    logged_model_info.model_uri,
    eval_data,
    targets="ground_truth",
    model_type="question-answering",
)

print(f"Evaluation metrics: {results.metrics}")

Este exemplo registra um modelo OpenAI, prepara dados de avaliação e, em seguida, avalia o modelo usando as métricas integradas do MLflow para tarefas de resposta a perguntas.

Métricas de avaliação personalizadas

O MLflow permite definir métricas personalizadas para avaliação de LLM. Veja um exemplo de criação de uma métrica personalizada para avaliar o profissionalismo das respostas:

from mlflow.metrics.genai import EvaluationExample, make_genai_metric

professionalism = 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 inappropriate\n"
        "1: Casual but respectful\n"
        "2: Moderately formal\n"
        "3: Professional and appropriate\n"
        "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 evaluation
results = 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']}")

Esta métrica personalizada usa GPT-3.5-turbo para avaliar o profissionalismo das respostas, demonstrando como você pode aproveitar os próprios LLMs para avaliação.

Técnicas avançadas de avaliação LLM

À medida que os LLMs se tornam mais sofisticados, as técnicas de avaliação também se tornam mais sofisticadas. Vamos explorar alguns métodos avançados de avaliação usando o MLflow.

Avaliação de geração aumentada de recuperação (RAG)

Os sistemas RAG combinam o poder dos modelos baseados em recuperação e generativos. Avaliar sistemas RAG requer a avaliação dos componentes de recuperação e geração. Veja como você pode configurar um sistema RAG e avaliá-lo usando o 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

# Load and preprocess documents
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)

# Create vector store
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)

# Create RAG chain
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(),
    return_source_documents=True
)

# Evaluation function
def evaluate_rag(question):
    result = qa_chain({"query": question})
    return result["result"], [doc.page_content for doc in result["source_documents"]]

# Prepare evaluation data
eval_questions = [
    "What is MLflow?",
    "How does MLflow handle experiment tracking?",
    "What are the main components of MLflow?"
]

# Evaluate using MLflow
with 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))

Este exemplo configura um sistema RAG usando LangChain e Chroma e, em seguida, avalia-o registrando perguntas, respostas, fontes recuperadas e métricas personalizadas no MLflow.

Avaliação da estratégia de chunking

A maneira como você agrupa seus documentos pode impactar significativamente o desempenho do RAG. O MLflow pode ajudá-lo a avaliar diferentes estratégias de agrupamento:

import mlflow
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter

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)
    
    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 strategies
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)

# Compare results
best_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']}")

Este script avalia diferentes combinações de tamanhos de blocos, sobreposições e métodos de divisão, registrando os resultados no MLflow para fácil comparação.

Visualizando os resultados da avaliação LLM

O MLflow fornece várias maneiras de visualizar os resultados da avaliação do LLM. Aqui estão algumas técnicas:

Usando a IU do MLflow

Depois de executar suas avaliações, você pode usar a IU do MLflow para visualizar os resultados:

  1. Inicie a IU do MLflow: mlflow ui
  2. Abra um navegador da Web e navegue até http://localhost:5000
  3. Selecione seu experimento e execuções para visualizar métricas, parâmetros e artefatos

Visualizações personalizadas

Você pode criar visualizações personalizadas dos resultados da sua avaliação usando bibliotecas como Matplotlib ou Plotly e registrá-las como artefatos:

 
import matplotlib.pyplot as plt
import mlflow

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))
    
    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")

# Usage
with mlflow.start_run():
    plot_metric_comparison("answer_relevance", ["run_id_1", "run_id_2", "run_id_3"])

Esta função cria um gráfico de linhas comparando uma métrica específica em várias execuções e registra-a como um artefato.

Alternativas ao MLflow de código aberto

Existem inúmeras alternativas ao código aberto Fluxo de ML para gerenciar fluxos de trabalho de aprendizado de máquina, cada um oferecendo recursos e integrações exclusivas.

MLflow gerenciado por Databricks

MLflow gerenciado, hospedado por Bancos de dados, oferece as funcionalidades principais do MLflow de código aberto, mas com benefícios adicionais, como integração perfeita com o ecossistema da Databricks, recursos avançados de segurança e infraestrutura gerenciada. Isso o torna uma excelente escolha para organizações que precisam de segurança e escalabilidade robustas.

Aprendizado de Máquina do Azure

Aprendizado de Máquina do Azure oferece uma solução de aprendizado de máquina de ponta a ponta na plataforma de nuvem Azure da Microsoft. Ela oferece compatibilidade com componentes do MLflow, como o registro de modelos e o rastreador de experimentos, embora não seja baseada no MLflow.

Plataformas de ML dedicadas

Várias empresas fornecem produtos de ML gerenciados com diversos recursos:

  • netuno.ai: concentra-se no rastreamento de experimentos e gerenciamento de modelos.
  • Pesos e preconceitos: oferece amplo rastreamento de experimentos, controle de versão de conjuntos de dados e ferramentas de colaboração.
  • Cometa ML: fornece rastreamento de experimentos, monitoramento de produção de modelos e registro de dados.
  • Valohai: é especializado em pipelines e orquestração de aprendizado de máquina.

Metafluxo

Metafluxo, desenvolvido pela Netflix, é uma estrutura de código aberto projetada para orquestrar fluxos de trabalho de dados e pipelines de ML. Embora seja excelente no gerenciamento de implantações em grande escala, falta-lhe recursos abrangentes de rastreamento de experimentos e gerenciamento de modelos em comparação com o MLflow.

Amazon SageMaker e Vertex AI do Google

Ambos Amazon Sage Maker e Vertex AI do Google fornecem soluções MLOps ponta a ponta integradas em suas respectivas plataformas de nuvem. Esses serviços oferecem ferramentas robustas para criar, treinar e implantar modelos de aprendizado de máquina em escala.

Comparação Detalhada

MLflow gerenciado vs. MLflow de código aberto

O Managed MLflow da Databricks oferece diversas vantagens em relação à versão de código aberto, incluindo:

  • Configuração e implantação: A integração perfeita com o Databricks reduz o tempo e o esforço de configuração.
  • Global: capaz de lidar com cargas de trabalho de aprendizado de máquina em grande escala com facilidade.
  • Segurança e Gerenciamento: Recursos de segurança prontos para uso, como controle de acesso baseado em função (RBAC) e criptografia de dados.
  • Integração: Integração profunda com os serviços da Databricks, melhorando a interoperabilidade e funcionalidade.
  • Armazenamento e backup de dados: estratégias de backup automatizadas garantem segurança e confiabilidade dos dados.
  • Custo: os usuários pagam pela plataforma, pelo armazenamento e pelos recursos de computação.
  • Suporte e manutenção: Suporte e manutenção dedicados fornecidos pela Databricks.

Conclusão

O rastreamento de grandes modelos de linguagem com MLflow fornece uma estrutura robusta para gerenciar as complexidades de desenvolvimento, avaliação e implantação de LLM. Seguindo as práticas recomendadas e aproveitando os recursos avançados descritos neste guia, você pode criar experimentos de LLM mais organizados, reproduzíveis e esclarecedores.

Lembre-se de que o campo dos LLMs está evoluindo rapidamente e novas técnicas de avaliação e rastreamento surgem constantemente. Mantenha-se atualizado com os lançamentos mais recentes do MLflow e pesquisas LLM para refinar continuamente seus processos de rastreamento e avaliação.

Ao aplicar essas técnicas em seus projetos, você desenvolverá uma compreensão mais profunda do comportamento e desempenho de seus LLMs, o que levará a modelos de linguagem mais eficazes e confiáveis.

Passei os últimos cinco anos mergulhando no fascinante mundo do Machine Learning e Deep Learning. Minha paixão e experiência me levaram a contribuir para mais de 50 projetos diversos de engenharia de software, com foco particular em AI/ML. Minha curiosidade contínua também me atraiu para o Processamento de Linguagem Natural, um campo que estou ansioso para explorar mais.