Beschreibung des Problems:
Bei der Verwendung von yolov5 zum Trainieren des von mir erstellten Datensatzes tritt ein Fehler auf.
Hintergrund:
Der Datensatz ist ein von mir selbst erstellter Datensatz im Yolo-Format. Das Bild ist groß und wurde nicht in der Größe geändert. Die Auflösung beträgt 4000 * 3000 . Die Vermutung könnte sein, dass der Datensatz fraglich erscheint
Suche nach Fehlermeldungen im Internet:
Lösung eins:
img = Image.open(image_path) oder
img = Image.open(image_path).convert('RGB')。
Lösung zwei:
Fehler 1::RuntimeError: DataLoader-Worker (pid XXX) wird durch Signal: Busfehler getötet
Problemursachen:
Im Allgemeinen tritt diese Art von Problem in Docker auf. Da der standardmäßige gemeinsame Speicher von Docker 64 MB beträgt, reicht der Speicherplatz nicht aus, wenn die Anzahl der Arbeiter groß ist, und es tritt ein Fehler auf.
Lösung:
1. Selbstzerstörerische Kampfkunst
- wird
num_workers
auf 0 gesetzt
2. Lösen Sie das Problem
Konfigurieren Sie beim Erstellen von Docker einen größeren gemeinsam genutzten Speicher, fügen Sie Parameter hinzu --shm-size="15g"
und legen Sie einen gemeinsam genutzten Speicher von 15 g fest (entsprechend der tatsächlichen Situation eingestellt):
nvidia-docker run -it --name [container_name] --shm-size="15g" ...
- durch
df -h
Ansehen
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
- Wobei shm der gemeinsam genutzte Speicherplatz ist
Fehler 2 RuntimeError: DataLoader-Worker (pid(s) ****) wurde unerwartet beendet
Problemursachen:
Da der Datenlader Multithread-Vorgänge verwendet, kann es bei anderen Multithread-Vorgängen mit einigen Problemen im Programm dazu kommen, dass Threads verschachtelt werden, was zu Deadlocks führt
Lösung:
1. Selbstzerstörerische Kampfkünste
werden num_workers
auf 0 gesetzt
2. Lösen Sie das Problem
__getitem__
Deaktivieren Sie das Multithreading von opencv in der Dataloader- Methode:
def __getitem__(self, idx):
import cv2
cv2.setNumThreads(0)
Lösung drei:
Beim Kapseln des Datenladers beträgt der letzte verbleibende Wert weniger als eine Stapelgröße! Der eingebaute Datenlader wird dieses Phänomen haben
. Korrektur:
batch_size_s = len(targets) #不足一个batch_size直接停止训练
if batch_size_s < BATCH_SIZE:
break
Lösung vier:
Wenn ich den Grund nach oben zurückverfolge, ist mein Grund:
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.
Reduzieren Sie den Stapel also direkt auf 32, und die Trainingsparameter lauten wie folgt:
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
Beginne zu trainieren!
Referenzen:
1. Pytorch-Dataloader-Fehler „DataLoader-Worker (pid xxx) wird durch Signal getötet“ Lösung
2. RuntimeError: Die Größe von Tensor a (128) muss mit der Größe von Tensor b (16) bei Nicht-Singleton-Dimensionen übereinstimmen