Machine Learning Platform for AI (PAI)-Blade menyediakan SDK untuk C++ yang dapat digunakan untuk menerapkan model yang dioptimalkan untuk inferensi. Topik ini menjelaskan cara menggunakan PAI-Blade SDK untuk menerapkan model PyTorch.
Prasyarat
Model PyTorch telah dioptimalkan dengan menggunakan PAI-Blade. Untuk informasi lebih lanjut, lihat Optimalkan Model PyTorch.
SDK telah diinstal, dan token otentikasi telah diperoleh. Dalam contoh ini, SDK untuk antarmuka biner aplikasi Pre-CXX11 (ABI) dan paket .deb versi V3.7.0 digunakan.
CatatanModel yang dioptimalkan dengan menggunakan PAI-Blade hanya dapat berjalan dengan benar jika SDK yang sesuai telah diinstal.
Siapkan lingkungan
Topik ini menjelaskan cara menggunakan PAI-Blade SDK untuk menerapkan model PyTorch untuk inferensi. Dalam contoh ini, Ubuntu 18.04 64-bit digunakan.
Persiapkan server.
Persiapkan instance Elastic Compute Service (ECS) dengan spesifikasi berikut:
Tipe instance: ecs.gn6i-c4g1.xlarge, NVIDIA Tesla T4 GPU
Sistem operasi: Ubuntu 18.04 64-bit
Perangkat: CUDA 10.0
GPU: Driver 440.64.00
Paket akselerasi komputasi GPU: cuDNN 7.6.5
Instal Python 3.
# Perbarui pip. python3 -m pip install --upgrade pip # Instal virtualenv, yang merupakan lingkungan virtual tempat Anda dapat menginstal PyTorch. pip3 install virtualenv==16.0 python3 -m virtualenv venv # Aktifkan virtualenv. source venv/bin/activate
Terapkan model untuk inferensi
Untuk menggunakan PAI-Blade SDK dalam memuat dan menerapkan model yang dioptimalkan untuk inferensi, Anda dapat menautkan pustaka dalam SDK saat mengompilasi kode inferensi tanpa perlu memodifikasi logika kode asli.
Persiapkan model dan data uji.
Dalam contoh ini, model sampel yang dioptimalkan digunakan. Jalankan perintah berikut untuk mengunduh model sampel. Anda juga dapat menggunakan model yang dioptimalkan sendiri. Untuk informasi lebih lanjut tentang cara mengoptimalkan model dengan menggunakan PAI-Blade, lihat Optimalkan Model PyTorch.
# Unduh model sampel yang dioptimalkan. wget http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/demo/sdk/pytorch/optimized_resnet50.pt # Unduh data uji. wget http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/demo/sdk/pytorch/inputs.pthUnduh dan lihat kode inferensi.
Anda dapat menjalankan model PyTorch yang dioptimalkan dengan menggunakan PAI-Blade dengan cara yang sama seperti model PyTorch biasa. Tidak diperlukan penulisan kode tambahan atau penyetelan parameter tambahan. Dalam contoh ini, kode antarmuka berikut diunduh:
#include <torch/script.h> #include <torch/serialize.h> #include <chrono> #include <iostream> #include <fstream> #include <memory> int benchmark(torch::jit::script::Module &module, std::vector<torch::jit::IValue> &inputs) { // warmup 10-iter for (int k = 0; k < 10; ++ k) { module.forward(inputs); } auto start = std::chrono::system_clock::now(); // run 20-iter for (int k = 0; k < 20; ++ k) { module.forward(inputs); } auto end = std::chrono::system_clock::now(); std::chrono::duration<double> elapsed_seconds = end-start; std::time_t end_time = std::chrono::system_clock::to_time_t(end); std::cout << "finished computation at " << std::ctime(&end_time) << "\nelapsed time: " << elapsed_seconds.count() << "s" << "\navg latency: " << 1000.0 * elapsed_seconds.count()/20 << "ms\n"; return 0; } torch::Tensor load_data(const char* data_file) { std::ifstream file(data_file, std::ios::binary); std::vector<char> data((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); torch::IValue ivalue = torch::pickle_load(data); CHECK(ivalue.isTensor()); return ivalue.toTensor(); } int main(int argc, const char* argv[]) { if (argc != 3) { std::cerr << "usage: example-app <path-to-exported-script-module> <path-to-saved-test-data>\n"; return -1; } torch::jit::script::Module module; try { // Deserialize the ScriptModule from a file using torch::jit::load(). module = torch::jit::load(argv[1]); auto image_tensor = load_data(argv[2]); std::vector<torch::jit::IValue> inputs{image_tensor}; benchmark(module, inputs); auto outputs = module.forward(inputs); } catch (const c10::Error& e) { std::cerr << "error loading the model" << std::endl << e.what(); return -1; } std::cout << "ok\n"; }Simpan kode sampel sebelumnya ke file lokal bernama torch_app.cc.
Kompilasi kode inferensi.
Saat mengompilasi kode, tautkan pustaka LibTorch serta file libtorch_blade.so dan libral_base_context.so di direktori /usr/local/lib. Jalankan perintah berikut untuk mengompilasi kode:
TORCH_DIR=$(python3 -c "import torch; import os; print(os.path.dirname(torch.__file__))") g++ torch_app.cc -std=c++14 \ -D_GLIBCXX_USE_CXX11_ABI=0 \ -I ${TORCH_DIR}/include \ -I ${TORCH_DIR}/include/torch/csrc/api/include \ -Wl,--no-as-needed \ -L /usr/local/lib \ -L ${TORCH_DIR}/lib \ -l torch -l torch_cuda -l torch_cpu -l c10 -l c10_cuda \ -l torch_blade -l ral_base_context \ -o torch_appAnda dapat memodifikasi parameter berikut berdasarkan kebutuhan bisnis Anda:
torch_app.cc: nama file yang berisi kode inferensi.
/usr/local/lib: jalur instalasi SDK. Dalam banyak kasus, Anda tidak perlu memodifikasi parameter ini.
torch_app: nama program yang dapat dieksekusi yang dihasilkan setelah kompilasi.
Dalam beberapa versi sistem dan kompiler, tautan hanya bekerja jika Anda menulis baris kode
-Wl,--no-as-needed \.PentingAtur nilai dari makro
GLIBCXX_USE_CXX11_ABIberdasarkan versi ABI LibTorch.PyTorch untuk CUDA 10.0 yang disediakan oleh PAI-Blade dikompilasi menggunakan GNU Compiler Collection (GCC) 7.5. Jika Anda menggunakan CXX11 ABI, pastikan bahwa versi GCC adalah 7.5. Jika Anda menggunakan Pre-CXX11 ABI, tidak ada batasan yang diberlakukan pada versi GCC.
Jalankan model untuk inferensi pada perangkat lokal.
Gunakan program yang dapat dieksekusi untuk memuat dan menjalankan model yang dioptimalkan. Contoh kode sampel berikut memberikan ilustrasi. Dalam contoh ini, program yang dapat dieksekusi torch_app dan model sampel yang dioptimalkan optimized_resnet50.pt digunakan.
export BLADE_REGION=<region> # Region: cn-beijing, cn-shanghai sebagai contoh. export BLADE_TOKEN=<token> export LD_LIBRARY_PATH=/usr/local/lib:${TORCH_DIR}/lib:${LD_LIBRARY_PATH} ./torch_app optimized_resnet50.pt inputs.pthModifikasi parameter berikut berdasarkan kebutuhan bisnis Anda:
<region>: wilayah tempat Anda menggunakan PAI-Blade. Anda dapat bergabung dengan grup DingTalk pengguna PAI-Blade untuk mendapatkan wilayah tempat PAI-Blade dapat digunakan.
<token>: token otentikasi yang diperlukan untuk menggunakan PAI-Blade. Anda dapat bergabung dengan grup DingTalk pengguna PAI-Blade untuk mendapatkan token otentikasi.
torch_app: program yang dapat dieksekusi yang dihasilkan setelah kompilasi.
optimized_resnet50.pt: model PyTorch yang dioptimalkan dengan menggunakan PAI-Blade. Dalam contoh ini, model sampel yang dioptimalkan yang diunduh di Langkah 1 digunakan.
inputs.pth: data uji. Dalam contoh ini, data uji yang diunduh di Langkah 1 digunakan.
Jika sistem menampilkan informasi serupa dengan output berikut, model sedang dijalankan.
finished computation at Wed Jan 27 20:03:38 2021 elapsed time: 0.513882s avg latency: 25.6941ms ok