Bu, PyTorch modelini WebGPU hızlandırmasıyla tarayıcıda çalışacak şekilde dönüştürme sürecini kapsayan uçtan uca bir LiteRT.js kılavuzudur. Bu örnekte, görsel model için ResNet18, ön ve son işleme için ise TensorFlow.js kullanılmaktadır.
Bu kılavuzda aşağıdaki adımlar ele alınacaktır:
- AI Edge
Torch'u kullanarak PyTorch modelinizi LiteRT'ye dönüştürün.
- LiteRT paketini web uygulamanıza ekleyin.
- Modeli yükleyin.
- İşleme öncesi ve işleme sonrası mantığını yazın.
LiteRT'ye dönüştürme
PyTorch modelini uygun .tflite
biçimine dönüştürmek için PyTorch Converter
not defterini
kullanın. Karşılaşabileceğiniz hata türleri ve bunları nasıl düzeltebileceğiniz hakkında ayrıntılı bilgi için AI Edge Torch Converter README'yi inceleyin.
Modeliniz torch.export.export
ile uyumlu olmalıdır. Bu da modelinizin TorchDynamo ile dışa aktarılabilir olması gerektiği anlamına gelir. Bu nedenle, tensörlerdeki çalışma zamanı değerlerine bağlı herhangi bir python koşullu dalı olmamalıdır. Aşağıdaki hataları torch.export.export
sırasında görürseniz
torch.export.export
,
modeliniz torch.export.export
ile dışa aktarılamaz. Modelinizin tensörlerinde dinamik giriş veya çıkış boyutları da olmamalıdır. Buna toplu boyut da dahildir.
Ayrıca TensorRT ile uyumlu veya ONNX'e aktarılabilir bir PyTorch modeliyle de başlayabilirsiniz:
TensorRT uyumlu bir model sürümü iyi bir başlangıç noktası olabilir. Çünkü bazı TensorRT dönüşümleri için modellerin TorchDynamo ile dışa aktarılabilir olması gerekir. Modelde herhangi bir NVIDIA / CUDA işlemi kullanıyorsanız bunları standart PyTorch işlemleriyle değiştirmeniz gerekir.
ONNX'e aktarılabilir bir PyTorch modeli iyi bir başlangıç noktası olabilir. Ancak bazı ONNX modelleri, dışa aktarma için TorchDynamo yerine TorchScript kullanır. Bu durumda model, TorchDynamo'ya aktarılamayabilir (ancak orijinal model koduna göre daha yakın olması muhtemeldir).
Daha fazla bilgi için PyTorch modellerini LiteRT'ye dönüştürme başlıklı makaleyi inceleyin.
LiteRT paketini ekleme
@litertjs/core
paketini npm'den yükleyin:
npm install @litertjs/core
Paketi içe aktarın ve Wasm dosyalarını yükleyin:
import {loadLiteRt} from '@litertjs/core';
// They are located in node_modules/@litertjs/core/wasm/
// Serve them statically on your server.
await loadLiteRt(`your/path/to/wasm/`);
Modeli yükleme
LiteRT.js ve LiteRT-TFJS dönüştürme yardımcı programlarını içe aktarın ve başlatın. Tensörleri LiteRT.js'ye aktarmak için TensorFlow.js'yi de içe aktarmanız gerekir.
import {CompileOptions, loadAndCompile, loadLiteRt, setWebGpuDevice} from '@litertjs/core';
import {runWithTfjsTensors} from '@litertjs/tfjs-interop';
// TensorFlow.js imports
import * as tf from '@tensorflow/tfjs';
import '@tensorflow/tfjs-backend-webgpu'; // Only WebGPU is supported
import {WebGPUBackend} from '@tensorflow/tfjs-backend-webgpu';
async function main() {
// Initialize TensorFlow.js WebGPU backend
await tf.setBackend('webgpu');
// Initialize LiteRT.js's Wasm files
await loadLiteRt('your/path/to/wasm/');
// Make LiteRt use the same GPU device as TFJS (for tensor conversion)
const backend = tf.backend() as WebGPUBackend;
setWebGpuDevice(backend.device);
// ...
}
main();
Dönüştürülmüş LiteRT modelini yükleyin:
const model = await loadAndCompile('path_to_model.tflite', {
accelerator: 'webgpu', // or 'wasm'
});
Model ardışık düzenini yazma
Modeli uygulamanıza bağlayan ön ve son işleme mantığını yazın.
Ön ve son işleme için TensorFlow.js kullanılması önerilir. Ancak TensorFlow.js ile yazılmamışsa değeri ArrayBuffer olarak almak için await
tensor.data
, yapılandırılmış bir JS dizisi almak için await
tensor.array
işlevini çağırabilirsiniz.
Aşağıda ResNet18 için uçtan uca bir örnek işlem hattı verilmiştir:
// Wrap in a tf.tidy call to automatically clean up intermediate TensorFlow.js tensors.
// (Note: tidy only supports synchronous functions).
const top5 = tf.tidy(() => {
// Get RGB data values from an image element and convert it to range [0, 1).
const image = tf.browser.fromPixels(dogs, 3).div(255);
// These preprocessing steps come from https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py#L315
// The mean and standard deviation for the image normalization come from https://github.com/pytorch/vision/blob/main/torchvision/transforms/_presets.py#L38
const imageData = image.resizeBilinear([224, 224])
.sub([0.485, 0.456, 0.406])
.div([0.229, 0.224, 0.225])
.reshape([1, 224, 224, 3])
.transpose([0, 3, 1, 2]);
// You can pass inputs as a single tensor, an array, or a JS Object
// where keys are the tensor names in the TFLite model.
// When passing an Object, the output is also an Object.
// Here, we're passing a single tensor, so the output is an array.
const probabilities = runWithTfjsTensors(model, imageData)[0];
// Get the top five classes.
return tf.topk(probabilities, 5);
});
const values = await top5.values.data();
const indices = await top5.indices.data();
top5.values.dispose(); // Clean up the tfjs tensors.
top5.indices.dispose();
// Print the top five classes.
const classes = ... // Class names are loaded from a JSON file in the demo.
for (let i = 0; i < 5; ++i) {
const text = `${classes[indices[i]]}: ${values[i]}`;
console.log(text);
}
Test ve sorun giderme
Uygulamanızı test etme ve hataları ele alma yöntemleri hakkında bilgi edinmek için aşağıdaki bölümlere bakın.
Sahte girişlerle test etme
Bir modeli yükledikten sonra, modeli önce sahte girişlerle test etmeniz önerilir. Bu sayede, model işlem hattınız için işleme öncesi ve işleme sonrası mantığını yazmaya zaman harcamadan önce tüm çalışma zamanı hatalarını yakalayabilirsiniz. Bunu kontrol etmek için LiteRT.js Model Test Aracı'nı kullanabilir veya manuel olarak test edebilirsiniz.
LiteRT.js Model Test Aracı
LiteRT.js Model Tester, modelin GPU'da doğru şekilde çalıştığını doğrulamak için rastgele girişler kullanarak modelinizi GPU ve CPU'da çalıştırır. Aşağıdakiler kontrol edilir:
- Giriş ve çıkış veri türlerinin desteklenip desteklenmediği.
- Tüm işlemlerin GPU'da kullanılabilir olup olmadığı.
- GPU çıktılarının referans CPU çıktılarıyla ne kadar eşleştiği.
- GPU çıkarımının performansı.
LiteRT.js Model Tester'ı çalıştırmak için npm i @litertjs/model-tester
ve ardından npx model-tester
komutunu çalıştırın. Modelinizi çalıştırmanız için bir tarayıcı sekmesi açılır.
Manuel model testi
LiteRT.js model test cihazını (@litertjs/model-tester
) kullanmak yerine modeli manuel olarak test etmeyi tercih ederseniz sahte girişler oluşturabilir ve modeli runWithTfjsTensors
ile çalıştırabilirsiniz.
Sahte girişler oluşturmak için giriş tensörlerinin adlarını ve şekillerini bilmeniz gerekir. Bunları model.getInputDetails
veya model.getOutputDetails
çağrılarını yaparak LiteRT.js ile bulabilirsiniz. Bunları bulmanın basit bir yolu, model oluşturulduktan sonra bir kesme noktası ayarlamaktır. Alternatif olarak Model Gezgini'ni kullanın.
Giriş ve çıkış şekillerini ve adlarını öğrendikten sonra modeli sahte bir girişle test edebilirsiniz. Bu, makine öğrenimi işlem hattının geri kalanını yazmadan önce modelin çalışacağına dair bir güven sağlar. Bu, tüm model işlemlerinin desteklenip desteklenmediğini test eder. Örneğin:
// Imports, initialization, and model loading...
// Create fake inputs for the model
const fakeInputs = model.getInputDetails().map(
({shape, dtype}) => tf.ones(shape, dtype));
// Run the model
const outputs = runWithTfjsTensors(model, fakeInputs);
console.log(outputs);
Hata türleri
Bazı LiteRT modelleri LiteRT.js tarafından desteklenmeyebilir. Hatalar genellikle şu kategorilere girer:
- Şekil Uyuşmazlığı: Yalnızca GPU'yu etkileyen bilinen bir hata.
- İşlem Desteklenmiyor: Çalışma zamanı, modeldeki bir işlemi desteklemiyor. WebGPU arka ucu, CPU'ya kıyasla daha sınırlı kapsama alanına sahiptir. Bu nedenle, bu hatayı GPU'da görüyorsanız modeli CPU'da çalıştırabilirsiniz.
- Desteklenmeyen Tensor Türü: LiteRT.js, model girişleri ve çıkışları için yalnızca int32 ve float32 tensörlerini destekler.
- Model Çok Büyük: LiteRT.js, yükleyebileceği modellerin boyutuyla sınırlıdır.
İşlem Desteklenmiyor
Bu, kullanılan arka ucun modeldeki işlemlerden birini desteklemediğini gösterir. Bu işlemi önlemek için orijinal PyTorch modelini yeniden yazmanız ve tekrar dönüştürmeniz gerekir. Alternatif olarak, modeli CPU'da çalıştırabilirsiniz.
BROADCAST_TO
durumunda, bu sorun, modelin her giriş tensörü için toplu iş boyutunu aynı yaparak çözülebilir. Diğer durumlar daha karmaşık olabilir.
Desteklenmeyen Tensor Türü
LiteRT.js, modelin giriş ve çıkışları için yalnızca int32 ve float32 tensörlerini destekler.
Model Çok Büyük
Bu durum genellikle Aborted()
çağrısı veya model yükleme sırasında bellek ayırma hatası olarak görünür. LiteRT.js, yükleyebileceği modellerin boyutuyla sınırlıdır. Bu nedenle, bu hatayı görüyorsanız modeliniz çok büyük olabilir. Ağırlıkları ai-edge-quantizer ile nicelendirmeyi deneyebilirsiniz ancak hesaplamaları float32 veya float16 olarak tutun, model giriş ve çıkışlarını ise float32 veya int32 olarak tutun.