Bu belge, Birleşik Öğrenme için bir temel görevi gören çekirdek TFF katmanını ve gelecekteki olası öğrenme olmayan birleşik algoritmaları tanıtır.
Federated Core'a nazik bir giriş yapmak için, bazı temel kavramları örneklerle tanıttıkları ve basit bir birleşik ortalama algoritmasının yapısını adım adım gösterdikleri için lütfen aşağıdaki eğitimleri okuyun.
Federe öğrenme için Federated Core API (FC API) kullanımı, içinde yaptığımız seçimlerden bazıları için önemli bir bağlam sağladığından, Federe Öğrenmeye ve görüntü sınıflandırması ve metin oluşturmaya ilişkin ilgili eğitimlere kendinizi alıştırmanızı da öneririz. bu katmanı tasarlamak.
Genel Bakış
Hedefler, Kullanım Amaçları ve Kapsam
Federated Core (FC) en iyi, dağıtılmış hesaplamaları, yani her biri farklı performans gösterebilen birden çok bilgisayarı (cep telefonları, tabletler, gömülü cihazlar, masaüstü bilgisayarlar, sensörler, veritabanı sunucuları vb.) İçeren hesaplamaları uygulamak için bir programlama ortamı olarak anlaşılır. yerel olarak önemsiz işleme ve çalışmalarını koordine etmek için ağ üzerinden iletişim.
Dağıtılmış terimi çok geneldir ve TFF oradaki olası tüm dağıtılmış algoritma türlerini hedeflemez, bu nedenle bu çerçevede ifade edilebilecek algoritma türlerini tanımlamak için daha az genel bir terim olan federe hesaplamayı kullanmayı tercih ederiz.
Birleşik hesaplama terimini tamamen resmi bir şekilde tanımlamak bu belgenin kapsamı dışındayken, yeni bir dağıtılmış öğrenme algoritmasını açıklayan bir araştırma yayınında sözde kodla ifade edildiğini görebileceğiniz algoritma türlerini düşünün.
Bir nusthell'de FC'nin amacı, sözde kod olmayan program mantığının benzer sözde kod benzeri bir soyutlama seviyesinde benzer şekilde kompakt gösterimini mümkün kılmaktır, bunun yerine çeşitli hedef ortamlarda çalıştırılabilir.
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 cihazdan ve sonuçlarını yayınlayan , toplayan veya bir araya getiren merkezi bir koordinatör tarafından yapılan işi 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 federe öğrenmedeki kökenlerinden kaynaklanmaktadır; bu, istemci cihazların kontrolü altında kalan potansiyel olarak hassas veriler üzerindeki hesaplamaları desteklemek için orijinal olarak tasarlanmış bir teknoloji olup, gizlilik nedenleriyle merkezi bir konuma kolayca indirilemeyebilir. 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 (genel olarak tüm katılımcılar için değerli olmasını beklediğimiz bir sonuçtur), ayrıca her müşterinin mahremiyetini ve anonimliğini korumaya çalışıyoruz.
Bu nedenle, dağıtılmış bilgi işlem için çoğu çerçeve, işlemi bireysel katılımcıların bakış açısından 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ığı düzeyinde TFF'nin Federe Çekirdeği, sistemin davranışını küresel sistem çapında perspektiften (örneğin, MapReduce'a benzer şekilde) tanımlamak için tasarlanmıştır.
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'daki serileştirilebilir gösterimle tanımlanan federe hesaplamaları temsil etmek için dahili bir dil kullanır. Ancak 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 (
tff ad alanı) sağlıyoruz.
Özellikle TFF, dekore edilmiş işlevlerin gövdelerini izleyen ve TFF'nin dilinde federe hesaplama mantığının serileştirilmiş temsillerini üreten
tff.federated_computation gibi Python işlev dekoratörleri sağlar.
tff.federated_computation ile
tff.federated_computation işlev, bu tür serileştirilmiş gösterimin taşıyıcısı olarak hareket eder ve onu başka bir hesaplamanın gövdesine bir yapı taşı olarak yerleştirebilir veya çağrıldığında isteğe bağlı olarak çalıştırabilir.
İş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)
Hevesli olmayan TensorFlow'u tanıyan okuyucular, bu yaklaşımı, bir TensorFlow grafiğini tanımlayan Python kodunun 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
tf.Graph de 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 ,
tff.federated_mean temsil edilen federe bir hesaplamaya bir federasyon operasyonu eklemek olarak
get_average_temperature .
FC'nin bir dili tanımlamasının nedeninin bir kısmı, yukarıda belirtildiği gibi, federe hesaplamaların dağıtılmış toplu davranışları belirtmesi ve bu nedenle bunların mantığının yerel olmamasıyla ilgilidir. Örneğin, TFF, ağın farklı yerlerinde mevcut olabilecek operatörler, girişler ve çıkışlar sağlar.
Bu, dağınıklık kavramını yakalayan bir dil ve bir tür sistemi gerektirir.
Tipi Sistem
Federated Core, aşağıdaki tür kategorilerini sunar. Bu türleri açıklarken, kullanışlı bir yol veya hesaplama ve işleç türlerini tanımlayan kompakt bir gösterim sunmanın yanı sıra tür kurucularına işaret ediyoruz.
İlk olarak, mevcut ana akım dillerde bulunanlara kavramsal olarak benzer tür kategorileri şunlardır:
Tensör türleri (
tff.TensorType). TensorFlow'da olduğu gibi, bunların
dtypeve
shape. Tek fark, bu türdeki nesnelerin Python'daki
tf.Tensorörnekleriyle sınırlı olmaması ve bir TensorFlow grafiğindeki TensorFlow işlemlerinin çıktılarını temsil eden, 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'daki bu tür bir türün somut fiziksel temsilinin basit bir versiyonudur.
Tensör türleri için kompakt gösterim,
dtypeveya
dtype[shape]. Örneğin,
int32ve
int32[10], sırasıyla tamsayı ve int vektörlerinin türleridir.
Sıra türleri (
tff.SequenceType). Bunlar, TFF'nin TensorFlow'un somut
tf.data.Datasets kavramının soyut eşdeğeridir. Dizilerin elemanları sıralı bir şekilde tüketilebilir ve karmaşık türleri içerebilir.
Sıra türlerinin kompakt temsili
T*ve burada
T, elemanların türüdür. Örneğin,
int32*bir tamsayı dizisini temsil eder.
Adlandırılmış demet türleri (
tff.StructType). Bunlar, TFF'nin belirli türlerde, adlandırılmış veya adlandırılmamış önceden tanımlanmış sayıda öğeye sahip tuple ve sözlüğe benzer yapılar oluşturma yöntemidir. Önemlisi, TFF'nin adlandırılmış tuple kavramı, Python'un argüman dizilerinin soyut eşdeğerini, yani tümü değil bazıları isimlendirilmiş ve bazıları konumsal olan öğe koleksiyonlarını kapsar.
Adlandırılmış
<n_1=T_1, ..., n_k=T_k>için kompakt gösterim,
<n_1=T_1, ..., n_k=T_k>, burada
n_kisteğ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
Xve
Yadlı bir kayan çift için kompakt bir gösterimdir . Tuplelar iç içe yerleştirilebilir 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.
Fonksiyon türleri (
tff.FunctionType). TFF, birinci sınıf değerler olarak değerlendirilen işlevlere sahip işlevsel bir programlama çerçevesidir. Fonksiyonların en fazla bir argümanı ve tam olarak bir sonucu vardır.
Fonksiyonlar için kompakt gösterim,
(T -> U), burada
Tbir argümanın türüdür ve
U, sonucun türüdür veya argüman yoksa
( -> U)(argüman içermeyen fonksiyonlar dejenere olmasına rağmen) Çoğunlukla sadece Python düzeyinde var olan kavram). Örneğin
(int32* -> int32), bir tamsayı dizisini tek bir tamsayı değerine indirgeyen bir işlev türü 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 öğreticisine bakmanızı öneririz.
Yerleşim türü . Bu tür, bu türden sabitler olarak
tff.SERVER2 değişmez
tff.SERVERve
tff.CLIENTSdışında genel API'de henüz açığa
tff.SERVER. Bununla birlikte, dahili olarak kullanılır ve gelecekteki sürümlerde genel API'de tanıtılacaktır. Bu türün kompakt temsili
placement.
Yerleştirme , belirli bir rolü oynayan sistem katılımcılarından oluşan bir grubu temsil eder. İlk sürüm, iki katılımcı grubunun olduğ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 ara toplayıcılar gibi, farklı toplama türleri 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ı, federe türleri tanımlamak için bir temel oluşturmaktır.
Birleşik türler (
tff.FederatedType). Federasyon türünün değeri, belirli bir yerleşimle (
tff.SERVERveya
tff.CLIENTS) tanımlanan bir grup sistem katılımcısı tarafından barındırılan
tff.CLIENTS. Federasyon türü, yerleşim değeri (bu nedenle, bağımlı bir türdür ), üye bileşenlerinin türü (katılımcıların her birinin yerel olarak ne tür içerik barındırdığı) ve tüm katılımcıların yerel olarak olup olmadığını belirten ek bit
all_equalile tanımlanır. aynı öğeyi barındırıyor.
Her biri grup (yerleşim)
Gtarafından barındırılan,
Ttürü öğeleri (üye bileşenleri) içeren federe tür değerlerin kompakt gösterimi, sırasıyla,
all_equalbit kümesiyle veya ayarlanmadan
T@Gveya
{T}@G
T@G.
Örneğin:
{int32}@CLIENTS, her istemci cihazı için bir potansiyel olarak farklı tam sayılardan oluşan bir federasyon değeri temsil eder. Ağ üzerinde birden çok konumda 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, istemci cihaz başına bir sıra olmak üzere, birden çok
XYkoordinat dizisinden oluşan bir değer olan federe 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üme parantezlerini
all_equal, bu,
all_equalbitinin 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 unsur içeren bir lambda-hesaplama biçimidir.
Şu anda genel API'de sunulan aşağıdaki programlama soyutlamalarını sağlar:
TensorFlow hesaplamaları (
tff.tf_computation). Bunlar,
tff.tf_computationdekoratörü kullanılarak
tff.tf_computationyeniden kullanılabilir bileşenler olarak sarılmış TensorFlow kod bölümleri. Her zaman işlevsel türleri vardır ve TensorFlow'daki işlevlerin aksine, yapılandırılmış parametreleri alabilir veya bir dizi türünün yapılandırılmış sonuçlarını döndürebilirler.
İşte bir örnek, tamsayıların toplamını hesaplamak için
tf.data.Dataset.reduceoperatörünü kullanan bir TF hesaplama türü
(int32* -> int):
@tff.tf_computation(tff.SequenceType(tf.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, FC API'nin büyük bir kısmını oluşturan
tff.federated_sumveya
tff.federated_broadcastgibi işlevlerden oluşan bir kitaplıktır ve çoğu TFF ile kullanım için dağıtılmış iletişim operatörlerini temsil eder.
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 koda derlenmiş açık uçlu, genişletilebilir bir işleçler kümesidir.
Bu işleçlerin çoğunun, birleşik türlerin parametreleri ve sonuçları vardır ve çoğu, çeşitli veri türlerine uygulanabilen şablonlardır.
Örneğin,
tff.federated_broadcast,
T@SERVER -> T@CLIENTSiş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
lambdaveya
defeşdeğerdir; parametre adı ve bu parametreye referansları içeren bir gövdeden (ifade) oluşur.
İş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)
İşlev çağrıları (
__call__). İşlevsel bir türü olan her şey, standart Python
__call__sözdizimi kullanılarak çağrılabilir. Çağrı, türü çağrılan işlevin sonucunun türüyle aynı olan bir ifadedir.
Örneğin:
add_up_integers(x), daha önce bir
xbağı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 federe ortalama alma operatörünün çağrılmasını temsil eder. Bu ifadenin türü
float32@SERVER(yukarıdaki örnekteki bağlam varsayılarak).
Dizilerini Şekillendirme ve kendi elemanları seçerek.
tff.federated_computationile süslenmiş işlevlerin gövdelerinde görünen
[x, y],
x[y]veya
xybiçimindeki Python ifadeleri.