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 fino é importante

Os modelos de fundação são treinados para uso geral 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 especializadas e difíceis de ensinar usando apenas 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 aderir a 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 só se destacam quando recebem treinamento especializado. O ajuste pode treinar um LLM, permitindo que você adapte um LLM pré-treinado para suas necessidades específicas.

Neste codelab, você vai aprender a fazer o ajuste fino usando a abordagem supervisionada para um modelo de LLM.

O ajuste supervisionado melhora o desempenho de um 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 rotulados 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.

Saiba mais sobre a personalização de modelos neste link.

O que você vai criar

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

Vamos supor que você queira gerar títulos automaticamente para artigos de notícias. Com 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 fazer o seguinte:

  • Use BBC FULLTEXT DATA (disponibilizado pelo conjunto de dados públicos do BigQuery bigquery-public-data.bbc_news.fulltext).
  • Ajuste um LLM (text-bison@002) para um novo modelo ajustado chamado "bbc-news-summary-tuned" e compare o resultado com a resposta do modelo de 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 refinado:
  • Prepare seus dados:comece com um conjunto de dados de artigos de notícias e os títulos correspondentes, como o conjunto de dados do BBC News usado no exemplo de código.
  • Ajustar um modelo pré-treinado:escolha um modelo de 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 seu modelo ajustado com o modelo de base para conferir a melhoria na qualidade da geração de manchetes.
  • Implante e use seu modelo:disponibilize o modelo refinado 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 o projeto na nuvem 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 da 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 o ajuste fino usando as outras opções: HTTP, comando CURL, SDK Java e 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 conforme mostrado no arquivo .ipynb no repositório. Substitua 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 de amostra TRAIN.jsonl. Os dados de exemplo 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 vai resultar no seguinte:

17274866af36a47c.png

6. Etapa 3: ajustar um modelo de linguagem grande

Neste ponto, você pode ajustar qualquer modelo de linguagem grande (com base na disponibilidade de suporte) . Neste snippet, estamos ajustando o modelo pré-treinado "text-bison@002" com o DataFrame que tem os dados de treinamento carregados 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. Você pode acompanhar o progresso do ajuste usando o link do job do pipeline no resultado.

7. Etapa 4: fazer previsões com o novo modelo refinado

Depois que o job de ajuste refinado for concluído, você poderá fazer previsões com o novo modelo. Para fazer uma previsão 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 fazer previsões com o modelo de 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 refinado) está mais alinhado ao estilo de títulos usados no conjunto de dados em questão.

Carregar o modelo ajustado

Talvez seja mais fácil carregar um modelo que você acabou de ajustar. Mas lembre-se de que, na etapa 3, ele é invocado no escopo do próprio código. Portanto, ainda conté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 completo do ENDPOINT do modelo ajustado implantado do Vertex AI Model Registry. Nesse caso, você está inserindo PROJECT_NUMBER e 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 fundamental para analisar a qualidade e a relevância da resposta gerada. Isso envolve examinar a 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 a performance 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 ver como conseguir algumas métricas de avaliação no modelo refinado e comparar com o modelo de 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. Acompanhe o progresso usando o link do job de pipeline no resultado. Após a conclusão, você vai 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. Ela é calculada usando a maior subsequência comum (LCS) entre os dois resumos e dividindo 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 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 Registro de modelos da Vertex AI.

9. Considerações importantes

  • Suporte a modelos:sempre confira a documentação do modelo para saber a compatibilidade mais recente.
  • Desenvolvimento rápido:a área de LLMs avança rapidamente. Um modelo mais novo e avançado pode ter uma performance melhor do que um modelo refinado criado em uma base mais antiga. A boa notícia é que você pode aplicar essas técnicas de ajuste fino a modelos mais recentes quando o recurso estiver disponível.
  • LoRA:é uma técnica para ajustar LLMs de maneira eficiente. Isso é feito introduzindo matrizes de decomposição de baixo posto treináveis nas camadas do modelo pré-treinado atual. Saiba mais neste link. Em vez de atualizar todos os parâmetros de um LLM enorme, a LoRA aprende matrizes menores que são adicionadas ou multiplicadas com as matrizes de peso do modelo original. Isso reduz significativamente o número de parâmetros adicionais introduzidos durante o ajuste refinado.

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. Outra opção é acessar o Model Registry, navegar até a guia de implantação e teste do modelo e desimplantar o endpoint e excluir o modelo ajustado implantado.

11. Parabéns

Parabéns! Você usou a Vertex AI para ajustar um modelo de LLM. O ajuste fino é uma técnica poderosa 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 teste o exemplo de código para conhecer o ajuste refinado e a avaliação na prática. Considere como os LLMs ajustados podem atender às suas necessidades específicas, desde a geração de textos de marketing segmentados até o resumo de documentos complexos ou a tradução de idiomas com nuances culturais. Use o conjunto abrangente de ferramentas e serviços oferecidos pela Vertex AI para criar, treinar, avaliar e implantar seus modelos refinados com facilidade.