Bài viết

VNLFVNLF Social
?
Đăng nhậpĐể dùng đầy đủ tính năng
Bảng tinKhám pháTin nhắnVoiceHỗ trợ CaramOS
VNLF trên các mạng xã hội khác
Cài đặtTrợ giúpĐăng nhập
Giao diện
Bảng tinKhám pháTin nhắnVoice
Article9 phút đọc

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

ArchonDvnlf logo (1)CachyOS@ArchonD

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-cachyos 7.2.11-1 (kèm linux-cachyos-lts 6.18.55-2)

  • Driver: nvidia-open-dkms 615.78.08 (nvidia-smi báo CUDA UMD Version 13.4)

  • cuda 13.4.3-1 (nvcc 13.4.92)

  • cudnn 9.27.0.42-1.1

  • nvtop 3.3.2-1.1

  • uv 0.13.4-1.1

  • TensorRT 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

  • ultralytics 8.4.116 (kèm ultralytics-thop 2.1.6)

  • torch 2.13.0 (build +cu130) / torchvision 0.28.0

  • nvidia-cuda-runtime 13.0.96, nvidia-cudnn-cu13 9.20.0.48

  • tensorrt-cu13 11.2.1.2 (kèm tensorrt-cu13-bindings và tensorrt-cu13-libs cùng bản 11.2.1.2)

  • onnx 1.22.0

  • onnxruntime-gpu 1.30.0

  • onnxslim 0.1.96

  • opencv-python 5.0.0.93

  • numpy 2.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 -Syu

Sau đó 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 --list
sudo chwd -a
sudo reboot

Sau khi khởi động lại, kiểm tra driver (máy thử cho ra driver 615.78.08):

nvidia-smi

Bước 2 — Cài CUDA và cuDNN

sudo pacman -S --needed cuda cudnn nvtop

Trê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' >> ~/.bashrc

Nếu dùng fish:

fish_add_path /opt/cuda/bin

Mở 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ó nvcc và 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 uv
mkdir -p ~/yolo-trt && cd ~/yolo-trt
uv venv --seed --python 3.14 .venv

Kích hoạt venv (bash/zsh):

source .venv/bin/activate

Hoặc nếu dùng fish:

source .venv/bin/activate.fish

Bướ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.116

Sau đó 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.2

Lư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.txt

Chỉ 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.py

Hoặ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ố định 1×3×640×640, để TensorRT chọn kernel tối ưu cho đúng shape này.

  • simplify=True: rút gọn đồ thị ONNX bằng onnxslim.

  • 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.py

Build 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 yolov8s

Bướ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.mp4

Chạy với webcam và hiển thị cửa sổ:

python infer_video.py --model yolov8n.engine --source 0 --show

Trê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 --show

Bướ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 tensorrt

Build 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 --fp16

Bản TensorRT trong venv hiện là 11.2.1.2. Từ TensorRT 11.x, NVIDIA đã loại bỏ cờ --fp16 và trtexec sẽ 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ài trtexec từ AUR, nên chọn cùng bản 11.2.1.2 với venv, rồi chạy trtexec --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ần trtexec.

Engine do trtexec build không có metadata của Ultralytics, nên không nạp được bằng YOLO(). 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 TensorRT nghĩ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.py
  • Nếu ONNX Runtime rơi về CPU (thiếu libcudart.so.13 hoặc libcudnn.so.9), kiểm tra bạn đã import torch trước onnxruntime và chỉ cài đúng gói onnxruntime-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 -r

Tên GPU, phiên bản driver và compute capability:

nvidia-smi --query-gpu=name,driver_version,compute_cap --format=csv

Gó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-smi

Cá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 uv

Gó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 tensorrt

Bản nvcc (cần /opt/cuda/bin trong PATH):

nvcc --version

Bả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/activate
source ~/yolo-trt/.venv/bin/activate.fish

Kiểm tra python3 đang trỏ vào venv và xem bản Python (máy thử: 3.14.8):

which python3 && python3 --version

Cá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 checks

Lưu lại để đối chiếu về sau

uv pip freeze > requirements-lock.txt
pacman -Q cuda cudnn nvtop uv > system-versions.txt
nvidia-smi --query-gpu=name,driver_version,compute_cap --format=csv >> system-versions.txt

3

Thảo luận

0 bình luận

Đang tải bình luận…

?