Descripción del problema:
se produce un error al usar yolov5 para entrenar el conjunto de datos que hice.
Fondo:
el conjunto de datos es un conjunto de datos en formato yolo creado por mí. La imagen es grande y no se ha redimensionado. La resolución es 4000 * 3000 La conjetura puede ser que el conjunto de datos parece pregunta
Busque mensajes de error en Internet:
Solución uno:
img = Image.open(image_path) 改为
img = Image.open(image_path).convert('RGB')。
Solución dos:
问题1::RuntimeError: el trabajador de DataLoader (pid XXX) es eliminado por la señal: Error de bus
causas del problema:
Generalmente, este tipo de problema ocurre en Docker.Dado que la memoria compartida predeterminada de Docker es 64M, cuando la cantidad de trabajadores es grande, el espacio no es suficiente y se produce un error.
Solución:
1. Artes marciales autodestructivas
- se
num_workers
establecerá en 0
2. Resuelve el problema
Configure una memoria compartida más grande al crear la ventana acoplable, agregue parámetros --shm-size="15g"
y configure una memoria compartida de 15 g (configurada de acuerdo con la situación real):
nvidia-docker run -it --name [container_name] --shm-size="15g" ...
- viendo
df -h
_
df-h
# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 3.6T 3.1T 317G 91% /
tmpfs 64M 0 64M 0% /dev
tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/sdb1 3.6T 3.1T 317G 91% /workspace/tmp
shm 15G 8.1G 7.0G 54% /dev/shm
tmpfs 63G 12K 63G 1% /proc/driver/nvidia
/dev/sda1 219G 170G 39G 82% /usr/bin/nvidia-smi
udev 63G 0 63G 0% /dev/nvidia3
tmpfs 63G 0 63G 0% /proc/acpi
tmpfs 63G 0 63G 0% /proc/scsi
tmpfs 63G 0 63G 0% /sys/firmware
- Donde shm es el espacio de memoria compartida
问题2 RuntimeError: el trabajador de DataLoader (pid(s) ****) salió inesperadamente
causas del problema:
Dado que el cargador de datos utiliza operaciones de subprocesos múltiples, si hay otras operaciones de subprocesos múltiples con algunos problemas en el programa, puede hacer que los subprocesos aniden subprocesos, lo que es propenso a interbloqueos.
solución:
1. Las artes marciales de autodestrucción
se num_workers
establecerán en 0
2. Resuelve el problema
__getitem__
Deshabilite los subprocesos múltiples de opencv en el método del cargador de datos :
def __getitem__(self, idx):
import cv2
cv2.setNumThreads(0)
Solución tres:
Al encapsular el cargador de datos, ¡el último que queda tiene menos de un tamaño de lote! El cargador de datos incorporado tendrá este fenómeno
Corrección:
batch_size_s = len(targets) #不足一个batch_size直接停止训练
if batch_size_s < BATCH_SIZE:
break
Solución cuatro:
Rastreando la razón hacia arriba, mi razón es:
AutoAnchor: Running kmeans for 9 anchors on 3078 points...
AutoAnchor: Evolving anchors with Genetic Algorithm: fitness = 0.7565: 20%|██▉ | 198/1000 [01:42<06:55, 1.93it/s]
AutoAnchor: ERROR: DataLoader worker (pid 193674) is killed by signal: Killed.
Entonces, reduzca directamente el lote a 32, y los parámetros de entrenamiento son los siguientes:
python train.py --img 640 \
--batch 32 \
--epochs 300 \
--data /ai/AD4/code/yolov5/data/waterpipewire_yolo.yaml \
--weights /ai/AD4/code/yolov5/models/model/yolov5s.pt
¡Empezar a entrenar!
Referencias:
1. Error del cargador de datos de Pytorch "El trabajador del cargador de datos (pid xxx) es eliminado por la señal" Solución
2. RuntimeError: el tamaño del tensor a (128) debe coincidir con el tamaño del tensor b (16) en la dimensión no singleton