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.