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

1. Introdução

Por que fazer ajustes é importante

Os modelos de fundação são treinados para fins gerais e, às vezes, não realizam 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 a um modelo usando apenas o design de comandos. Nesses casos, é possível usar o ajuste de modelo para melhorar o desempenho dele em tarefas específicas. O ajuste de modelos também ajuda a cumprir requisitos de saída específicos quando as instruções não são suficientes. Os modelos de linguagem grandes (LLMs) podem ter uma grande quantidade de informações e realizar muitas tarefas, mas se destacam apenas quando recebem treinamento especializado. O ajuste fino pode treinar um LLM, permitindo que você adapte um LLM pré-treinado para suas necessidades específicas.

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

O ajuste supervisionado melhora o desempenho de um modelo ao ensinar uma nova habilidade. Dados com 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 ao modelo como personalizar as respostas para nosso caso de uso específico.

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

O que você vai criar

Caso de uso: gerar títulos para artigos de notícias

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

Neste codelab, você vai fazer o seguinte:

  • Use BBC FULLTEXT DATA, disponibilizado pelo conjunto de dados público bigquery-public-data.bbc_news.fulltext do BigQuery.
  • Ajuste 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 exemplo de arquivo JSONL está disponível para este codelab no repositório. Faça upload do arquivo para o bucket do Cloud Storage e execute as seguintes etapas de ajuste:
  • Preparar seus dados:comece com um conjunto de dados de matérias e manchetes correspondentes, como o conjunto de dados da BBC News usado no código de exemplo.
  • Ajustar um modelo pré-treinado:escolha um modelo base como "text-bison@002" e ajustá-los com seus dados de notícias usando o SDK da Vertex AI para Python.
  • Avalie os resultados:compare o desempenho do seu modelo ajustado com o modelo base para ver a melhoria na qualidade da geração de títulos.
  • Implantar e usar seu modelo:disponibilize o modelo ajustado por um endpoint de API e comece a gerar títulos 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 que sua conta ativa do Google Cloud.

3. Ajustar um modelo de linguagem grande

Este codelab usa o SDK da Vertex AI para Python para ajustar o modelo. Você também pode fazer ajustes usando as outras opções: HTTP, comando CURL, SDK do Java, Console.

Você pode 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 o restante das etapas, conforme mostrado no arquivo .ipynb no repositório. Lembre-se de substituir PROJECT_ID e 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 TRAIN.jsonl de amostra para ele. Os dados de amostra foram provisionados para este 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

Nesse momento, você pode ajustar qualquer modelo de linguagem grande (com base na disponibilidade do suporte) . Neste snippet, porém, estamos ajustando o modelo pré-treinado "text-bison@002" pelo data frame que contém 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, você poderá 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

Mesmo que os dois títulos gerados pareçam apropriados, o primeiro (gerado com o modelo ajustado) está mais alinhado com o estilo dos 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. Mas lembre-se, na etapa 3, que ele é invocado no escopo do próprio código para manter o modelo ajustado na variável Tune_model. Mas e se você quiser invocar um modelo ajustado anteriormente?

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

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 para avaliar a qualidade e a relevância da resposta gerada. Ele envolve examinar a saída de um modelo de linguagem generativa para determinar sua coerência, acurácia e alinhamento com o comando fornecido. A avaliação de modelos ajuda a identificar áreas de melhoria, otimizar o desempenho do modelo e garantir que o texto gerado atenda aos padrões de qualidade e utilidade desejados. Confira mais informações na documentação. Por enquanto, vamos ver como conseguir algumas métricas de avaliação no modelo ajustado e comparar com o modelo base.

  1. Carregue o conjunto de dados EVALUATION:
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 do 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 do resumo. ROUGE-L é uma métrica baseada em recall que mede a sobreposição entre um resumo e um resumo de referência. Esse valor é calculado dividindo a subsequência comum mais longa (LCS, na sigla em inglês) entre os dois resumos pelo tamanho 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 de resumo é relativamente mais alta para o modelo ajustado.

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

9. Considerações importantes

  • Suporte ao modelo:sempre verifique a documentação do modelo para verificar a compatibilidade mais recente.
  • Desenvolvimento rápido:o campo dos LLMs avança rapidamente. Um modelo mais novo e mais poderoso pode superar um modelo ajustado criado com base em uma base mais antiga. A boa notícia é que você pode aplicar essas técnicas de ajuste a modelos mais novos quando a capacidade estiver disponível.
  • LoRA:a LoRA é uma técnica para ajustar LLMs com eficiência. Ele faz isso introduzindo matrizes de decomposição treináveis e de baixa classificação nas camadas do modelo pré-treinado existente. Saiba mais neste link. Em vez de atualizar todos os parâmetros de um LLM massivo, a 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 Encerrar para excluí-lo.
  4. Como alternativa, acesse o Model Registry, navegue até a guia de implantação e teste do modelo, remova 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 LLM. O ajuste fino é uma técnica avançada que permite personalizar LLMs para seu domínio e suas tarefas. Com a Vertex AI, você tem as ferramentas e os recursos necessários para ajustar seus modelos com eficiência e eficácia.

Explore os repositórios do GitHub e teste o exemplo de código para fazer ajustes e avaliações em primeira mão. Considere como LLMs ajustados podem atender às suas necessidades específicas, desde a geração de textos de marketing direcionados até o resumo de documentos complexos ou a tradução de idiomas com nuances culturais. Utilize o pacote abrangente de ferramentas e serviços oferecidos pela Vertex AI para criar, treinar, avaliar e implantar seus modelos ajustados com facilidade.