PAI-Blade mendukung kuantisasi INT8 untuk model TensorFlow dan PyTorch pada GPU. Kuantisasi mengurangi penggunaan memori model dan meningkatkan throughput inferensi dengan mengganti bilangan titik mengambang 32-bit menggunakan bilangan bulat titik tetap berlebar bit lebih rendah.
Kuantisasi INT8 memerlukan GPU yang mendukung komputasi INT8. Jika perangkat GPU yang Anda gunakan mendukung kuantisasi INT8 dan model terkuantisasi dapat dipercepat, PAI-Blade akan menerapkan kuantisasi.
Cara kerja
Mode online vs. mode offline
| Online mode | Offline mode | |
|---|---|---|
| Calibration dataset | Tidak diperlukan | Diperlukan |
| Acceleration | Lebih rendah | Lebih tinggi (disarankan) |
| Quantization parameters | Dihitung tanpa calibration dataset | Dihitung dari data kalibrasi |
Model TensorFlow mendukung kedua mode tersebut, sedangkan model PyTorch hanya tersedia dalam mode offline—calibration dataset diperlukan.
Calibration dataset
Calibration dataset harus merepresentasikan distribusi nyata dari input inferensi Anda. Contoh kode dalam topik ini menggunakan 10 sampel hanya untuk ilustrasi.
| Framework | Format |
|---|---|
| TensorFlow | Daftar argumen feed_dict; semua nilai harus berupa np.ndarray |
| PyTorch | Daftar yang berisi beberapa kelompok data masukan |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
GPU yang mendukung kuantisasi INT8
PAI-Blade terinstal di lingkungan Python Anda
Model TensorFlow (frozen) atau PyTorch (traced) yang telah dilatih
Kuantisasi model TensorFlow
Atur optimization_level='o2' dalam blade.optimize() untuk mengaktifkan kuantisasi. Untuk hasil terbaik, sediakan calibration dataset agar berjalan dalam mode offline.
Persiapkan calibration dataset:
# Persiapkan calibration dataset.
import numpy as np
calib_data = list()
for i in range(10):
# Semua nilai dalam argumen feed_dict harus bertipe np.ndarray.
feed_dict = {'input:0': np.ones((32, 224, 224, 3), dtype=np.float32)}
calib_data.append(feed_dict)Langkah-langkah:
Unduh model contoh, data uji, dan calibration dataset.
wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/frozen.pb wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/test_bc32.npy wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/calib_data_test_bc32.npyMuat model dan data.
import numpy as np import tensorflow as tf # Muat model. graph_def = tf.GraphDef() with open('frozen.pb', 'rb') as f: graph_def.ParseFromString(f.read()) # Muat data uji. test_data = np.load('test_bc32.npy', allow_pickle=True, encoding='bytes',).item() # Muat calibration dataset. calib_data = np.load('calib_data_test_bc32.npy', allow_pickle=True, encoding='bytes',)Jalankan kuantisasi INT8 dalam mode offline.
import blade optimized_model, opt_spec, report = blade.optimize( model=graph_def, optimization_level='o2', device_type='gpu', test_data=test_data, calib_data=calib_data )Verifikasi presisi model terkuantisasi. Gunakan set data uji lengkap untuk memeriksa apakah presisi turun secara signifikan. Jika presisi memenuhi kebutuhan Anda, kuantisasi selesai. Jika penurunan presisi terlalu tinggi, aktifkan
weight_adjustmentagar PAI-Blade secara otomatis menyesuaikan parameter model. Opsi ini hanya tersedia untuk model TensorFlow pada GPU.quant_config = { 'weight_adjustment': 'true' # Nilai default: false. } optimized_model, opt_spec, report = blade.optimize( model=graph_def, optimization_level='o2', device_type='gpu', test_data=test_data, calib_data=calib_data, config=blade.Config(quant_config=quant_config) )Untuk semua opsi konfigurasi kuantisasi yang tersedia, lihat blade.Config.
Kuantisasi model PyTorch
Model PyTorch hanya dapat dikuantisasi dalam mode offline. Calibration dataset diperlukan.
Atur optimization_level='o2' dalam blade.optimize() untuk mengaktifkan kuantisasi.
Persiapkan calibration dataset:
# Persiapkan calibration dataset.
import torch
calib_data = list()
for i in range(10):
image = torch.ones(32, 3, 224, 224)
calib_data.append(image)Langkah-langkah:
Unduh model contoh, data uji, dan calibration dataset.
wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/pt_resnet50_v1.5/traced_model.pt wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/pt_resnet50_v1.5/test_bc32.pth wget https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/pt_resnet50_v1.5/calib_data_test_bc32.pthMuat model dan data.
import torch # Muat model. pt_model = torch.jit.load('traced_model.pt') # Muat data uji. test_data = torch.load('test_bc32.pth') # Muat calibration dataset. calib_data = torch.load('calib_data_test_bc32.pth')Jalankan kuantisasi INT8 dalam mode offline.
import blade optimized_model, opt_spec, report = blade.optimize( model=pt_model, optimization_level='o2', device_type='gpu', test_data=test_data, calib_data=calib_data )
Langkah selanjutnya
Untuk mengoptimalkan model TensorFlow dengan level optimasi lainnya, lihat Optimize a TensorFlow model.
Untuk semua opsi konfigurasi kuantisasi termasuk
weight_adjustment, lihat blade.Config.