imagenes - Entrenamiento de detección de objetos Tensorflow asesinado, inanición de recursos?
tensorflow reconocimiento de imagenes (3)
Esta pregunta se ha hecho parcialmente aquí y aquí sin seguimientos, así que tal vez este no sea el lugar para hacer esta pregunta, pero he descubierto un poco más de información que espero que pueda obtener una respuesta a estas preguntas.
He estado intentando entrenar object_detection en mi propia biblioteca de aproximadamente 1k fotos. He estado usando el archivo de configuración de canal proporcionado "ssd_inception_v2_pets.config". Y creo los datos de entrenamiento correctamente, creo. El programa parece comenzar a entrenar muy bien. Cuando no pudo leer los datos, alertó con un error y lo solucioné.
Mi configuración de train_config es la siguiente, aunque he cambiado algunos de los números para intentar que se ejecute con menos recursos.
train_config: {
batch_size: 1000 #also tried 1, 10, and 100
optimizer {
rms_prop_optimizer: {
learning_rate: {
exponential_decay_learning_rate {
initial_learning_rate: 0.04 # also tried .004
decay_steps: 800 # also tried 800720. 80072
decay_factor: 0.95
}
}
momentum_optimizer_value: 0.9
decay: 0.9
epsilon: 1.0
}
}
fine_tune_checkpoint: "~/Downloads/ssd_inception_v2_coco_11_06_2017/model.ckpt" #using inception checkpoint
from_detection_checkpoint: true
data_augmentation_options {
random_horizontal_flip {
}
}
data_augmentation_options {
ssd_random_crop {
}
}
}
Básicamente, lo que creo que está sucediendo es que la computadora se está quedando sin recursos muy rápidamente, y me pregunto si alguien tiene una optimización que toma más tiempo construir, pero usa menos recursos.
O me equivoco acerca de por qué el proceso está siendo asesinado, y ¿hay alguna manera de obtener más información sobre eso del kernel?
Esta es la información Dmesg que recibo después de que el proceso se mata.
[711708.975215] Out of memory: Kill process 22087 (python) score 517 or sacrifice child
[711708.975221] Killed process 22087 (python) total-vm:9086536kB, anon-rss:6114136kB, file-rss:24kB, shmem-rss:0kB
Muy bien, así que después de investigarlo y probar algunas cosas, el problema terminó en la información de Dmesg que publiqué.
La capacitación requería más de los 8 GB de memoria que tenía, así que la solución terminó usando el espacio de intercambio para aumentar la cantidad de memoria que el modelo tuvo que extraer.
Me encontré con el mismo problema que tú. En realidad, el uso pleno de la memoria es causado por las data_augmentation_options ssd_random_crop
, por lo que puede eliminar esta opción y establecer el tamaño del lote en 8 o menos, es decir, 2,4. Cuando configuré el tamaño de lote en 1, también encontré algunos problemas causados por la pérdida de nan.
Otra cosa es que el parámetro epsilon debe ser un número muy pequeño, como 1e -6 de acuerdo con el libro de "aprendizaje profundo". Como épsilon se usa para evitar un denominador cero, pero el valor predeterminado aquí es 1, no creo que sea correcto establecerlo en 1.
Este es un problema que enfrentan muchas personas . Hay múltiples soluciones propuestas:
- disminuir el tamaño del lote, no siempre relevante, especialmente si entrenas en una GPU (que deberías)
- Aumente su memoria, agregando más o usando el intercambio, como sugirió. Sin embargo, si utiliza la nota de intercambio, es ~ 10-100x más lenta que la RAM, por lo que todo podría llevar mucho más tiempo
- Lo mejor: disminuir el tamaño de las colas : se observó que, por lo general, este problema no está directamente relacionado con el modelo, sino con la configuración. El tamaño de cola predeterminado es un poco demasiado grande, ya que los modelos son computacionalmente pesados y no procesan ejemplos a gran velocidad.
Creo que la tercera solución es la mejor para usted, ya que se está quedando sin memoria de la CPU (RAM). Y no ralentiza el entrenamiento ni afecta tu modelo.
Para citar el problema, con mis comentarios:
La sección en tu nueva configuración se verá así:
train_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/pet_train.record" } label_map_path: "PATH_TO_BE_CONFIGURED/pet_label_map.pbtxt" queue_capacity: 500 # change this number min_after_dequeue: 250 # change this number (strictly less than the above) }
También puede configurar estos para eval_input_reader
. Para este uso estoy usando 20, 10
y para el train
uso 400, 200
, aunque creo que podría ir más bajo. Mi entrenamiento requiere menos de 8 Gb de RAM.