RetinaNet adalah jaringan deteksi satu-tahap berbasis Region-based Convolutional Neural Networks (R-CNN). Struktur dasarnya terdiri dari backbone, beberapa subnetwork, dan menggunakan Non-Maximum Suppression (NMS) untuk post-processing. Banyak framework pelatihan, seperti Detectron2, mengimplementasikan RetinaNet. Topik ini menjelaskan cara menggunakan Blade untuk mengoptimalkan model RetinaNet (Detectron2), dengan implementasi standar di Detectron2 sebagai contoh.
Batasan
- Lingkungan sistem: Sistem Linux dengan Python 3.6 atau lebih baru dan CUDA 10.2.
- Framework: PyTorch 1.8.1 atau lebih baru dan Detectron2 0.4.1 atau lebih baru.
- Tool optimasi inferensi: Blade 3.16.0 atau lebih baru.
Prosedur
- Langkah 1: Ekspor model
Ekspor model menggunakan metode
TracingAdapteratauscripting_with_instancesyang disediakan oleh Detectron2. - Langkah 2: Panggil Blade untuk mengoptimalkan model
Panggil antarmuka
blade.optimizeuntuk mengoptimalkan model dan simpan model yang telah dioptimalkan. - Langkah 3: Muat dan jalankan model yang telah dioptimalkan
Jalankan uji kinerja. Jika hasilnya memuaskan, muat model yang telah dioptimalkan untuk inferensi.
Langkah 1: Ekspor model
Detectron2 adalah framework pelatihan open source yang fleksibel, dapat diperluas, dan dikonfigurasi dari Facebook AI Research (FAIR) untuk deteksi objek dan segmentasi gambar. Karena fleksibilitasnya, mengekspor model menggunakan metode konvensional mungkin gagal atau menghasilkan output yang salah. Untuk mendukung penerapan TorchScript, Detectron2 menyediakan dua metode ekspor: TracingAdapter dan scripting_with_instances. Untuk informasi selengkapnya, lihat Detectron2 Usage.
scripting_with_instances untuk menunjukkan proses ekspor model.import torch
import numpy as np
from torch import Tensor
from torch.testing import assert_allclose
from detectron2 import model_zoo
from detectron2.export import scripting_with_instances
from detectron2.structures import Boxes
from detectron2.data.detection_utils import read_image
# Ekspor model RetinaNet menggunakan scripting_with_instances.
def load_retinanet(config_path):
model = model_zoo.get(config_path, trained=True).eval()
fields = {
"pred_boxes": Boxes,
"scores": Tensor,
"pred_classes": Tensor,
}
script_model = scripting_with_instances(model, fields)
return model, script_model
# Unduh contoh gambar.
# wget http://images.cocodataset.org/val2017/000000439715.jpg -q -O input.jpg
img = read_image('./input.jpg')
img = torch.from_numpy(np.ascontiguousarray(img.transpose(2, 0, 1)))
# Jalankan dan bandingkan hasil sebelum dan sesudah mengekspor model.
pytorch_model, script_model = load_retinanet("COCO-Detection/retinanet_R_50_FPN_3x.yaml")
with torch.no_grad():
batched_inputs = [{"image": img.float()}]
pred1 = pytorch_model(batched_inputs)
pred2 = script_model(batched_inputs)
assert_allclose(pred1[0]['instances'].scores, pred2[0].scores)Langkah 2: Panggil Blade untuk mengoptimalkan model
- Panggil antarmuka optimasi Blade.
Panggil antarmuka
blade.optimizeuntuk mengoptimalkan model. Kode berikut memberikan contohnya. Untuk informasi selengkapnya tentang antarmukablade.optimize, lihat Optimalkan model PyTorch.import blade test_data = [(batched_inputs,)] # Data masukan untuk PyTorch berupa daftar tuple. optimized_model, opt_spec, report = blade.optimize( script_model, # Model TorchScript yang diekspor pada langkah sebelumnya. 'o1', # Aktifkan optimasi tingkat O1 Blade. device_type='gpu', # Perangkat target adalah GPU. test_data=test_data, # Set data uji yang diberikan untuk membantu optimasi dan pengujian. ) - Cetak laporan optimasi dan simpan model.
Model yang dioptimalkan oleh Blade tetap merupakan model TorchScript. Setelah optimasi selesai, gunakan kode berikut untuk mencetak laporan optimasi dan menyimpan model yang telah dioptimalkan.
Berikut adalah laporan optimasi yang dicetak. Untuk informasi selengkapnya tentang bidang dalam laporan optimasi, lihat Laporan optimasi.# Cetak laporan optimasi. print("Report: {}".format(report)) # Simpan model yang telah dioptimalkan. torch.jit.save(optimized_model, 'optimized.pt')Report: { "software_context": [ { "software": "pytorch", "version": "1.8.1+cu102" }, { "software": "cuda", "version": "10.2.0" } ], "hardware_context": { "device_type": "gpu", "microarchitecture": "T4" }, "user_config": "", "diagnosis": { "model": "unnamed.pt", "test_data_source": "user provided", "shape_variation": "undefined", "message": "Unable to deduce model inputs information (data type, shape, value range, etc.)", "test_data_info": "0 shape: (3, 480, 640) data type: float32" }, "optimizations": [ { "name": "PtTrtPassFp16", "status": "effective", "speedup": "3.77", "pre_run": "40.64 ms", "post_run": "10.78 ms" } ], "overall": { "baseline": "40.73 ms", "optimized": "10.76 ms", "speedup": "3.79" }, "model_info": { "input_format": "torch_script" }, "compatibility_list": [ { "device_type": "gpu", "microarchitecture": "T4" } ], "model_sdk": {} } - Jalankan uji kinerja pada model sebelum dan sesudah optimasi.
Kode berikut memberikan contoh uji kinerja.
Berikut adalah hasil referensi untuk pengujian ini.import time @torch.no_grad() def benchmark(model, inp): for i in range(100): model(inp) torch.cuda.synchronize() start = time.time() for i in range(200): model(inp) torch.cuda.synchronize() elapsed_ms = (time.time() - start) * 1000 print("Latency: {:.2f}".format(elapsed_ms / 200)) # Uji kecepatan model asli. benchmark(pytorch_model, batched_inputs) # Uji kecepatan model yang telah dioptimalkan. benchmark(optimized_model, batched_inputs)
Hasil menunjukkan bahwa setelah 200 kali eksekusi, latensi rata-rata model asli dan model yang telah dioptimalkan masing-masing adalah 42,38 ms dan 10,77 ms.Latency: 42.38 Latency: 10.77
Langkah 3: Muat dan jalankan model yang telah dioptimalkan
Opsional: Selama masa percobaan, tambahkan pengaturan variabel lingkungan berikut untuk mencegah program berhenti tiba-tiba akibat kegagalan otentikasi:
export BLADE_AUTH_USE_COUNTING=1Lakukan otentikasi untuk menggunakan PAI-Blade.
export BLADE_REGION=<region> export BLADE_TOKEN=<token>Konfigurasikan parameter berikut sesuai kebutuhan bisnis Anda:
<region>: wilayah tempat Anda menggunakan PAI-Blade. Anda dapat bergabung dengan grup DingTalk pengguna PAI-Blade untuk memperoleh daftar wilayah tempat PAI-Blade tersedia. Informasi tentang kode QR grup DingTalk tersedia di Install PAI-Blade.
<token>: token otentikasi yang diperlukan untuk menggunakan PAI-Blade. Anda dapat bergabung dengan grup DingTalk pengguna PAI-Blade untuk memperoleh token otentikasi tersebut. Informasi tentang kode QR grup DingTalk tersedia di Install PAI-Blade.
- Terapkan model.
Model yang dioptimalkan oleh Blade tetap merupakan model TorchScript. Oleh karena itu, Anda dapat memuat model yang telah dioptimalkan tanpa perlu mengganti lingkungan.
import blade.runtime.torch import detectron2 import torch from torch.testing import assert_allclose from detectron2.utils.testing import ( get_sample_coco_image, ) pytorch_model = model_zoo.get("COCO-Detection/retinanet_R_50_FPN_3x.yaml", trained=True).eval() optimized_model = torch.jit.load('optimized.pt') img = read_image('./input.jpg') img = torch.from_numpy(np.ascontiguousarray(img.transpose(2, 0, 1))) with torch.no_grad(): batched_inputs = [{"image": img.float()}] pred1 = pytorch_model(batched_inputs) pred2 = optimized_model(batched_inputs) assert_allclose(pred1[0]['instances'].scores, pred2[0].scores, rtol=1e-3, atol=1e-2)