如何减少预处理和后处理的时间?
我正在使用 DETR 对视频帧实现对象检测。我的系统处理 30 FPS、30 秒视频中的帧(总共 900 帧),这些帧是从 Redis 队列中以 30 为批次读取的,并在 NVIDIA RTX A4000 GPU 上进行处理。尽管拥有高端硬件,但我注意到 GPU 并未得到充分利用。以下是我的流程和计时结果的细分:
DetrImageProcessor
处理帧。post_process_object_detection
) 是瓶颈,所有帧需要 34.13 秒。processor(images=frames, ...)
) 也需要大量时间:29.30 秒。outputs = model(**inputs)
)需要 3.06 秒。这是我的批处理代码:
frame_consumer.py
:
# Batch processing logic
def process_batch():
for _ in range(30):
image_bytes = redis_client.rpop(FRAME_QUEUE, 30)
imgs = decode_img_list(image_bytes)
results = model2.process_batch(imgs)
model.py
:
import torch
from transformers import DetrImageProcessor, DetrForObjectDetection
from processing_timer import ProcessingTimer
import time
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"device: {device}")
processor = DetrImageProcessor.from_pretrained(
"facebook/detr-resnet-50", revision="no_timm"
)
model = DetrForObjectDetection.from_pretrained(
"facebook/detr-resnet-50", revision="no_timm"
).to(device)
model.eval()
def process_batch(frames):
inputs = processor(images=frames, return_tensors="pt").to(device)
with torch.no_grad():
outputs = model(**inputs)
target_sizes = torch.tensor([frame.shape[:2] for frame in frames]).to(device)
results = processor.post_process_object_detection(outputs, target_sizes=target_sizes)
del outputs
del inputs
torch.cuda.empty_cache()
return results
也许你可以尝试增加批量大小。还有其他原因要批量处理 30 个吗?另外,也许您可以将
process
函数包装在数据加载器中,以实现更好的批量处理。