TorchScript

TorchScript adalah format serialized-graph milik PyTorch sendiri. LibreYOLO melakukan tracing pada model dengan torch.jit.trace dan menyimpan hasilnya bersama berkas extra libreyolo_metadata.json, sehingga arsipnya membawa family, task, nama kelas dan ukuran input.

Flag
export(format="torchscript")
Menulis
Satu arsip .torchscript dengan berkas extra libreyolo_metadata.json
Tambahan
Tidak ada. TorchScript sudah termasuk dalam PyTorch.
Dimuat kembali
LibreYOLO("weights/LibreYOLO9t.torchscript")
Bentuk
Tetap. Graph dihasilkan dari tracing pada satu bentuk input.
Presisi
FP32, FP16 (half=True). Tidak ada INT8.

Instalasi

Instalasi
pip install libreyolo

TorchScript tidak butuh apa pun di luar instalasi dasar, karena torch.jit sudah termasuk dalam PyTorch. Ini satu-satunya target ekspor tanpa dependensi opsional dan tanpa converter eksternal, sehingga berguna sebagai pemeriksaan pertama ketika toolchain yang lebih panjang gagal.

Ekspor

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Menulis weights/LibreYOLO9t.torchscriptpath = model.export(format="torchscript")print(path)
CLI
libreyolo export --model LibreYOLO9t.pt --format torchscript
Argumen
model.export(    format="torchscript",    imgsz=640,        # int, atau (height, width)    batch=1,    half=False,       # bobot dan aktivasi FP16    device=None,      # None melakukan tracing di CPU untuk format ini    output_path=None, # None menulis weights/<stem>.torchscript) # dynamic diterima, tetapi arsipnya selalu berupa trace dengan bentuk tetap,# dan metadata yang tertanam tetap mencatat dynamic=False.

Tracing berjalan di CPU kecuali ada device yang disebutkan, dan arsipnya ditulis ke weights/ memakai nama dasar checkpoint ketika output_path tidak diisi.

Pemeriksaan retrace yang biasanya dilakukan torch.jit.trace dimatikan. Beberapa wrapper ekspor menyimpan cache anchor yang bergantung pada bentuk saat forward pass pertama, sehingga trace kedua melihat jalur Python yang berbeda meskipun graph bentuk tetap yang terekam sudah benar. Sebagai gantinya, uji paritas memvalidasi modul yang tersimpan secara langsung.

Metadata tidak ditaruh di berkas sidecar. torch.jit.save menyimpan libreyolo_metadata.json di dalam arsip, dan torch.jit.load mengembalikannya lewat _extra_files.

Menjalankan artefak

Lewat LibreYOLO
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("weights/LibreYOLO9t.torchscript")result = model.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])
Langsung dengan PyTorch
import json import torch extra_files = {"libreyolo_metadata.json": ""}module = torch.jit.load(    "weights/LibreYOLO9t.torchscript",    map_location="cpu",    _extra_files=extra_files,)module.eval() metadata = json.loads(extra_files["libreyolo_metadata.json"])print(metadata["model_family"], metadata["task"], metadata["imgsz"]) # Preprocessing dan postprocessing jadi tanggung jawab Anda di jalur ini.with torch.no_grad():    out = module(torch.zeros(1, 3, 640, 640))print(out.shape if torch.is_tensor(out) else [t.shape for t in out])

LibreYOLO() melakukan routing berdasarkan sufiks .torchscript dan mengembalikan objek Results yang sama seperti checkpoint asalnya. Dengan device="auto", modulnya dipetakan ke CUDA bila tersedia, lalu MPS, lalu CPU.

Snippet kedua adalah jalur untuk pembaca yang tidak memasang LibreYOLO, dan untuk deployment C++ lewat libtorch, tempat arsip yang sama dimuat dengan torch::jit::load. Di sana, preprocessing, decoding, NMS dan penskalaan ulang koordinat menjadi tanggung jawab Anda. Berkas extra metadata tetap bisa dibaca, dan hanya di situlah nama kelas tersimpan.

Batasan

Graph-nya adalah trace pada satu bentuk input. dynamic=True diterima demi simetri antarmuka tetapi tidak mengubah apa pun, dan metadata yang tertanam melaporkan dynamic=False supaya backend tidak pernah mengasumsikan sumbu yang tidak bisa dipakainya. Ekspor arsip kedua untuk resolusi kedua.

half=True melakukan cast pada model dan input trace ke FP16. Tidak ada jalur INT8: int8=True memunculkan NotImplementedError saat validasi.

imgsz persegi panjang bekerja untuk family YOLO9, HRNet, NAFNet dan Real-ESRGAN, dan ditolak untuk family dengan kontrak persegi tetap.

Lima kombinasi ditolak sebelum tracing. Segmentasi YOLO9, karena YOLO9 hanya untuk deteksi di LibreYOLO. Segmentasi RTMDet-Ins, yang decode mask dengan kernel dinamisnya tidak punya kontrak runtime hasil ekspor. Deteksi SSD, Faster R-CNN dan RetinaNet, yang graph berpanjang variabel atau ber-anchor dinamisnya hanya punya bukti paritas melalui kontrak ONNX Runtime.

Untuk grid family dan task lengkap, lihat matriks ekspor. Untuk satu kombinasi:

Memeriksa satu family dan task sebelum mengekspor
libreyolo formats --family yolo9 --task detect

Dibaca dari libreyolo/export/torchscript.py, libreyolo/export/exporter.py, libreyolo/export/support.py dan libreyolo/backends/torchscript.py di branch dev.