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 örneklerle tanıtılır ve basit bir birleşik ortalama algoritmasının yapımı adım adım gösterilir.
Özel Birleştirilmiş Algoritmalar, Bölüm 1: Birleştirilmiş Çekirdeğe Giriş .
Özel Birleştirilmiş Algoritmalar, Bölüm 2: Birleştirilmiş Ortalamanın Uygulanması .
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ştirilmiş hesaplamaları temsil etmek için söz dizimi computation.proto dosyasındaki serileştirilebilir gösterimle tanımlanan dahili bir dil kullanır. Ancak 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ılan 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 dadtype
veshape
vardır. Tek fark, bu tür nesnelerin bir TensorFlow grafiğindeki TensorFlow işlemlerinin çıktılarını temsil eden Python'dakitf.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ü. Bu nedenle, 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
veyadtype[shape]
şeklindedir. Örneğinint32
veint32[10]
sırasıyla tamsayı ve int vektör türleridir.Sıra türleri (
tff.SequenceType
). Bunlar, TFF'nin TensorFlow'un somuttf.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; buradaT
öğelerin türüdür. Örneğinint32*
bir tam sayı dizisini temsil eder.Adlandırılmış demet türleri (
tff.StructType
). Bunlar, TFF'nin, adlandırılmış veya adlandırılmamış, 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; buradan_k
isteğe bağlı öğe adlarıdır veT_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 edebilenX
veY
adlı bir kayan nokta çifti için kompakt bir gösterimdir . Demetler diğer türlerle karıştırılabileceği gibi iç içe de yerleştirilebilir; ö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; buradaT
, bir argümanın türü veU
, 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
vetff.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 temsiliplacement
.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
veyatff.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 ekall_equal
biti ile tanımlanır. aynı öğeyi barındırıyor.Her biri grup (yerleştirme)
G
tarafından barındırılanT
türündeki öğeleri (üye bileşenler) içeren birleşik değer türleri için kompakt gösterim, sırasıylaall_equal
biti ayarlanmış veya ayarlanmamış olarakT@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 fazlaXY
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.tensorflow.computation
). Bunlar,tff.tensorflow.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.tensorflow.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şturantff.federated_sum
veyatff.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 birlambda
veyadef
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
vetff.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 öncex
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ünsensor_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]
veyaxy
biçimindeki Python ifadeleri.