Birleşik Çekirdek

Bu belge, Birleşik Öğrenim için temel görevi gören TFF'nin temel katmanını ve gelecekteki olası öğrenme dışı birleşik algoritmaları tanıtmaktadır.

Birleşik Çekirdeğe nazik bir giriş için lütfen aşağıdaki eğitimleri okuyun; burada bazı temel kavramlar örnek olarak tanıtılmakta ve basit bir birleşik ortalama algoritmasının oluşturulması adım adım gösterilmektedir.

Ayrıca, Birleşik Çekirdek API'nin (FC API) birleşik öğrenim için kullanımları, yaptığımız bazı seçimler için önemli bağlam sağladığından, Birleşik Öğrenme ve resim sınıflandırma ve metin oluşturmayla ilgili ilgili eğitimler hakkında bilgi edinmenizi de öneririz. Bu katmanı tasarlıyoruz.

Genel Bakış

Hedefler, Kullanım Amaçları ve Kapsam

Birleşik Çekirdek (FC) en iyi şekilde, dağıtılmış hesaplamaları, yani her biri farklı işlemleri gerçekleştirebilen birden fazla bilgisayarı (cep telefonları, tabletler, yerleşik cihazlar, masaüstü bilgisayarlar, sensörler, veritabanı sunucuları vb.) içeren hesaplamaları uygulamaya yönelik bir programlama ortamı olarak anlaşılır. önemsiz işlemleri yerel olarak yapar ve çalışmalarını koordine etmek için ağ üzerinden iletişim kurar.

Dağıtılmış terimi çok geneldir ve TFF mevcut tüm olası dağıtılmış algoritma türlerini hedeflemez; bu nedenle, bu çerçevede ifade edilebilecek algoritma türlerini tanımlamak için daha az genel olan birleştirilmiş hesaplama terimini kullanmayı tercih ediyoruz.

Birleşik hesaplama terimini tamamen resmi bir şekilde tanımlamak bu belgenin kapsamı dışında olsa da, yeni bir dağıtılmış öğrenme algoritmasını açıklayan bir araştırma yayınında sahte kodla ifade edildiğini görebileceğiniz algoritma türlerini düşünün.

Kısaca FC'nin amacı, sözde kod olmayan , bunun yerine çeşitli hedef ortamlarda çalıştırılabilen program mantığının benzer sözde kod benzeri soyutlama düzeyinde benzer şekilde kompakt temsilini mümkün kılmaktır.

FC'nin ifade etmek için tasarladığı algoritma türlerinin temel tanımlayıcı özelliği, sistem katılımcılarının eylemlerinin kolektif bir şekilde tanımlanmasıdır. Bu nedenle, verileri yerel olarak dönüştüren her cihazdan ve sonuçları yayınlayan , toplayan veya toplayan merkezi bir koordinatör tarafından çalışmayı koordine eden cihazlardan bahsetme eğilimindeyiz.

TFF, basit istemci-sunucu mimarilerinin ötesine geçebilecek şekilde tasarlanmış olsa da kolektif işlem kavramı temeldir. Bunun nedeni, başlangıçta istemci cihazlarının kontrolü altında kalan ve gizlilik nedeniyle merkezi bir konuma indirilemeyen, potansiyel olarak hassas veriler üzerinde hesaplamaları desteklemek üzere tasarlanmış bir teknoloji olan TFF'nin birleşik öğrenmedeki kökenlerinden kaynaklanmaktadır. Bu tür sistemlerdeki her müşteri, sistem tarafından bir sonucun hesaplanmasına yönelik veri ve işlem gücüne katkıda bulunurken (genellikle tüm katılımcılar için değerli olmasını beklediğimiz bir sonuç), aynı zamanda her müşterinin gizliliğini ve anonimliğini korumaya da çalışıyoruz.

Bu nedenle, dağıtılmış hesaplamaya yönelik çoğu çerçeve, bireysel katılımcıların bakış açısından, yani bireysel noktadan noktaya mesaj alışverişi düzeyinde ve katılımcının yerel durum geçişlerinin gelen ve giden mesajlarla karşılıklı bağımlılığı düzeyinde, işlemeyi ifade etmek için tasarlanırken TFF'nin Birleşik Çekirdeği, sistemin davranışını küresel sistem çapındaki perspektiften tanımlamak üzere tasarlanmıştır (örneğin, MapReduce'a benzer şekilde).

Sonuç olarak, genel amaçlara yönelik dağıtılmış çerçeveler yapı taşları olarak gönderme ve alma gibi işlemler sunabilirken FC, basit dağıtılmış protokolleri kapsayan tff.federated_sum , tff.federated_reduce veya tff.federated_broadcast gibi yapı blokları sağlar.

Dil

Python Arayüzü

TFF, birleşik hesaplamaları temsil etmek için söz dizimi computation.proto dosyasındaki serileştirilebilir gösterimle tanımlanan dahili bir dil kullanır. FC API kullanıcılarının genellikle bu dille doğrudan etkileşim kurması gerekmez. Bunun yerine, hesaplamaları tanımlamanın bir yolu olarak onu çevreleyen bir Python API'si ( tff ad alanı) sağlıyoruz.

Özellikle TFF, dekore edilmiş fonksiyonların gövdelerini izleyen ve TFF dilinde birleştirilmiş hesaplama mantığının serileştirilmiş temsillerini üreten tff.federated_computation gibi Python fonksiyon dekoratörlerini sağlar. tff.federated_computation ile donatılmış bir işlev, bu tür serileştirilmiş gösterimin taşıyıcısı olarak görev yapar ve onu başka bir hesaplamanın gövdesine bir yapı taşı olarak yerleştirebilir veya çağrıldığında talep üzerine çalıştırabilir.

İşte sadece bir örnek; Özel algoritmalar eğitimlerinde daha fazla örnek bulunabilir.

@tff.federated_computation(tff.FederatedType(np.float32, tff.CLIENTS))
def get_average_temperature(sensor_readings):
  return tff.federated_mean(sensor_readings)

TensorFlow'a meraklı olmayan okuyucular bu yaklaşımı, Python kodunun TensorFlow grafiğini tanımlayan bir bölümünde tf.add veya tf.reduce_sum gibi işlevleri kullanan Python kodunu yazmaya benzer bulacaktır. Kod teknik olarak Python'da ifade edilmiş olsa da, amacı altta bir tf.Graph serileştirilebilir bir temsilini oluşturmaktır ve TensorFlow çalışma zamanı tarafından dahili olarak yürütülen şey Python kodu değil grafiktir. Benzer şekilde, tff.federated_mean , get_average_temperature ile temsil edilen birleştirilmiş bir hesaplamaya birleştirilmiş bir işlem eklemesi olarak düşünülebilir.

FC'nin bir dili tanımlamasının nedeninin bir kısmı, yukarıda belirtildiği gibi, birleştirilmiş hesaplamaların dağıtılmış kolektif davranışları belirlemesi ve dolayısıyla mantıklarının yerel olmaması gerçeğiyle ilgilidir. Örneğin TFF, girdileri ve çıktıları ağın farklı yerlerinde bulunabilecek operatörleri sağlamaktadır.

Bu, dağıtılmışlık kavramını yakalayan bir dil ve tip sistemi gerektirir.

Tip Sistemi

Federe Çekirdek aşağıdaki tür kategorilerini sunar. Bu türleri tanımlarken, tür oluşturuculara işaret etmenin yanı sıra, hesaplama ve operatör türlerini tanımlamanın kullanışlı bir yolu olduğundan kompakt bir gösterim de sunuyoruz.

İlk olarak, kavramsal olarak mevcut ana dillerde bulunanlara benzeyen türlerin kategorileri şunlardır:

  • Tensör türleri ( tff.TensorType ). Tıpkı TensorFlow'da olduğu gibi bunların da dtype ve shape vardır. Tek fark, bu tür nesnelerin bir TensorFlow grafiğindeki TensorFlow işlemlerinin çıktılarını temsil eden Python'daki tf.Tensor örnekleriyle sınırlı olmamasıdır, ancak aynı zamanda örneğin dağıtılmış bir grafiğin çıktısı olarak üretilebilen veri birimlerini de içerebilir. toplama protokolü. Dolayısıyla, TFF tensör tipi Python veya TensorFlow'da bu tipteki somut fiziksel temsilin basit bir soyut versiyonudur.

    TFF'nin TensorTypes şekillerin (statik) işlenmesi açısından TensorFlow'dan daha katı olabilir. Örneğin, TFF'nin tip sistemi, derecesi bilinmeyen bir tensörü, aynı dtype herhangi bir tensörden atanabilir olarak ele alır, ancak sabit dereceli herhangi bir tensöre atanamaz. Bu uygulama, TFF'nin geçerli olarak kabul ettiği hesaplamalarda daha fazla katılık pahasına, belirli çalışma zamanı hatalarını (örneğin, derecesi bilinmeyen bir tensörü yanlış sayıda öğe içeren bir şekle yeniden şekillendirmeye çalışmak) önler.

    Tensör türleri için kompakt gösterim dtype veya dtype[shape] şeklindedir. Örneğin int32 ve int32[10] sırasıyla tamsayı ve int vektör türleridir.

  • Sıra türleri ( tff.SequenceType ). Bunlar, TFF'nin TensorFlow'un somut tf.data.Dataset s konseptinin soyut eşdeğeridir. Dizilerin öğeleri sıralı bir şekilde tüketilebilir ve karmaşık türleri içerebilir.

    Dizi türlerinin kompakt gösterimi T* dır; burada T öğelerin türüdür. Örneğin int32* bir tam sayı dizisini temsil eder.

  • Adlandırılmış demet türleri ( tff.StructType ). Bunlar, TFF'nin, adlandırılmış veya adsız, belirli türlerde önceden tanımlanmış sayıda öğeye sahip olan demetler ve sözlük benzeri yapılar oluşturma yöntemidir. Daha da önemlisi, TFF'nin adlandırılmış demet kavramı, Python'un argüman demetlerinin soyut eşdeğerini, yani tamamı olmasa da bazılarının adlandırıldığı ve bazılarının konumsal olduğu öğelerin koleksiyonlarını kapsar.

    Adlandırılmış kayıtların kompakt gösterimi <n_1=T_1, ..., n_k=T_k> şeklindedir; burada n_k isteğe bağlı öğe adlarıdır ve T_k öğe türleridir. Örneğin, <int32,int32> bir çift isimsiz tamsayı için kompakt bir gösterimdir ve <X=float32,Y=float32> düzlemdeki bir noktayı temsil edebilen X ve Y adlı bir kayan nokta çifti için kompakt bir gösterimdir . Demetler yuvalanabilir ve diğer türlerle karıştırılabilir; örneğin, <X=float32,Y=float32>* bir nokta dizisi için kompakt bir gösterim olacaktır.

  • İşlev türleri ( tff.FunctionType ). TFF, işlevlerin birinci sınıf değerler olarak değerlendirildiği işlevsel bir programlama çerçevesidir. Fonksiyonların en fazla bir argümanı ve tam olarak bir sonucu vardır.

    İşlevlerin kompakt gösterimi (T -> U) şeklindedir; burada T , bir argümanın türü ve U , sonucun türüdür veya herhangi bir argüman yoksa ( -> U) (argümansız işlevler dejenere olmasına rağmen) Çoğunlukla yalnızca Python düzeyinde var olan kavram). Örneğin (int32* -> int32) bir tamsayı dizisini tek bir tamsayı değerine indirgeyen bir tür fonksiyon için bir gösterimdir.

Aşağıdaki türler TFF hesaplamalarının dağıtılmış sistemler yönünü ele almaktadır. Bu kavramlar bir bakıma TFF'ye özgü olduğundan, ek yorumlar ve örnekler için özel algoritmalar eğitimine başvurmanızı öneririz.

  • Yerleştirme türü . Bu tür, bu türün sabitleri olarak düşünebileceğiniz 2 değişmez tff.SERVER ve tff.CLIENTS biçiminden başka, genel API'de henüz kullanıma sunulmamıştır. Ancak dahili olarak kullanılır ve gelecek sürümlerde genel API'ye eklenecektir. Bu türün kompakt temsili placement .

    Bir yerleşim, belirli bir rol oynayan sistem katılımcılarının bir kolektifini temsil eder. İlk sürüm, 2 katılımcı grubunun bulunduğu istemci-sunucu hesaplamalarını hedefliyor: istemciler ve bir sunucu (ikincisini tekil bir grup olarak düşünebilirsiniz). Bununla birlikte, daha ayrıntılı mimarilerde, çok katmanlı bir sistemdeki farklı türde toplama gerçekleştirebilen veya sunucu veya sunucu tarafından kullanılanlardan farklı veri sıkıştırma/açma türlerini kullanan ara toplayıcılar gibi başka roller de olabilir. müşteriler.

    Yerleştirme kavramını tanımlamanın temel amacı , birleştirilmiş türlerin tanımlanmasına temel oluşturmaktır.

  • Birleşik türler ( tff.FederatedType ). Birleştirilmiş türdeki değer, belirli bir yerleşim ( tff.SERVER veya tff.CLIENTS gibi) tarafından tanımlanan bir grup sistem katılımcısı tarafından barındırılan değerdir. Birleştirilmiş tür, yerleşim değeri (dolayısıyla bağımlı bir türdür ), üye bileşenlerinin türü (her bir katılımcının yerel olarak ne tür içerik barındırdığı) ve tüm katılımcıların yerel olup olmadığını belirten ek all_equal biti ile tanımlanır. aynı öğeyi barındırıyor.

    Her biri grup (yerleştirme) G tarafından barındırılan T türündeki öğeleri (üye bileşenler) içeren birleşik değer türleri için kompakt gösterim, sırasıyla all_equal biti ayarlanmış veya ayarlanmamış olarak T@G veya {T}@G .

    Örneğin:

    • {int32}@CLIENTS istemci cihazı başına bir tane olmak üzere, potansiyel olarak farklı tamsayılar kümesinden oluşan birleştirilmiş bir değeri temsil eder. Ağ üzerinde birden fazla konumda görünen birden fazla veri öğesini kapsayan tek bir birleşik değerden bahsettiğimizi unutmayın. Bunu "ağ" boyutuna sahip bir tür tensör olarak düşünmenin bir yolu vardır; ancak bu benzetme mükemmel değildir çünkü TFF, federe bir değerin üye bileşenlerine rastgele erişime izin vermez.

    • {<X=float32,Y=float32>*}@CLIENTS istemci cihazı başına bir dizi olmak üzere birden çok XY koordinat dizisinden oluşan bir değer olan birleştirilmiş bir veri kümesini temsil eder.

    • <weights=float32[10,5],bias=float32[5]>@SERVER sunucudaki adlandırılmış ağırlık ve önyargı tensörlerini temsil eder. Kıvrımlı parantezleri bıraktığımızdan bu, all_equal bitinin ayarlandığını gösterir, yani yalnızca tek bir demet vardır (bu değeri barındıran bir kümede kaç sunucu kopyası olabileceğine bakılmaksızın).

Yapı taşları

Birleşik Çekirdeğin dili, birkaç ek öğeyle birlikte bir lambda hesabı biçimidir.

Şu anda genel API'de kullanıma sunulan aşağıdaki programlama soyutlamalarını sağlar:

  • TensorFlow hesaplamaları ( tff.tf_computation ). Bunlar, tff.tf_computation dekoratörü kullanılarak TFF'de yeniden kullanılabilir bileşenler olarak sarılmış TensorFlow kodunun bölümleridir. Her zaman işlevsel türleri vardır ve TensorFlow'daki işlevlerden farklı olarak yapılandırılmış parametreleri alabilir veya bir dizi türünün yapılandırılmış sonuçlarını döndürebilirler.

    Tamsayıların toplamını hesaplamak için tf.data.Dataset.reduce operatörünü kullanan (int32* -> int) türünde bir TF hesaplamasının bir örneğini burada bulabilirsiniz:

    @tff.tf_computation(tff.SequenceType(np.int32))
    def add_up_integers(x):
      return x.reduce(np.int32(0), lambda x, y: x + y)
    
  • İçsel veya birleşik operatörler ( tff.federated_... ). Bu, çoğu TFF ile kullanılmak üzere dağıtılmış iletişim operatörlerini temsil eden, FC API'nin büyük kısmını oluşturan tff.federated_sum veya tff.federated_broadcast gibi işlevlerden oluşan bir kütüphanedir.

    Bunları içsel işlevler olarak adlandırıyoruz çünkü bunlar, bir bakıma içsel işlevlere benzer şekilde, TFF tarafından anlaşılan ve daha düşük seviyeli kod halinde derlenen açık uçlu, genişletilebilir bir operatörler kümesidir.

    Bu operatörlerin çoğu, birleştirilmiş türlerin parametrelerine ve sonuçlarına sahiptir ve çoğu, çeşitli veri türlerine uygulanabilen şablonlardır.

    Örneğin, tff.federated_broadcast T@SERVER -> T@CLIENTS işlevsel türünün şablon operatörü olarak düşünülebilir.

  • Lambda ifadeleri ( tff.federated_computation ). TFF'deki bir lambda ifadesi, Python'daki bir lambda veya def eşdeğeridir; parametre adından ve bu parametreye referansları içeren bir gövdeden (ifade) oluşur.

    Python kodunda bunlar, Python işlevlerini tff.federated_computation ile süsleyerek ve bir argüman tanımlayarak oluşturulabilir.

    Daha önce bahsettiğimiz lambda ifadesinin bir örneğini burada bulabilirsiniz:

    @tff.federated_computation(tff.FederatedType(np.float32, tff.CLIENTS))
    def get_average_temperature(sensor_readings):
      return tff.federated_mean(sensor_readings)
    
  • Yerleşim değişmezleri . Şimdilik basit istemci-sunucu hesaplamalarının tanımlanmasına izin vermek için yalnızca tff.SERVER ve tff.CLIENTS .

  • İşlev çağrıları ( __call__ ). İşlevsel türü olan herhangi bir şey standart Python __call__ sözdizimi kullanılarak çağrılabilir. Çağrı, türü çağrılan fonksiyonun sonucunun türüyle aynı olan bir ifadedir.

    Örneğin:

    • add_up_integers(x) daha önce x bağımsız değişkeninde tanımlanan TensorFlow hesaplamasının çağrılmasını temsil eder. Bu ifadenin türü int32 .

    • tff.federated_mean(sensor_readings) birleştirilmiş ortalama alma operatörünün sensor_readings çağrılmasını temsil eder. Bu ifadenin türü float32@SERVER (yukarıdaki örnekteki bağlam varsayılarak).

  • Demetlerin oluşturulması ve elemanlarının seçilmesi . tff.federated_computation ile süslenmiş işlevlerin gövdelerinde görünen [x, y] , x[y] veya xy biçimindeki Python ifadeleri.