Birleşik Çekirdek

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Bu belge, Federated Learning için bir temel olarak hizmet veren TFF'nin çekirdek katmanını ve gelecekteki olası öğrenme olmayan federe algoritmaları tanıtır.

Federated Core'a nazik bir giriş için, bazı temel kavramları örneklerle tanıttıklarından ve basit bir birleşik ortalama algoritmasının yapımını adım adım gösterdiklerinden, lütfen aşağıdaki öğreticileri okuyun.

Federasyon öğrenme için Federated Core API'nin (FC API) kullanımları, bizim yaptığımız bazı seçimler için önemli bağlam sağladığından, Federated Learning ve görüntü sınıflandırma ve metin oluşturmayla ilgili öğreticiler hakkında bilgi sahibi olmanızı öneririz. Bu katmanı tasarlamak.

genel bakış

Hedefler, Kullanım Amaçları ve Kapsam

Federated Core (FC) en iyi, dağıtık hesaplamaları, yani her biri non-performans gerçekleştirebilen birden çok bilgisayarı (cep telefonları, tabletler, gömülü aygıtlar, masaüstü bilgisayarlar, sensörler, veritabanı sunucuları vb.) içeren hesaplamaları uygulamak için bir programlama ortamı olarak anlaşılır. yerel olarak önemsiz işleme ve işlerini koordine etmek için ağ üzerinden iletişim kurma.

Dağıtılmış terimi çok geneldir ve TFF, oradaki 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 terim olan birleşik hesaplamayı 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 sözde kodda ifade edilen algoritma türlerini düşünün.

Özetle FC'nin amacı, sözde kod olmayan , daha ziyade çeşitli hedef ortamlarda yürütülebilen program mantığının benzer sözde kod benzeri bir soyutlama düzeyinde benzer şekilde kompakt temsilini sağlamaktır.

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

TFF, basit istemci-sunucu mimarilerinin ötesine geçebilecek şekilde tasarlanmış olsa da, toplu işleme kavramı esastır. Bunun nedeni, TFF'nin orijinal olarak istemci cihazlarının kontrolü altında kalan potansiyel olarak hassas veriler üzerindeki hesaplamaları desteklemek için tasarlanmış ve gizlilik nedenleriyle merkezi bir konuma indirilemeyen bir teknoloji olan birleşik öğrenmedeki kökenleridir. 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 (genelde tüm katılımcılar için değerli olmasını beklediğimiz bir sonuç), ayrıca her müşterinin gizliliğini ve anonimliğini korumaya çalışıyoruz.

Bu nedenle, dağıtılmış bilgi işlem çerçevelerinin çoğu, işlemi bireysel katılımcıların bakış açısıyla ifade etmek için tasarlanırken, 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ığı , TFF'nin Federe Çekirdeği, sistemin davranışını küresel sistem çapında perspektiften tanımlamak için tasarlanmıştır (örneğin, MapReduce'a benzer şekilde).

Sonuç olarak, genel amaçlar için 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ı taşları sağlar.

Dil

Python Arayüzü

TFF, sözdizimi computation.proto içindeki serileştirilebilir temsil tarafından tanımlanan birleşik hesaplamaları temsil etmek için dahili bir dil kullanır. FC API kullanıcılarının genellikle bu dille doğrudan etkileşime girmesi gerekmez. Bunun yerine, hesaplamaları tanımlamanın bir yolu olarak etrafını saran bir Python API'si ( tff ad alanı) sağlıyoruz.

Spesifik olarak, TFF, dekore edilmiş işlevlerin gövdelerini izleyen ve TFF'nin dilinde birleşik hesaplama mantığının serileştirilmiş temsillerini üreten tff.federated_computation gibi Python işlev dekoratörleri sağlar. tff.federated_computation ile süslenmiş bir işlev, bu tür serileştirilmiş temsilin taşıyıcısı olarak hareket eder ve onu başka bir hesaplamanın gövdesine bir yapı taşı olarak gömebilir veya çağrıldığında talep üzerine yürütebilir.

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

@tff.federated_computation(tff.type_at_clients(tf.float32))
def get_average_temperature(sensor_readings):
  return tff.federated_mean(sensor_readings)

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

FC'nin bir dili tanımlamasının nedeninin bir kısmı, yukarıda belirtildiği gibi, birleşik hesaplamaların dağıtılmış toplu davranışları belirtmesi ve bu nedenle mantıklarının yerel olmaması gerçeğiyle ilgilidir. Örneğin TFF, girişleri ve çıkışları ağda farklı yerlerde bulunabilecek operatörler sağlar.

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

Tip Sistem

Federated Core, aşağıdaki tür kategorilerini sunar. Bu türleri tanımlarken, tür oluşturuculara işaret ediyoruz ve ayrıca kullanışlı bir yol olduğu veya hesaplama ve operatör türlerini tanımladığı için kompakt bir gösterim tanıtıyoruz.

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

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

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

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

  • Sıra türleri ( tff.SequenceType ). Bunlar TFF'nin TensorFlow'un tf.data.Dataset s somut kavramının 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* 'dir, burada T , öğelerin türüdür. Örneğin int32* bir tamsayı dizisini temsil eder.

  • Adlandırılmış demet türleri ( tff.StructType ). Bunlar, TFF'nin, önceden tanımlanmış sayıda öğeye sahip, adlandırılmış veya adlandırılmamış belirli tiplere sahip tuple'lar ve sözlük benzeri yapılar oluşturma yöntemidir. Daha da önemlisi, TFF'nin adlandırılmış tanımlama grubu kavramı, Python'un bağımsız değişken gruplarının soyut eşdeğerini, yani bazılarının adlandırıldığı, ancak hepsinin adlandırılmadığı ve bazılarının konumsal olduğu öğelerin koleksiyonlarını kapsar.

    Adlandırılmış demetler için kompakt gösterim <n_1=T_1, ..., n_k=T_k> ; burada n_k isteğe bağlı öğe adlarıdır ve T_k öğe türleridir. Örneğin, <int32,int32> bir çift adsız tamsayı için kompakt bir gösterimdir ve <X=float32,Y=float32> , bir düzlemdeki bir noktayı temsil edebilen X ve Y adlı bir çift kayan nokta için kompakt bir gösterimdir. . Tuple'lar diğer türlerle karıştırılabileceği gibi iç içe de yerleştirilebilir, örneğin <X=float32,Y=float32>* , bir dizi nokta için kompakt bir gösterim olacaktır.

  • İşlev türleri ( tff.FunctionType ). TFF, işlevleri birinci sınıf değerler olarak ele alan 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 tipidir ve U , sonucun tipidir veya ( -> U) argüman yoksa (argümansız fonksiyonlar dejenere olsa da) çoğunlukla sadece Python düzeyinde var olan kavram). Örneğin (int32* -> int32) , bir tamsayı dizisini tek bir tamsayı değerine indirgeyen bir tür işlev 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 şekilde TFF'ye özgü olduğundan, ek yorumlar ve örnekler için özel algoritmalar eğitimine başvurmanızı öneririz.

  • Yerleşim türü . Bu tür, bu türün sabitleri olarak düşünebileceğiniz 2 değişmez tff.SERVER ve tff.CLIENTS dışında henüz genel API'de açığa çıkmamıştır. Ancak dahili olarak kullanılır ve gelecek sürümlerde genel API'de tanıtılacaktır. Bu türün kompakt gösterimi placement .

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

    Yerleşim kavramını tanımlamanın birincil amacı, birleşik türleri tanımlamanın temelidir.

  • Birleşik türler ( tff.FederatedType ). Birleştirilmiş türün değeri, 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şik bir tür, yerleştirme değeri (dolayısıyla bağımlı bir türdür ), üye bileşenlerin türü (her bir katılımcının yerel olarak barındırdığı içerik türü) 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ırma.

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

    Örneğin:

    • {int32}@CLIENTS , istemci cihaz başına bir tane olmak üzere, potansiyel olarak farklı tamsayılar kümesinden oluşan birleşik bir değeri temsil eder. Ağ üzerinde birden çok yerde görünen birden çok veri öğesini kapsayan tek bir birleşik değerden bahsettiğimizi unutmayın. Bunu düşünmenin bir yolu, "ağ" boyutuna sahip bir tür tensördü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 , birleştirilmiş bir veri kümesini temsil eder, istemci cihaz başına bir dizi olmak üzere birden çok XY koordinat dizisinden oluşan bir değerdir.

    • <weights=float32[10,5],bias=float32[5]>@SERVER , sunucudaki adlandırılmış ağırlık ve bias tensör grubunu 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ı

Federated Core'un dili, birkaç ek öğeyle birlikte bir lambda hesabı biçimidir.

Şu anda genel API'de 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şlevlerin aksine, yapılandırılmış parametreler alabilir veya bir dizi türünün yapılandırılmış sonuçlarını döndürebilirler.

    İşte bir örnek, tam sayıların toplamını hesaplamak için tf.data.Dataset.reduce operatörünü kullanan (int32* -> int) bir TF hesaplaması:

    @tff.tf_computation(tff.SequenceType(tf.int32))
    def add_up_integers(x):
      return x.reduce(np.int32(0), lambda x, y: x + y)
    
  • Intrinsics veya federe operatörler ( tff.federated_... ). Bu, çoğu TFF ile kullanım için dağıtılmış iletişim operatörlerini temsil eden, FC API'sinin büyük kısmını oluşturan tff.federated_sum veya tff.federated_broadcast gibi işlevlerden oluşan bir kitaplıktır.

    Bunları içsel olarak adlandırıyoruz, çünkü bir şekilde içsel işlevler gibi, bunlar TFF tarafından anlaşılan ve daha düşük seviyeli kodda derlenen açık uçlu, genişletilebilir bir operatörler grubudur.

    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ünde bir ş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.

    İşte daha önce bahsettiğimiz bir lambda ifadesi örneği:

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

  • İşlev çağrıları ( __call__ ). İşlevsel bir türü olan herhangi bir şey, standart Python __call__ sözdizimi kullanılarak çağrılabilir. Çağırma, türü çağrılan işlevin 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 bir çağrısını temsil eder. Bu ifadenin türü int32 .

    • tff.federated_mean(sensor_readings) , sensor_readings üzerinde birleşik ortalama alma operatörünün bir çağrısını temsil eder. Bu ifadenin türü float32@SERVER (yukarıdaki örnekteki bağlamı varsayarak).

  • Tuples oluşturma ve öğelerini seçme . tff.federated_computation ile süslenmiş işlevlerin gövdelerinde görünen [x, y] , x[y] veya xy biçimindeki Python ifadeleri.