Pular para o conteúdo principal

Ajuste fino do Llama 3.1 para classificação de textos

Comece a usar os novos modelos Llama e personalize o Llama-3.1-8B-It para prever vários distúrbios de saúde mental a partir do texto.
Actualizado 5 de nov. de 2024  · 13 min de leitura

Antes de começarmos, apenas uma observação: ao abordar os casos de uso de IA na área da saúde, é extremamente importante estar atento aos resultados potencialmente prejudiciais para os pacientes. O exemplo abaixo, embora abrangente, destina-se apenas a ilustrar o ajuste fino em um conjunto de dados do mundo real. Se você estiver buscando casos de uso de IA na área da saúde ou em outros domínios sensíveis, recomendamos a leitura do nosso guia de Ética em IA.

Neste tutorial, você aprenderá sobre os modelos Llama 3.1 e fará o ajuste fino do modelo Llama-3.1-8b-It na análise de sentimentos do conjunto de dados de saúde mental. Nosso objetivo é personalizar o modelo para que ele possa prever o estado de saúde mental do paciente com base no texto. Também mesclaremos o adaptador com o modelo baseado e salvaremos o modelo completo no hub Hugging Face. 

Aprenderemos sobre os modelos do Llama 3.1, como acessá-los no Kaggle e como usar a biblioteca Transformer para executar a inferência do modelo. Também faremos o ajuste fino do modelo Llama-3.1-8b-It no conjunto de dados de classificação de saúde mental. Por fim, mesclaremos o adaptador salvo com o modelo básico e enviaremos o modelo completo para o Hugging Face Hub.

Se você é novo no assunto, pode aprender sobre a teoria por trás do ajuste fino lendo nosso artigo, Guia introdutório para LLMs de ajuste fino.

Imagem do autor

Apresentando o Llama 3.1

O Llama 3.1 é a mais recente série de modelos multilíngues de grande porte (LLMs) desenvolvidos pela Meta AI, que estão ampliando os limites da compreensão e da geração de idiomas. Ele vem em três tamanhos: Parâmetros 8B, 70B e 405B.

Os modelos da Llama 3.1 são criados com base em uma arquitetura de modelo de linguagem auto-regressiva com transformadores otimizados e podem ser ajustados para várias tarefas de processamento de linguagem natural e conjuntos de dados. Eles são treinados em um conjunto de dados diversificado de dados on-line disponíveis publicamente, suportam oito idiomas (inglês, alemão, francês, italiano, português, hindi, espanhol e tailandês) e vêm com um comprimento de contexto de 128k. 

Os modelos Llama 3.1 estão disponíveis para todos sob licenças comerciais personalizadas e exigem informações mínimas sobre o indivíduo para que você possa fazer o download dos pesos do modelo.

O Llama 3.1 foi otimizado para o diálogo multilíngue e superou o Gemma 2, o GPT 3.5 turbo e o GPT-4o em vários benchmarks, incluindo bate-papo geral, codificação, matemática, raciocínio e muito mais. Ele é, de longe, o modelo de código aberto mais rápido e preciso disponível.

Referência Llama 3.1

Fonte: Llama 3.1 (meta.com)

Você pode saber mais sobre o modelo Llama 3.1 lendo O que é o Llama 3.1 405B da Meta? Como funciona, casos de uso e muito mais.

Primeiros passos com o Llama 3.1

Para este tutorial, usaremos o Kaggle Notebook como um ambiente de desenvolvimento, pois ele oferece GPUs e TPUs gratuitas. Para usar o modelo Llama 3.1 no notebook do Kaggle, siga estas etapas:

1. Preencha o formulário em meta.com com o mesmo endereço de e-mail da sua conta do Kaggle.

2. Acesse o Meta | Llama 3.1 no repositório de modelos do Kaggle e clique no botão "acessar o modelo". Aceite todos os termos e, após alguns segundos, você terá acesso ao modelo.

Acessando o Llama 3.1 no Kaggle

3. Inicie o notebook do Kaggle com os modelos do Llama 3.1 clicando no botão "Code" disponível no canto superior direito da página do modelo.

Iniciando o notebook do Kaggle.

4. Selecione a estrutura, a variação e a versão e pressione o botão "Add Model" (Adicionar modelo).

Selecionando a versão correta do modelo Llama 3.1.

5. Instale os pacotes Python necessários no notebook da Kaggle usando o seguinte comando:

%pip install -U transformers accelerate

6. Carregue o modelo e o tokenizador usando a biblioteca Transformers do diretório local.

7. Crie o pipeline de geração de texto com o modelo, o tokenizador, o tipo de tocha e o mapa do dispositivo.

from transformers import AutoTokenizer,AutoModelForCausalLM,pipeline
import torch

base_model = "/kaggle/input/llama-3.1/transformers/8b-instruct/1"

tokenizer = AutoTokenizer.from_pretrained(base_model)

model = AutoModelForCausalLM.from_pretrained(
        base_model,
        return_dict=True,
        low_cpu_mem_usage=True,
        torch_dtype=torch.float16,
        device_map="auto",
        trust_remote_code=True,
)
pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.float16,
    device_map="auto",
)

8. Escreva a mensagem e converta-a no prompt adequado usando o modelo de bate-papo.

9. Execute o pipeline usando o prompt e imprima a saída gerada.

messages = [{"role": "user", "content": "What is the tallest building in the world?"}]

prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
outputs = pipe(prompt, max_new_tokens=120, do_sample=True)
print(outputs[0]["generated_text"])

A resposta é precisa e detalhada. 

Saída de geração de resposta usando o modelo Llama 3.1

Se você tiver dificuldades para executar a inferência do modelo, consulte o Kaggle Notebook em Llama 3.1 Inferência de modelo simples.

Ajuste fino do Llama 3.1 na classificação de transtornos mentais 

Agora, precisamos carregar o conjunto de dados, processá-lo e ajustar o modelo Llama 3.1. Também compararemos o desempenho do modelo antes e depois do ajuste fino.

Se você é novo em LLMs, recomendo que faça o curso Conceitos de modelos de linguagem grandes (LLMs) antes de mergulhar na parte de ajuste fino do tutorial.

1. Configuração

Primeiro, iniciaremos o novo notebook do Kaggle e o modelo Llama 3.1, como fizemos na seção anterior.

Em seguida, instalaremos os pacotes Python necessários, conforme descrito abaixo:

%%capture
%pip install -U bitsandbytes
%pip install -U transformers
%pip install -U accelerate
%pip install -U peft
%pip install -U trl

Em seguida, adicionamos a Análise de sentimento para saúde mental no notebook do Kaggle.  Para fazer isso, clique no botão "Add Input" (Adicionar entrada) localizado na parte superior direita e cole o link do modelo na barra de pesquisa. Em seguida, para adicionar o modelo, basta clicar no botão de adição (+).

Adicionando a análise sentimental para o conjunto de dados de saúde mental no notebook do Kaggle.

Acompanharemos o desempenho do modelo usando a API Weights and Biases. Para acessar a API, precisamos da chave da API. Configure a chave de API no Kaggle usando Secrets e ative-a, conforme mostrado abaixo.  

Ativar os segredos do w&b para que você possa acessá-lo no notebook com segurança.

Em seguida, podemos iniciar o projeto Weights and Biases usando a chave da API.

import wandb

from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

wb_token = user_secrets.get_secret("wandb")

wandb.login(key=wb_token)
run = wandb.init(
    project='Fine-tune llama-3.1-8b-it on Sentiment Analysis Dataset', 
    job_type="training", 
    anonymous="allow"
)

Em seguida, precisamos importar todos os pacotes e funções Python necessários.

import numpy as np
import pandas as pd
import os
from tqdm import tqdm
import bitsandbytes as bnb
import torch
import torch.nn as nn
import transformers
from datasets import Dataset
from peft import LoraConfig, PeftConfig
from trl import SFTTrainer
from trl import setup_chat_format
from transformers import (AutoModelForCausalLM, 
                          AutoTokenizer, 
                          BitsAndBytesConfig, 
                          TrainingArguments, 
                          pipeline, 
                          logging)
from sklearn.metrics import (accuracy_score, 
                             classification_report, 
                             confusion_matrix)
from sklearn.model_selection import train_test_split

2. Carregamento e processamento do conjunto de dados

Agora é hora de carregarmos o conjunto de dados, realizarmos a limpeza dos dados e eliminarmos três categorias ambíguas. 

Para simplificar, eliminaremos a categoria "Suicidal" porque o Llama 3.1 tem mecanismos de segurança para evitar certas palavras desencadeadoras. O "estresse" não é considerado um transtorno mental, e o "transtorno de personalidade" tem muitas semelhanças com o "transtorno bipolar". 

Como resultado, ficaremos com apenas quatro categorias: "Normal", "Depressão", "Ansiedade" e "Bipolar".

df = pd.read_csv("/kaggle/input/sentiment-analysis-for-mental-health/Combined Data.csv",index_col = "Unnamed: 0")
df.loc[:,'status'] = df.loc[:,'status'].str.replace('Bi-Polar','Bipolar')
df = df[(df.status != "Personality disorder") & (df.status != "Stress") & (df.status != "Suicidal")]
df.head()

As 5 principais linhas do conjunto de dados

Para economizar tempo de treinamento, faremos o ajuste fino do modelo com apenas 3.000 amostras. Para isso, embaralharemos o conjunto de dados e selecionaremos 3.000 linhas. 

Em seguida, dividiremos o conjunto de dados em conjuntos de treinamento, avaliação e teste para treinamento e teste do modelo. 

Também queremos criar a coluna "text" nos conjuntos de treinamento e avaliação usando a função generate_prompt, que combina os dados das colunas "statement" e "status". 

Por fim, criaremos a coluna "text" no conjunto de teste usando a função generate_test_prompt e a y_true usando a coluna "status". Nós o usaremos para gerar o relatório de avaliação do modelo, conforme mostrado abaixo.

# Shuffle the DataFrame and select only 3000 rows
df = df.sample(frac=1, random_state=85).reset_index(drop=True).head(3000)

# Split the DataFrame
train_size = 0.8
eval_size = 0.1

# Calculate sizes
train_end = int(train_size * len(df))
eval_end = train_end + int(eval_size * len(df))

# Split the data
X_train = df[:train_end]
X_eval = df[train_end:eval_end]
X_test = df[eval_end:]

# Define the prompt generation functions
def generate_prompt(data_point):
    return f"""
            Classify the text into Normal, Depression, Anxiety, Bipolar, and return the answer as the corresponding mental health disorder label.
text: {data_point["statement"]}
label: {data_point["status"]}""".strip()

def generate_test_prompt(data_point):
    return f"""
            Classify the text into Normal, Depression, Anxiety, Bipolar, and return the answer as the corresponding mental health disorder label.
text: {data_point["statement"]}
label: """.strip()

# Generate prompts for training and evaluation data
X_train.loc[:,'text'] = X_train.apply(generate_prompt, axis=1)
X_eval.loc[:,'text'] = X_eval.apply(generate_prompt, axis=1)

# Generate test prompts and extract true labels
y_true = X_test.loc[:,'status']
X_test = pd.DataFrame(X_test.apply(generate_test_prompt, axis=1), columns=["text"])

Neste ponto, queremos verificar a distribuição das categorias no conjunto de treinamento.

X_train.status.value_counts()

Você pode ver abaixo que temos uma distribuição quase igual das categorias "Normal" e "Depressão". O restante dos rótulos é minoria. Isso significa que nosso conjunto de dados é desequilibrado, e o modelo será melhor na previsão de rótulos majoritários em comparação com os minoritários. 

Podemos equilibrar o conjunto de dados, mas esse não é o objetivo deste tutorial.

status
Normal        1028
Depression     938
Anxiety        258
Bipolar        176
Name: count, dtype: int64

Portanto, em seguida, queremos converter o conjunto de treinamento e avaliação nos conjuntos de dados do Hugging Face.

# Convert to datasets
train_data = Dataset.from_pandas(X_train[["text"]])
eval_data = Dataset.from_pandas(X_eval[["text"]])

Em seguida, exibimos a quarta amostra da coluna "texto".

train_data['text'][3]

Vemos que a coluna "texto" tem um prompt do sistema, a declaração e os status como rótulos. 

3. Carregando o modelo e o tokenizador

Em seguida, queremos carregar o modelo Llama-3.1-8b-instruct em 4 bits quantização para economizar a memória da GPU.

Em seguida, carregaremos o tokenizador e definiremos o ID do token do pad. 

base_model_name = "/kaggle/input/llama-3.1/transformers/8b-instruct/1"

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=False,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype="float16",
)

model = AutoModelForCausalLM.from_pretrained(
    base_model_name,
    device_map="auto",
    torch_dtype="float16",
    quantization_config=bnb_config, 
)

model.config.use_cache = False
model.config.pretraining_tp = 1

tokenizer = AutoTokenizer.from_pretrained(base_model_name)

tokenizer.pad_token_id = tokenizer.eos_token_id

4. Avaliação do modelo antes do ajuste fino

Aqui, criamos a função predict, que usará o pipeline de geração de texto para prever rótulos da coluna "text". A execução da função retornará uma lista de categorias de transtornos mentais com base em várias amostras no conjunto de testes. 

def predict(test, model, tokenizer):
    y_pred = []
    categories = ["Normal", "Depression", "Anxiety", "Bipolar"]
    
    for i in tqdm(range(len(test))):
        prompt = test.iloc[i]["text"]
        pipe = pipeline(task="text-generation", 
                        model=model, 
                        tokenizer=tokenizer, 
                        max_new_tokens=2, 
                        temperature=0.1)
        
        result = pipe(prompt)
        answer = result[0]['generated_text'].split("label:")[-1].strip()
        
        # Determine the predicted category
        for category in categories:
            if category.lower() in answer.lower():
                y_pred.append(category)
                break
        else:
            y_pred.append("none")
    
    return y_pred

y_pred = predict(X_test, model, tokenizer)
100%|██████████| 300/300 [02:54<00:00,  1.72it/s]

Depois, criamos a função evaluate que usará os rótulos previstos e os rótulos verdadeiros para calcular a precisão geral do modelo e a precisão por categoria, gerar um relatório de classificação e imprimir uma matriz de confusão. A execução da função nos fornecerá um resumo detalhado da avaliação do modelo. 

def evaluate(y_true, y_pred):
    labels = ["Normal", "Depression", "Anxiety", "Bipolar"]
    mapping = {label: idx for idx, label in enumerate(labels)}
    
    def map_func(x):
        return mapping.get(x, -1)  # Map to -1 if not found, but should not occur with correct data
    
    y_true_mapped = np.vectorize(map_func)(y_true)
    y_pred_mapped = np.vectorize(map_func)(y_pred)
    
    # Calculate accuracy
    accuracy = accuracy_score(y_true=y_true_mapped, y_pred=y_pred_mapped)
    print(f'Accuracy: {accuracy:.3f}')
    
    # Generate accuracy report
    unique_labels = set(y_true_mapped)  # Get unique labels
    
    for label in unique_labels:
        label_indices = [i for i in range(len(y_true_mapped)) if y_true_mapped[i] == label]
        label_y_true = [y_true_mapped[i] for i in label_indices]
        label_y_pred = [y_pred_mapped[i] for i in label_indices]
        label_accuracy = accuracy_score(label_y_true, label_y_pred)
        print(f'Accuracy for label {labels[label]}: {label_accuracy:.3f}')
        
    # Generate classification report
    class_report = classification_report(y_true=y_true_mapped, y_pred=y_pred_mapped, target_names=labels, labels=list(range(len(labels))))
    print('\nClassification Report:')
    print(class_report)
    
    # Generate confusion matrix
    conf_matrix = confusion_matrix(y_true=y_true_mapped, y_pred=y_pred_mapped, labels=list(range(len(labels))))
    print('\nConfusion Matrix:')
    print(conf_matrix)

evaluate(y_true, y_pred)

O Llama 3.1 teve um desempenho excepcional, mesmo sem o ajuste fino. 79% de precisão é bom o suficiente. Vamos ver como nosso modelo melhora quando o ajustamos no conjunto de dados.

Accuracy: 0.790
Accuracy for label Normal: 0.741
Accuracy for label Depression: 0.939
Accuracy for label Anxiety: 0.556
Accuracy for label Bipolar: 0.533

Classification Report:
              precision    recall  f1-score   support

      Normal       0.92      0.74      0.82       143
  Depression       0.70      0.94      0.80       115
     Anxiety       0.68      0.56      0.61        27
     Bipolar       0.89      0.53      0.67        15

    accuracy                           0.79       300
   macro avg       0.80      0.69      0.73       300
weighted avg       0.81      0.79      0.79       300


Confusion Matrix:
[[106  33   4   0]
 [  3 108   3   1]
 [  4   8  15   0]
 [  2   5   0   8]]

5. Criação do modelo

Ao criar o modelo, começamos extraindo os nomes dos módulos lineares do modelo usando a biblioteca bits and bytes

Em seguida, configuramos o LoRA usando os módulos de destino, o tipo de tarefa e outros argumentos antes de definir os argumentos de treinamento. Esses argumentos de treinamento são otimizados para o notebook do Kaggle. Talvez seja necessário alterá-los se você estiver usando-os localmente. 

Em seguida, criaremos o treinador de modelos usando argumentos de treinamento, um modelo, um tokenizador, uma configuração de LoRA e um conjunto de dados. 

import bitsandbytes as bnb

def find_all_linear_names(model):
    cls = bnb.nn.Linear4bit
    lora_module_names = set()
    for name, module in model.named_modules():
        if isinstance(module, cls):
            names = name.split('.')
            lora_module_names.add(names[0] if len(names) == 1 else names[-1])
    if 'lm_head' in lora_module_names:  # needed for 16 bit
        lora_module_names.remove('lm_head')
    return list(lora_module_names)
modules = find_all_linear_names(model)
modules
['down_proj', 'gate_proj', 'o_proj', 'v_proj', 'up_proj', 'q_proj', 'k_proj']
output_dir="llama-3.1-fine-tuned-model"

peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules=modules,
)

training_arguments = TrainingArguments(
    output_dir=output_dir,                    # directory to save and repository id
    num_train_epochs=1,                       # number of training epochs
    per_device_train_batch_size=1,            # batch size per device during training
    gradient_accumulation_steps=8,            # number of steps before performing a backward/update pass
    gradient_checkpointing=True,              # use gradient checkpointing to save memory
    optim="paged_adamw_32bit",
    logging_steps=1,                         
    learning_rate=2e-4,                       # learning rate, based on QLoRA paper
    weight_decay=0.001,
    fp16=True,
    bf16=False,
    max_grad_norm=0.3,                        # max gradient norm based on QLoRA paper
    max_steps=-1,
    warmup_ratio=0.03,                        # warmup ratio based on QLoRA paper
    group_by_length=False,
    lr_scheduler_type="cosine",               # use cosine learning rate scheduler
    report_to="wandb",                  # report metrics to w&b
    eval_strategy="steps",              # save checkpoint every epoch
    eval_steps = 0.2
)

trainer = SFTTrainer(
    model=model,
    args=training_arguments,
    train_dataset=train_data,
    eval_dataset=eval_data,
    peft_config=peft_config,
    dataset_text_field="text",
    tokenizer=tokenizer,
    max_seq_length=512,
    packing=False,
    dataset_kwargs={
    "add_special_tokens": False,
    "append_concat_token": False,
    }
)

6. Treinamento de modelos

Agora é hora de iniciar o treinamento do modelo:

trainer.train()

Levou 1,5 horas para ajustar o modelo, e nossa perda de validação diminuiu gradualmente. Para obter um desempenho ainda melhor, tente treinar o modelo no conjunto de dados completo por pelo menos cinco épocas.

Registros de treinamento de modelos

Em seguida, concluímos a execução dos pesos e das tendências.

wandb.finish()
model.config.use_cache = True

Você poderá visualizar o resumo da execução, incluindo todas as métricas necessárias para o desempenho do modelo.

Resumo da corrida w&b

Para visualizar um resumo detalhado, acesse sua conta do Weights and Biases e visualize a execução em seu navegador. Ele vem com visualizações interativas.

Visualização detalhada do resumo da execução no site weights and biases.

Em seguida, podemos salvar o adaptador de modelo e o tokenizador localmente. Na próxima seção, usaremos isso para mesclar o adotante com o modelo básico.

# Save trained model and tokenizer
trainer.save_model(output_dir)
tokenizer.save_pretrained(output_dir)

7. Teste do modelo após o ajuste fino

Agora vem a parte mais importante. Nosso modelo terá um desempenho melhor após o ajuste fino ou ficará pior? Para descobrir, devemos executar a função "predict" no conjunto de teste e, em seguida, a função "evaluate" para gerar um relatório de avaliação do modelo.

y_pred = predict(X_test, model, tokenizer)
evaluate(y_true, y_pred)

Como você pode ver nos resultados abaixo, isso representa uma grande melhoria no desempenho do modelo, de 79% para 91,3% de precisão. Até mesmo as pontuações da F1 estão parecendo boas. 

100%|██████████| 300/300 [03:24<00:00,  1.47it/s]
Accuracy: 0.913
Accuracy for label Normal: 0.972
Accuracy for label Depression: 0.913
Accuracy for label Anxiety: 0.667
Accuracy for label Bipolar: 0.800

Classification Report:
              precision    recall  f1-score   support

      Normal       0.92      0.97      0.95       143
  Depression       0.93      0.91      0.92       115
     Anxiety       0.75      0.67      0.71        27
     Bipolar       1.00      0.80      0.89        15

    accuracy                           0.91       300
   macro avg       0.90      0.84      0.87       300
weighted avg       0.91      0.91      0.91       300


Confusion Matrix:
[[139   3   1   0]
 [  5 105   5   0]
 [  6   3  18   0]
 [  1   2   0  12]]

Agora você pode salvar o notebook do Kaggle para salvar os resultados e os arquivos de modelo. Para fazer isso, clicamos no botão "Save Version" (Salvar versão) no canto superior direito, selecionamos o tipo de versão "Quick Save" (Salvamento rápido) e selecionamos o tipo de saída de salvamento "Always save output when creating a Quick Save" (Sempre salvar a saída ao criar um salvamento rápido).

Se você estiver tendo problemas para ajustar o modelo, consulte o notebook do Kaggle notebook para obter mais assistência.

Você também pode aprender a fazer o ajuste fino dos modelos da Llama 3.0 seguindo o nosso guia, Como fazer o ajuste fino da Llama 3 e usá-la localmente.

Mesclando e salvando o modelo Llama 3.1 ajustado

Nesta seção, mesclaremos o adaptador com o modelo básico e salvaremos a versão completa no hub Hugging Face. 

Primeiro, lançamos um novo notebook do Kaggle com aceleração de GPU e adicionamos o notebook salvo para acessar os arquivos de modelo. Você também pode incluir outros notebooks do Kaggle como entrada, da mesma forma que adiciona um conjunto de dados.

Adicionando o notebook como conjunto de dados no Kaggle Notebook.

Em seguida, podemos instalar os pacotes Python necessários. 

%%capture
%pip install -U bitsandbytes
%pip install -U transformers
%pip install -U accelerate
%pip install -U peft

Em seguida, fazemos login na API do hub da Hugging Face usando a chave da API para enviar nossos arquivos de modelo para o repositório de modelos da Hugging Face. 

from huggingface_hub import login
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN")
login(token = hf_token)

Em seguida, podemos definir o diretório do modelo básico e do modelo ajustado.

base_model = "/kaggle/input/llama-3.1/transformers/8b-instruct/1"
fine_tuned_model = "/kaggle/input/fine-tune-llama-3-1-for-text-classification/llama-3.1-fine-tuned-model/"

Em seguida, carregue o tokenizador e o modelo básico. 

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
from peft import PeftModel
import torch


# Reload tokenizer and model
tokenizer = AutoTokenizer.from_pretrained(base_model)

base_model_reload = AutoModelForCausalLM.from_pretrained(
        base_model,
        return_dict=True,
        low_cpu_mem_usage=True,
        torch_dtype=torch.float16,
        device_map="auto",
        trust_remote_code=True,
)

Combinamos o modelo básico com o adaptador ajustado, conforme mostrado abaixo. 

# Merge adapter with base model
model = PeftModel.from_pretrained(base_model_reload, fine_tuned_model)
model = model.merge_and_unload()

Antes de salvarmos nosso modelo, vamos verificar se ele está funcionando corretamente. Crie um pipeline de geração de texto com o modelo e o tokenizador e forneça a ele o prompt de amostra. 

text = "I'm trapped in a storm of emotions that I can't control, and it feels like no one understands the chaos inside me"
prompt = f"""Classify the text into Normal, Depression, Anxiety, Bipolar, and return the answer as the corresponding mental health disorder label.
text: {text}
label: """.strip()

pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.float16,
    device_map="auto",
)

outputs = pipe(prompt, max_new_tokens=2, do_sample=True, temperature=0.1)
print(outputs[0]["generated_text"].split("label: ")[-1].strip())

Nosso modelo está funcionando perfeitamente.

Depression

Agora podemos salvar o modelo e o tokenizador localmente. 

model_dir = "Llama-3.1-8B-Instruct-Mental-Health-Classification"
model.save_pretrained(model_dir)
tokenizer.save_pretrained(model_dir)

Em seguida, envie o modelo e o tokenizador para o Hugging Face Hub.

model.push_to_hub(model_dir, use_temp_dir=False)
tokenizer.push_to_hub(model_dir, use_temp_dir=False)

Isso criará o repositório no Hugging Face e enviará todos os arquivos do modelo e do tokenizador.

CommitInfo(commit_url='https://huggingface.co/kingabzpro/Llama-3.1-8B-Instruct-Mental-Health-Classification/commit/e1244abeaac159e0a48439095200a4190c2b493c', commit_message='Upload tokenizer', commit_description='', oid='e1244abeaac159e0a48439095200a4190c2b493c', pr_url=None, pr_revision=None, pr_num=None)

Você pode visualizar todos os arquivos de modelo visitando o site da Hugging Face. 

Repositório de modelos com ajuste fino no Hugging Face.

Fonte: kingabzpro/Llama-3.1-8B-Instruct-Mental-Health-Classification - Cara de Abraço

Se você estiver enfrentando problemas para mesclar o adaptador com o modelo básico, consulte o Caderno do Kaggle.

Se achar difícil fazer o ajuste fino dos LLMs, você pode seguir o site Fine-Tuning OpenAI's GPT-4: A Step-by-Step Guide tutorial para você aprender uma maneira mais fácil de usar a API OpenAI para ajustar o modelo em qualquer conjunto de dados com apenas algumas linhas de código.

Considerações finais

O ajuste fino do modelo não se limita à personalização com base no conjunto de dados. Podemos ajustar grandes modelos de linguagem em várias tarefas de linguagem natural, como tradução automática, agrupamento, classificação, perguntas e respostas, incorporação e muito mais. 

Neste tutorial, aprendemos a fazer o ajuste fino do modelo Llama 3.1 em um conjunto de dados de classificação de saúde mental. Esse modelo pode ser usado para identificar pacientes e até mesmo funcionários que estejam enfrentando desafios em seu dia a dia.

Se você está se perguntando como pode começar a trabalhar com LLMs e começar a ajustar os modelos por conta própria, considere fazer o curso Desenvolvimento de modelos de idiomas grandes que você pode fazer. Com esta série de cursos, você criará uma base sólida em LLMs, impulsionando-o para o novo cenário alimentado por IA.


Photo of Abid Ali Awan
Author
Abid Ali Awan
LinkedIn
Twitter

Sou um cientista de dados certificado que gosta de criar aplicativos de aprendizado de máquina e escrever blogs sobre ciência de dados. No momento, estou me concentrando na criação e edição de conteúdo e no trabalho com modelos de linguagem de grande porte.

Temas

Principais cursos de LLM da DataCamp

Certificação disponível

curso

Trabalhando com o Llama 3

4 hr
1.1K
Explore as técnicas mais recentes para executar o Llama LLM localmente, ajustando-o e integrando-o à sua pilha.
Ver DetalhesRight Arrow
Iniciar Curso
Ver maisRight Arrow
Relacionado

blog

Entendendo e atenuando o viés em modelos de idiomas grandes (LLMs)

Mergulhe em um passo a passo abrangente sobre a compreensão do preconceito nos LLMs, o impacto que ele causa e como atenuá-lo para garantir a confiança e a justiça.
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

12 min

tutorial

Guia de Introdução ao Ajuste Fino de LLMs

O ajuste fino dos grandes modelos de linguagem (LLMs, Large Language Models) revolucionou o processamento de linguagem natural (PLN), oferecendo recursos sem precedentes em tarefas como tradução de idiomas, análise de sentimentos e geração de textos. Essa abordagem transformadora aproveita modelos pré-treinados como o GPT-2, aprimorando seu desempenho em domínios específicos pelo processo de ajuste fino.
Josep Ferrer's photo

Josep Ferrer

12 min

tutorial

Guia para iniciantes do LlaMA-Factory WebUI: Ajuste fino dos LLMs

Saiba como fazer o ajuste fino dos LLMs em conjuntos de dados personalizados, avaliar o desempenho e exportar e servir modelos com facilidade usando a estrutura com pouco ou nenhum código do LLaMA-Factory.
Abid Ali Awan's photo

Abid Ali Awan

12 min

tutorial

Como fazer o ajuste fino do GPT 3.5: Liberando todo o potencial da IA

Explore o GPT-3.5 Turbo e descubra o potencial transformador do ajuste fino. Saiba como personalizar esse modelo de linguagem avançado para aplicativos de nicho, aprimorar seu desempenho e entender os custos associados, a segurança e as considerações de privacidade.
Moez Ali's photo

Moez Ali

11 min

tutorial

Como treinar um LLM com o PyTorch

Domine o processo de treinamento de grandes modelos de linguagem usando o PyTorch, desde a configuração inicial até a implementação final.
Zoumana Keita 's photo

Zoumana Keita

8 min

tutorial

DCLM-7B da Apple: Configuração, exemplo de uso, ajuste fino

Comece a usar o modelo de linguagem grande DCLM-7B da Apple e saiba como configurá-lo, usá-lo e ajustá-lo para tarefas específicas.
Dimitri Didmanidze's photo

Dimitri Didmanidze

9 min

See MoreSee More