Pomoc chronić Wielkiej Rafy Koralowej z TensorFlow na Kaggle Dołącz Wyzwanie

Sfederowany rdzeń

Dokument ten wprowadza warstwę rdzeniową z TFF, który służy jako podstawa do Federacji Learning i ewentualnej przyszłej zakaz uczenia algorytmów federacyjnych.

Aby uzyskać delikatne wprowadzenie do Federated Core, przeczytaj poniższe samouczki, ponieważ przedstawiają niektóre podstawowe pojęcia na przykładach i demonstrują krok po kroku konstrukcję prostego federacyjnego algorytmu uśredniania.

Chcielibyśmy również zachęcić do zapoznania się z Federacji Learning oraz związanych z tutoriali na klasyfikację obrazu i generowania tekstu , gdyż zastosowania API Federalne Rdzeń (FC API) dla stowarzyszonym nauki dostarczyć ważny kontekst dla niektórych wyborów zrobiliśmy w projektowanie tej warstwy.

Przegląd

Cele, przeznaczenie i zakres

Federated Core (FC) najlepiej rozumieć jako środowisko programistyczne do wdrażania obliczeń rozproszonych, tj. obliczeń obejmujących wiele komputerów (telefony komórkowe, tablety, urządzenia wbudowane, komputery stacjonarne, czujniki, serwery baz danych itp.), z których każdy może wykonywać inne czynności niż: trywialne przetwarzanie lokalnie i komunikowanie się w sieci w celu koordynowania ich pracy.

Termin rozprowadzany jest bardzo ogólny, a nie kierować TFF wszystkie możliwe rodzaje rozproszonych algorytmów tam, więc wolimy używać mniej ogólny termin stowarzyszonego obliczeń do opisania rodzajów algorytmów, które mogą być wyrażone w tych ramach.

Definiując pojęcie stowarzyszonego obliczeń w pełni formalny sposób wykracza poza zakres niniejszego dokumentu, pomyśl o rodzajach algorytmów można zobaczyć wyrażone w Pseudokod w publikacji badań , które opisuje nową rozproszonego algorytmu uczenia.

Celem FC w nusthell, jest umożliwienie podobnie zwartą reprezentację, przy podobnym poziomie pseudokod podobny abstrakcji, logiki programu, który nie jest pseudokod, ale raczej, to wykonywalny w różnych środowiskach docelowych.

Kluczową cechą definiującą rodzaje algorytmów, które ma wyrażać FC, jest to, że działania uczestników systemu są opisywane w sposób zbiorowy. Tak więc, mamy tendencję, aby mówić o każdym urządzeniu lokalnie przekształcania danych, a urządzenia koordynujący pracę przez scentralizowany nadawania koordynatora, gromadzenie lub agregowanie ich wyniki.

Choć TFF został zaprojektowany, aby być w stanie wyjść poza prostą architekturę klient-serwer, pojęcie zbiorowego przetwarzania jest fundamentalna. Wynika to z początków TFF w federacyjnym uczeniu się, technologii pierwotnie zaprojektowanej do obsługi obliczeń na potencjalnie wrażliwych danych, które pozostają pod kontrolą urządzeń klienckich i których nie można po prostu pobrać do scentralizowanej lokalizacji ze względu na ochronę prywatności. Podczas gdy każdy klient w takich systemach wnosi swoje dane i moc obliczeniową do obliczania wyniku przez system (wynik, który według nas będzie wartościowy dla wszystkich uczestników), staramy się również zachować prywatność i anonimowość każdego klienta.

Tak więc, podczas gdy większość frameworków dla obliczeń rozproszonych jest zaprojektowana tak, aby wyrażać przetwarzanie z perspektywy poszczególnych uczestników – to znaczy na poziomie indywidualnych wymian komunikatów punkt-punkt oraz współzależności lokalnych przejść stanu uczestnika z komunikatami przychodzącymi i wychodzącymi , TFF za Federalne Rdzeń został zaprojektowany, aby opisać zachowanie systemu z globalnego punktu widzenia całego systemu (podobnie jak np MapReduce ).

W związku z tym, podczas gdy rozproszone ramy dla celów ogólnych może oferować operacji, takich jak wysyłanie i odbieranie jak klocki, FC zapewnia bloki, takie jak budowanie tff.federated_sum , tff.federated_reduce lub tff.federated_broadcast że hermetyzacji prosty rozprowadzane protokołów.

Język

Interfejs Pythona

TFF używa języka wewnętrznego stanowią stowarzyszone obliczenia, składni, który jest zdefiniowany przez serializable zastępstwa computation.proto . Jednak użytkownicy FC API zazwyczaj nie muszą wchodzić w bezpośrednią interakcję z tym językiem. Przeciwnie, zapewniamy API Pythona (The tff namespace), który owija arounds go jako sposób definiowania obliczeń.

Konkretnie, TFF zapewnia dekoratorów funkcję Pythona, takich jak tff.federated_computation że śladu ciał zdobione funkcji i produkować szeregowane reprezentacje stowarzyszonej logiki obliczeń w języku TFF jest. Funkcja ozdobione tff.federated_computation działa jako nośnik taki serializowanym reprezentacji, a może umieścić go jako blok konstrukcyjny w ciele innego obliczeń, lub wykonać ją na żądanie przy wywołaniu.

Oto tylko jeden przykład; Więcej przykładów można znaleźć w niestandardowych algorytmów samouczków.

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

Czytelnicy zaznajomieni z upragnieniem TensorFlow nie znajdzie to podejście analogiczne do pisania kodu Pythona, który korzysta z takich funkcji, jak tf.add lub tf.reduce_sum w sekcji kodu Pythona, który określa wykres TensorFlow. Choć jest to technicznie kod wyrażony w Pythonie, jego celem jest skonstruowanie zaszeregować reprezentację tf.Graph spodu, a to na wykresie nie kod pythonie, który jest wykonany wewnętrznie przez program TensorFlow. Podobnie, można myśleć tff.federated_mean jak wstawianie stowarzyszonego op w stowarzyszonym obliczenia przedstawionego get_average_temperature .

Część powodów, dla których FC definiuje język, ma związek z faktem, że, jak wspomniano powyżej, obliczenia sfederowane określają rozproszone zachowania zbiorowe, a zatem ich logika jest nielokalna. Na przykład TFF zapewnia operatorów, których wejścia i wyjścia mogą istnieć w różnych miejscach sieci.

Wymaga to języka i systemu typów, które uchwycą pojęcie rozproszenia.

Rodzaj systemu

Federated Core oferuje następujące kategorie typów. Opisując te typy, wskazujemy na konstruktory typów, a także wprowadzamy zwartą notację, ponieważ jest to wygodny sposób opisywania typów obliczeń i operatorów.

Po pierwsze, oto kategorie typów, które są koncepcyjnie podobne do tych występujących w istniejących językach głównego nurtu:

  • Typy tensor ( tff.TensorType ). Podobnie jak w TensorFlow, mają one dtype i shape . Jedyną różnicą jest to, że przedmiotem tego typu nie ograniczają się do tf.Tensor przypadkach w Pythonie które stanowią wyjścia TensorFlow ops na wykresie TensorFlow, ale może także zawierać jednostki danych, które mogą być wytwarzane, na przykład, do sygnału rozproszonego protokół agregacji. Zatem typ tensora TFF jest po prostu abstrakcyjną wersją konkretnej fizycznej reprezentacji takiego typu w Pythonie lub TensorFlow.

    TFF za TensorTypes mogą być bardziej rygorystyczne w ich leczeniu (statycznego) kształtach niż TensorFlow. Na przykład, TFF za system typów traktuje tensora z nieznanego zaliczona do przypisania z innego tensora tego samego dtype , ale nie przypisane do każdej tensora z ustalonym stopniem. Ta obróbka zapobiega pewnym błędom w czasie wykonywania (np. próbom przekształcenia tensora o nieznanej randze w kształt z nieprawidłową liczbą elementów), kosztem większej ścisłości w obliczeniach, które TFF akceptuje jako prawidłowe.

    Zapis Zwarty typów tensor jest dtype lub dtype[shape] . Na przykład, int32 i int32[10] są rodzaje liczb INT wektorach, odpowiednio.

  • Typy kolejności ( tff.SequenceType ). Są to abstrakcyjne TFF za równoważne z betonu koncepcji TensorFlow dnia tf.data.Dataset s. Elementy sekwencji mogą być konsumowane w sposób sekwencyjny i mogą obejmować typy złożone.

    Zwarta reprezentacja typów sekwencji jest T* , gdzie T jest typem elementów. Na przykład int32* reprezentuje sekwencję liczb całkowitych.

  • Nazwane typy krotkowe ( tff.StructType ). Są sposobem konstruowania TFF za krotki i słownik podobny struktur, które mają predefiniowaną liczbę elementów o określonych typów, nazwanych lub nienazwanych. Co ważne, koncepcja nazwanych krotek TFF obejmuje abstrakcyjny odpowiednik krotek argumentów Pythona, tj. kolekcje elementów, z których niektóre, ale nie wszystkie, są nazwane, a niektóre są pozycyjne.

    Kompaktowy notacji dla nazwanych krotek jest <n_1=T_1, ..., n_k=T_k> , gdzie n_k są opcjonalne nazwy elementów i T_k są typy elementów. Na przykład <int32,int32> to kompaktowy notacja dla pary nienazwanych liczb całkowitych, a <X=float32,Y=float32> to kompaktowy notacja dla pary pływaków nazwie X i Y , które mogą stanowić punkt na płaszczyźnie . Krotki mogą być zagnieżdżane, jak również miesza się z innych typów, na przykład, <X=float32,Y=float32>* byłaby zwarta notacja dla sekwencji punktów.

  • Typy funkcyjne ( tff.FunctionType ). TFF jest funkcjonalnym ramy programowania, z funkcjami traktowanych jako wartości najwyższej klasy . Funkcje mają co najwyżej jeden argument i dokładnie jeden wynik.

    Kompaktowa notacja dla funkcji jest (T -> U) , gdzie T jest typem argumentu, a U jest typ wyniku, lub ( -> U) , jeśli nie ma argument (choć funkcjonuje bez argumentów są zdegenerowane koncepcja, która istnieje głównie tylko na poziomie Pythona). Na przykład (int32* -> int32) jest zapisem typu funkcji zmniejszenia całkowitej sekwencji do pojedynczej wartości całkowitej.

Poniższe typy dotyczą aspektu systemów rozproszonych w obliczeniach TFF. Jak te pojęcia są dość unikalne dla TFF, zachęcamy do odnoszą się do niestandardowych algorytmów poradnika dla dalszych komentarzy i przykładów.

  • Rodzaj stazu. Ten typ nie został jeszcze wystawiony w API publicznych innych niż w postaci 2 literałów tff.SERVER i tff.CLIENTS że można myśleć jako stałe tego typu. Jest jednak używany wewnętrznie i zostanie wprowadzony do publicznego interfejsu API w przyszłych wydaniach. Kompaktowa reprezentacja tego typu jest placement .

    Staż oznacza kolektyw uczestników systemu, które odgrywają szczególną rolę. Pierwsza wersja jest kierowana obliczeń klient-serwer, w którym znajdują się 2 grupy uczestników: klientów i serwer (można myśleć o ten ostatni jako grupa singleton). Jednak w bardziej rozbudowanych architekturach mogą istnieć inne role, takie jak pośrednicy agregatorzy w systemie wielowarstwowym, którzy mogą wykonywać różne typy agregacji lub używać innych typów kompresji/dekompresji danych niż te używane przez serwer lub klienci.

    Podstawowym celem zdefiniowania pojęcia praktyki jest jako podstawa do definiowania typów federacyjnych.

  • Rodzaje stowarzyszeń ( tff.FederatedType ). Wartość typu stowarzyszonym to taki, który jest obsługiwany przez grupę uczestników systemu zdefiniowanej przez umieszczenie określonej (np tff.SERVER lub tff.CLIENTS ). Stowarzyszony typ jest określony przez wartość placement (w ten sposób, że jest to rodzaj zależny ), rodzaju składników członkowskich (jakiego rodzaju treści każdego z uczestników jest lokalnie hosting) oraz dodatkowy bit all_equal określająca, czy wszyscy uczestnicy są lokalnie hostowanie tego samego przedmiotu.

    Zwarta zapisem wartości stowarzyszonego typu, które zawierają elementy (składników użytkownika) typu T , z których każdy prowadzonego przez grupę (umieszczenie) G jest T@G lub {T}@G z all_equal zestawu bitów i nie jest ustawiony, odpowiednio.

    Na przykład:

    • {int32}@CLIENTS oznacza stowarzyszonego wartość, która składa się z zestawu potencjalnie różne liczby całkowite, po jednym urządzeniem klienckim. Należy pamiętać, że mówimy o pojedynczej wartości stowarzyszonego jako obejmujące wiele elementów danych, które pojawiają się w wielu miejscach w sieci. Jednym ze sposobów, aby myśleć o tym, jak to pewnego rodzaju tensora o wymiarze „sieć”, chociaż ta analogia nie jest idealny, ponieważ TFF nie pozwala na swobodny dostęp do części składowych członek wartości stowarzyszonym.

    • {<X=float32,Y=float32>*}@CLIENTS oznacza stowarzyszonego zestaw danych, wartości, która składa się z wielu sekwencji XY współrzędnych, kolejno za urządzeniem klienckim.

    • <weights=float32[10,5],bias=float32[5]>@SERVER oznacza nazwie krotki masy i diagonalnych tensorów na serwerze. Od kiedy spadł nawiasy klamrowe, oznacza to, że all_equal bit jest ustawiony, to znaczy, że jest tylko jedna krotka (niezależnie od tego, ile serwer replik może istnieć w klastrze obsługującego tę wartość).

Cegiełki

Językiem Federalne Core jest forma lambda-rachunek , z kilkoma dodatkowymi elementami.

Zapewnia następujące abstrakcje programowania, które są obecnie dostępne w publicznym API:

  • TensorFlow obliczenia ( tff.tf_computation ). Są to części kodu TensorFlow zawinięte jako wielokrotnego składników TFF stosując tff.tf_computation dekoratora. Zawsze mają typy funkcjonalne i w przeciwieństwie do funkcji w TensorFlow mogą przyjmować parametry strukturalne lub zwracać wyniki strukturalne typu sekwencyjnego.

    Oto jeden przykład obliczeniowy typu TF (int32* -> int) , która korzysta z tf.data.Dataset.reduce operatora, aby obliczyć sumę liczb:

    @tff.tf_computation(tff.SequenceType(tf.int32))
    def add_up_integers(x):
      return x.reduce(np.int32(0), lambda x, y: x + y)
    
  • Intrinsics lub podmioty stowarzyszone ( tff.federated_... ). Jest to biblioteka funkcji takich jak tff.federated_sum lub tff.federated_broadcast które stanowią większość FC API, z których większość reprezentują rozproszonej operatorów komunikacyjnych do użytku z TFF.

    Odnosimy się do nich jako intrinsics ponieważ trochę jak swoistych funkcji , są one otwarte, rozszerzalny zestaw operatorów, które są zrozumiałe dla TFF, a skompilowany w dół do kodu niższego poziomu.

    Większość z tych operatorów ma parametry i wyniki typów stowarzyszonych, a większość to szablony, które można zastosować do różnych rodzajów danych.

    Na przykład, tff.federated_broadcast mogą być traktowane jako operator szablonu typu funkcjonalnego T@SERVER -> T@CLIENTS .

  • Wyrażenia lambda ( tff.federated_computation ). Wyrażenie lambda TFF jest odpowiednikiem lambda lub def Pythona; składa się z nazwy parametru i treści (wyrażenia), które zawiera odniesienia do tego parametru.

    W kodzie Pythona, mogą być tworzone poprzez dekorowanie funkcje Pythona z tff.federated_computation i definiowania argumentu.

    Oto przykład wyrażenia lambda, o którym wspominaliśmy już wcześniej:

    @tff.federated_computation(tff.type_at_clients(tf.float32))
    def get_average_temperature(sensor_readings):
      return tff.federated_mean(sensor_readings)
    
  • Literały stażu. Na razie tylko tff.SERVER i tff.CLIENTS aby umożliwić definiowanie prostych obliczeń klient-serwer.

  • Wywołania funkcji ( __call__ ). Wszystko, co ma typ funkcjonalne mogą być wywoływane za pomocą standardowej Pythona __call__ składnię. Wywołanie to wyrażenie, którego typ jest taki sam jak typ wyniku wywołanej funkcji.

    Na przykład:

    • add_up_integers(x) oznacza wywołanie obliczeń TensorFlow określonej wcześniej argument x . Typ tego wyrażenia jest int32 .

    • tff.federated_mean(sensor_readings) oznacza wywołanie stowarzyszonego operatora uśredniania sensor_readings . Rodzaj tego wyrażenia jest float32@SERVER (zakładając, że kontekst w przykładach powyżej).

  • Formowanie krotki i wybierając ich elementów. Pytona wyrażenia postaci [x, y] , x[y] , lub xy , występujące w ciałach funkcji ozdobione tff.federated_computation .