Ajuste de modelos de linguagem grandes: como a Vertex AI leva os LLMs ao próximo nível

1. Introdução

Por que o ajuste é importante

Os modelos de fundação são treinados para propósitos gerais e, às vezes, não executam tarefas tão bem quanto você gostaria. Isso pode acontecer porque as tarefas que você quer que o modelo execute são tarefas especializadas que são difíceis de ensinar um modelo apenas usando o design de comandos. Nesses casos, é possível usar o ajuste de modelo para melhorar o desempenho de um modelo em tarefas específicas. O ajuste do modelo também pode ajudar a especificar os requisitos do resultado quando só as instruções não são suficientes. Os modelos de linguagem grande (LLMs) podem ter uma grande quantidade de informações e realizar muitas tarefas, mas só se destacam quando recebem treinamento especializado. O ajuste pode treinar um LLM, permitindo que você adapte um LLM pré-treinado às suas necessidades específicas.

Neste codelab, você vai aprender a realizar o ajuste usando a abordagem de ajuste supervisionado para um modelo de LLM.

O ajuste supervisionado melhora o desempenho do modelo ensinando uma nova habilidade. Dados que contêm centenas de exemplos rotulados são usados para ensinar o modelo a imitar um comportamento ou tarefa desejado. Vamos fornecer um conjunto de dados rotulado para texto de entrada (comando) e texto de saída (resposta) para ensinar o modelo a personalizar as respostas para nosso caso de uso específico.

Mais informações sobre a personalização do modelo estão disponíveis aqui.

O que você vai criar

Caso de uso: gerar manchetes para artigos de notícias

Vamos supor que você queira gerar manchetes automaticamente para artigos de notícias. Usando a Vertex AI, é possível ajustar um LLM que gera um título resumido adequado em um estilo específico e personaliza o título de acordo com as diretrizes do canal de notícias.

Neste codelab, você vai realizar o seguinte:

  • Usar BBC FULLTEXT DATA (disponibilizado pelo conjunto de dados públicos do BigQuery bigquery-public-data.bbc_news.fulltext).
  • Ajustar um LLM (text-bison@002) para um novo modelo ajustado chamado "bbc-news-summary-tuned" e comparar o resultado com a resposta do modelo base. Um arquivo JSONL de amostra está disponível para este codelab no repositório. É possível fazer upload do arquivo para o bucket do Cloud Storage e executar as seguintes etapas de ajuste:
  • Prepare seus dados:comece com um conjunto de dados de artigos de notícias e as manchetes correspondentes, como o conjunto de dados da BBC News usado no exemplo de código.
  • Ajuste um modelo pré-treinado:escolha um modelo base como "text-bison@002" e ajuste-o com seus dados de notícias usando o SDK da Vertex AI para Python.
  • Avalie os resultados:compare o desempenho do modelo ajustado com o modelo base para conferir a melhoria na qualidade da geração de manchetes.
  • Implante e use seu modelo:disponibilize o modelo ajustado por um endpoint de API e comece a gerar manchetes para novos artigos automaticamente.

2. Antes de começar

  1. No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud.
  2. Verifique se o faturamento está ativado para seu projeto do Google Cloud. Saiba como verificar se o faturamento está ativado em um projeto.
  3. Abra o notebook do Colab e faça login na mesma conta do Google Cloud ativa.

3. Ajustar um modelo de linguagem grande

Este codelab usa o SDK da Vertex AI para Python para ajustar o modelo. Também é possível realizar o ajuste usando as outras opções: HTTP, comando CURL, SDK Java, console.

É possível ajustar e avaliar seu modelo para respostas personalizadas em cinco etapas. Consulte o código completo no arquivo llm_fine_tuning_supervised.ipynb do repositório.

4. Etapa 1: instalar e importar dependências

!pip install google-cloud-aiplatform
!pip install --user datasets
!pip install --user google-cloud-pipeline-components

Siga as demais etapas mostradas no arquivo .ipynb no repositório. Substitua o PROJECT_ID e o BUCKET_NAME pelas suas credenciais.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import warnings
warnings.filterwarnings('ignore')
import vertexai
vertexai.init(project=PROJECT_ID, location=REGION)
import kfp
import sys
import uuid
import json
import pandas as pd
from google.auth import default
from datasets import load_dataset
from google.cloud import aiplatform
from vertexai.preview.language_models import TextGenerationModel, EvaluationTextSummarizationSpec

5. Etapa 2: preparar e carregar dados de treinamento

Substitua YOUR_BUCKET pelo seu bucket e faça upload do arquivo de dados de treinamento de amostra TRAIN.jsonl. Os dados de amostra foram provisionados para esse caso de uso no link mencionado acima.

json_url = 'https://storage.googleapis.com/YOUR_BUCKET/TRAIN.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)

Esta etapa deve resultar em:

17274866af36a47c.png

6. Etapa 3: ajustar um modelo de linguagem grande

É possível ajustar qualquer modelo de linguagem grande neste momento (com base na disponibilidade de suporte) . No entanto, neste snippet, estamos ajustando o modelo pré-treinado "text-bison@002" com o frame de dados que tem os dados de treinamento que carregamos na etapa anterior:

model_display_name = 'bbc-finetuned-model' # @param {type:"string"}
tuned_model = TextGenerationModel.from_pretrained("text-bison@002")
tuned_model.tune_model(
training_data=df,
train_steps=100,
tuning_job_location="europe-west4",
tuned_model_location="europe-west4",
)

Essa etapa leva algumas horas para ser concluída. É possível acompanhar o progresso do ajuste usando o link do job de pipeline no resultado.

7. Etapa 4: prever com o novo modelo ajustado

Depois que o job de ajuste for concluído, será possível fazer previsões com o novo modelo. Para prever com o novo modelo ajustado:

response = tuned_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

Você verá o seguinte resultado:

67061c36b7ba39b7.png

Para prever com o modelo base (text-bison@002) para comparação, execute os seguintes comandos:

base_model = TextGenerationModel.from_pretrained("text-bison@002")
response = base_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)

Você verá o seguinte resultado:

22ec58e4261405d6.png

Embora os dois títulos gerados pareçam adequados, o primeiro (gerado com o modelo ajustado) está mais de acordo com o estilo de títulos usados no conjunto de dados em questão.

Carregar o modelo ajustado

Pode ser mais fácil carregar um modelo que você acabou de ajustar. No entanto, lembre-se de que, na etapa 3, ele é invocado no escopo do próprio código. Portanto, ele ainda mantém o modelo ajustado na variável tuned_model. Mas e se você quiser invocar um modelo que foi ajustado no passado?

Para fazer isso, invoque o método get_tuned_model() no LLM com o URL do endpoint completo do modelo ajustado implantado no Vertex AI Model Registry. Nesse caso, você está inserindo o PROJECT_NUMBER e o MODEL_NUMBER em vez dos IDs respectivos.

tuned_model_1 = TextGenerationModel.get_tuned_model("projects/<<PROJECT_NUMBER>>/locations/europe-west4/models/<<MODEL_NUMBER>>")
print(tuned_model_1.predict("YOUR_PROMPT"))

8. Etapa 5: avaliar o novo modelo ajustado

A avaliação é um aspecto essencial da avaliação da qualidade e relevância da resposta gerada. Ela envolve o exame da saída de um modelo de linguagem generativa para determinar a coerência, a precisão e o alinhamento com o comando fornecido. A avaliação do modelo ajuda a identificar áreas de melhoria, otimizar o desempenho do modelo e garantir que o texto gerado atenda aos padrões desejados de qualidade e utilidade. Leia mais sobre isso na documentação. Por enquanto, vamos conferir como podemos receber algumas métricas de avaliação no modelo ajustado e comparar com o modelo base.

  1. Carregue o conjunto de dados de AVALIAÇÃO:
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
  1. Defina a especificação de avaliação para uma tarefa de resumo de texto no modelo ajustado.
task_spec = EvaluationTextSummarizationSpec(
 task_name = "summarization",
 ground_truth_data=df
)

Essa etapa leva alguns minutos para ser concluída. É possível acompanhar o progresso usando o link do job de pipeline no resultado. Após a conclusão, você verá o seguinte resultado da avaliação:

387843d6c970e02.png

A métrica rougeLSum no resultado da avaliação especifica a pontuação ROUGE-L para o resumo. ROUGE-L é uma métrica baseada em recall que mede a sobreposição entre um resumo e um resumo de referência. Ela é calculada usando a maior subsequência comum (LCS) entre os dois resumos e dividindo-a pelo comprimento do resumo de referência.

A pontuação rougeLSum na expressão fornecida é 0,36600753600753694, o que significa que o resumo tem uma sobreposição de 36,6% com o resumo de referência.

Se você executar a etapa de avaliação no modelo de referência, vai observar que a pontuação do resumo é relativamente maior para o modelo ajustado.

Encontre os resultados da avaliação no diretório de saída do Cloud Storage especificado ao criar o job de avaliação. O arquivo é chamado evaluation_metrics.json. Para modelos ajustados, também é possível conferir os resultados da avaliação no console do Google Cloud na página do Vertex AI Model Registry.

9. Considerações importantes

  • Suporte ao modelo: sempre confira a documentação do modelo para conferir a compatibilidade mais recente.
  • Desenvolvimento rápido:o campo de LLMs avança rapidamente. Um modelo mais novo e mais avançado pode superar um modelo ajustado criado em uma base mais antiga. A boa notícia é que você pode aplicar essas técnicas de ajuste a modelos mais recentes quando o recurso estiver disponível.
  • LoRA:LoRA é uma técnica para ajustar LLMs de maneira eficiente. Ele faz isso introduzindo matrizes de decomposição de baixa classificação treináveis nas camadas do modelo pré-treinado. Leia mais sobre isso aqui. Em vez de atualizar todos os parâmetros de um LLM enorme, o LoRA aprende matrizes menores que são adicionadas ou multiplicadas pelas matrizes de peso do modelo original. Isso reduz significativamente o número de parâmetros adicionais introduzidos durante o ajuste.

10. Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste codelab, siga estas etapas:

  1. No console do Google Cloud, acesse a página Gerenciar recursos.
  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Desligar para excluir o projeto.
  4. Como alternativa, acesse o Model Registry, navegue até a guia "Implantar e testar modelo", cancele a implantação do endpoint e exclua o modelo ajustado implantado.

11. Parabéns

Parabéns! Você usou a Vertex AI para ajustar um modelo de LLM. O ajuste é uma técnica avançada que permite personalizar LLMs para seu domínio e tarefas. Com a Vertex AI, você tem as ferramentas e os recursos necessários para ajustar seus modelos de maneira eficiente.

Explore os repositórios do GitHub e faça testes com o exemplo de código para conferir o ajuste e a avaliação. Considere como os LLMs ajustados podem atender às suas necessidades específicas, desde a geração de textos de marketing direcionados até a sumarização de documentos complexos ou a tradução de idiomas com nuances culturais. Use o pacote abrangente de ferramentas e serviços oferecidos pela Vertex AI para criar, treinar, avaliar e implantar seus modelos ajustados com facilidade.