forked from ultralytics/yolov5
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
…#5092) * Autobatch * fix mem * fix mem2 * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update train.py * print result * Cleanup print result * swap fix in call * to 64 * use total * fix * fix * fix * fix * fix * Update * Update * Update * Update * Update * Update * Update * Cleanup printing * Update final printout * Update autobatch.py * Update autobatch.py * Update autobatch.py
- Loading branch information
1 parent
5672863
commit 20c74db
Showing
3 changed files
with
68 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license | ||
""" | ||
Auto-batch utils | ||
""" | ||
|
||
from copy import deepcopy | ||
|
||
import numpy as np | ||
import torch | ||
from torch.cuda import amp | ||
|
||
from utils.general import colorstr | ||
from utils.torch_utils import profile | ||
|
||
|
||
def check_train_batch_size(model, imgsz=640): | ||
# Check YOLOv5 training batch size | ||
with amp.autocast(): | ||
return autobatch(deepcopy(model).train(), imgsz) # compute optimal batch size | ||
|
||
|
||
def autobatch(model, imgsz=640, fraction=0.9, batch_size=16): | ||
# Automatically estimate best batch size to use `fraction` of available CUDA memory | ||
# Usage: | ||
# import torch | ||
# from utils.autobatch import autobatch | ||
# model = torch.hub.load('ultralytics/yolov5', 'yolov5s', autoshape=False) | ||
# print(autobatch(model)) | ||
|
||
prefix = colorstr('autobatch: ') | ||
print(f'{prefix}Computing optimal batch size for --imgsz {imgsz}') | ||
device = next(model.parameters()).device # get model device | ||
if device.type == 'cpu': | ||
print(f'{prefix}CUDA not detected, using default CPU batch-size {batch_size}') | ||
return batch_size | ||
|
||
d = str(device).upper() # 'CUDA:0' | ||
t = torch.cuda.get_device_properties(device).total_memory / 1024 ** 3 # (GB) | ||
r = torch.cuda.memory_reserved(device) / 1024 ** 3 # (GB) | ||
a = torch.cuda.memory_allocated(device) / 1024 ** 3 # (GB) | ||
f = t - (r + a) # free inside reserved | ||
print(f'{prefix}{d} {t:.3g}G total, {r:.3g}G reserved, {a:.3g}G allocated, {f:.3g}G free') | ||
|
||
batch_sizes = [1, 2, 4, 8, 16] | ||
try: | ||
img = [torch.zeros(b, 3, imgsz, imgsz) for b in batch_sizes] | ||
y = profile(img, model, n=3, device=device) | ||
except Exception as e: | ||
print(f'{prefix}{e}') | ||
|
||
y = [x[2] for x in y if x] # memory [2] | ||
batch_sizes = batch_sizes[:len(y)] | ||
p = np.polyfit(batch_sizes, y, deg=1) # first degree polynomial fit | ||
b = int((f * fraction - p[1]) / p[0]) # y intercept (optimal batch size) | ||
print(f'{prefix}Using colorstr(batch-size {b}) for {d} {t * fraction:.3g}G/{t:.3g}G ({fraction * 100:.0f}%)') | ||
return b |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters