pt-br/1_instruction_tuning/notebooks/sft_finetuning_example.ipynb (273 lines of code) (raw):

{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Ajuste Fino Supervisionado com SFTTrainer\n", "\n", "Este caderno demonstra como ajustar o modelo `HuggingFaceTB/SmolLM2-135M` usando o `SFTTrainer` do móduli `trl`. As células do caderno são executadas e vão ajustar finamente o modelo. Você pode selecionar sua dificuldade experimentando diferentes conjuntos de dados.\n", "\n", "<div style='background-color: lightblue; padding: 10px; border-radius: 5px; margin-bottom: 20px; color:black'>\n", " <h2 style='margin: 0;color:blue'>Exercício: Ajuste fino do SmolLM2 com SFTTrainer</h2>\n", " <p>Pegue um conjunto de dados do hub do Hugging Face e faça um ajuste fino em um modelo. </p> \n", " <p><b>Níveis de Dificuldade</b></p>\n", " <p>🐢 Use o conjunto de dados `HuggingFaceTB/smoltalk`.</p>\n", " <p>🐕 Experimente o conjunto de dados `bigcode/the-stack-smol` e ajuste um modelo de geração de código no subconjunto específico `data/python`.</p>\n", " <p>🦁 Selecione um conjunto de dados relacionado a um caso de uso do mundo real que seja do seu interesse.</p>\n", "</div>" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Instale os requisitos no Google Colab\n", "# !pip install transformers datasets trl huggingface_hub\n", "\n", "# Autentique ao Hugging Face\n", "\n", "from huggingface_hub import login\n", "login()\n", "\n", "# Por conveniência, você pode criar uma variável de ambiente que contém seu token do hub como HF_TOKEN" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Importe módulos necessários\n", "from transformers import AutoModelForCausalLM, AutoTokenizer\n", "from datasets import load_dataset\n", "from trl import SFTConfig, SFTTrainer, setup_chat_format\n", "import torch\n", "\n", "device = (\n", " \"cuda\"\n", " if torch.cuda.is_available()\n", " else \"mps\" if torch.backends.mps.is_available() else \"cpu\"\n", ")\n", "\n", "# Carregue o modelo e o tokenizador\n", "model_name = \"HuggingFaceTB/SmolLM2-135M\"\n", "model = AutoModelForCausalLM.from_pretrained(\n", " pretrained_model_name_or_path=model_name\n", ").to(device)\n", "tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path=model_name)\n", "\n", "# Configure o formato de bate-papo\n", "model, tokenizer = setup_chat_format(model=model, tokenizer=tokenizer)\n", "\n", "# Defina nosso nome para o ajuste fino a ser salvo e/ou carregado em um local\n", "finetune_name = \"SmolLM2-FT-MyDataset\"\n", "finetune_tags = [\"smol-course\", \"module_1\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Gerar com o modelo base\n", "\n", "Aqui vamos experimentar o modelo base que não tem um modelo de bate-papo. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Vamos testar o modelo base antes do treinamento\n", "prompt = \"Write a haiku about programming\"\n", "\n", "# Formato com o modelo de bate-papo\n", "messages = [{\"role\": \"user\", \"content\": prompt}]\n", "formatted_prompt = tokenizer.apply_chat_template(messages, tokenize=False)\n", "\n", "# Gerando a resposta\n", "inputs = tokenizer(formatted_prompt, return_tensors=\"pt\").to(device)\n", "outputs = model.generate(**inputs, max_new_tokens=100)\n", "print(\"Before training:\")\n", "print(tokenizer.decode(outputs[0], skip_special_tokens=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Preparação do Conjunto de Dados\n", "\n", "Carregaremos um conjunto de dados de amostra e o formataremos para treinamento. O conjunto de dados deve ser estruturado com pares de input-output, em que cada input é um prompt e o output é a resposta esperada do modelo.\n", "\n", "**TRL formatará as mensagens de entrada com base nos modelos de bate-papo.** Elas precisam ser representadas como uma lista de dicionários com as chaves: `role` e `content`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Carregue um conjunto de dados de amostra\n", "from datasets import load_dataset\n", "\n", "# TODO: Defina seu próprio conjunto de dados e configurações usando os parâmetros do caminho e do nome\n", "ds = load_dataset(path=\"HuggingFaceTB/smoltalk\", name=\"everyday-conversations\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# TODO: 🦁 Se o seu conjunto de dados não estiver em um formato que o TRL possa converter para o modelo de chat, você precisará processá-lo. Consulte o [módulo](../chat_templates.md)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Configuração do SFTTrainer\n", "\n", "O `SFTTrainer` é configurado com vários parâmetros que controlam o processo de treinamento. Eles incluem o número de etapas de treinamento, o tamanho do lote, a taxa de aprendizado e a estratégia de avaliação. Ajuste esses parâmetros com base em seus requisitos específicos e recursos computacionais." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Configure o SFTTrainer\n", "sft_config = SFTConfig(\n", " output_dir=\"./sft_output\",\n", " max_steps=1000, # Adjust based on dataset size and desired training duration\n", " per_device_train_batch_size=4, # Set according to your GPU memory capacity\n", " learning_rate=5e-5, # Common starting point for fine-tuning\n", " logging_steps=10, # Frequency of logging training metrics\n", " save_steps=100, # Frequency of saving model checkpoints\n", " evaluation_strategy=\"steps\", # Evaluate the model at regular intervals\n", " eval_steps=50, # Frequency of evaluation\n", " use_mps_device=(\n", " True if device == \"mps\" else False\n", " ), # Use MPS for mixed precision training\n", " hub_model_id=finetune_name, # Set a unique name for your model\n", ")\n", "\n", "# Inicie o SFTTrainer\n", "trainer = SFTTrainer(\n", " model=model,\n", " args=sft_config,\n", " train_dataset=ds[\"train\"],\n", " tokenizer=tokenizer,\n", " eval_dataset=ds[\"test\"],\n", ")\n", "\n", "# TODO: 🦁 🐕 alinhe os parâmetros do SFTTrainer com o conjunto de dados escolhido. Por exemplo, se estiver usando o conjunto de dados `bigcode/the-stack-smol`, será necessário escolher a coluna `content`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Treinando o modelo\n", "\n", "Com o trainer configurado, podemos prosseguir com o treinamento do modelo. O processo de treinamento envolverá a iteração do conjunto de dados, o cálculo da perda e a atualização dos parâmetros do modelo para minimizar essa perda." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Treine o modelo\n", "trainer.train()\n", "\n", "# Salve o model\n", "trainer.save_model(f\"./{finetune_name}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "trainer.push_to_hub(tags=finetune_tags)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<div style='background-color: lightblue; padding: 10px; border-radius: 5px; margin-bottom: 20px; color:black'>\n", " <h2 style='margin: 0;color:blue'>Exercício bônus: Gerar com o modelo ajustado</h2>\n", " <p>🐕 Use o ajuste fino para modelar e gerar uma resposta, assim como no exemplo básico.</p>\n", "</div>" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Teste o modelo ajustado no mesmo prompt\n", "\n", "# Vamos testar o modelo básico antes do treinamento\n", "prompt = \"Write a haiku about programming\"\n", "\n", "# Formatar com o modelo\n", "messages = [{\"role\": \"user\", \"content\": prompt}]\n", "formatted_prompt = tokenizer.apply_chat_template(messages, tokenize=False)\n", "\n", "# Gerar resposta\n", "inputs = tokenizer(formatted_prompt, return_tensors=\"pt\").to(device)\n", "\n", "# TODO: use o ajuste fino para modelar e gerar uma resposta, assim como no exemplo básico." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 💐 Você conseguiu!\n", "\n", "Este caderno fornece um guia passo-a-passo para o ajuste fino do modelo `HuggingFaceTB/SmolLM2-135M` usando o `SFTTrainer`. Seguindo essas etapas, você pode adaptar o modelo para executar tarefas específicas com mais eficiência. Se quiser continuar trabalhando neste curso, aqui estão as etapas que você pode experimentar:\n", "\n", "- Experimente este caderno com uma dificuldade maior\n", "- Revisar o PR de um colega\n", "- Melhorar o material do curso por meio de uma Issue ou PR." ] } ], "metadata": { "kernelspec": { "display_name": "py310", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.15" } }, "nbformat": 4, "nbformat_minor": 2 }