Real-time Inference
Suy luận thời gian thực trả về từng dự đoán trước khi đầu vào tiếp theo đến, chẳng hạn trong vòng 33 ms mỗi khung hình ở 30 FPS. Bài viết đề cập đến ngân sách độ trễ và cách tăng tốc.
Suy luận thời gian thực là chạy model đã huấn luyện trên đầu vào trực tiếp và trả về từng dự đoán trước khi đầu vào tiếp theo đến, nhờ đó hệ thống có thể hành động khi thông tin vẫn còn cập nhật. Với camera truyền ở tốc độ 30 frame mỗi giây (FPS), hệ thống có 33.3 mili giây cho mỗi frame, bao gồm mọi bước từ đọc ảnh đến tạo kết quả cuối cùng; ở 60 FPS, ngân sách giảm còn 16.7 ms. Mỗi ứng dụng có thời hạn riêng: hệ thống tri giác của ô tô, camera kiểm tra băng chuyền và bộ lọc nền trong cuộc gọi video đều hoạt động theo thời gian thực nhưng có ngân sách khác nhau.
Ngân sách độ trễ#
Thời gian cần quan tâm là độ trễ suy luận từ đầu đến cuối: từ lúc thu nhận khung hình, qua bước tiền xử lý bằng cách đổi kích thước và chuẩn hóa khung hình, đến lượt truyền xuôi của model và các bước hậu xử lý như giải mã các box và loại bỏ phi cực đại (NMS). Khi tổng thời gian vượt quá khoảng thời gian giữa các khung hình, các khung hình chưa xử lý sẽ dồn ứ và đầu ra ngày càng tụt lại so với cảnh đang diễn ra, vì vậy các pipeline xử lý trực tiếp thường loại bỏ các khung hình lỗi thời và luôn xử lý khung hình mới nhất. Điện toán thời gian thực phân biệt hệ thống thời gian thực cứng, chẳng hạn bộ điều khiển túi khí, nơi việc lỡ thời hạn đồng nghĩa với thất bại, với hệ thống thời gian thực mềm, vốn có thể chấp nhận đôi khi lỡ thời hạn. Hầu hết các ứng dụng thị giác máy tính thuộc loại thời gian thực mềm: một khung hình bị loại bỏ làm giảm chất lượng đầu ra trong chốc lát và khung hình tiếp theo sẽ khôi phục chất lượng đó.
Đoạn mã này truyền video đã ghi qua một detector nhỏ và so sánh thời gian trung bình mỗi frame với ngân sách 30 FPS:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
video = "https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov"
# stream=True yields each frame's result as soon as it is ready
frame_times = []
for result in model(video, stream=True):
# Preprocess, inference, and postprocess time for this frame, in milliseconds
frame_times.append(sum(result.speed.values()))
mean_ms = sum(frame_times) / len(frame_times)
print(f"{mean_ms:.1f} ms per frame ({1000 / mean_ms:.0f} FPS); a 30 FPS camera allows 33.3 ms")Thời gian trung bình dưới 33.3 ms nghĩa là model xử lý kịp tốc độ của camera 30 FPS trên phần cứng đã chạy model.
Suy luận thời gian thực và suy luận theo batch#
- Suy luận thời gian thực (trực tuyến): Xử lý từng đầu vào khi dữ liệu đến, thường là từng ảnh một, và được đánh giá dựa trên độ trễ của mỗi dự đoán. Hệ thống hỗ trợ lái, điều khiển robot và phân tích video trực tiếp đều phụ thuộc vào phương thức này.
- Suy luận theo batch (ngoại tuyến): Thu thập nhiều đầu vào rồi xử lý cùng lúc; phương thức này được đánh giá theo thông lượng, tính bằng số đầu vào mỗi giây, và chi phí. Việc lập chỉ mục lại kho ảnh qua đêm hoặc phân tích video của tháng trước là các tác vụ batch; batch lớn hơn giúp GPU hoạt động hiệu quả hơn, nhưng mỗi đầu vào phải chờ lâu hơn để nhận kết quả.
Máy chủ xử lý nhiều luồng camera thường nằm giữa hai phương thức này, gom frame từ các camera khác nhau thành batch nhỏ để tăng thông lượng mà vẫn đáp ứng ngân sách frame của từng luồng.
Ứng dụng thực tế#
- Xe tự hành: Ở tốc độ 100 km/h, ô tô đi được 2.8 mét trong mỗi 100 ms, vì vậy độ trễ tri giác trực tiếp làm tăng quãng đường phanh.
- Kiểm tra trong sản xuất: Camera phía trên băng chuyền phát hiện lỗi trên từng sản phẩm và phải kích hoạt cơ chế loại bỏ trước khi sản phẩm lỗi đi qua cơ chế đó.
- Robot học: Phát hiện vật cản và ước lượng tư thế chạy trong vòng lặp điều khiển robot; tri giác chậm hơn buộc robot di chuyển chậm hơn.
- Hiệu ứng video và thực tế tăng cường: Làm mờ nền trong cuộc gọi video và lớp phủ AR chạy phân đoạn hoặc tracking trên từng frame; mọi độ trễ đều khiến lớp phủ bị tụt lại phía sau người đang di chuyển.
Tăng tốc model để đáp ứng yêu cầu#
- Model hoặc kích thước đầu vào nhỏ hơn: Biến thể model nhỏ hơn thực hiện ít phép toán hơn trên mỗi ảnh; vì lượng tính toán tích chập tăng gần tỷ lệ với số pixel, giảm một nửa chiều rộng và chiều cao đầu vào sẽ giảm lượng tính toán xuống khoảng một phần tư, nhưng có thể làm giảm accuracy với vật thể nhỏ.
- Lượng tử hóa model: Lưu trọng số và activation ở dạng FP16 hoặc INT8 thay vì FP32 giúp giảm lưu lượng bộ nhớ và sử dụng các đơn vị tính toán nhanh hơn. INT8 thường cần một tập ảnh hiệu chỉnh để hạn chế tổn thất accuracy.
- Engine suy luận: Runtime được xây dựng cho một dòng phần cứng sẽ hợp nhất các layer và chọn kernel được tinh chỉnh cho thiết bị, chẳng hạn TensorRT cho GPU NVIDIA hoặc Core ML cho thiết bị Apple.
- AI biên: Chạy model trên camera hoặc module nhúng giúp loại bỏ lượt truyền dữ liệu qua mạng đến dịch vụ đám mây; với kết nối chậm, lượt truyền này có thể vượt quá toàn bộ ngân sách frame.
Runtime và phần cứng có thể làm latency thay đổi hơn một bậc độ lớn: model YOLO26 nano mất 38,9 ms cho mỗi ảnh 640 pixel trên CPU với ONNX, và 1,7 ms trên GPU NVIDIA T4 với TensorRT. Chế độ export của Ultralytics chuyển đổi model YOLO26 đã huấn luyện sang TensorRT, OpenVINO, LiteRT và các định dạng khác; đối số quantize=16 hoặc quantize=8 tạo trọng số FP16 hoặc INT8 cho thiết bị đích.










