Hướng dẫn tăng FPS mô hình YOLOv8 chạy bằng file .engine
Bài này hướng dẫn tối ưu mô hình YOLOv8 để tăng FPS trên GPU NVIDIA bằng cách chuyển model sang ONNX rồi TensorRT (FP16). Hệ điều hành: CachyOS (Arch Linux) · Model: yolov8n Lộ trình: yolov8n.pt (PyTorch, FP32) → yolov8n
Bài này hướng dẫn tối ưu mô hình YOLOv8 để tăng FPS trên GPU NVIDIA bằng cách chuyển model sang ONNX rồi TensorRT (FP16).
Hệ điều hành: CachyOS (Arch Linux) · Model: yolov8n
Lộ trình:
yolov8n.pt (PyTorch, FP32) → yolov8n.onnx → yolov8n.engine (TensorRT, FP16)Mức tăng FPS chủ yếu đến từ TensorRT (hợp nhất layer, chọn kernel theo đúng GPU) và FP16 (tính trên Tensor Core, ít băng thông bộ nhớ hơn).
File .engine bị khóa theo đúng GPU, đúng phiên bản TensorRT và đúng input size lúc build. Đổi một trong ba thì phải build lại.
Shell mặc định của CachyOS là fish. Lệnh trong bài chạy được ở bash, zsh và fish, trừ những chỗ có ghi chú riêng (đặt PATH, activate venv).
Phiên bản đã kiểm tra trên máy
Máy thử: Intel Core i5-12450H, 15,3 GB RAM, NVIDIA GeForce GTX 1650 (4 GB, compute capability 7.5).
Phần hệ thống:
Kernel:
linux-cachyos7.2.11-1 (kèmlinux-cachyos-lts6.18.55-2)Driver:
nvidia-open-dkms615.78.08 (nvidia-smibáo CUDA UMD Version 13.4)cuda13.4.3-1 (nvcc13.4.92)cudnn9.27.0.42-1.1nvtop3.3.2-1.1uv0.13.4-1.1TensorRT hệ thống và
trtexec: chưa cài (Bước 8 là tùy chọn)
Phần Python (trong venv):
Python 3.14.8
ultralytics8.4.116 (kèmultralytics-thop2.1.6)torch2.13.0 (build+cu130) /torchvision0.28.0nvidia-cuda-runtime13.0.96,nvidia-cudnn-cu139.20.0.48tensorrt-cu1311.2.1.2 (kèmtensorrt-cu13-bindingsvàtensorrt-cu13-libscùng bản 11.2.1.2)onnx1.22.0onnxruntime-gpu1.30.0onnxslim0.1.96opencv-python5.0.0.93numpy2.5.1
Cả bộ cùng dùng CUDA 13: torch 2.13.0 từ PyPI kéo theo CUDA runtime 13.0 và cuDNN 9.20, khớp với onnxruntime-gpu 1.30.0 và tensorrt-cu13. Đừng nâng cấp riêng lẻ từng gói, vì dễ làm lệch bản CUDA giữa chúng.
Bước 1 — Cài driver NVIDIA
Cập nhật toàn bộ hệ thống trước, để kernel, driver và danh sách gói cùng một đợt. Cài gói lẻ khi hệ thống chưa cập nhật dễ gặp lỗi tải file 404 hoặc xung đột phụ thuộc ở các bước sau:
sudo pacman -SyuSau đó dùng chwd (CachyOS Hardware Detection) để chọn đúng gói driver khớp kernel, rồi reboot. Với GPU Turing trở lên (GTX 16xx, RTX 20xx…), profile thường là nvidia-open-dkms. Trên laptop có thêm iGPU Intel như máy thử, chwd đề xuất nvidia-open-dkms.prime (ưu tiên cao nhất).
sudo chwd --listsudo chwd -asudo rebootSau khi khởi động lại, kiểm tra driver (máy thử cho ra driver 615.78.08):
nvidia-smiBước 2 — Cài CUDA và cuDNN
sudo pacman -S --needed cuda cudnn nvtopTrên Arch, nvcc nằm ở /opt/cuda/bin và thường chưa có trong PATH. Thêm vào shell rc (bash/zsh):
echo 'export PATH=/opt/cuda/bin:$PATH' >> ~/.bashrcNếu dùng fish:
fish_add_path /opt/cuda/binMở terminal mới rồi chạy nvcc --version để chắc PATH đã nhận (máy thử: CUDA 13.4).
Cài bằng pip ở các bước sau mang theo thư viện CUDA riêng cho torch và TensorRT, nên CUDA hệ thống ở đây chủ yếu để có
nvccvàtrtexec. Bản CUDA hệ thống và bản CUDA của torch có thể khác nhau mà vẫn chạy được (máy thử: hệ thống 13.4, torch 13.0).
Bước 3 — Tạo môi trường Python bằng uv
Cài uv, tạo thư mục làm việc và venv Python 3.14 (nếu máy chưa có Python 3.14, uv sẽ tự tải về):
sudo pacman -S --needed uvmkdir -p ~/yolo-trt && cd ~/yolo-trtuv venv --seed --python 3.14 .venvKích hoạt venv (bash/zsh):
source .venv/bin/activateHoặc nếu dùng fish:
source .venv/bin/activate.fishBước 4 — Cài thư viện
Đảm bảo venv đang được kích hoạt (dòng lệnh phải có tiền tố (.venv)), rồi cài toàn bộ thư viện chính trong một lệnh để uv phân giải các phiên bản cùng lúc:
uv pip install torch==2.13.0 torchvision==0.28.0 onnx==1.22.0 onnxruntime-gpu==1.30.0 onnxslim==0.1.96 opencv-python==5.0.0.93 ultralytics==8.4.116Sau đó cài TensorRT. Gói này cài sau cùng vì dùng lại thư viện CUDA runtime mà torch đã kéo về:
uv pip install tensorrt-cu13==11.2.1.2Lưu ý: tensorrt-cu13 là gói trung gian, lúc cài nó tải thư viện TensorRT thật từ pypi.nvidia.com, nên máy cần truy cập được địa chỉ này. Nó kéo theo tensorrt-cu13-bindings và tensorrt-cu13-libs cùng bản 11.2.1.2. Các gói phụ như numpy, matplotlib do ultralytics và torchvision tự kéo về, không cần cài thêm.
Lưu lại tổ hợp phiên bản để tái lập về sau:
uv pip freeze > requirements-lock.txtChỉ cài onnxruntime-gpu, không cài thêm gói onnxruntime (bản CPU), vì hai gói dùng chung thư mục và có thể làm mất CUDA provider.
Bước 5 — Export PyTorch sang ONNX
Tạo export_onnx.py:
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
path = model.export(format='onnx', imgsz=640, dynamic=False, simplify=True, opset=17, device=0)
print('ONNX:', path)python export_onnx.pyHoặc dùng lệnh nhanh:
yolo export model=yolov8n.pt format=onnx imgsz=640 dynamic=False simplify=True opset=17 device=0Ý nghĩa các tham số:
dynamic=False: shape cố định1×3×640×640, để TensorRT chọn kernel tối ưu cho đúng shape này.simplify=True: rút gọn đồ thị ONNX bằngonnxslim.opset=17: ghi rõ để tái lập được.
Bộ export ONNX kiểu cũ của PyTorch (dynamo=False) không cần cài onnxscript. Phần này chưa được kiểm chứng với tổ hợp ultralytics 8.4.116 + torch 2.13.0; nếu lúc export báo thiếu onnxscript, cài thêm bằng uv pip install onnxscript. Lần chạy đầu, Ultralytics tự tải yolov8n.pt về thư mục hiện tại, cần có mạng.
Bước 6 — Build TensorRT engine (FP16)
Tạo export_engine.py. Script nhận tên model làm tham số để dùng lại cho yolov8s, yolov8m:
import sys
from ultralytics import YOLO
name = sys.argv[1] if len(sys.argv) > 1 else 'yolov8n'
model = YOLO(f'{name}.pt')
path = model.export(format='engine', half=True, imgsz=640, dynamic=False, device=0)
print('Engine:', path)python export_engine.pyBuild mất vài phút vì TensorRT thử nhiều kernel để chọn cái nhanh nhất cho GPU của bạn. Kết quả là file yolov8n.engine. Ultralytics ghi sẵn metadata (tên class, imgsz, task…) vào file nên có thể nạp lại bằng YOLO('yolov8n.engine') mà không cần khai báo gì thêm.
Muốn dùng model lớn hơn, chạy:
python export_engine.py yolov8sBước 7 — Chạy inference với engine
Tạo infer_video.py. Script đọc video, chạy engine, vẽ bounding box và ghi ra file:
import argparse
import cv2
from ultralytics import YOLO
def main():
ap = argparse.ArgumentParser()
ap.add_argument('--model', default='yolov8n.engine')
ap.add_argument('--source', required=True, help='đường dẫn video, hoặc số 0 cho webcam | ví dụ: /home/archonduy/Videos/noinaycoanh_ST_M-TP.mp4 hoặc 0')
ap.add_argument('--conf', type=float, default=0.25)
ap.add_argument('--show', action='store_true', help='hiển thị cửa sổ')
ap.add_argument('--out', default=None, help='ghi video kết quả ra file')
a = ap.parse_args()
src = int(a.source) if a.source.isdigit() else a.source
cap = cv2.VideoCapture(src)
assert cap.isOpened(), f'Không mở được nguồn: {a.source}'
fps_in = cap.get(cv2.CAP_PROP_FPS) or 30.0
model = YOLO(a.model, task='detect')
writer = None
while True:
ok, frame = cap.read()
if not ok:
break
r = model.predict(frame, imgsz=640, conf=a.conf, device=0, verbose=False)[0]
if a.show or a.out:
vis = r.plot()
if a.out and writer is None:
h, w = vis.shape[:2]
writer = cv2.VideoWriter(a.out, cv2.VideoWriter_fourcc(*'mp4v'), fps_in, (w, h))
if writer is not None:
writer.write(vis)
if a.show:
cv2.imshow('yolov8', vis)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
if writer is not None:
writer.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()Chạy với một file video:
python infer_video.py --model yolov8n.engine --source sample.mp4 --out out_engine.mp4Chạy với webcam và hiển thị cửa sổ:
python infer_video.py --model yolov8n.engine --source 0 --showTrên Wayland, nếu cửa sổ không mở và báo Could not find the Qt platform plugin, chạy với:
env QT_QPA_PLATFORM=xcb python infer_video.py --model yolov8n.engine --source 0 --showBước 8 (tùy chọn) — Build engine bằng trtexec
Bước này chỉ cần nếu bạn muốn dùng công cụ dòng lệnh của TensorRT. Máy thử chưa cài gói này (trtexec báo Unknown command). Gói tensorrt cho Arch nằm ở AUR, build từ tarball của NVIDIA nên khá tốn thời gian và dung lượng. Kiểm tra repo trước:
paru -S tensorrtBuild engine từ file ONNX. Lệnh dưới dùng cờ --fp16, chỉ chạy được với TensorRT 10.x:
trtexec --onnx=yolov8n.onnx --saveEngine=yolov8n_trtexec.engine --fp16Bản TensorRT trong venv hiện là 11.2.1.2. Từ TensorRT 11.x, NVIDIA đã loại bỏ cờ
--fp16vàtrtexecsẽ báo lỗi nếu bạn dùng nó, nên lệnh trên không dùng được với bản 11.x. Nếu càitrtexectừ AUR, nên chọn cùng bản 11.2.1.2 với venv, rồi chạytrtexec --helpđể xem cờ nào còn dùng được. Nếu gặp tình huống này, bỏ qua Bước 8: pipeline Python ở trên không cầntrtexec.
Engine do
trtexecbuild không có metadata của Ultralytics, nên không nạp được bằngYOLO(). Với pipeline Python ở trên, hãy dùng engine của Bước 6.
Lưu ý khi dùng engine
Đổi GPU hoặc nâng phiên bản TensorRT thì phải build lại engine bằng
python export_engine.py.Lỗi
The engine plan file is not compatible with this version of TensorRTnghĩa là engine được build bằng phiên bản TensorRT khác với bản đang chạy. Xóa engine cũ và build lại trong đúng venv này:
rm yolov8n.engine && python export_engine.pyNếu ONNX Runtime rơi về CPU (thiếu
libcudart.so.13hoặclibcudnn.so.9), kiểm tra bạn đãimport torchtrướconnxruntimevà chỉ cài đúng góionnxruntime-gpu.
Phụ lục — Xem phiên bản đang cài trên máy
Các lệnh dưới đây chỉ đọc thông tin, không thay đổi gì trên máy.
Phần hệ thống (chạy ở terminal bình thường)
Kernel đang chạy:
uname -rTên GPU, phiên bản driver và compute capability:
nvidia-smi --query-gpu=name,driver_version,compute_cap --format=csvGóc trên bên phải của nvidia-smi có dòng CUDA Version (máy thử: 13.4): đó là bản CUDA cao nhất mà driver hỗ trợ, không phải bản CUDA đã cài.
nvidia-smiCác gói pacman liên quan (gói nào chưa cài sẽ báo was not found, các gói còn lại vẫn hiển thị):
pacman -Q cuda cudnn nvtop uvGói driver NVIDIA và kernel CachyOS đã cài:
pacman -Q | grep -Ei 'nvidia|linux-cachyos'Gói TensorRT của hệ thống:
pacman -Qs tensorrtBản nvcc (cần /opt/cuda/bin trong PATH):
nvcc --versionBản trtexec của hệ thống (nếu có). Số v<số> mã hóa theo kiểu major×10000 + minor×100 + patch, ví dụ v101303 ứng với 10.13.3:
trtexec --help 2>&1 | grep -m1 'TensorRT v'Phần Python (kích hoạt venv của bạn trước)
Với venv ở ~/yolo-trt, kích hoạt bằng một trong hai lệnh:
source ~/yolo-trt/.venv/bin/activatesource ~/yolo-trt/.venv/bin/activate.fishKiểm tra python3 đang trỏ vào venv và xem bản Python (máy thử: 3.14.8):
which python3 && python3 --versionCác thư viện chính trong venv, gồm cả gói CUDA do pip kéo về:
uv pip list | grep -Ei '^(torch|torchvision|ultralytics|tensorrt|onnx|opencv|numpy|nvidia-cudnn|nvidia-cuda-runtime)'Bản torch, bản CUDA mà torch dùng, cuDNN, và GPU có được nhận hay không:
python3 -c "import torch; print(torch.__version__, torch.version.cuda, torch.backends.cudnn.version(), torch.cuda.is_available(), torch.cuda.get_device_name(0))"Bản TensorRT mà Python đang dùng:
python3 -c "import tensorrt; print(tensorrt.__version__)"Bản ONNX Runtime và các provider khả dụng (phải có CUDAExecutionProvider):
python3 -c "import torch, onnxruntime as ort; print(ort.__version__, ort.get_available_providers())"Ultralytics có lệnh tự in tổng hợp môi trường (phiên bản, torch, CUDA, GPU, RAM):
yolo checksLưu lại để đối chiếu về sau
uv pip freeze > requirements-lock.txtpacman -Q cuda cudnn nvtop uv > system-versions.txtnvidia-smi --query-gpu=name,driver_version,compute_cap --format=csv >> system-versions.txt
Đang tải bình luận…