TensorFlow.js ile boyutu optimize edilmiş tarayıcı paketleri oluşturma

Genel Bakış

TensorFlow.js 3.0, boyutu optimize edilmiş, üretim odaklı tarayıcı paketleri oluşturmaya yönelik destek sağlar. Başka bir deyişle, tarayıcıya daha az JavaScript göndermenizi kolaylaştırmak istiyoruz.

Bu özellik, özellikle yüklerindeki baytları tıraşlamaktan fayda sağlayacak (ve dolayısıyla bunu başarmak için çaba göstermeye istekli) üretim kullanım durumlarına sahip kullanıcılara yöneliktir. Bu özelliği kullanmak için ES Modüllerine , webpack veya rollup gibi JavaScript paketleme araçlarına ve ağaç sallama/ölü kod eleme gibi kavramlara aşina olmanız gerekir.

Bu eğitimde, tensorflow.js kullanan bir program için boyutu optimize edilmiş bir yapı oluşturmak üzere bir paketleyiciyle kullanılabilecek özel bir tensorflow.js modülünün nasıl oluşturulacağı gösterilmektedir.

Terminoloji

Bu belgenin bağlamında kullanacağımız birkaç anahtar terim vardır:

ES Modülleri - Standart JavaScript modül sistemi . ES6/ES2015'te tanıtıldı. İthalat ve ihracat beyanlarının kullanılmasıyla tanımlanabilir.

Paketleme - Bir dizi JavaScript varlığını almak ve bunları bir tarayıcıda kullanılabilen bir veya daha fazla JavaScript varlığı halinde gruplamak/paketlemek. Bu genellikle tarayıcıya sunulan nihai varlıkları üreten adımdır. Uygulamalar genellikle kendi paketlerini doğrudan aktarılan kitaplık kaynaklarından yapar . Yaygın paketleyiciler arasında toplama ve web paketi bulunur. Paketlemenin nihai sonucu, paket olarak bilinir (veya bazen birden fazla parçaya bölünmüşse yığın olarak da bilinir)

Ağaç Sallama / Ölü Kodun Ortadan Kaldırılması - Nihai yazılı başvuruda kullanılmayan kodun kaldırılması. Bu, paketleme sırasında, genellikle küçültme adımında yapılır.

İşlemler (Ops) - Çıkış olarak bir veya daha fazla tensör üreten bir veya daha fazla tensör üzerinde yapılan matematiksel bir işlem. Operasyonlar 'yüksek seviyeli' kodlardır ve mantıklarını tanımlamak için diğer operasyonları kullanabilirler.

Çekirdek - Belirli donanım yeteneklerine bağlı bir seçeneğin belirli bir uygulaması. Çekirdekler 'düşük seviyeli'dir ve arka uca özeldir. Bazı op'larda op'tan çekirdeğe birebir eşleme bulunurken diğer op'larda birden fazla çekirdek kullanılır.

Kapsam ve Kullanım Durumları

Yalnızca çıkarım grafik modelleri

Bununla ilgili olarak kullanıcılardan duyduğumuz ve bu sürümde desteklediğimiz birincil kullanım durumu, TensorFlow.js grafik modelleriyle çıkarım yapmaktır. TensorFlow.js katman modelini kullanıyorsanız tfjs-converter'ı kullanarak bunu grafik modeli formatına dönüştürebilirsiniz. Grafik modeli formatı çıkarım kullanım durumu için daha verimlidir.

Tfjs-core ile düşük seviyeli Tensör manipülasyonu

Desteklediğimiz diğer kullanım durumu, daha düşük seviyeli tensör manipülasyonu için doğrudan @tensorflow/tjfs-core paketini kullanan programlardır.

Özel yapımlara yaklaşımımız

Bu işlevselliği tasarlarken temel ilkelerimiz aşağıdakileri içerir:

  • JavaScript modül sisteminden (ESM) maksimum düzeyde yararlanın ve TensorFlow.js kullanıcılarının da aynısını yapmasına izin verin.
  • TensorFlow.js'yi mevcut paketleyiciler (ör. web paketi, toplama vb.) tarafından mümkün olduğunca ağaç sallanabilir hale getirin. Bu, kullanıcıların kod bölme gibi özellikler de dahil olmak üzere bu paketleyicilerin tüm özelliklerinden faydalanmalarını sağlar.
  • Paket boyutu konusunda hassas olmayan kullanıcılar için kullanım kolaylığını mümkün olduğunca koruyun. Bu, kitaplıklarımızdaki varsayılanların çoğu, boyutu optimize edilmiş yapılardan ziyade kullanım kolaylığını desteklediğinden, üretim yapılarının daha fazla çaba gerektireceği anlamına gelmez.

İş akışımızın birincil amacı, TensorFlow.js için yalnızca optimize etmeye çalıştığımız program için gereken işlevleri içeren özel bir JavaScript modülü üretmektir. Gerçek optimizasyonu yapmak için mevcut paketleyicilere güveniyoruz.

Öncelikle JavaScript modül sistemine güvensek de, kullanıcıya yönelik kodda modül sistemi aracılığıyla belirtilmesi kolay olmayan parçaları işlemek için özel bir CLI aracı da sağlıyoruz. Buna iki örnek:

  • model.json dosyalarında saklanan model özellikleri
  • Kullandığımız arka uca özel çekirdek sevk sistemi.

Bu, özel bir tfjs yapısı oluşturmayı, bir paketleyiciyi normal @tensorflow/tfjs paketine yönlendirmekten biraz daha karmaşık hale getirir.

Boyutu optimize edilmiş özel paketler nasıl oluşturulur?

Adım 1: Programınızın hangi çekirdekleri kullandığını belirleyin

Bu adım, çalıştırdığınız herhangi bir model tarafından kullanılan tüm çekirdekleri veya seçtiğiniz arka uca göre işlem öncesi/sonrası kodunu belirlememize olanak tanır.

Uygulamanızın tensorflow.js kullanan bölümlerini çalıştırmak ve çekirdekleri almak için tf.profile öğesini kullanın. Bunun gibi bir şeye benzeyecek

const profileInfo = await tf.profile(() => {
  // You must profile all uses of tf symbols.
  runAllMyTfjsCode();
});

const kernelNames = profileInfo.kernelNames
console.log(kernelNames);

Bir sonraki adım için bu çekirdek listesini panonuza kopyalayın.

Özel paketinizde kullanmak istediğiniz arka uçları kullanarak kodun profilini oluşturmanız gerekir.

Modeliniz değişirse veya işlem öncesi/sonrası kodunuz değişirse bu adımı tekrarlamanız gerekecektir.

Adım 2. Özel tfjs modülü için bir yapılandırma dosyası yazın

Örnek bir yapılandırma dosyası burada.

Şuna benziyor:

{
  "kernels": ["Reshape", "_FusedMatMul", "Identity"],
  "backends": [
      "cpu"
  ],
  "models": [
      "./model/model.json"
  ],
  "outputPath": "./custom_tfjs",
  "forwardModeOnly": true
}
  • çekirdekler: Pakete dahil edilecek çekirdeklerin listesi. Bunu 1. Adımın çıktısından kopyalayın.
  • arka uçlar: Eklemek istediğiniz arka uçların listesi. Geçerli seçenekler arasında "cpu", "webgl" ve "wasm" yer alır.
  • modeller: Uygulamanıza yüklediğiniz modellere ilişkin model.json dosyalarının listesi. Programınız bir grafik modelini yüklemek için tfjs_converter kullanmıyorsa boş olabilir.
  • OutputPath: Oluşturulan modüllerin yerleştirileceği klasöre giden yol.
  • forwardModeOnly: Daha önce listelenen çekirdekler için degradeler eklemek istiyorsanız bunu false olarak ayarlayın.

3. Adım. Özel tfjs modülünü oluşturun

Özel derleme aracını yapılandırma dosyasıyla bağımsız değişken olarak çalıştırın. Bu araca erişebilmek için @tensorflow/tfjs paketinin kurulu olması gerekir.

npx tfjs-custom-module  --config custom_tfjs_config.json

Bu, bazı yeni dosyaların bulunduğu outputPath bir klasör oluşturacaktır.

Adım 4. Paketleyicinizi yeni özel modüle tfjs takma adı verecek şekilde yapılandırın.

Webpack ve rollup gibi paketleyicilerde, yeni oluşturulan özel tfjs modüllerimize işaret edecek şekilde tfjs modüllerine yönelik mevcut referansları takma ad olarak kullanabiliriz. Paket boyutunda maksimum tasarruf sağlamak için takma ad verilmesi gereken üç modül vardır.

İşte web paketinde neye benzediğinin bir kısmı ( tam örnek burada ):

...

config.resolve = {
  alias: {
    '@tensorflow/tfjs$':
        path.resolve(__dirname, './custom_tfjs/custom_tfjs.js'),
    '@tensorflow/tfjs-core$': path.resolve(
        __dirname, './custom_tfjs/custom_tfjs_core.js'),
    '@tensorflow/tfjs-core/dist/ops/ops_for_converter': path.resolve(
        __dirname, './custom_tfjs/custom_ops_for_converter.js'),
  }
}

...

Ve burada toplama için eşdeğer kod pasajı var ( tam örnek burada ):

import alias from '@rollup/plugin-alias';

...

alias({
  entries: [
    {
      find: /@tensorflow\/tfjs$/,
      replacement: path.resolve(__dirname, './custom_tfjs/custom_tfjs.js'),
    },
    {
      find: /@tensorflow\/tfjs-core$/,
      replacement: path.resolve(__dirname, './custom_tfjs/custom_tfjs_core.js'),
    },
    {
      find: '@tensorflow/tfjs-core/dist/ops/ops_for_converter',
      replacement: path.resolve(__dirname, './custom_tfjs/custom_ops_for_converter.js'),
    },
  ],
}));

...

Paketleyiciniz modül takma adını desteklemiyorsa, 3. Adımda oluşturulan custom_tfjs.js dosyasından tensorflow.js dosyasını içe aktarmak için import ifadelerinizi değiştirmeniz gerekecektir. Op tanımları ağaç şeklinde sallanmayacak ancak çekirdekler hala ağaç şeklinde olacak - sarsıldı. Genel olarak ağaç sallayan çekirdekler, nihai paket boyutunda en büyük tasarrufu sağlayan şeydir.

Yalnızca @tensoflow/tfjs-core paketini kullanıyorsanız, o zaman yalnızca bu pakete takma ad vermeniz gerekir.

5. Adım. Paketinizi oluşturun

Paketinizi oluşturmak için paketleyicinizi (ör. webpack veya rollup ) çalıştırın. Paketin boyutu, paketleyiciyi modül takma adı olmadan çalıştırdığınızdan daha küçük olmalıdır. Son paketinizde neyin yer aldığını görmek için bunun gibi görselleştiricileri de kullanabilirsiniz.

6. Adım. Uygulamanızı test edin

Uygulamanızın beklendiği gibi çalıştığını test ettiğinizden emin olun!