Saltar al contenido
← lab
post-mortemholds-upgpuinfrafine-tuning

US$ 1,85 y 832 steps perdidos por un pod eviction

Un fine-tuning en una A100 alquilada murió en el step 832 por un pod eviction. /workspace es efímero, nohup no sobrevive a la desconexión SSH y pkill -9 python tumba más que tu entrenamiento.

El entrenamiento iba en el step 832 de 1500. El checkpoint del step 500 estaba en /workspace/output. El host reclamó el pod. Todo lo que había en esa máquina desapareció: el checkpoint, el entrenamiento parcial, US$ 1,85. Lo rehice desde cero.

Tres supuestos equivocados.

/workspace no es almacenamiento

En un pool de GPU SECURE, /workspace es efímero. Ni siquiera declarar volume_in_gb en el spec del pod te protege. El host puede reclamar el nodo y llevarse el volumen con él. El checkpoint del step 500 no era un backup. Era un archivo en el disco de otro.

El arreglo: un loop de scp local corriendo en paralelo con el entrenamiento. Cada 60 segundos consulta el directorio de salida remoto y copia cualquier .safetensors nuevo que no haya visto. Usa --save_every_n_steps 250 en vez del valor por defecto de 500. En el peor caso, un eviction te cuesta una ventana de checkpoint. La conexión de scp necesita -o ConnectTimeout=30 -o ServerAliveInterval=15, o se cae en silencio cuando el remoto está inactivo.

nohup no sobrevive al shell

nohup ... &; disown no mantiene vivo el proceso cuando la sesión SSH se cierra en la imagen ComfyUI de RunPod. El proceso muere con el shell.

setsid crea una sesión nueva, totalmente desacoplada de la terminal:

setsid bash -c "sleep 6000 && pkill -9 -f flux_train_network" \
    < /dev/null > /dev/null 2>&1 &

El entrenamiento sobrevive a la muerte del shell. El timer del watchdog se dispara a su hora, siga abierta la conexión o no.

pkill -9 python mata más que tu entrenamiento

En esa imagen, sshd es un wrapper en Python. pkill -9 python también lo tumba, globalmente, y la conexión se cae a mitad del entrenamiento. Mata los scripts por su nombre específico con pkill -f <script_name>, nunca por runtime.

Lección

La infraestructura alquilada es efímera por defecto. Diseña el entrenamiento para sobrevivir a que la máquina desaparezca, no para suponer que sigue en pie.