diff --git a/es/5_vision_language_models/README.md b/es/5_vision_language_models/README.md new file mode 100644 index 00000000..7c57337c --- /dev/null +++ b/es/5_vision_language_models/README.md @@ -0,0 +1,38 @@ +# Modelos de Visión-Lenguaje + +## 1. Uso de VLM + +Los Modelos de Visión-Lenguaje (VLMs por sus siglas en inglés) procesan imágenes y texto de manera simultánea para realizar tareas como la generación de descripciones de imágenes, la respuesta a preguntas visuales y el razonamiento multimodal. + +Una arquitectura típica de VLM incluye un codificador de imágenes para extraer características visuales, una capa de proyección para alinear las representaciones visuales y textuales, y un modelo de lenguaje para procesar o generar texto. Esto permite al modelo establecer conexiones entre elementos visuales y conceptos lingüísticos. + +Los VLMs pueden configurarse según el caso de uso. Los modelos base manejan tareas generales de visión-lenguaje, mientras que las variantes optimizadas para chat permiten interacciones conversacionales. Algunos modelos incluyen componentes adicionales para fundamentar predicciones en evidencia visual o especializarse en tareas específicas, como la detección de objetos. + +Para más detalles sobre el uso y las técnicas de VLMs, consulta la página [Uso de VLM](./vlm_usage.md). + +## 2. Fine-tuning de VLM + +El fine-tuning de un VLM consiste en adaptar un modelo previamente entrenado para realizar tareas específicas o mejorar su desempeño en un conjunto de datos determinado. Este proceso puede seguir metodologías como el fine-tuning supervisado, la optimización por preferencias o un enfoque híbrido que combine ambos, como se introduce en los Módulos 1 y 2. + +Aunque las herramientas y técnicas principales son similares a las utilizadas en los LLMs, el fine-tuning de VLMs requiere un enfoque adicional en la representación y preparación de datos de imágenes. Esto garantiza que el modelo integre y procese de manera efectiva tanto los datos visuales como los textuales para un rendimiento óptimo. Dado que el modelo de demostración, SmolVLM, es significativamente más grande que el modelo de lenguaje utilizado en el módulo anterior, es fundamental explorar métodos para un fine-tuning eficiente. Técnicas como la cuantización y PEFT pueden hacer que el proceso sea más accesible y rentable, permitiendo que más usuarios experimenten con el modelo. + +Para obtener una guía detallada sobre el fine-tuning de VLMs, visita la página [fine-tuning de VLM](./vlm_finetuning.md). + +## Cuadernos de ejercicios + +| Título | Descripción | Ejercicio | Enlace | Colab | +|--------|-------------|-----------|--------|-------| +| Uso de VLM | Aprende a cargar y usar un VLM preentrenado para diversas tareas | 🐢 Procesar una imagen
🐕 Procesar múltiples imágenes con manejo por lotes
🦁 Procesar un video completo | [Notebook](./notebooks/vlm_usage_sample.ipynb) | Abrir en Colab | +| fine-tuning de VLM | Aprende a ajustar un VLM preentrenado para conjuntos de datos específicos | 🐢 Usar un conjunto de datos básico para fine-tuning
🐕 Probar un nuevo conjunto de datos
🦁 Experimentar con métodos alternativos de fine-tuning | [Notebook](./notebooks/vlm_sft_sample.ipynb) | Abrir en Colab | + +## Referencias + +- [Hugging Face Learn: fine-tuning supervisado de VLMs](https://huggingface.co/learn/cookbook/fine_tuning_vlm_trl) +- [Hugging Face Learn: fine-tuning supervisado de SmolVLM](https://huggingface.co/learn/cookbook/fine_tuning_smol_vlm_sft_trl) +- [Hugging Face Learn: Optimización de preferencias para el fine-tuning de SmolVLM](https://huggingface.co/learn/cookbook/fine_tuning_vlm_dpo_smolvlm_instruct) +- [Hugging Face Blog: Optimización de preferencias para VLMs](https://huggingface.co/blog/dpo_vlm) +- [Hugging Face Blog: Modelos de Visión y Lenguaje](https://huggingface.co/blog/vlms) +- [Hugging Face Blog: SmolVLM](https://huggingface.co/blog/smolvlm) +- [Hugging Face Model: SmolVLM-Instruct](https://huggingface.co/HuggingFaceTB/SmolVLM-Instruct) +- [CLIP: Learning Transferable Visual Models from Natural Language Supervision](https://arxiv.org/abs/2103.00020) +- [Align Before Fuse: Vision and Language Representation Learning with Momentum Distillation](https://arxiv.org/abs/2107.07651) diff --git a/es/5_vision_language_models/images/VLM_Architecture.png b/es/5_vision_language_models/images/VLM_Architecture.png new file mode 100644 index 00000000..7b817084 Binary files /dev/null and b/es/5_vision_language_models/images/VLM_Architecture.png differ diff --git a/es/5_vision_language_models/images/VLM_Process.png b/es/5_vision_language_models/images/VLM_Process.png new file mode 100644 index 00000000..1f2beae7 Binary files /dev/null and b/es/5_vision_language_models/images/VLM_Process.png differ diff --git a/es/5_vision_language_models/images/VLM_Usage.png b/es/5_vision_language_models/images/VLM_Usage.png new file mode 100644 index 00000000..d25e04fd Binary files /dev/null and b/es/5_vision_language_models/images/VLM_Usage.png differ diff --git a/es/5_vision_language_models/notebooks/vlm_sft_sample.ipynb b/es/5_vision_language_models/notebooks/vlm_sft_sample.ipynb new file mode 100644 index 00000000..ffff5171 --- /dev/null +++ b/es/5_vision_language_models/notebooks/vlm_sft_sample.ipynb @@ -0,0 +1,464 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fine-Tuning de un VLM \n", + "\n", + "Este notebook demuestra cómo realizar fine-tuning del modelo `HuggingFaceTB/SmolVLM-Instruct` utilizando `SFTTrainer` de la biblioteca `trl`. Las celdas del notebook ejecutarán el proceso de fine-tuning del modelo. Puedes seleccionar el nivel de dificultad probando diferentes conjuntos de datos. \n", + "\n", + "
\n", + "

Ejercicio: Fine-Tuning de SmolVLM con SFTTrainer

\n", + "

Elige un conjunto de datos del Hugging Face Hub y realiza fine-tuning de un modelo con él.

\n", + "

Niveles de Dificultad

\n", + "

🐢 Usa el conjunto de datos `HuggingFaceM4/ChartQA` para entrenar con SFT.

\n", + "

🐕 Usa el modelo ajustado para generar una respuesta y mejora el ejemplo base.

\n", + "

🦁 Prueba otros conjuntos de datos y muestra mejoras.

\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Instalar los requisitos en Google Colab\n", + "# !pip install transformers datasets trl huggingface_hub\n", + "\n", + "# Autenticarse en Hugging Face\n", + "from huggingface_hub import login\n", + "login()\n", + "\n", + "# Para mayor comodidad, puedes crear una variable de entorno que contenga tu token del hub como HF_TOKEN" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Importart las librerías necesarias\n", + "\n", + "import torch\n", + "import os\n", + "from transformers import AutoProcessor, AutoModelForVision2Seq, BitsAndBytesConfig\n", + "from transformers.image_utils import load_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "`low_cpu_mem_usage` was None, now default to True since model is quantized.\n", + "You shouldn't move a model that is dispatched using accelerate hooks.\n", + "Some kwargs in processor config are unused and will not have any effect: image_seq_len. \n" + ] + } + ], + "source": [ + "device = (\n", + " \"cuda\"\n", + " if torch.cuda.is_available()\n", + " else \"mps\" if torch.backends.mps.is_available() else \"cpu\"\n", + ")\n", + "\n", + "quantization_config = BitsAndBytesConfig(load_in_4bit=True, \n", + " bnb_4bit_use_double_quant=True, \n", + " bnb_4bit_quant_type=\"nf4\", \n", + " bnb_4bit_compute_dtype=torch.bfloat16)\n", + "model_name = \"HuggingFaceTB/SmolVLM-Instruct\"\n", + "model = AutoModelForVision2Seq.from_pretrained(\n", + " model_name,\n", + " quantization_config=quantization_config,\n", + " torch_dtype=torch.bfloat16,\n", + ").to(device)\n", + "processor = AutoProcessor.from_pretrained(\"HuggingFaceTB/SmolVLM-Instruct\")\n", + "\n", + "# Establecer el nombre para guardar y/o subir el modelo ajustado\n", + "finetune_name = \"SmolVLM-FT-MyDataset\"\n", + "finetune_tags = [\"smol-course\", \"module_5\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparación del Conjunto de Datos \n", + "\n", + "Cargaremos un conjunto de datos de ejemplo y lo formatearemos para el entrenamiento. El conjunto de datos debe estar estructurado con pares de entrada-salida, donde cada entrada es un prompt y la salida es la respuesta esperada del modelo. \n", + "\n", + "**TRL formateará los mensajes de entrada según las plantillas de chat del modelo.** Deben representarse como una lista de diccionarios con las claves: `role` y `content`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DatasetDict({\n", + " train: Dataset({\n", + " features: ['image', 'query', 'label', 'human_or_machine'],\n", + " num_rows: 28299\n", + " })\n", + " val: Dataset({\n", + " features: ['image', 'query', 'label', 'human_or_machine'],\n", + " num_rows: 1920\n", + " })\n", + " test: Dataset({\n", + " features: ['image', 'query', 'label', 'human_or_machine'],\n", + " num_rows: 2500\n", + " })\n", + "})" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Cargar un conjunto de datos de ejemplo\n", + "from datasets import load_dataset\n", + "\n", + "# TODO: define tu conjunto de datos y configuración usando los parámetros path y name\n", + "dataset_name = \"HuggingFaceM4/ChartQA\"\n", + "ds = load_dataset(path=dataset_name)\n", + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'image': , 'query': 'What is the sum favourable value in the year 2014 and 2015?', 'label': ['95'], 'human_or_machine': 0, 'image_size': ((314, 281),)}\n", + "Query: What is the sum favourable value in the year 2014 and 2015?\n", + "Expected Answer: 95\n", + "Model Prediction: User:What is the sum favourable value in the year 2014 and 2015?\n", + "Answer: 91.\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "sample = ds['train'][3]\n", + "\n", + "# Mostrar la estructura de una muestra individual\n", + "sample['image_size'] = sample['image'].size,\n", + "\n", + "# Visualizar la imagen y los metadatos relacionados\n", + "plt.imshow(sample['image'])\n", + "plt.axis(\"off\")\n", + "plt.title(\"Imagen de Gráfico de Ejemplo\")\n", + "plt.show()\n", + "\n", + "print(sample)\n", + "\n", + "# Preprocesar la muestra\n", + "prompt = [{\"role\": \"user\", \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": sample[\"query\"]}]}]\n", + "formatted_query = processor.apply_chat_template(prompt, tokenize=False)\n", + "\n", + "inputs = processor(\n", + " images=sample[\"image\"], \n", + " text=formatted_query, \n", + " return_tensors=\"pt\"\n", + ").to(device)\n", + "inputs = {key: val.to(device, dtype=torch.bfloat16) if val.dtype == torch.float else val.to(device) for key, val in inputs.items()}\n", + "\n", + "# Generar predicciones\n", + "with torch.no_grad():\n", + " outputs = model.generate(**inputs,\n", + " max_length=1600)\n", + "\n", + "# Decodificar la predicción\n", + "prediction = processor.batch_decode(outputs, skip_special_tokens=True)\n", + "\n", + "# Mostrar el resultado\n", + "print(f\"Consulta: {sample['query']}\")\n", + "print(f\"Respuesta Esperada: {sample['label'][0]}\")\n", + "print(f\"Predicción del Modelo: {prediction[0]}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Configurar LoRA" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trainable params: 2,568,192 || all params: 2,248,841,072 || trainable%: 0.1142\n" + ] + } + ], + "source": [ + "from peft import LoraConfig, get_peft_model\n", + "\n", + "# Configurar LoRA\n", + "peft_config = LoraConfig(\n", + " lora_alpha=16,\n", + " lora_dropout=0.05,\n", + " r=8,\n", + " bias=\"none\",\n", + " target_modules=[\"q_proj\", \"v_proj\"],\n", + " task_type=\"CAUSAL_LM\",\n", + ")\n", + "\n", + "# Aplicar la adaptación del modelo con PEFT\n", + "peft_model = get_peft_model(model, peft_config)\n", + "\n", + "# Imprimir los parámetros entrenables\n", + "peft_model.print_trainable_parameters()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Configuración del Trainer \n", + "\n", + "El `Trainer` se configura con varios parámetros que controlan el proceso de entrenamiento. Estos incluyen el número de pasos de entrenamiento, el tamaño del lote, la tasa de aprendizaje y la estrategia de evaluación. Ajusta estos parámetros según tus necesidades específicas y los recursos computacionales disponibles. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def collate_fn(examples):\n", + " # Plantilla de mensaje del sistema para el VLM\n", + " system_message = \"\"\"You are a Vision Language Model specialized in interpreting visual data from chart images.\n", + " Your task is to analyze the provided chart image and respond to queries with concise answers, usually a single word, number, or short phrase.\n", + " The charts include a variety of types (e.g., line charts, bar charts) and contain colors, labels, and text.\n", + " Focus on delivering accurate, succinct answers based on the visual information. Avoid additional explanation unless absolutely necessary.\"\"\"\n", + "\n", + " # Inicializar listas para las entradas de texto e imagen\n", + " text_inputs = []\n", + " image_inputs = []\n", + "\n", + " # Procesar todos los ejemplos en un solo bucle\n", + " for example in examples:\n", + " # Formatear la estructura del chat para el procesador\n", + " formatted_example = {\n", + " \"messages\": [\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": [{\"type\": \"text\", \"text\": system_message}],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"image\",\n", + " },\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": example[\"query\"],\n", + " },\n", + " ],\n", + " },\n", + " ]\n", + " }\n", + " # Aplicar la plantilla de chat y eliminar espacios adicionales\n", + " text_inputs.append(processor.apply_chat_template(formatted_example[\"messages\"], tokenize=False).strip())\n", + " \n", + " # Asegurar que las imágenes estén en modo RGB\n", + " image = example[\"image\"]\n", + " if image.mode != 'RGB':\n", + " image = image.convert('RGB')\n", + " image_inputs.append([image])\n", + "\n", + " # Tokenizar los textos y procesar las imágenes\n", + " batch = processor(\n", + " text=text_inputs,\n", + " images=image_inputs,\n", + " return_tensors=\"pt\",\n", + " padding=True\n", + " )\n", + "\n", + " # Clonar los IDs de entrada para usarlos como etiquetas\n", + " labels = batch[\"input_ids\"].clone()\n", + " labels[labels == processor.tokenizer.pad_token_id] = -100 # Enmascarar los tokens de padding en las etiquetas\n", + "\n", + " # Asegurar que image_token se convierta en string si es un AddedToken\n", + " # En algunos procesadores, processor.image_token devuelve una lista para cada imagen.\n", + " # TODO: AutoProcessor.from_pretrained(\"HuggingFaceTB/SmolVLM-Instruct\") ¿solo tiene uno?\n", + " image_token_id = processor.tokenizer.convert_tokens_to_ids(str(processor.image_token))\n", + "\n", + " # Enmascarar los IDs de token de imagen en las etiquetas\n", + " labels[labels == image_token_id] = -100\n", + "\n", + " # Agregar las etiquetas al batch\n", + " batch[\"labels\"] = labels\n", + "\n", + " return batch" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from trl import SFTConfig, SFTTrainer\n", + "\n", + "# Configurar el Trainer\n", + "training_args = SFTConfig(\n", + " output_dir=\"sft_output\", # Directorio para guardar el modelo\n", + " num_train_epochs=3, # Número de épocas de entrenamiento\n", + " per_device_train_batch_size=1, # Tamaño del lote por dispositivo durante el entrenamiento\n", + " gradient_accumulation_steps=16, # Número de pasos antes de realizar una actualización de gradiente\n", + " gradient_checkpointing=True, # Usar gradient checkpointing para ahorrar memoria\n", + " optim=\"adamw_torch_fused\", # Usar el optimizador AdamW fusionado\n", + " logging_steps=5, # Registrar cada 10 pasos\n", + " save_strategy=\"epoch\", # Guardar un checkpoint en cada época\n", + " learning_rate=2e-4, # Tasa de aprendizaje, basada en el artículo de QLoRA\n", + " bf16=True, # Usar precisión bfloat16\n", + " tf32=True, # Usar precisión tf32\n", + " max_grad_norm=0.3, # Máximo gradiente normado basado en el artículo de QLoRA\n", + " warmup_ratio=0.03, # Proporción de calentamiento basada en el artículo de QLoRA\n", + " lr_scheduler_type=\"constant\", # Usar programador de tasa de aprendizaje constante\n", + " push_to_hub=True, # Subir el modelo al Hugging Face Hub\n", + " gradient_checkpointing_kwargs = {\"use_reentrant\": False}, # Usar checkpointing reentrant\n", + " # dataloader_num_workers=16, \n", + " dataset_text_field=\"\", # Se necesita un campo de texto ficticio para el collator\n", + " dataset_kwargs = {\"skip_prepare_dataset\": True}, # Importante para el collator\n", + " remove_unused_columns = False # Necesario, de lo contrario, se eliminarán las características excepto la etiqueta\n", + ")\n", + "\n", + "# Inicializar el Trainer\n", + "trainer = SFTTrainer(\n", + " model=model,\n", + " args=training_args,\n", + " train_dataset=ds[\"train\"],\n", + " eval_dataset=ds[\"test\"],\n", + " data_collator=collate_fn,\n", + " peft_config=peft_config,\n", + " tokenizer=processor.tokenizer,\n", + ")\n", + "\n", + "# TODO: 🦁 🐕 Alinea los parámetros de SFTTrainer con el conjunto de datos elegido. \n", + "# Por ejemplo, si usas el conjunto de datos `bigcode/the-stack-smol`, \n", + "# deberás elegir la columna `content`.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Entrenamiento del Modelo \n", + "\n", + "Con el trainer configurado, ahora podemos proceder a entrenar el modelo. El proceso de entrenamiento implicará iterar sobre el conjunto de datos, calcular la pérdida y actualizar los parámetros del modelo para minimizar esta pérdida. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6b4e2897ddbc47fa90254bcf12ce92f6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/5304 [00:00" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import Image, display\n", + "\n", + "image_url1 = \"https://cdn.pixabay.com/photo/2024/11/20/09/14/christmas-9210799_1280.jpg\"\n", + "display(Image(url=image_url1))\n", + "\n", + "image_url2 = \"https://cdn.pixabay.com/photo/2024/11/23/08/18/christmas-9218404_1280.jpg\"\n", + "display(Image(url=image_url2))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/duydl/Miniconda3/envs/py310/lib/python3.10/site-packages/bitsandbytes/nn/modules.py:451: UserWarning: Input type into Linear4bit is torch.float16, but bnb_4bit_compute_dtype=torch.float32 (default). This will lead to slow inference or training speed.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['User:Can you describe the image?\\nAssistant: The image is a scene of a person walking in a forest. The person is wearing a coat and a cap. The person is holding the hand of another person. The person is walking on a path. The path is covered with dry leaves. The background of the image is a forest with trees.']\n" + ] + } + ], + "source": [ + "# Cargar una imagen\n", + "image1 = load_image(image_url1)\n", + "\n", + "# Crear mensajes de entrada\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"image\"},\n", + " {\"type\": \"text\", \"text\": \"Can you describe the image?\"}\n", + " ]\n", + " },\n", + "]\n", + "\n", + "# Preparar las entradas\n", + "prompt = processor.apply_chat_template(messages, add_generation_prompt=True)\n", + "inputs = processor(text=prompt, images=[image1], return_tensors=\"pt\")\n", + "inputs = inputs.to(device)\n", + "\n", + "# Generar salidas\n", + "generated_ids = model.generate(**inputs, max_new_tokens=500)\n", + "generated_texts = processor.batch_decode(\n", + " generated_ids,\n", + " skip_special_tokens=True,\n", + ")\n", + "\n", + "# Imprimir el texto generado\n", + "print(generated_texts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Comparación de Múltiples Imágenes \n", + "El modelo puede procesar y comparar múltiples imágenes. Determinemos la temática en común de dos imágenes.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['User:What event do they both represent?\\nAssistant: Christmas.']\n" + ] + } + ], + "source": [ + "# Cargar imágenes\n", + "image2 = load_image(image_url2)\n", + "\n", + "# Crear mensajes de entrada\n", + "messages = [\n", + " # {\n", + " # \"role\": \"user\",\n", + " # \"content\": [\n", + " # {\"type\": \"image\"},\n", + " # {\"type\": \"image\"},\n", + " # {\"type\": \"text\", \"text\": \"Can you describe the two images?\"}\n", + " # ]\n", + " # },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"image\"},\n", + " {\"type\": \"image\"},\n", + " {\"type\": \"text\", \"text\": \"What event do they both represent?\"}\n", + " ]\n", + " },\n", + "]\n", + "\n", + "# Preparar las entradas\n", + "prompt = processor.apply_chat_template(messages, add_generation_prompt=True)\n", + "inputs = processor(text=prompt, images=[image1, image2], return_tensors=\"pt\")\n", + "inputs = inputs.to(device)\n", + "\n", + "# Generar salidas\n", + "generated_ids = model.generate(**inputs, max_new_tokens=500)\n", + "generated_texts = processor.batch_decode(\n", + " generated_ids,\n", + " skip_special_tokens=True,\n", + ")\n", + "\n", + "# Imprimir el texto generado\n", + "print(generated_texts)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 🔠 Reconocimiento de Texto (OCR) \n", + "El VLM también puede reconocer e interpretar texto en imágenes, lo que lo hace adecuado para tareas como el análisis de documentos. \n", + "Puedes probar con imágenes que contengan texto más denso." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['User:What is written?\\nAssistant: MERRY CHRISTMAS AND A HAPPY NEW YEAR']\n" + ] + } + ], + "source": [ + "document_image_url = \"https://cdn.pixabay.com/photo/2020/11/30/19/23/christmas-5792015_960_720.png\"\n", + "display(Image(url=document_image_url))\n", + "\n", + "# Cargar la imagen del documento\n", + "document_image = load_image(document_image_url)\n", + "\n", + "# Crear el mensaje de entrada para el análisis\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"image\"},\n", + " {\"type\": \"text\", \"text\": \"What is written?\"}\n", + " ]\n", + " }\n", + "]\n", + "\n", + "# Preparar las entradas\n", + "prompt = processor.apply_chat_template(messages, add_generation_prompt=True)\n", + "inputs = processor(text=prompt, images=[document_image], return_tensors=\"pt\")\n", + "inputs = inputs.to(device)\n", + "\n", + "# Generar salidas\n", + "generated_ids = model.generate(**inputs, max_new_tokens=500)\n", + "generated_texts = processor.batch_decode(\n", + " generated_ids,\n", + " skip_special_tokens=True,\n", + ")\n", + "\n", + "# Imprimir el texto generado\n", + "print(generated_texts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Procesamiento de videos \n", + "\n", + "Los Modelos de Visión-Lenguaje (VLMs) pueden procesar videos de forma indirecta extrayendo fotogramas clave y razonando sobre ellos en orden temporal. Aunque los VLMs no tienen las capacidades de modelado temporal de los modelos de video dedicados, aún pueden: \n", + "\n", + "- Describir acciones o eventos analizando fotogramas muestreados de forma secuencial. \n", + "- Responder preguntas sobre videos basándose en fotogramas representativos. \n", + "- Resumir el contenido de un video combinando descripciones textuales de múltiples fotogramas. \n", + "\n", + "Probemos con un ejemplo: \n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install opencv-python" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import Video\n", + "import cv2\n", + "import numpy as np\n", + "\n", + "def extract_frames(video_path, max_frames=50, target_size=None):\n", + " cap = cv2.VideoCapture(video_path)\n", + " if not cap.isOpened():\n", + " raise ValueError(f\"Could not open video: {video_path}\")\n", + " \n", + " total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))\n", + " frame_indices = np.linspace(0, total_frames - 1, max_frames, dtype=int)\n", + "\n", + " frames = []\n", + " for idx in frame_indices:\n", + " cap.set(cv2.CAP_PROP_POS_FRAMES, idx)\n", + " ret, frame = cap.read()\n", + " if ret:\n", + " frame = PIL.Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))\n", + " if target_size:\n", + " frames.append(resize_and_crop(frame, target_size))\n", + " else:\n", + " frames.append(frame)\n", + " cap.release()\n", + " return frames\n", + "\n", + "def resize_and_crop(image, target_size):\n", + " width, height = image.size\n", + " scale = target_size / min(width, height)\n", + " image = image.resize((int(width * scale), int(height * scale)), PIL.Image.Resampling.LANCZOS)\n", + " left = (image.width - target_size) // 2\n", + " top = (image.height - target_size) // 2\n", + " return image.crop((left, top, left + target_size, top + target_size))\n", + "\n", + "# Link al video\n", + "video_link = \"https://cdn.pixabay.com/video/2023/10/28/186794-879050032_large.mp4\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Response: User: Following are the frames of a video in temporal order.Describe what the woman is doing.\n", + "Assistant: The woman is hanging an ornament on a Christmas tree.\n" + ] + } + ], + "source": [ + "question = \"Describe what the woman is doing.\"\n", + "\n", + "def generate_response(model, processor, frames, question):\n", + "\n", + " image_tokens = [{\"type\": \"image\"} for _ in frames]\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"text\", \"text\": \"Following are the frames of a video in temporal order.\"}, *image_tokens, {\"type\": \"text\", \"text\": question}]\n", + " }\n", + " ]\n", + " inputs = processor(\n", + " text=processor.apply_chat_template(messages, add_generation_prompt=True),\n", + " images=frames,\n", + " return_tensors=\"pt\"\n", + " ).to(model.device)\n", + "\n", + " outputs = model.generate(\n", + " **inputs, max_new_tokens=100, num_beams=5, temperature=0.7, do_sample=True, use_cache=True\n", + " )\n", + " return processor.decode(outputs[0], skip_special_tokens=True)\n", + "\n", + "\n", + "# Extraer fotogramas del video\n", + "frames = extract_frames(video_link, max_frames=15, target_size=384)\n", + "\n", + "processor.image_processor.size = (384, 384)\n", + "processor.image_processor.do_resize = False\n", + "\n", + "# Generar respuesta\n", + "response = generate_response(model, processor, frames, question)\n", + "\n", + "# Mostrar el resultado\n", + "# print(\"Question:\", question)\n", + "print(\"Response:\", response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## VLMs en español\n", + "\n", + "Como pudiste notar, todos los ejemplos en este notebook usaron texto en inglés. Esto es porque el modelo `SmolVLM-Instruct` que usamos fue entrenado solamente en inglés. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 💐 ¡Has Terminado! \n", + "\n", + "Este notebook demostró cómo utilizar un Modelo de Visión-Lenguaje (VLM) y cómo estructurar prompts para tareas multimodales. Siguiendo los pasos descritos aquí, puedes experimentar con los VLMs y sus aplicaciones. \n", + "\n", + "### Próximos Pasos para Explorar: \n", + "- Experimenta con más casos de uso de VLMs. \n", + "- Colabora con un colega revisando sus pull requests (PRs). \n", + "- Contribuye a mejorar este material del curso abriendo un issue o enviando un PR para introducir nuevos casos de uso, ejemplos o conceptos. \n", + "\n", + "¡Feliz exploración! 🌟 " + ] + } + ], + "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.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/es/5_vision_language_models/vlm_finetuning.md b/es/5_vision_language_models/vlm_finetuning.md new file mode 100644 index 00000000..4737dfed --- /dev/null +++ b/es/5_vision_language_models/vlm_finetuning.md @@ -0,0 +1,97 @@ +# Fine-Tuning de Modelos de Visión-Lenguaje + +## Fine-Tuning Eficiente + +### Cuantización +La cuantización reduce la precisión de los pesos y activaciones del modelo, disminuyendo significativamente el uso de memoria y acelerando los cálculos. Por ejemplo, cambiar de `float32` a `bfloat16` reduce a la mitad los requisitos de memoria por parámetro manteniendo el rendimiento. Para una compresión más agresiva, se pueden usar cuantizaciones de 8 bits y 4 bits, reduciendo aún más el uso de memoria, aunque con cierta pérdida de precisión. Estas técnicas pueden aplicarse tanto al modelo como a los ajustes del optimizador, permitiendo entrenamientos eficientes en hardware con recursos limitados. + +### PEFT & LoRA +Como se introdujo en el Módulo 3, LoRA (Low-Rank Adaptation) se enfoca en aprender matrices de descomposición de rango reducido mientras se mantienen congelados los pesos originales del modelo. Esto reduce drásticamente la cantidad de parámetros entrenables, disminuyendo significativamente la cantidad de recursos requeridos. LoRA, cuando se integra con PEFT, permite el fine-tuning de modelos grandes ajustando solo un subconjunto pequeño y entrenable de parámetros. Este enfoque es particularmente efectivo para adaptaciones a tareas específicas, reduciendo miles de millones de parámetros entrenables a solo millones, manteniendo el mismo rendimiento. + +### Optimización del Tamaño del Lote (Batch Size en inglés) +Para optimizar el tamaño del lote en el proceso de fine-tuning, comienza con un valor grande y redúcelo si ocurren errores de memoria (OOM). Compensa aumentando `gradient_accumulation_steps`, lo que mantiene el tamaño total del lote en múltiples actualizaciones. Además, habilita `gradient_checkpointing` para reducir el uso de memoria mediante el recálculo de estados intermedios durante la propogación hacia atrás, intercambiando tiempo de cómputo por menor uso de memoria de activaciones. Estas estrategias maximizan la utilización del hardware y ayudan a superar las restricciones de memoria. + +```python +from transformers import TrainingArguments + +training_args = TrainingArguments( + output_dir="./fine_tuned_model", # Directorio para checkpoints + per_device_train_batch_size=4, # Tamaño del lote por dispositivo (GPU/TPU) + num_train_epochs=3, # Número total de épocas de entrenamiento + learning_rate=5e-5, # Tasa de aprendizaje + save_steps=1000, # Guardar checkpoint cada 1000 pasos + bf16=True, # Usar precisión mixta para el entrenamiento + gradient_checkpointing=True, # Habilitar para reducir el uso de memoria de activaciones + gradient_accumulation_steps=16, # Acumular gradientes en 16 pasos + logging_steps=50 # Registrar métricas cada 50 pasos +) +``` + +## **Supervised Fine-Tuning (SFT)** + +El Supervised Fine-Tuning (SFT) adapta un Modelo de Visión-Lenguaje (VLM) preentrenado a tareas específicas mediante el uso de conjuntos de datos etiquetados que contienen pares de imágenes y texto. Este método mejora la capacidad del modelo para desempeñar funciones específicas en un dominio o tarea, como responder a preguntas visuales, generar descripciones de imágenes o interpretar gráficos. + +### **Descripción General** +SFT es esencial cuando se necesita que un VLM se especialice en un dominio o resuelva problemas específicos donde las capacidades generales del modelo base pueden ser insuficientes. Por ejemplo, si el modelo tiene dificultades con características visuales únicas o terminología especializada, SFT le permite enfocarse en estas áreas mediante el aprendizaje con datos etiquetados. + +Si bien el SFT es altamente efectivo, presenta ciertas limitaciones: +- **Dependencia de Datos**: Se requieren conjuntos de datos etiquetados de alta calidad y adecuados para la tarea. +- **Recursos Computacionales**: El fine-tuning de grandes VLMs consume muchos recursos. +- **Riesgo de Sobreajuste**: Si el fine-tuning es demasiado ajustado a los datos, el modelo puede perder su capacidad de generalización. + +A pesar de estos desafíos, SFT sigue siendo una técnica robusta para mejorar el rendimiento del modelo en contextos específicos. + +### **Uso** +1. **Preparación de Datos**: Comienza con un conjunto de datos etiquetado que relacione imágenes con texto, como preguntas y respuestas. Por ejemplo, en tareas como el análisis de gráficos, el conjunto `HuggingFaceM4/ChartQA` incluye imágenes de gráficos, consultas y respuestas concisas. + +2. **Configuración del Modelo**: Carga un VLM preentrenado adecuado para la tarea, como `HuggingFaceTB/SmolVLM-Instruct`, y un procesador para preparar entradas de texto e imagen. Configura el modelo para aprendizaje supervisado y adáptalo a tu hardware. + +3. **Proceso de Fine-Tuning**: + - **Formateo de Datos**: Estructura el conjunto de datos en un formato de chatbot, emparejando mensajes del sistema, consultas de usuario y respuestas correspondientes. + - **Configuración del Entrenamiento**: Usa herramientas como `TrainingArguments` de Hugging Face o `SFTConfig` de TRL para configurar los parámetros del entrenamiento, como el tamaño del lote, la tasa de aprendizaje y los pasos de acumulación de gradientes. + - **Técnicas de Optimización**: Usa **gradient checkpointing** para ahorrar memoria durante el entrenamiento y emplea modelos cuantizados para reducir los requisitos de memoria y acelerar los cálculos. + - Emplea `SFTTrainer` de la librería TRL para simplificar el proceso de entrenamiento. + +## Optimización por Preferencias + +La Optimización por Preferencias, en particular la Direct Preference Optimization (DPO), entrena un Modelo de Visión-Lenguaje (VLM) para alinearse con las preferencias humanas. En lugar de seguir estrictamente instrucciones predefinidas, el modelo aprende a priorizar resultados que los humanos consideran preferibles. Este enfoque es útil para tareas que requieren juicios creativos, razonamiento matizado o respuestas variadas. + +### **Descripción General** +La Optimización por Preferencias es ideal en escenarios donde las preferencias humanas son clave para el éxito de la tarea. Mediante el fine-tuning en conjuntos de datos que codifican preferencias humanas, DPO mejora la capacidad del modelo para generar respuestas alineadas con las expectativas del usuario. Este método es particularmente efectivo para tareas como escritura creativa, interacciones con clientes o escenarios de opción múltiple. + +Apesar de sus beneficios, este método tiene desafíos: +- **Calidad de Datos**: Se requieren conjuntos de datos anotados con preferencias de alta calidad, lo que puede ser un cuello de botella en la recolección de datos. +- **Complejidad**: El entrenamiento involucra procesos sofisticados como muestreo por pares de preferencias y balanceo de recursos computacionales. + +Los conjuntos de datos de preferencias deben capturar diferencias claras entre respuestas candidatas. Por ejemplo, un dataset puede emparejar una pregunta con dos respuestas: una preferida y otra menos aceptable. El modelo aprende a predecir la respuesta preferida, incluso si no es completamente correcta, siempre que esté mejor alineada con el juicio humano. + +### **Uso** +1. **Preparación del Conjunto de Datos** + Un conjunto de datos etiquetado con preferencias es fundamental para el entrenamiento. Cada ejemplo suele consistir en un prompt (por ejemplo, una imagen y una pregunta) y dos respuestas candidatas: una elegida (preferida) y otra rechazada. Por ejemplo: + + - **Pregunta**: ¿Cuántas familias? + - **Rechazada**: La imagen no proporciona información sobre familias. + - **Preferida**: La imagen muestra una tabla de una Organización Sindical con 18,000 familias. + + El conjunto de datos enseña al modelo a priorizar respuestas mejor alineadas, incluso si no son perfectas. + +2. **Configuración del Modelo** + Carga un VLM preentrenado e intégralo con la biblioteca TRL de Hugging Face, que admite DPO, junto con un procesador para preparar las entradas de texto e imagen. Configura el modelo para aprendizaje supervisado y adáptalo a tu hardware. + +3. **Pipeline de Entrenamiento** + El entrenamiento implica la configuración de parámetros específicos de DPO. Aquí tienes un resumen del proceso: + + - **Formateo del Conjunto de Datos**: Estructura cada muestra con prompts, imágenes y respuestas candidatas. + - **Función de Pérdida**: Usa una función de pérdida basada en preferencias para optimizar el modelo en la selección de la respuesta preferida. + - **Entrenamiento Eficiente**: Combina técnicas como cuantización, acumulación de gradientes y adaptadores LoRA para optimizar el uso de memoria y el cómputo. + + +## Recursos + +- [Hugging Face Learn: Supervised Fine-Tuning VLMs](https://huggingface.co/learn/cookbook/fine_tuning_vlm_trl) +- [Hugging Face Learn: Supervised Fine-Tuning SmolVLM](https://huggingface.co/learn/cookbook/fine_tuning_smol_vlm_sft_trl) +- [Hugging Face Blog: Preference Optimization for VLMs](https://huggingface.co/blog/dpo_vlm) + +## Próximos Pasos + +⏩ Prueba el [vlm_finetune_sample.ipynb](./notebooks/vlm_finetune_sample.ipynb) para implementar este enfoque de alineación de preferencias. diff --git a/es/5_vision_language_models/vlm_usage.md b/es/5_vision_language_models/vlm_usage.md new file mode 100644 index 00000000..08b42517 --- /dev/null +++ b/es/5_vision_language_models/vlm_usage.md @@ -0,0 +1,76 @@ +# Modelos de Visión-Lenguaje + +Los Modelos de Visión-Lenguaje (VLMs) cierran la brecha entre imágenes y texto, permitiendo tareas avanzadas como generar descripciones de imágenes, responder preguntas basadas en elementos visuales o comprender la relación entre datos textuales y visuales. Su arquitectura está diseñada para procesar ambas modalidades de manera integrada. + +### Arquitectura + +Los VLMs combinan componentes de procesamiento de imágenes con modelos de generación de texto para lograr una comprensión unificada. Los elementos principales de su arquitectura son: + +![Arquitectura de VLM](./images/VLM_Architecture.png) + +- **Codificador de Imágenes**: Transforma imágenes en representaciones numéricas compactas. Se utilizan comúnmente codificadores preentrenados como CLIP o vision transformers (ViT). +- **Proyector de Embeddings**: Mapea características de imagen a un espacio compatible con embeddings textuales, utilizando capas densas o transformaciones lineales. +- **Decodificador de Texto**: Actúa como el componente de generación de lenguaje, traduciendo información multimodal en texto coherente. Ejemplos incluyen modelos generativos como Llama o Vicuna. +- **Proyector Multimodal**: Proporciona una capa adicional para combinar representaciones de imagen y texto. Es fundamental para modelos como LLaVA en la creación de conexiones más sólidas entre ambas modalidades. + +La mayoría de los VLMs aprovechan codificadores de imagen y decodificadores de texto preentrenados, alineándolos mediante fine-tuning en conjuntos de datos de pares imagen-texto. Este enfoque optimiza el entrenamiento y permite que los modelos generalicen de manera efectiva. + +### Uso + +![Proceso de VLM](./images/VLM_Process.png) + +Los VLMs se aplican a una variedad de tareas multimodales. Su adaptabilidad les permite desempeñarse en distintos campos con diferentes niveles de fine-tuning: + +- **Generación de Descripciones de Imágenes**: Creación de textos descriptivos a partir de imágenes. +- **Respuesta a Preguntas Visuales (VQA por sus siglas en inglés)**: Responder preguntas sobre el contenido de una imagen. +- **Recuperación Cruzada de Modalidades**: Encontrar texto correspondiente a una imagen o viceversa. +- **Aplicaciones Creativas**: Asistencia en diseño, generación artística o creación de contenido multimedia interactivo. + +![Uso de VLM](./images/VLM_Usage.png) + +El entrenamiento y fine-tuning de VLMs depende de la disponibilidad conjuntos de datos de alta calidad que vinculen imágenes con anotaciones textuales. Herramientas como la librería `transformers` de Hugging Face facilitan el acceso a VLMs preentrenados y proporcionan flujos de trabajo optimizados para fine-tuning personalizado. + +### Formato de Chat + +Muchos VLMs están estructurados para interactuar de manera conversacional, mejorando la experiencia del usuario. Este formato incluye: + +- Un **mensaje del sistema** que define el rol o contexto del modelo, como "Eres un asistente que analiza datos visuales". +- **Consultas del usuario** que combinan entradas textuales con imágenes asociadas. +- **Respuestas del asistente** que proporcionan salidas textuales derivadas del análisis multimodal. + +Este esquema conversacional es intuitivo y se alinea con las expectativas de los usuarios, especialmente en aplicaciones interactivas como servicio al cliente o herramientas educativas. + +Aquí tienes un ejemplo de cómo se estructura una entrada formateada: + +```json +[ + { + "role": "system", + "content": [{"type": "text", "text": "Eres un Modelo de Visión-Lenguaje especializado en interpretar datos visuales de gráficos..."}] + }, + { + "role": "user", + "content": [ + {"type": "image", "image": ""}, + {"type": "text", "text": "¿Cuál es el valor más alto en el gráfico de barras?"} + ] + }, + { + "role": "assistant", + "content": [{"type": "text", "text": "42"}] + } +] +``` + +**Trabajo con Múltiples Imágenes y Videos** + +Los VLMs también pueden procesar múltiples imágenes o incluso videos adaptando la estructura de entrada para manejar entradas visuales secuenciales o en paralelo. Para videos, se pueden extraer cuadros y procesarlos como imágenes individuales, manteniendo el orden temporal. + +## Recursos + +- [Hugging Face Blog: Modelos de Visión-Lenguaje](https://huggingface.co/blog/vlms) +- [Hugging Face Blog: SmolVLM](https://huggingface.co/blog/smolvlm) + +## Próximos Pasos + +⏩ Prueba el [vlm_usage_sample.ipynb](./notebooks/vlm_usage_sample.ipynb) para experimentar con diferentes usos de SMOLVLM.