Triton Inference Server
Triton Inference Server lưu trữ một model repository và trả lời các yêu cầu suy luận (inference) qua HTTP. LibreYOLO xuất đồ thị ONNX, sinh một config.pbtxt mang toàn bộ metadata của lần xuất dưới dạng một parameter Triton, và coi một model URL như một đường dẫn mô hình có thể tải được.
- Lệnh gọi
LibreYOLO("http://127.0.0.1:8000/yolo9")- Hàm hỗ trợ
create_triton_config(onnx_path, config_path, model_name=..., max_batch_size=8)- Extra
pip install "libreyolo[onnx,triton]"- Giao thức
- Chỉ inference V2 qua HTTP và HTTPS. Không có gRPC, xác thực, shared memory, hay load và unload mô hình.
- Thời gian chờ
- Timeout kết nối và timeout mạng mặc định là 30 giây
Cài đặt
pip install "libreyolo[onnx,triton]"Extra triton cài tritonclient[http]. Các extra cho gRPC và shared memory bị
loại bỏ có chủ đích: tích hợp này chỉ có inference V2 qua HTTP và HTTPS. Cần
onnx vì cả artifact được phục vụ lẫn bộ sinh config đều làm việc từ một đồ thị
ONNX.
Xây dựng model repository
Xuất với trục batch động, theo đúng bố cục thư mục mà Triton mong đợi.
from pathlib import Path from libreyolo import LibreYOLO model_dir = Path("triton_repo/yolo9/1")model_dir.mkdir(parents=True, exist_ok=True) LibreYOLO("LibreYOLO9t.pt").export( format="onnx", output_path=str(model_dir / "model.onnx"), dynamic=True, simplify=False,)from libreyolo import create_triton_config create_triton_config( "triton_repo/yolo9/1/model.onnx", "triton_repo/yolo9/config.pbtxt", model_name="yolo9", max_batch_size=8,)triton_repo/ yolo9/ config.pbtxt 1/ model.onnxTriton không giữ lại metadata tùy chỉnh của ONNX trong phản hồi model-config, nên
toàn bộ metadata đã xuất phải đi theo một đường khác. create_triton_config mã hóa
nó thành một parameter kiểu chuỗi JSON tên libreyolo_metadata trong
config.pbtxt, phát ra các khai báo đầu vào và đầu ra theo thứ tự trong đồ thị, xử
lý phần escape JSON, và ghim mô hình vào KIND_CPU.
Hàm hỗ trợ kiểm tra hợp lệ trước khi ghi. Nó đòi hỏi đúng một đầu vào cho đồ thị
ONNX, ít nhất một đầu ra, các shape tensor phân giải được, và metadata có map
names định nghĩa mọi chỉ số lớp đối tượng từ 0 đến nc - 1. Mô hình không qua
được bất kỳ kiểm tra nào trong số đó sẽ bị từ chối ngay lúc sinh config, chứ không
phải ở request đầu tiên.
max_batch_size: 8 khớp với một lần xuất động và cho phép server gom tới tám ảnh
mỗi request. Với đồ thị ONNX có batch cố định bằng 1, hãy dùng max_batch_size=0;
khi đó LibreYOLO gửi ảnh tuần tự.
Khởi động server
docker run --rm --name libreyolo-triton \ -p 8000:8000 -p 8002:8002 \ -v "$(pwd)/triton_repo:/models:ro" \ nvcr.io/nvidia/tritonserver:26.04-py3 \ tritonserver --model-repository=/models --exit-on-error=trueuntil curl --fail --silent http://127.0.0.1:8000/v2/health/ready; do sleep 1; donedocker stop libreyolo-tritonCác lệnh này ghim Triton Server 26.04 và cố ý bỏ qua các cờ GPU của Docker, vì dù
sao KIND_CPU trong config được sinh ra cũng đã chặn việc đặt mô hình lên GPU.
Chạy artifact
Một model URL của Triton chính là một đường dẫn mô hình. LibreYOLO() kiểm tra
scheme http hoặc https trước mọi xử lý đường dẫn cục bộ và trả về một backend
nói chuyện với server, nên chỗ gọi hàm giống hệt như với một checkpoint cục bộ, và
đối tượng Results trả về cũng vậy.
from libreyolo import LibreYOLO, SAMPLE_IMAGE remote = LibreYOLO("http://127.0.0.1:8000/yolo9")result = remote.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])from libreyolo import LibreYOLO, SAMPLE_IMAGE remote = LibreYOLO("http://127.0.0.1:8000/yolo9").predict(SAMPLE_IMAGE)native = LibreYOLO("LibreYOLO9t.pt").predict(SAMPLE_IMAGE) print(len(remote.boxes), len(native.boxes))print(remote.boxes.xyxy[:3])print(native.boxes.xyxy[:3])from libreyolo import LibreYOLOfrom libreyolo.backends.triton import TritonBackend # Đoạn path thứ hai chọn phiên bản mô hình. Nếu không có nó,# version policy đã cấu hình của Triton sẽ quyết địnhpinned = LibreYOLO("http://127.0.0.1:8000/yolo9/1") # Timeout kết nối và timeout mạng mặc định là 30 giâypatient = TritonBackend("http://127.0.0.1:8000/yolo9", timeout=120)Dạng URL là http(s)://host:port/model với một đoạn phiên bản tùy chọn. Port phải
được ghi rõ. Thông tin đăng nhập nhúng trong URL, query string và fragment đều bị
từ chối, đường dẫn có hơn hai đoạn cũng vậy.
device được chấp nhận rồi bỏ qua kèm một dòng log, vì việc đặt mô hình ở đâu là
quyết định của server.
Giới hạn
Backend báo lỗi thẳng thay vì trả về kết quả kém chất lượng khi hợp đồng không được đáp ứng: thiếu metadata LibreYOLO trong model config, mô hình có nhiều hơn một đầu vào, các đầu ra được cấu hình không khớp với metadata của mô hình, kiểu dữ liệu đầu vào mà nó không hỗ trợ, hoặc server hay mô hình chưa sẵn sàng.
Nằm ngoài hợp đồng ở phiên bản này: gRPC, xác thực, shared memory, và việc load hay unload mô hình qua API.
Bất kỳ format nào bản thân Triton hỗ trợ đều có thể được phục vụ, nhưng ở đây parameter metadata và config được sinh ra đều mang hình dạng ONNX, nên con đường của LibreYOLO là ONNX đưa vào repository. Nếu cần một pipeline video đầy đủ thay vì một server kiểu request-response, xem DeepStream.