Binding karat untuk C ++ API dari Pytorch. Tujuan peti tch adalah untuk menyediakan beberapa pembungkus tipis di sekitar C ++ Pytorch API (alias libtorch). Ini bertujuan untuk tetap sedekat mungkin dengan C ++ API asli. Binding karat yang lebih idiomatik kemudian dapat dikembangkan di atas ini. Dokumentasi dapat ditemukan di Docs.Rs.
Changelog
Bagian pembuatan kode untuk API C di atas LiborTor berasal dari Ocaml-torch.
Peti ini membutuhkan C ++ Pytorch Library (LIBTORCH) di Versi v2.5.1 agar tersedia di sistem Anda. Anda bisa:
LIBTORCH .LIBTORCH_USE_PYTORCH=1 .LIBTORCH tidak diatur, skrip build dapat mengunduh versi biner pra-buatan libtorch dengan menggunakan fitur download-libtorch . Secara default versi CPU digunakan. Variabel lingkungan TORCH_CUDA_VERSION dapat diatur ke cu117 untuk mendapatkan biner pra-dibangun menggunakan CUDA 11.7. Pada platform Linux, skrip build akan mencari perpustakaan liborTorch di seluruh sistem di /usr/lib/libtorch.so .
Jika variabel lingkungan LIBTORCH_USE_PYTORCH diatur, penerjemah Python aktif dipanggil untuk mengambil informasi tentang paket Python Torch. Versi ini kemudian dihubungkan.
libtorch dari bagian Unduh Situs Web Pytorch dan ekstrak konten file ZIP..bashrc Anda atau setara, di mana /path/to/libtorch adalah jalur ke direktori yang dibuat saat membuka ritsleting file. export LIBTORCH=/path/to/libtorchLokasi file header juga dapat ditentukan secara terpisah dari pustaka bersama melalui yang berikut:
# LIBTORCH_INCLUDE must contain `include` directory.
export LIBTORCH_INCLUDE=/path/to/libtorch/
# LIBTORCH_LIB must contain `lib` directory.
export LIBTORCH_LIB=/path/to/libtorch/ Untuk pengguna Windows, dengan asumsi bahwa X:pathtolibtorch adalah direktori libtorch unzip.
LIBTORCH dan atur ke X:pathtolibtorch .X:pathtolibtorchlib ke variabel Path .Jika Anda lebih suka mengatur variabel lingkungan sementara, di PowerShell Anda dapat menjalankan
$ Env: LIBTORCH = " X:pathtolibtorch "
$ Env: Path += " ;X:pathtolibtorchlib "cargo run --example basics .Sesuai dokumen Pytorch, debug dan rilis Windows tidak kompatibel dengan Abi. Ini dapat menyebabkan beberapa segfault jika versi LIBTORCH yang salah digunakan.
Disarankan untuk menggunakan msvc rust toolchain (misalnya dengan memasang stable-x86_64-pc-windows-msvc melalui rustup) daripada yang berbasis MINGW karena pytorch memiliki masalah kompatibilitas dengan MINGW.
Saat mengatur variabel lingkungan LIBTORCH_STATIC=1 , libtorch secara statis dihubungkan daripada menggunakan pustaka dinamis. Artefak yang telah dikompilasi tampaknya tidak menyertakan libtorch.a secara default sehingga ini harus dikompilasi secara manual, misalnya melalui yang berikut:
git clone -b v2.5.1 --recurse-submodule https://github.com/pytorch/pytorch.git pytorch-static --depth 1
cd pytorch-static
USE_CUDA=OFF BUILD_SHARED_LIBS=OFF python setup.py build
# export LIBTORCH to point at the build directory in pytorch-static. Peti ini menyediakan jenis tensor yang membungkus tensor pytorch. Berikut adalah contoh minimal tentang cara melakukan beberapa operasi tensor.
use tch :: Tensor ;
fn main ( ) {
let t = Tensor :: from_slice ( & [ 3 , 1 , 4 , 1 , 5 ] ) ;
let t = t * 2 ;
t . print ( ) ;
} Pytorch memberikan diferensiasi otomatis untuk sebagian besar operasi tensor yang didukungnya. Ini biasanya digunakan untuk melatih model menggunakan keturunan gradien. Optimalisasi dilakukan lebih dari variabel yang dibuat melalui nn::VarStore dengan mendefinisikan bentuk dan inisialisasi mereka.
Dalam contoh di bawah my_module menggunakan dua variabel x1 dan x2 yang nilai awalnya 0. Pass maju yang diterapkan pada Tensor xs mengembalikan xs * x1 + exp(xs) * x2 .
Setelah model dihasilkan, pengoptimal nn::Sgd dibuat. Kemudian pada setiap langkah loop pelatihan:
VarStore dimodifikasi sesuai. use tch :: nn :: { Module , OptimizerConfig } ;
use tch :: { kind , nn , Device , Tensor } ;
fn my_module ( p : nn :: Path , dim : i64 ) -> impl nn :: Module {
let x1 = p . zeros ( "x1" , & [ dim ] ) ;
let x2 = p . zeros ( "x2" , & [ dim ] ) ;
nn :: func ( move |xs| xs * & x1 + xs . exp ( ) * & x2 )
}
fn gradient_descent ( ) {
let vs = nn :: VarStore :: new ( Device :: Cpu ) ;
let my_module = my_module ( vs . root ( ) , 7 ) ;
let mut opt = nn :: Sgd :: default ( ) . build ( & vs , 1e-2 ) . unwrap ( ) ;
for _idx in 1 .. 50 {
// Dummy mini-batches made of zeros.
let xs = Tensor :: zeros ( & [ 7 ] , kind :: FLOAT_CPU ) ;
let ys = Tensor :: zeros ( & [ 7 ] , kind :: FLOAT_CPU ) ;
let loss = ( my_module . forward ( & xs ) - ys ) . pow_tensor_scalar ( 2 ) . sum ( kind :: Kind :: Float ) ;
opt . backward_step ( & loss ) ;
}
} nn API dapat digunakan untuk membuat arsitektur jaringan saraf, misalnya kode berikut menentukan model sederhana dengan satu lapisan tersembunyi dan melatihnya pada dataset MNIST menggunakan Adam Optimizer.
use anyhow :: Result ;
use tch :: { nn , nn :: Module , nn :: OptimizerConfig , Device } ;
const IMAGE_DIM : i64 = 784 ;
const HIDDEN_NODES : i64 = 128 ;
const LABELS : i64 = 10 ;
fn net ( vs : & nn :: Path ) -> impl Module {
nn :: seq ( )
. add ( nn :: linear (
vs / "layer1" ,
IMAGE_DIM ,
HIDDEN_NODES ,
Default :: default ( ) ,
) )
. add_fn ( |xs| xs . relu ( ) )
. add ( nn :: linear ( vs , HIDDEN_NODES , LABELS , Default :: default ( ) ) )
}
pub fn run ( ) -> Result < ( ) > {
let m = tch :: vision :: mnist :: load_dir ( "data" ) ? ;
let vs = nn :: VarStore :: new ( Device :: Cpu ) ;
let net = net ( & vs . root ( ) ) ;
let mut opt = nn :: Adam :: default ( ) . build ( & vs , 1e-3 ) ? ;
for epoch in 1 .. 200 {
let loss = net
. forward ( & m . train_images )
. cross_entropy_for_logits ( & m . train_labels ) ;
opt . backward_step ( & loss ) ;
let test_accuracy = net
. forward ( & m . test_images )
. accuracy_for_logits ( & m . test_labels ) ;
println ! (
"epoch: {:4} train loss: {:8.5} test acc: {:5.2}%" ,
epoch ,
f64 :: from ( & loss ) ,
100. * f64 :: from ( & test_accuracy ) ,
) ;
}
Ok ( ( ) )
}Rincian lebih lanjut tentang loop pelatihan dapat ditemukan dalam tutorial terperinci.
Contoh model pretrained menggambarkan cara menggunakan beberapa model visi komputer pra-terlatih pada suatu gambar. Bobot - yang telah diekstraksi dari implementasi Pytorch - dapat diunduh di sini resnet18.ot dan di sini resnet34.ot.
Contohnya kemudian dapat dijalankan melalui perintah berikut:
cargo run --example pretrained-models -- resnet18.ot tiger.jpgIni harus mencetak 5 kategori Imagenet teratas untuk gambar. Kode untuk contoh ini cukup sederhana.
// First the image is loaded and resized to 224x224.
let image = imagenet :: load_image_and_resize ( image_file ) ? ;
// A variable store is created to hold the model parameters.
let vs = tch :: nn :: VarStore :: new ( tch :: Device :: Cpu ) ;
// Then the model is built on this variable store, and the weights are loaded.
let resnet18 = tch :: vision :: resnet :: resnet18 ( vs . root ( ) , imagenet :: CLASS_COUNT ) ;
vs . load ( weight_file ) ? ;
// Apply the forward pass of the model to get the logits and convert them
// to probabilities via a softmax.
let output = resnet18
. forward_t ( & image . unsqueeze ( 0 ) , /*train=*/ false )
. softmax ( - 1 ) ;
// Finally print the top 5 categories and their associated probabilities.
for ( probability , class ) in imagenet :: top ( & output , 5 ) . iter ( ) {
println ! ( "{:50} {:5.2}%" , class , 100.0 * probability )
} safetensors adalah format sederhana baru dengan memeluk wajah untuk menyimpan tensor. Itu tidak bergantung pada modul pickle Python, dan oleh karena itu tensor tidak terikat pada kelas spesifik dan struktur direktori yang tepat yang digunakan ketika model disimpan. Ini juga nol-copy, yang berarti membaca file tidak akan memerlukan lebih banyak memori daripada file asli.
Untuk informasi lebih lanjut tentang safetensors , silakan lihat https://github.com/huggingface/safetensors
safetensors Anda dapat menginstal safetensors melalui PIP Manager:
pip install safetensors
import torchvision
from safetensors import torch as stt
model = torchvision . models . resnet18 ( pretrained = True )
stt . save_file ( model . state_dict (), 'resnet18.safetensors' ) Catatan: Nama file ekspor harus dinamai dengan akhiran .safetensors agar dapat diterjemahkan dengan benar oleh tch .
tch use anyhow :: Result ;
use tch :: {
Device ,
Kind ,
nn :: VarStore ,
vision :: {
imagenet ,
resnet :: resnet18 ,
}
} ;
fn main ( ) -> Result < ( ) > {
// Create the model and load the pre-trained weights
let mut vs = VarStore :: new ( Device :: cuda_if_available ( ) ) ;
let model = resnet18 ( & vs . root ( ) , 1000 ) ;
vs . load ( "resnet18.safetensors" ) ? ;
// Load the image file and resize it to the usual imagenet dimension of 224x224.
let image = imagenet :: load_image_and_resize224 ( "dog.jpg" ) ?
. to_device ( vs . device ( ) ) ;
// Apply the forward pass of the model to get the logits
let output = image
. unsqueeze ( 0 )
. apply_t ( & model , false )
. softmax ( - 1 , Kind :: Float ) ;
// Print the top 5 categories for this image.
for ( probability , class ) in imagenet :: top ( & output , 5 ) . iter ( ) {
println ! ( "{:50} {:5.2}%" , class , 100.0 * probability )
}
Ok ( ( ) )
}Contoh lebih lanjut meliputi:
Bahan Eksternal:
tch-rs dan opencv untuk menjalankan inferensi pada feed webcam untuk beberapa model terlatih Python berdasarkan MobileNet V3. Lihat beberapa detail di utas ini.
Periksa masalah ini.
Lihat masalah ini, ini bisa disebabkan oleh karat-analyzer yang tidak tahu tentang variabel lingkungan yang tepat seperti LIBTORCH dan LD_LIBRARY_PATH .
Dimungkinkan untuk memanggil kode Rust/TCH dari Python melalui Pyo3, TCH-EXT memberikan contoh ekstensi Python tersebut.
Jika Anda mendapatkan kesalahan tentang tidak menemukan beberapa perpustakaan bersama saat menjalankan binari yang dihasilkan (misalnya error while loading shared libraries: libtorch_cpu.so: cannot open shared object file: No such file or directory ). Anda dapat mencoba menambahkan yang berikut ini ke .bashrc Anda di mana /path/to/libtorch adalah jalur ke instalasi libtorch Anda.
# For Linux
export LD_LIBRARY_PATH=/path/to/libtorch/lib:$LD_LIBRARY_PATH
# For macOS
export DYLD_LIBRARY_PATH=/path/to/libtorch/lib:$DYLD_LIBRARY_PATH
tch-rs didistribusikan berdasarkan ketentuan lisensi MIT dan lisensi Apache (versi 2.0), atas opsi Anda.
Lihat Lisensi-Apache, lisensi-mit untuk lebih jelasnya.