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.