TensorFlow.js'de özel işlemler, çekirdekler ve degradeler yazma

Genel Bakış

Bu kılavuz, TensorFlow.js'de özel işlemleri (ops), çekirdekleri ve degradeleri tanımlamaya yönelik mekanizmaları özetlemektedir. Ana kavramlara genel bir bakış sunmayı ve kavramları eylem halinde gösteren kod işaretçilerini sağlamayı amaçlamaktadır.

Bu rehber kimin için?

Bu, TensorFlow.js'nin bazı iç kısımlarına değinen oldukça gelişmiş bir kılavuzdur; özellikle aşağıdaki insan grupları için yararlı olabilir:

  • TensorFlow.js'nin çeşitli matematiksel işlemlerin davranışını özelleştirmeyle ilgilenen ileri düzey kullanıcıları (örneğin, mevcut degrade uygulamalarını geçersiz kılan araştırmacılar veya kitaplıktaki eksik işlevleri düzeltmesi gereken kullanıcılar)
  • TensorFlow.js'yi genişleten kitaplıklar oluşturan kullanıcılar (örneğin, TensorFlow.js temel öğeleri veya yeni bir TensorFlow.js arka ucu üzerine oluşturulmuş genel bir doğrusal cebir kitaplığı).
  • Tensorflow.js'ye yeni operasyonlarla katkıda bulunmakla ilgilenen ve bu mekanizmaların nasıl çalıştığına dair genel bir bakış edinmek isteyen kullanıcılar.

Bu, dahili uygulama mekanizmalarına girdiğinden TensorFlow.js'nin genel kullanımına yönelik bir kılavuz değildir . TensorFlow.js'yi kullanmak için bu mekanizmaları anlamanıza gerek yok

Bu kılavuzdan en iyi şekilde yararlanmak için TensorFlow.js kaynak kodunu okuma konusunda rahat olmanız (veya denemeye istekli olmanız) gerekir.

Terminoloji

Bu kılavuz için, birkaç temel terimin önceden tanımlanması yararlı olacaktır.

İşlemler (Ops) — Bir veya daha fazla tensör üzerinde çıktı olarak bir veya daha fazla tensör üreten 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/platform 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.

Gradient / GradFunc — Bir girdiye göre bu işlevin türevini hesaplayan bir op/çekirdeğin 'geriye dönük mod' tanımı. Degradeler 'yüksek düzey' koddur (arka uca özgü değildir) ve diğer operasyonları veya çekirdekleri çağırabilir.

Çekirdek Kaydı - Bir (çekirdek adı, arka uç adı) tanımlama grubundan çekirdek uygulamasına kadar bir harita.

Gradient RegistryÇekirdek adından degrade uygulamasına kadar bir harita.

Kod organizasyonu

İşlemler ve Gradyanlar tfjs-core'da tanımlanmıştır.

Çekirdekler arka uca özeldir ve ilgili arka uç klasörlerinde tanımlanır (örn. tfjs-backend-cpu ).

Bu paketlerin içinde özel operasyonların, çekirdeklerin ve degradelerin tanımlanmasına gerek yoktur. Ancak uygulamalarında sıklıkla benzer semboller kullanılacaktır.

Özel İşlemleri Uygulama

Özel bir işlemi düşünmenin bir yolu, genellikle tensörlerin giriş olduğu bazı tensör çıktılarını döndüren bir JavaScript işlevidir.

  • Bazı operasyonlar tamamen mevcut operasyonlar açısından tanımlanabilir ve bu fonksiyonları doğrudan içe aktarmalı ve çağırmalıdır. İşte bir örnek .
  • Bir operasyonun uygulanması ayrıca belirli çekirdeklerin arka ucuna da gönderilebilir. Bu, Engine.runKernel aracılığıyla yapılır ve "özel çekirdeklerin uygulanması" bölümünde daha ayrıntılı olarak açıklanacaktır. İşte bir örnek .

Özel Çekirdeklerin Uygulanması

Arka uca özgü çekirdek uygulamaları, belirli bir işlem için mantığın optimize edilmiş şekilde uygulanmasına olanak tanır. Çekirdekler tf.engine().runKernel() çağıran operasyonlar tarafından çağrılır. Bir çekirdek uygulamaları dört şeyle tanımlanır

  • Bir çekirdek adı.
  • Çekirdeğin uygulandığı arka uç.
  • Girişler: Çekirdek fonksiyonuna yönelik tensör argümanları.
  • Nitelikler: Çekirdek işlevine ilişkin tensör olmayan argümanlar.

İşte çekirdek uygulamasının bir örneği. Uygulamak için kullanılan kurallar arka uca özeldir ve en iyi şekilde, her bir arka ucun uygulanmasına ve belgelerine bakılarak anlaşılır.

Genellikle çekirdekler tensörlerden daha düşük bir seviyede çalışır ve bunun yerine doğrudan belleğe okur ve yazar, bu da sonunda tfjs-core tarafından tensörlere sarılır.

Bir çekirdek uygulandıktan sonra, tfjs-core'daki registerKernel işlevi kullanılarak TensorFlow.js'ye kaydedilebilir. Çekirdeğin çalışmasını istediğiniz her arka uç için bir çekirdek kaydedebilirsiniz. Kaydedildikten sonra çekirdek tf.engine().runKernel(...) ile çağrılabilir ve TensorFlow.js, uygulamaya mevcut aktif arka uç.

Özel Degradeleri Uygulama

Degradeler genellikle belirli bir çekirdek için tanımlanır ( tf.engine().runKernel(...) çağrısında kullanılan aynı çekirdek adıyla tanımlanır). Bu, tfjs-core'un çalışma zamanında herhangi bir çekirdek için degrade tanımlarını aramak üzere bir kayıt defteri kullanmasına olanak tanır.

Özel degradelerin uygulanması aşağıdakiler için faydalıdır:

  • Kitaplıkta bulunmayabilecek bir degrade tanımı ekleme
  • Belirli bir çekirdek için degrade hesaplamasını özelleştirmek amacıyla mevcut bir degrade tanımını geçersiz kılma.

Gradyan uygulamalarının örneklerini burada görebilirsiniz.

Belirli bir çağrı için bir degrade uyguladığınızda, tfjs-core'daki registerGradient işlevi kullanılarak TensorFlow.js'ye kaydedilebilir.

Degrade kayıt defterini atlayan (ve dolayısıyla rastgele işlevler için degradelerin keyfi yollarla hesaplanmasına izin veren) özel degradeleri uygulamaya yönelik diğer yaklaşım, tf.customGrad kullanmaktır.

İşte , kütüphanedeki, CustomGrad'ı kullanmanın bir örneği