TensorFlow.js, tarayıcıda ve Node.js'de çalışır ve her iki platformda da birçok farklı yapılandırma mevcuttur. Her platformun, uygulamaların geliştirilme şeklini etkileyecek benzersiz bir dizi hususu vardır.
Tarayıcıda TensorFlow.js, masaüstü cihazların yanı sıra mobil cihazları da destekler. Her cihazın, sizin için otomatik olarak belirlenen ve yapılandırılan, kullanılabilir WebGL API'leri gibi belirli bir kısıtlamaları vardır.
Node.js'de TensorFlow.js, doğrudan TensorFlow API'sine bağlanmayı veya daha yavaş vanilya CPU uygulamalarıyla çalışmayı destekler.
Ortamlar
Bir TensorFlow.js programı çalıştırıldığında, özel konfigürasyona ortam adı verilir. Ortam, tek bir global arka uçtan ve TensorFlow.js'nin ayrıntılı özelliklerini kontrol eden bir dizi işaretten oluşur.
Arka uçlar
TensorFlow.js, tensör depolamayı ve matematiksel işlemleri uygulayan birden fazla farklı arka ucu destekler. Herhangi bir zamanda yalnızca bir arka uç etkindir. TensorFlow.js çoğu zaman mevcut ortama göre sizin için en iyi arka ucu otomatik olarak seçecektir. Ancak bazen hangi arka ucun kullanıldığını ve bunun nasıl değiştirileceğini bilmek önemlidir.
Hangi arka ucu kullandığınızı bulmak için:
console.log(tf.getBackend());
Arka ucu manuel olarak değiştirmek istiyorsanız:
tf.setBackend('cpu');
console.log(tf.getBackend());
WebGL arka ucu
WebGL arka ucu 'webgl' şu anda tarayıcı için en güçlü arka uçtur. Bu arka uç, vanilya CPU arka ucundan 100 kata kadar daha hızlıdır. Tensörler WebGL dokuları olarak depolanır ve matematiksel işlemler WebGL gölgelendiricilerinde uygulanır. Bu arka ucu kullanırken bilmeniz gereken birkaç yararlı nokta şunlardır: \
Kullanıcı arayüzü iş parçacığını engellemekten kaçının
tf.matMul(a, b) gibi bir işlem çağrıldığında, ortaya çıkan tf.Tensor eşzamanlı olarak döndürülür, ancak matris çarpımının hesaplanması aslında henüz hazır olmayabilir. Bu, döndürülen tf.Tensor'un hesaplamanın yalnızca bir tanıtıcısı olduğu anlamına gelir. x.data()
veya x.array()
öğesini çağırdığınızda, hesaplama gerçekten tamamlandığında değerler çözümlenecektir. Bu, hesaplama tamamlanırken kullanıcı arayüzü iş parçacığının engellenmesini önlemek için eş zamanlı olmayan x.data()
ve x.array()
yöntemlerinin, eşzamanlı karşılıkları olan x.dataSync()
ve x.arraySync()
yerine kullanılmasını önemli hale getirir.
Bellek yönetimi
WebGL arka ucunu kullanırken dikkat edilmesi gereken bir husus, açık bellek yönetimine duyulan ihtiyaçtır. Tensor verilerinin nihai olarak depolandığı WebGLTextures, tarayıcı tarafından otomatik olarak çöp toplama işlemine tabi tutulmaz.
Bir tf.Tensor
belleğini yok etmek için, dispose()
yöntemini kullanabilirsiniz:
const a = tf.tensor([[1, 2], [3, 4]]);
a.dispose();
Bir uygulamada birden fazla işlemin birlikte zincirlenmesi çok yaygındır. Bunları ortadan kaldırmak için tüm ara değişkenlere bir referans tutmak kodun okunabilirliğini azaltabilir. Bu sorunu çözmek için TensorFlow.js, bir işlev çalıştırıldığında yerel değişkenlerin temizlenmesine benzer şekilde, bir işlev çalıştırıldıktan sonra bir işlev tarafından döndürülmeyen tüm tf.Tensor
temizleyen bir tf.tidy()
yöntemi sağlar:
const a = tf.tensor([[1, 2], [3, 4]]);
const y = tf.tidy(() => {
const result = a.square().log().neg();
return result;
});
Kesinlik
Mobil cihazlarda WebGL yalnızca 16 bitlik kayan nokta dokularını destekleyebilir. Ancak çoğu makine öğrenimi modeli 32 bitlik kayan nokta ağırlıkları ve aktivasyonlarıyla eğitilir. 16 bit kayan sayılar yalnızca [0.000000059605, 65504]
aralığındaki sayıları temsil edebildiğinden, bir mobil cihaz için bir model taşınırken bu durum hassasiyet sorunlarına neden olabilir. Bu da modelinizdeki ağırlıkların ve aktivasyonların bu aralığı aşmamasına dikkat etmeniz gerektiği anlamına gelir. Cihazın 32 bit dokuları destekleyip desteklemediğini kontrol etmek için tf.ENV.getBool('WEBGL_RENDER_FLOAT32_CAPABLE')
değerini kontrol edin, eğer bu yanlışsa cihaz yalnızca 16 bit kayan nokta dokularını destekler. TensorFlow.js'nin şu anda 32 bit dokular kullanıp kullanmadığını kontrol etmek için tf.ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED')
kullanabilirsiniz.
Gölgelendirici derlemesi ve doku yüklemeleri
TensorFlow.js, WebGL gölgelendirici programlarını çalıştırarak GPU üzerindeki işlemleri yürütür. Bu gölgelendiriciler, kullanıcı bir işlemi yürütmek istediğinde tembel bir şekilde bir araya getirilir ve derlenir. Gölgelendiricinin derlenmesi ana iş parçacığı üzerindeki CPU'da gerçekleşir ve yavaş olabilir. TensorFlow.js, derlenen gölgelendiricileri otomatik olarak önbelleğe alacak ve aynı şekildeki giriş ve çıkış tensörleriyle aynı işleme yapılan ikinci çağrıyı çok daha hızlı hale getirecek. Tipik olarak TensorFlow.js uygulamaları, uygulamanın ömrü boyunca aynı işlemleri birden çok kez kullanır, dolayısıyla makine öğrenimi modelinden ikinci geçiş çok daha hızlı olur.
TensorFlow.js ayrıca tf.Tensor verilerini WebGLTextures olarak saklar. Bir tf.Tensor
oluşturulduğunda, verileri hemen GPU'ya yüklemiyoruz; bunun yerine, tf.Tensor
bir işlemde kullanılıncaya kadar verileri CPU'da tutuyoruz. tf.Tensor
ikinci kez kullanılırsa veriler zaten GPU'da olduğundan yükleme maliyeti oluşmaz. Tipik bir makine öğrenimi modelinde bu, model aracılığıyla ilk tahmin sırasında ağırlıkların yüklendiği ve modelden ikinci geçişin çok daha hızlı olacağı anlamına gelir.
Modeliniz veya TensorFlow.js kodunuz aracılığıyla ilk tahminin performansını önemsiyorsanız, gerçek veriler kullanılmadan önce aynı şekle sahip bir giriş Tensörü ileterek modeli ısıtmanızı öneririz.
Örneğin:
const model = await tf.loadLayersModel(modelUrl);
// Warmup the model before using real data.
const warmupResult = model.predict(tf.zeros(inputShape));
warmupResult.dataSync();
warmupResult.dispose();
// The second predict() will be much faster
const result = model.predict(userData);
Node.js TensorFlow arka ucu
TensorFlow Node.js arka ucundaki 'düğüm'de, işlemleri hızlandırmak için TensorFlow C API kullanılır. Bu, varsa CUDA gibi makinenin mevcut donanım hızlandırmasını kullanacaktır.
Bu arka uçta, tıpkı WebGL arka ucunda olduğu gibi, işlemler tf.Tensor
eşzamanlı olarak döndürür. Ancak WebGL arka ucunun aksine, tensörü geri almadan işlem tamamlanır. Bu tf.matMul(a, b)
çağrısının UI iş parçacığını engelleyeceği anlamına gelir.
Bu nedenle, eğer bunu bir üretim uygulamasında kullanmayı düşünüyorsanız, ana thread'i engellememek için çalışan thread'lerde TensorFlow.js'yi çalıştırmalısınız.
Node.js hakkında daha fazla bilgi için bu kılavuza bakın.
WASM arka ucu
TensorFlow.js, CPU hızlandırması sunan ve standart JavaScript CPU ( cpu
) ve WebGL hızlandırılmış ( webgl
) arka uçlarına alternatif olarak kullanılabilen bir WebAssembly arka ucu ( wasm
) sağlar. Kullanmak için:
// Set the backend to WASM and wait for the module to be ready.
tf.setBackend('wasm');
tf.ready().then(() => {...});
Sunucunuz .wasm
dosyasını farklı bir yolda veya farklı bir adla sunuyorsa, arka ucu başlatmadan önce setWasmPath
kullanın. Daha fazla bilgi için README'deki "Paketleyicileri Kullanma" bölümüne bakın:
import {setWasmPath} from '@tensorflow/tfjs-backend-wasm';
setWasmPath(yourCustomPath);
tf.setBackend('wasm');
tf.ready().then(() => {...});
Neden WASM?
WASM, 2015 yılında yeni bir web tabanlı ikili format olarak tanıtıldı ve JavaScript, C, C++ vb. ile yazılmış programlara web üzerinde çalışmak üzere bir derleme hedefi sağladı. WASM, 2017'den beri Chrome, Safari, Firefox ve Edge tarafından desteklenmektedir ve dünya çapındaki cihazların %90'ı tarafından desteklenmektedir.
Performans
WASM arka ucu, sinir ağı operatörlerinin optimize edilmiş uygulaması için XNNPACK kitaplığından yararlanır.
JavaScript'e Karşı : WASM ikili dosyaları, tarayıcıların yüklemesi, ayrıştırması ve yürütmesi için genellikle JavaScript paketlerinden çok daha hızlıdır. JavaScript dinamik olarak yazılır ve çöp toplanır; bu da çalışma zamanında yavaşlamalara neden olabilir.
WebGL'ye Karşı : WebGL çoğu model için WASM'den daha hızlıdır, ancak küçük modeller için WASM, WebGL gölgelendiricilerini çalıştırmanın sabit genel giderleri nedeniyle WebGL'den daha iyi performans gösterebilir. Aşağıdaki "WASM'yi ne zaman kullanmalıyım" bölümünde bu kararı vermek için buluşsal yöntemler tartışılmaktadır.
Taşınabilirlik ve Kararlılık
WASM, tüm cihazlarda hassas eşlik sunan taşınabilir 32 bit kayan aritmetik özelliğine sahiptir. Öte yandan WebGL, donanıma özgüdür ve farklı aygıtların hassasiyeti farklı olabilir (örneğin, iOS aygıtlarında 16 bitlik kayan noktalara geri dönüş).
WebGL gibi WASM de resmi olarak tüm büyük tarayıcılar tarafından desteklenmektedir. WebGL'den farklı olarak WASM, Node.js'de çalışabilir ve yerel kitaplıkları derlemeye gerek kalmadan sunucu tarafında kullanılabilir.
WASM'yi ne zaman kullanmalıyım?
Model boyutu ve hesaplama talebi
Genel olarak, modeller daha küçük olduğunda veya WebGL desteği olmayan ( OES_texture_float
uzantısı) veya daha az güçlü GPU'lara sahip alt uç cihazlarla ilgilendiğinizde WASM iyi bir seçimdir. Aşağıdaki grafik, WebGL, WASM ve CPU arka uçlarında resmi olarak desteklenen 5 modelimiz için 2018 MacBook Pro'da Chrome'daki çıkarım sürelerini (TensorFlow.js 1.5.2 itibarıyla) göstermektedir:
Daha küçük modeller
Modeli | WebGL | WASM | İşlemci | Hafıza |
---|---|---|---|---|
BlazeFace | 22,5 ms | 15,6 ms | 315,2 ms | 0,4 MB |
YüzMesh | 19,3 ms | 19,2 ms | 335 ms | 2,8 MB |
Daha büyük modeller
Modeli | WebGL | WASM | İşlemci | Hafıza |
---|---|---|---|---|
PoseNet | 42,5 ms | 173,9 ms | 1514,7 ms | 4,5 MB |
BodyPix | 77 ms | 188,4 ms | 2683 ms | 4,6 MB |
MobilNet v2 | 37 ms | 94 ms | 923,6 ms | 13 MB |
Yukarıdaki tablo, WASM'nin modeller arasında düz JS CPU arka ucundan 10-30 kat daha hızlı olduğunu ve hafif (400 KB), ancak makul sayıda işlem sayısına (~140) sahip olan BlazeFace gibi daha küçük modeller için WebGL ile rekabet ettiğini göstermektedir. WebGL programlarının operasyon başına sabit bir genel gider maliyeti olduğu göz önüne alındığında, bu BlazeFace gibi modellerin WASM'de neden daha hızlı olduğunu açıklıyor.
Bu sonuçlar cihazınıza bağlı olarak değişecektir. WASM'nin uygulamanız için doğru olup olmadığını belirlemenin en iyi yolu, onu farklı arka uçlarımızda test etmektir.
Çıkarım ve Eğitim
Önceden eğitilmiş modellerin dağıtımına yönelik birincil kullanım durumunu ele almak için WASM arka uç geliştirmesi, eğitim desteği yerine çıkarıma öncelik verecektir. WASM'de desteklenen operasyonların güncel listesine bakın ve modelinizde desteklenmeyen bir operasyon varsa bize bildirin . Eğitim modelleri için Node (TensorFlow C++) arka ucunu veya WebGL arka ucunu kullanmanızı öneririz.
CPU arka ucu
CPU arka ucu 'cpu' en düşük performanslı arka uçtur ancak en basitidir. İşlemlerin tümü vanilya JavaScript'te uygulanır, bu da onları daha az paralel hale getirir. Ayrıca UI iş parçacığını da engellerler.
Bu arka uç, test için veya WebGL'nin kullanılamadığı cihazlarda çok yararlı olabilir.
Bayraklar
TensorFlow.js, otomatik olarak değerlendirilen ve mevcut platformdaki en iyi yapılandırmayı belirleyen bir dizi ortam bayrağına sahiptir. Bu bayraklar çoğunlukla dahilidir ancak birkaç genel bayrak genel API ile kontrol edilebilir.
-
tf.enableProdMode():
performans adına model doğrulamayı, NaN kontrollerini ve diğer doğruluk kontrollerini ortadan kaldıracak üretim modunu etkinleştirir. -
tf.enableDebugMode()
: yürütülen her işlemin yanı sıra bellek alanı ve toplam çekirdek yürütme süresi gibi çalışma zamanı performans bilgilerini konsola kaydedecek hata ayıklama modunu etkinleştirir. Bunun uygulamanızı büyük ölçüde yavaşlatacağını unutmayın; bunu üretimde kullanmayın.