1. 概要
先日、こちらのページに記載したように、Windows 11 に PyCharm をインストールし、Ultralytics YOLO をデバッグ実行しました。その際、GPU を搭載していないノートパソコン LIFEBOOK WU2/D2 で実行しました。
今回は、NVIDIA GeForce GTX 1650 (GPGPU) をセットしたデスクトップパソコン ESPRIMO WD2/H2 で実行しました。使用したデスクトップパソコンのスペックはこちらのページの末尾の表に記載しました。
また、WSL2 上の Ubuntu に PyCharm の Linux 版をインストールし、Ultralytics の training の実行時間を Windows 版で GPU を使用して実行した場合と比較しました。
2. GPU を使用した環境での実行
2.1. 新しい PyCharm の Project の作成
新しい PyCharm の Project をデフォルトの設定で作成しました。
2.2. CUDA 版 PyTorch のインストール
こちらの PyTorch のページで下の画像の例のように PyTorch をインストールする条件を選択しました。私の Windows 11 のデスクトップパソコンには、CUDA Toolkit 12.4 がすでにインストールされていたため、下の画像の例のような選択をしました。
上の画像の Run this Command: の欄の下記のコマンドを PyCharm のターミナルにコピーして実行しました。
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
下の画像は PyCharm 下段のターミナルに上記のコマンドを貼り付けて実行したときの画面です。
下記のようなログが出力されました。Windows 11 の PowerShell から pip3 コマンドで CUDA 版の PyTorch をインストールしています。
(.venv) PS C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda> pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124 Looking in indexes: https://download.pytorch.org/whl/cu124 Collecting torch Using cached https://download.pytorch.org/whl/cu124/torch-2.4.1%2Bcu124-cp312-cp312-win_amd64.whl (2506.2 MB) Collecting torchvision Using cached https://download.pytorch.org/whl/cu124/torchvision-0.19.1%2Bcu124-cp312-cp312-win_amd64.whl (5.9 MB) ... Installing collected packages: mpmath, typing-extensions, sympy, setuptools, pillow, numpy, networkx, MarkupSafe, fsspec, filelock, jinja2, torch, torchvision, torchaudio Successfully installed MarkupSafe-2.1.5 filelock-3.13.1 fsspec-2024.2.0 jinja2-3.1.3 mpmath-1.3.0 networkx-3.2.1 numpy-1.26.3 pillow-10.2.0 setuptools-70.0.0 sympy-1.12 torch-2.4.1+cu124 torchaudio-2.4.1+cu124 torchvision-0.19.1+cu124 typing-extensions-4.9.0
2.3. Ultralytics のインストール
こちらの Ultralytics のページの Git clone によるインストール手順にしたがい、Ultralytics を editable mode でインストールしました。
PyCharm の PowerShell のターミナルに下記のようなコマンドを順に入力しました。
(.venv) PS C:\...\TestUltralyticsCuda> cd .venv (.venv) PS C:\...\TestUltralyticsCuda\.venv> mkdir src (.venv) PS C:\...\TestUltralyticsCuda\.venv> cd src (.venv) PS C:\...\TestUltralyticsCuda\.venv\src> git clone https://github.com/ultralytics/ultralytics (.venv) PS C:\...\TestUltralyticsCuda\.venv\src> cd .\ultralytics\ (.venv) PS C:\...\TestUltralyticsCuda\.venv\src\ultralytics> pip install -e .
その後、こちらのページの「3.4. Ultralytics のパスの追加」の手順で Git clone した Ultralytics のパスを Project の Interpreter Paths に追加しました。
2.4. Ultralytics の実行
2.4.1. GPU使用の確認
下記の内容の Python スクリプト check_ultralytics.py を実行しました。
import ultralytics ultralytics.checks()
PyCharm 下段のコンソールに下記のようなログが出力され、NVIDIA GeForce GTX 1650 (GPGPU) を使ってプログラムが実行されることを確認しました。
C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\Scripts\python.exe C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\check_ultralytics.py Ultralytics 8.3.7 🚀 Python-3.12.3 torch-2.4.1+cu124 CUDA:0 (NVIDIA GeForce GTX 1650, 4096MiB) Setup complete ✅ (16 CPUs, 15.2 GB RAM, 260.6/1903.6 GB disk) Process finished with exit code 0
2.4.2. 物体検出の実行
下記の内容の Python スクリプト test_ultralytics_yolo.py を実行しました。
from ultralytics import YOLO if __name__ == '__main__': # Load a pretrained YOLOv8n model model = YOLO("yolo11n.pt") # Define remote image or video URL source = "https://www.leafwindow.com/wordpress-05/wp-content/uploads/2023/03/DSC00283-min-SonyAlpha-%E6%A8%AA.jpg" # Run inference on the source results = model(source) # list of Results objects # Save image results[0].save("A_bird_taken_at_nagara_park.jpg")
コンソールには下記のようなログが出力されました。推定処理 (inference) には 24.3 ms 要しました。
C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\Scripts\python.exe C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\test_ultralytics_yolo.py Found https://www.leafwindow.com/wordpress-05/wp-content/uploads/2023/03/DSC00283-min-SonyAlpha-横.jpg locally at DSC00283-min-SonyAlpha-横.jpg image 1/1 C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\DSC00283-min-SonyAlpha-横.jpg: 448x640 1 bird, 24.3ms Speed: 1.1ms preprocess, 24.3ms inference, 59.9ms postprocess per image at shape (1, 3, 448, 640) Process finished with exit code 0
2.4.3. training 処理の実行
下記の内容の Python スクリプト test_ultralytics_yolo_train.py を実行しました。
data=”coco128.yaml” を指定し、128枚の物体検出用のデータセットで training を実行しました。
epochs=100 を指定し、128枚の画像で100回の training を実行しています。
from ultralytics import YOLO if __name__ == '__main__': # Load a model model = YOLO("yolo11n.pt") # load a pretrained model (recommended for training) # Train the model results = model.train(data="coco128.yaml", epochs=100, imgsz=640, amp=False, half=False)
コンソールには下記のようなログが出力されました。100 epoch の training に 0.590 時間 (35.4分) 要しました。
C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\Scripts\python.exe C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\test_ultralytics_yolo_train.py Ultralytics 8.3.7 🚀 Python-3.12.3 torch-2.4.1+cu124 CUDA:0 (NVIDIA GeForce GTX 1650, 4096MiB) engine\trainer: task=detect, mode=train, model=yolo11n.pt, data=coco128.yaml, epochs=100, time=None, patience=100, batch=16, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train28, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=False, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\ultralytics\runs\detect\train28 ... Starting training for 100 epochs... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/100 4.82G 1.221 1.583 1.271 217 640: 100%|██████████| 8/8 [00:17<00:00, 2.20s/it] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 4/4 [00:10<00:00, 2.70s/it] all 128 929 0.664 0.593 0.676 0.507 ... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 100/100 4.67G 0.7988 0.6416 0.9954 75 640: 100%|██████████| 8/8 [00:11<00:00, 1.39s/it] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 4/4 [00:08<00:00, 2.04s/it] all 128 929 0.824 0.831 0.882 0.732 100 epochs completed in 0.590 hours. ...
2.4.4. GPU メモリのサイズに応じて Batch Size を変えた training 処理の実行
上記 2.4.3. の Python スクリプト test_ultralytics_yolo_train.py の model.train(…) メソッドのパラメータに下記のように batch=-1 を追加して training を実行しました。こちらのページに記載されているように training の Batch Size のデフォルト値は 16 ですが、training を効率的に実行するための Batch Size はハードウェアに依存します。パラメータ batch=-1 を指定すると GPU メモリの使用率が約 60 % となるような Batch Size で training が実行されます。
from ultralytics import YOLO if __name__ == '__main__': # Load a model model = YOLO("yolo11n.pt") # load a pretrained model (recommended for training) # Train the model results = model.train(data="coco128.yaml", epochs=100, imgsz=640, batch=-1, amp=False, half=False)
上記の Python スクリプトを実行すると、コンソールには下記のようなログが出力されました。100 epoch の training に 0.162 時間 (9.72分) 要しました。
C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\Scripts\python.exe C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\test_ultralytics_yolo_train.py New https://pypi.org/project/ultralytics/8.3.10 available 😃 Update with 'pip install -U ultralytics' Ultralytics 8.3.7 🚀 Python-3.12.3 torch-2.4.1+cu124 CUDA:0 (NVIDIA GeForce GTX 1650, 4096MiB) engine\trainer: task=detect, mode=train, model=yolo11n.pt, data=coco128.yaml, epochs=100, time=None, patience=100, batch=-1, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train34, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=False, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\ultralytics\runs\detect\train34 ... AutoBatch: Using batch-size 7 for CUDA:0 2.15G/4.00G (54%) ✅ ... Starting training for 100 epochs... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/100 2.23G 1.155 1.687 1.255 21 640: 100%|██████████| 19/19 [00:04<00:00, 3.84it/s] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 10/10 [00:01<00:00, 6.11it/s] all 128 929 0.668 0.6 0.675 0.502 ... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 100/100 2.17G 0.8717 0.7377 1.018 15 640: 100%|██████████| 19/19 [00:03<00:00, 4.76it/s] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 10/10 [00:01<00:00, 7.93it/s] all 128 929 0.812 0.826 0.873 0.711 100 epochs completed in 0.162 hours. ...
Windows 11 上で CUDA を使用し、Ultralytics のサンプル Python スクリプトと同じように model.train(…) メソッドを実行すると、こちらのページと同様のエラーが発生したため、if __name__ == ‘__main__’: から model.train(…) メソッドを実行するようにしました。
補足2:
Windows 11 上で NVIDIA GeForce GTX 1650 を使用して model.train(…) メソッドを実行すると、こちらのページと同様のエラーが validation 実行時に発生したため、amp=False, half=False を model.train(…) メソッドのパラメータに追加しました。
補足3:
こちらのページに記載された GPU メモリの使用率を指定する方法で batch=0.7 を指定した際の training 時間は 0.163 時間、 batch=0.8 を指定した際の training 時間は 0.164 時間、batch=0.9 を指定した際の training 時間は 0.2 時間以上になりました。
3. CPU のみでの実行
GPU を使用したときと CPU のみで実行したときの実行時間を比較するため、同じデスクトップパソコン上で、CPU のみを使用する条件で上記 2.4.2. と 2.4.3. の Python スクリプトを実行しました。
3.1. CPU のみを利用する設定で Project を作成
上記 2.1. と同様、新しい PyCharm の Project をデフォルトの設定で作成しました。その後、上記 2.2. の「CUDA 版 PyTorch のインストール」の手順をスキップし、上記 2.3. の「Ultralytics のインストール」の手順で Ultralytics をインストールしました。
上記の手順でインストールしたところ、CPU のみで Ultralytics を実行する PyCharm の Project になりました。
3.2. Ultralytics の実行
3.2.1. CPUのみが使用されることの確認
上記 2.4.1. と同じ Python スクリプト check_ultralytics.py を実行しました。
PyCharm 下段のコンソールに下記のようなログが出力され、CPU のみでプログラムが実行されることを確認しました。
C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\Scripts\python.exe C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\src\check_ultralytics.py Ultralytics 8.3.7 🚀 Python-3.12.3 torch-2.4.1+cpu CPU (13th Gen Intel Core(TM) i5-13400) Setup complete ✅ (16 CPUs, 15.2 GB RAM, 262.5/1903.6 GB disk) Process finished with exit code 0
3.2.2. CPU のみで物体検出の推定処理 (inference) を実行
上記 2.4.2. と同じ Python スクリプト test_ultralytics_yolo.py を実行しました。
コンソールには下記のようなログが出力されました。推定処理 (inference) には 108.6 ms 要しました。
C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\Scripts\python.exe C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\src\test_ultralytics_yolo.py Found https://www.leafwindow.com/wordpress-05/wp-content/uploads/2023/03/DSC00283-min-SonyAlpha-横.jpg locally at DSC00283-min-SonyAlpha-横.jpg image 1/1 C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\src\DSC00283-min-SonyAlpha-横.jpg: 448x640 1 bird, 108.6ms Speed: 6.1ms preprocess, 108.6ms inference, 7.1ms postprocess per image at shape (1, 3, 448, 640) Process finished with exit code 0
3.2.3. CPU のみで物体検出の学習処理 (training) を実行
上記 2.4.3. と同じ Python スクリプト test_ultralytics_yolo_train.py を実行しました。
コンソールには下記のようなログが出力されました。学習処理 (training) には 1.007 時間 (60.42 分) 要しました。
C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\Scripts\python.exe C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\src\test_ultralytics_yolo_train.py New https://pypi.org/project/ultralytics/8.3.9 available 😃 Update with 'pip install -U ultralytics' Ultralytics 8.3.7 🚀 Python-3.12.3 torch-2.4.1+cpu CPU (13th Gen Intel Core(TM) i5-13400) engine\trainer: task=detect, mode=train, model=yolo11n.pt, data=coco128.yaml, epochs=100, time=None, patience=100, batch=16, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train33, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=False, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\ultralytics\runs\detect\train33 ... Starting training for 100 epochs... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/100 0G 1.164 1.332 1.256 278 640: 100%|██████████| 8/8 [00:28<00:00, 3.61s/it] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 4/4 [00:10<00:00, 2.50s/it] all 128 929 0.687 0.595 0.68 0.513 ... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 100/100 0G 0.8197 0.637 0.9913 126 640: 100%|██████████| 8/8 [00:25<00:00, 3.25s/it] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 4/4 [00:09<00:00, 2.41s/it] all 128 929 0.893 0.813 0.886 0.739 100 epochs completed in 1.007 hours. ...
3.2.4. CPU のみで batch=-1 を指定して training を実行
上記 2.4.4. と同様、batch=-1 を指定し、CPU のみで training を実行しました。
下記のように CPU のみの実行では適切な Batch Size の推定が実施されないことを示すログが出力され、デフォルトの Batch Size 16 が適用されました。
C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\Scripts\python.exe C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\src\test_ultralytics_yolo_train.py New https://pypi.org/project/ultralytics/8.3.10 available 😃 Update with 'pip install -U ultralytics' Ultralytics 8.3.7 🚀 Python-3.12.3 torch-2.4.1+cpu CPU (13th Gen Intel Core(TM) i5-13400) engine\trainer: task=detect, mode=train, model=yolo11n.pt, data=coco128.yaml, epochs=100, time=None, patience=100, batch=-1, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train39, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=False, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\ultralytics\runs\detect\train39 ... AutoBatch: Computing optimal batch size for imgsz=640 at 60.0% CUDA memory utilization. AutoBatch: ⚠️ intended for CUDA devices, using default batch-size 16 ...
3.2.5. CPU のみで batch=7 を指定して training を実行
上記 2.4.4. で batch=-1 を指定した際、Batch Size 7 で training が実行されました。
比較のため、batch=7 のように Batch Size を指定して CPU のみで training を実行しました。
下記のログのように training には 0.911 時間 (54.66分) 要しました。
GPU を使用した 2.4.4. の処理時間 0.162 の約 5.6 倍の処理時間になります。
C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\Scripts\python.exe C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCpu\.venv\src\test_ultralytics_yolo_train.py New https://pypi.org/project/ultralytics/8.3.10 available 😃 Update with 'pip install -U ultralytics' Ultralytics 8.3.7 🚀 Python-3.12.3 torch-2.4.1+cpu CPU (13th Gen Intel Core(TM) i5-13400) engine\trainer: task=detect, mode=train, model=yolo11n.pt, data=coco128.yaml, epochs=100, time=None, patience=100, batch=7, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train40, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=False, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=C:\Users\fukag\PycharmProjects\UltralyticsTest\TestUltralyticsCuda\.venv\src\ultralytics\runs\detect\train40 ... Starting training for 100 epochs... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/100 0G 1.166 1.45 1.241 41 640: 100%|██████████| 19/19 [00:27<00:00, 1.44s/it] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 10/10 [00:08<00:00, 1.21it/s] all 128 929 0.681 0.6 0.677 0.508 ... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 100/100 0G 0.8943 0.75 1.037 7 640: 100%|██████████| 19/19 [00:23<00:00, 1.26s/it] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 10/10 [00:07<00:00, 1.26it/s] all 128 929 0.842 0.811 0.87 0.707 100 epochs completed in 0.911 hours. ...
4. WSL2 上で GPU を使用して training したときとの実行時間の比較
4.1. WSL2 上の Ubuntu に PyCharm をインストール
こちらのページから PyCharm Community Edition の Linux 版をダウンロードしました。
ダウンロード後、下記のコマンドで PyCharm を /opt/ ディレクトリに展開しました。
sudo tar xzf pycharm-*.tar.gz -C /opt/
私のユーザーアカウントの権限で PyCharm のバージョンアップができるよう、展開して生成されたディレクトリの権限を下記のコマンドで書き換えました。
sudo chown -R fukagai.fukagai /opt/pycharm-community-2024.2.2/
下記のコマンドで PyCharm の Linux 版が起動されます。Xサーバー等の設定はしておらず、WSLg を使用した GUI アプリとして起動しました。
/opt/pycharm-community-2024.2.2/bin/pycharm &
4.2. Ultralytics のインストール
PyCharm の Project をデフォルトの設定で作成後、PyCharm 下段のターミナルに下記のコマンドを入力しました。Ultralytics は editable mode でインストールしています。
下記のコマンドで、GPU を使用する設定で Ultralytics がインストールされました。
(.venv) fukagai@ESPRIMOWD2H2:~/PycharmProjects/TestUltralyticsCuda/.venv$ mkdir src (.venv) fukagai@ESPRIMOWD2H2:~/PycharmProjects/TestUltralyticsCuda/.venv$ cd src/ (.venv) fukagai@ESPRIMOWD2H2:~/PycharmProjects/TestUltralyticsCuda/.venv/src$ git clone https://github.com/ultralytics/ultralytics (.venv) fukagai@ESPRIMOWD2H2:~/PycharmProjects/TestUltralyticsCuda/.venv/src$ cd ultralytics/ (.venv) fukagai@ESPRIMOWD2H2:~/PycharmProjects/TestUltralyticsCuda/.venv/src/ultralytics$ pip install -e . Obtaining file:///home/fukagai/PycharmProjects/TestUltralyticsCuda/.venv/src/ultralytics Installing build dependencies ... done Checking if build backend supports build_editable ... done Getting requirements to build editable ... done Preparing editable metadata (pyproject.toml) ... done ... Successfully installed MarkupSafe-3.0.1 certifi-2024.8.30 charset-normalizer-3.4.0 contourpy-1.3.0 cycler-0.12.1 filelock-3.16.1 fonttools-4.54.1 fsspec-2024.9.0 idna-3.10 jinja2-3.1.4 kiwisolver-1.4.7 matplotlib-3.9.2 mpmath-1.3.0 networkx-3.4.1 numpy-2.1.2 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.20.5 nvidia-nvjitlink-cu12-12.6.77 nvidia-nvtx-cu12-12.1.105 opencv-python-4.10.0.84 packaging-24.1 pandas-2.2.3 pillow-10.4.0 psutil-6.0.0 py-cpuinfo-9.0.0 pyparsing-3.1.4 python-dateutil-2.9.0.post0 pytz-2024.2 pyyaml-6.0.2 requests-2.32.3 scipy-1.14.1 seaborn-0.13.2 six-1.16.0 sympy-1.13.3 torch-2.4.1 torchvision-0.19.1 tqdm-4.66.5 triton-3.0.0 typing-extensions-4.12.2 tzdata-2024.2 ultralytics-8.3.11 ultralytics-thop-2.0.9 urllib3-2.2.3
インストール後、Windows 版 PyCharm と同様、こちらのページの「3.4. Ultralytics のパスの追加」の手順で Git clone した Ultralytics のパスを Project の Interpreter Paths に追加しました。
4.3. Ultralytics の training の実行
上記 2.4.4. と同様、batch=-1 を指定し、WSL2 の Ubuntu 上で Ultralytics の training を実行しました。
実行したのは上記 2.4.4. と同じ下記の Python スクリプトになります。
from ultralytics import YOLO if __name__ == '__main__': # Load a model model = YOLO("yolo11n.pt") # load a pretrained model (recommended for training) # Train the model results = model.train(data="coco128.yaml", epochs=100, imgsz=640, batch=-1, amp=False, half=False)
下記のようなログが PyCharm のコンソールに出力され、0.168 時間で 100 epoch の training が完了しました。Windows 版で GPU を使用して実行したときの実行時間 0.162 時間と近い実行時間になりました。
/home/fukagai/PycharmProjects/TestUltralyticsCuda/.venv/bin/python /home/fukagai/PycharmProjects/TestUltralyticsCuda/.venv/src/test_ultralytics_train.py ... Ultralytics 8.3.11 🚀 Python-3.10.12 torch-2.4.1+cu121 CUDA:0 (NVIDIA GeForce GTX 1650, 4096MiB) engine/trainer: task=detect, mode=train, model=yolo11n.pt, data=coco128.yaml, epochs=100, time=None, patience=100, batch=-1, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=False, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=/home/fukagai/PycharmProjects/TestUltralyticsCuda/.venv/src/ultralytics/runs/detect/train ... AutoBatch: Computing optimal batch size for imgsz=640 at 60.0% CUDA memory utilization. AutoBatch: CUDA:0 (NVIDIA GeForce GTX 1650) 4.00G total, 0.04G reserved, 0.02G allocated, 3.94G free ... Starting training for 100 epochs... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/100 2.23G 1.155 1.687 1.255 21 640: 100%|██████████| 19/19 [00:05<00:00, 3.38it/s] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 10/10 [00:02<00:00, 4.24it/s] all 128 929 0.669 0.592 0.673 0.5 ... Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 100/100 2.17G 0.8802 0.744 1.02 15 640: 100%|██████████| 19/19 [00:04<00:00, 4.62it/s] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 10/10 [00:01<00:00, 6.70it/s] all 128 929 0.818 0.828 0.875 0.713 100 epochs completed in 0.168 hours. ...