Avances del Proyecto Open R1: Réplica de DeepSeek-R1

Después del lanzamiento de DeepSeek-R1, iniciamos el proyecto open-r1 hace una semana para replicar su flujo de entrenamiento y datos sintéticos. Esta actualización cubre:

  • Progreso en la imitación del flujo y datos de DeepSeek-R1
  • Comprensiones y discusiones sobre DeepSeek-R1
  • Proyectos interesantes de la comunidad tras el lanzamiento

Progreso después de una semana

Evaluación

Para replicar los resultados, primero verificamos si podíamos reproducir las métricas de DeepSeek. Evaluamos en el benchmark MATH-500:

Modelo MATH-500 (Nuestro test) MATH-500 (Publicado por DeepSeek)
DeepSeek-R1-Distill-Qwen-1.5B 81.6 83.9
DeepSeek-R1-Distill-Qwen-7B 91.8 92.8
DeepSeek-R1-Distill-Qwen-14B 94.2 93.9
DeepSeek-R1-Distill-Qwen-32B 95.0 94.3
DeepSeek-R1-Distill-Llama-8B 85.8 89.1
DeepSeek-R1-Distill-Llama-70B 93.4 94.5

Las respuestas generadas por DeepSeek-R1 tienden a ser muy extensas. En el conjunto OpenThoughts, las respuestas promedian 6000 tokens, con algunas excediendo 20000 tokens. Esta longitud desafía el entrenamiento con GRPO, ya que requiere significativa memoria GPU para gradientes y activaciones.

Establecemos un tablero de evaluación público para el seguimiento continuo.

Flujo de Entrenamiento

GRPO (Optimización de Política Relativa Grupal) se integró en TRL v0.14. Esto permite entrenar cualquier modelo con funciones de recompensa personalizadas, combinado con DeepSpeed ZeRO para entrenamiento multi-GPU y vLLM para generación acelerada.


from datasets import load_dataset
from trl import GRPOConfig, GRPOTrainer

training_data = load_dataset("trl-lib/tldr", split="train")

def calculate_reward(responses, **params):
    target_length = 20
    scores = []
    for resp in responses:
        length_diff = abs(target_length - len(resp))
        scores.append(-length_diff)
    return scores

config = GRPOConfig(
    output_dir="custom-optimized-model",
    logging_steps=10
)

trainer = GRPOTrainer(
    model="Qwen/Qwen2-0.5B-Instruct",
    reward_funcs=calculate_reward,
    args=config,
    train_dataset=training_data,
)

trainer.start_training()

La utilización de memoria siguee siendo un área de optimización activa.

Generación de Datos Sintéticos

El método de DeepSeek para generar datos de razonamiento sintéticos mediante modelos grandes y luego destilarlos en modelos pequeños es particularmente prometedor. Nuestros esfuerzos iniciales usaron dos nodos 8xH100 con vLLM, pero enfrentamos cuellos de botella en el caché KV, limitando a 8 solicitudes concurrentes.

Expandimos a 4 nodos (32 GPUs totales), permitiendo 32 solicitudes simultáneas. Optimizamos de procesamiento por lotes a streaming para mejorar la utilización de GPU:


pending_tasks = set()

for input_item in dataset:
    while len(pending_tasks) >= 500:
        completed, pending_tasks = await asyncio.wait(
            pending_tasks,
            return_when=asyncio.FIRST_COMPLETED
        )
    
    new_task = asyncio.create_task(process_request(input_item))
    pending_tasks.add(new_task)

if pending_tasks:
    await asyncio.gather(*pending_tasks)

El código original para procesamiento por lotes:


for batch_chunk in chunk_dataset(dataset, size=500):
    batch_tasks = []
    for item in batch_chunk:
        task = asyncio.create_task(process_request(item))
        batch_tasks.append(task)
    if batch_tasks:
        await asyncio.gather(*batch_tasks)

Estamos explorando estrategias adicionales como el caché en CPU para manejar interrupciones de solicitudes largas.

Perspectivas sobre DeepSeek-R1

Reacciones del Sector

El impacto en los mercados y la industria fue notable:

  • Reacciones variadas en mercados bursátiles tras el anuncio
  • Declaraciones de líderes como Sam Altman y Dario Amodei
  • Integración rápida por parte de empresas como Dell, AWS y plataformas de IA especializadas

Costos de Entrenamiento

Los analizados y profesionales como Tom Goldstein y Reiner Pope han proporcionado estimaciones sobre los costos de entrenamiento de DeepSeek V3, generando discusión sobre la eficiencia lograda.

Desarrollos de la Comunidad

Proyectos Destacados

  • TinyZero: Experimento de bajo costo para replicar comportameintos emergentes con modelos de 3B parámetros
  • Mini-R1: Tutorial para reproducir dinámicas de aprendizaje básico
  • Open-R1 Multimodal: Extensión hacia capacidades multimodales
  • Extrracción de Información: Adaptaciones para tareas específicas como extracción de diagramas

Conjuntos de Datos

La comunidad ha creado múltiples datasets derivados:

  • OpenThoughts-114k: 114k ejemplos de razonamiento sintético diverso
  • Sky-T1_data_17k: Dataset para entrenamiento de bajo costo
  • R1-Distill-SFT: Datos para fine-tuning especializado

Se anticipan más contribuciones a medida que la comunidad experimenta con diferentes técnicas de generación y destilación.

Etiquetas: GRPO TRL vLLM entrenamiento refuerzo modelos destilados

Publicado el 7-11 13:17