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

Sfederowane uczenie się

Przegląd

W tym dokumencie przedstawiono interfejsy, które ułatwiają sfederowane zadania uczenia się, takie jak szkolenie sfederowane lub ocena z istniejącymi modelami uczenia maszynowego zaimplementowanymi w TensorFlow. Projektując te interfejsy, naszym głównym celem było umożliwienie eksperymentowania ze sfederowanym uczeniem się bez konieczności posiadania wiedzy o tym, jak to działa pod maską, oraz ocena zaimplementowanych algorytmów sfederowanego uczenia się na różnych istniejących modelach i danych. Zachęcamy do powrotu do platformy. TFF został zaprojektowany z myślą o rozszerzalności i komponowaniu, dlatego chętnie przyjmujemy wkłady; jesteśmy podekscytowani, aby zobaczyć, co wymyślisz!

Interfejsy oferowane przez tę warstwę składają się z następujących trzech kluczowych części:

  • Modeli. Klasy i funkcje pomocnicze, które umożliwiają zawijanie istniejących modeli do użytku z TFF. Owijania model może być tak proste jak pojedyncze wywołanie funkcji opakowania (np tff.learning.from_keras_model ) lub określenie podklasę tff.learning.Model interfejsu pełnego możliwości dostosowywania.

  • Stowarzyszonych obliczeniowe budowniczych. Funkcje pomocnicze, które konstruują sfederowane obliczenia na potrzeby szkolenia lub oceny przy użyciu istniejących modeli.

  • Zbiorów danych. Gotowe kolekcje danych, które można pobrać i uzyskać do nich dostęp w języku Python w celu symulowania scenariuszy nauczania sfederowanego. Chociaż uczenie sfederowane jest przeznaczone do użytku ze zdecentralizowanymi danymi, których nie można po prostu pobrać w scentralizowanej lokalizacji, na etapach badań i rozwoju często wygodnie jest przeprowadzać wstępne eksperymenty przy użyciu danych, które można pobrać i manipulować lokalnie, zwłaszcza dla programistów, którzy mogą być nowość w podejściu.

Interfejsy te są określone przede wszystkim w tff.learning nazw, z wyjątkiem zbiorów danych badawczych oraz innych funkcji związanych z symulacji, które zostały pogrupowane w tff.simulation . Warstwa ta jest realizowane za pomocą interfejsów niższego poziomu oferowanych przez Federalne rdzeń (FC) , który również środowisko wykonawcze.

Przed kontynuowaniem zalecamy, aby najpierw przejrzeć tutoriale dotyczące klasyfikacji obrazu i generowania tekstu , gdyż wprowadzają większość pojęć opisanych tutaj, podając konkretne przykłady. Jeśli jesteś zainteresowany dowiedzieć się więcej o tym, jak działa TFF, może chcesz przejrzeć nad zwyczaj algorytmy samouczka jako wprowadzenie do interfejsów niższego szczebla, których używamy, aby wyrazić logikę federacyjnych obliczeń i badać istniejące wdrożenie systemu tff.learning interfejsów.

Modele

Założenia architektoniczne

Serializacja

TFF ma na celu obsługę różnych scenariuszy uczenia rozproszonego, w których napisany przez Ciebie kod modelu uczenia maszynowego może być wykonywany na dużej liczbie heterogenicznych klientów o różnych możliwościach. Chociaż na jednym końcu spektrum, w niektórych aplikacjach tymi klientami mogą być potężne serwery baz danych, wiele ważnych zastosowań, które nasza platforma zamierza wspierać, obejmuje urządzenia mobilne i wbudowane z ograniczonymi zasobami. Nie możemy zakładać, że te urządzenia mogą obsługiwać środowiska uruchomieniowe Pythona; jedyną rzeczą, jaką możemy w tym momencie założyć, jest to, że są one w stanie hostować lokalne środowisko wykonawcze TensorFlow. Dlatego podstawowym założeniem architektonicznym, jakie przyjmujemy w TFF, jest to, że kod modelu musi być możliwy do serializacji jako graf TensorFlow.

Możesz (i powinieneś) nadal rozwijać swój kod TF zgodnie z najnowszymi najlepszymi praktykami, takimi jak używanie trybu szybkiego. Należy zauważyć, iż kod musi być serializacji (na przykład, mogą być pakowane w postaci tf.function dla kodu chętny-MODE). Zapewnia to, że każdy stan Pythona lub kontrola przepływu niezbędne w trakcie realizacji można w odcinkach (ewentualnie z pomocą Autograf ).

Obecnie TensorFlow nie obsługuje w pełni serializacji i deserializacji TensorFlow w trybie podekscytowanym. Tak więc, obecnie serializacji w TFF następujący wzór TF 1.0, w którym cały kod musi być wykonany wewnątrz a tf.Graph że kontrole TFF. Oznacza to, że obecnie TFF nie może wykorzystywać już skonstruowanego modelu; zamiast tego, układ logiczny definicji modelu jest pakowany w nie-Arg funkcję, która zwraca wartość tff.learning.Model . Ta funkcja jest następnie wywoływana przez TFF, aby zapewnić serializację wszystkich składników modelu. Ponadto, będąc silnie wpisany środowiska, TFF będzie wymagało trochę dodatkowych metadanych, takich jak specyfikacja typu wejścia Twojego modelu.

Zbiór

Zalecamy większości modeli użytkownicy skonstruować za pomocą Keras, zobacz przetworniki Keras sekcji poniżej. Te opakowania obsługują agregację aktualizacji modelu oraz wszelkie metryki zdefiniowane dla modelu automatycznie. Jednak wciąż może być przydatna do zrozumienia jak agregacja jest obsługiwane za pomocą ogólnego tff.learning.Model .

W uczeniu sfederowanym zawsze istnieją co najmniej dwie warstwy agregacji: agregacja lokalna na urządzeniu i agregacja na różnych urządzeniach (lub federacja):

  • Agregacja lokalny. Ten poziom agregacji odnosi się do agregacji w wielu partiach przykładów należących do pojedynczego klienta. Dotyczy to zarówno parametrów modelu (zmiennych), które ewoluują sekwencyjnie, gdy model jest lokalnie szkolony, jak również obliczanych statystyk (takich jak średnia strata, dokładność i inne metryki), które model będzie ponownie lokalnie aktualizowany ponieważ iteruje po lokalnym strumieniu danych każdego klienta.

    Wykonywanie agregacji na tym poziomie jest obowiązkiem kodu modelu i odbywa się przy użyciu standardowych konstrukcji TensorFlow.

    Ogólna struktura przetwarzania jest następująca:

    • Pierwszy model tworzy tf.Variable S agregatów wstrzymanym, takie jak numer partii lub liczby przykładów przetworzonych sumy strat na partiami lub na przykład, itp

    • TFF wywołuje forward_pass metodę na swoim Model wiele razy, kolejno w ciągu kolejnych porcji danych klienta, co pozwala na aktualizację zmiennych posiadających różne agregaty jako efekt uboczny.

    • Wreszcie TFF wywołuje report_local_outputs metodę modelu, aby umożliwić model skompilować wszystkie podsumowania danych statystycznych zebranych w to kompaktowy zestaw metryk być eksportowane przez klienta. W tym miejscu kod Twojego modelu może na przykład podzielić sumę strat przez liczbę przykładów przetworzonych w celu wyeksportowania średniej straty itp.

  • Federalne agregacji. Ten poziom agregacji odnosi się do agregacji wielu klientów (urządzeń) w systemie. Ponownie dotyczy to zarówno parametrów modelu (zmiennych), które są uśredniane dla klientów, jak i metryk wyeksportowanych przez model w wyniku agregacji lokalnej.

    Za wykonanie agregacji na tym poziomie odpowiada TFF. Jako twórca modelu możesz jednak kontrolować ten proces (więcej na ten temat poniżej).

    Ogólna struktura przetwarzania jest następująca:

    • Model początkowy i wszelkie parametry wymagane do szkolenia są dystrybuowane przez serwer do podzbioru klientów, którzy będą uczestniczyć w rundzie szkolenia lub oceny.

    • Na każdym kliencie, niezależnie i równolegle, kod modelu jest wywoływany wielokrotnie w strumieniu lokalnych partii danych w celu wygenerowania nowego zestawu parametrów modelu (podczas uczenia) oraz nowego zestawu metryk lokalnych, jak opisano powyżej (jest to lokalny zbiór).

    • TFF uruchamia protokół agregacji rozproszonej, aby gromadzić i agregować parametry modelu oraz lokalnie wyeksportowane metryki w całym systemie. Logika ta jest wyrażona w sposób deklaratywny, używając własnego języka stowarzyszonego obliczeń TFF (a nie w TensorFlow), w modelu za federated_output_computation. Zobacz niestandardowych algorytmów poradnik dla bardziej na API agregacji.

Abstrakcyjne interfejsy

Ta podstawowa konstruktor + interfejs metadane są reprezentowane za pomocą interfejsu z tff.learning.Model w następujący sposób:

  • Konstruktorze forward_pass i report_local_outputs metody powinny konstruować zmienne modelu, podaniu, a statystyki chcesz zgłosić odpowiednio. TensorFlow skonstruowany przez te metody musi być możliwy do serializacji, jak omówiono powyżej.

  • input_spec nieruchomość, jak również 3 właściwości, które podzbiory powrotne Twojego wyszkolić, non-wyszkolić i zmiennych lokalnych reprezentacji metadanych. TFF wykorzystuje te informacje, aby określić, jak połączyć części modelu ze stowarzyszonymi algorytmami optymalizacji oraz zdefiniować wewnętrzne sygnatury typów, aby pomóc w weryfikacji poprawności zbudowanego systemu (tak, aby nie można było utworzyć instancji modelu na danych, które nie są zgodne z model jest przeznaczony do konsumpcji).

Ponadto, abstrakcyjny interfejs tff.learning.Model naraża nieruchomość federated_output_computation , że wraz z report_local_outputs nieruchomość wspomniano wcześniej, pozwala kontrolować proces agregacji statystyk podsumowania.

Można znaleźć przykłady jak określić swój własny tff.learning.Model w drugiej części naszego wizerunku klasyfikacja samouczka, a także w przykładowych modeli, których używamy do testowania w model_examples.py .

Konwertery dla Keras

Prawie wszystkie informacje, które jest wymagane przez TFF można uzyskać dzwoniąc tf.keras interfejsy, więc jeśli masz model Keras można polegać na tff.learning.from_keras_model skonstruować tff.learning.Model .

Zauważ, że TFF nadal chce, aby zapewnić konstruktora - funkcja modelu bez argumentów, takich jak:

def model_fn():
  keras_model = ...
  return tff.learning.from_keras_model(keras_model, sample_batch, loss=...)

Oprócz samego modelu dostarczasz próbną partię danych, których TFF używa do określenia typu i kształtu danych wejściowych Twojego modelu. Gwarantuje to, że TFF może prawidłowo utworzyć instancję modelu dla danych, które faktycznie będą obecne na urządzeniach klienckich (ponieważ zakładamy, że te dane nie są ogólnie dostępne w czasie konstruowania TensorFlow do serializacji).

Zastosowanie owijarki Keras jest zilustrowany w naszej klasyfikacji obrazu i generacji tekst samouczków.

Sfederowani Konstruktorzy Obliczeń

tff.learning pakiet zawiera kilka budowniczych dla tff.Computation s, które wykonują zadania związane z uczenia się; spodziewamy się, że zestaw takich obliczeń będzie się rozszerzał w przyszłości.

Założenia architektoniczne

Wykonanie

Uruchamianie obliczeń federacyjnych składa się z dwóch odrębnych etapów.

  • Kompilacji: TFF najpierw kompiluje algorytmów uczenia federacyjnych w abstrakcyjnej serializowanym reprezentacji całego rozprowadzane obliczeń. To wtedy ma miejsce serializacja TensorFlow, ale mogą wystąpić inne przekształcenia w celu obsługi wydajniejszego wykonywania. Nawiązujemy do reprezentacji serializowanym emitowanego przez kompilator jako stowarzyszonym obliczeń.

  • Wykonaj TFF zapewnia sposoby wykonania tych obliczeń. Na razie wykonanie jest obsługiwane tylko przez symulację lokalną (np. w notebooku przy użyciu symulowanych danych zdecentralizowanych).

Stowarzyszony obliczeń generowane przez TFF za Federalne Uczenie API, takich jak szkolenia, które wykorzystuje algorytm stowarzyszony modelu uśredniania lub stowarzyszonej oceny zawiera szereg elementów, przede wszystkim:

  • Zserializowanego forma kodzie modelu, a także dodatkowym kodem TensorFlow skonstruowany przez Federalne ramach nauki jazdy pętlę szkolenia / ewaluacji Twojego modelu (takie jak konstruowanie optymalizujące, przy zastosowaniu modelu aktualizacji iteracji nad tf.data.Dataset s, a obliczanie metryk, i zastosowanie zagregowanej aktualizacji na serwerze, żeby wymienić tylko kilka).

  • Deklaratywny specyfikacja komunikacji między klientami a serwerem (zwykle różne formy agregacji całej urządzeń klienckich i nadawanie z serwera do wszystkich klientów), a także w jaki sposób dystrybuowane komunikacja jest przeplatany z realizacją klienta lokalnego lub serwera lokalnego kodu TensorFlow.

Stowarzyszonej obliczenia przedstawione w niniejszym formularzu odcinkach są wyrażone w języku wewnętrznym niezależny od platformy odróżnieniu od Pythona, ale w użyciu API Federalne Learning, nie będzie musiał martwić się o szczegółach tej reprezentacji. Obliczenia są reprezentowane w kodzie Pythona jako obiekty typu tff.Computation , które w przeważającej części można traktować jako nieprzezroczyste Pythona callable s.

W tych samouczkach będziesz wywoływać te sfederowane obliczenia tak, jakby były zwykłymi funkcjami Pythona, które mają być wykonywane lokalnie. Jednakże TFF przeznaczony jest do ekspresji stowarzyszone z obliczeń w sposób agnostycznego do większości aspektów środowiska wykonawczego, dzięki czemu mogą być potencjalnie rozmieszczenia się np grup urządzeń z Android lub klastrów w centrum danych. Ponownie, głównym skutkiem tego są silne założenia dotyczące serializacji . W szczególności, kiedy powołać jedną z build_... metod opisanych poniżej obliczeń jest w pełni odcinkach.

Stan modelowania

TFF jest funkcjonalnym środowiskiem programistycznym, jednak wiele procesów związanych z uczeniem sfederowanym jest opartych na stanach. Na przykład, że pętla szkolenia obejmuje wiele rund stowarzyszonym modelu uśrednianie jest przykładem tego, co możemy sklasyfikować jako stanowego procesu. W tym procesie stan, który ewoluuje z rundy na rundę, obejmuje zestaw trenowanych parametrów modelu i ewentualnie dodatkowy stan związany z optymalizatorem (np. wektor pędu).

Ponieważ TFF jest funkcjonalny, procesy stanowe są modelowane w TFF jako obliczenia, które akceptują bieżący stan jako dane wejściowe, a następnie dostarczają zaktualizowany stan jako dane wyjściowe. Aby w pełni zdefiniować proces stanowy, należy również określić, skąd pochodzi stan początkowy (w przeciwnym razie nie możemy załadować procesu). Jest to podane w definicji klasy pomocnika tff.templates.IterativeProcess , przy czym 2 Właściwości initialize i next odpowiadającego inicjalizacji i iteracji, odpowiednio.

Dostępne budowniczych

Obecnie TFF udostępnia dwie funkcje konstruktora, które generują sfederowane obliczenia na potrzeby szkolenia i oceny sfederowanej:

Zbiory danych

Założenia architektoniczne

Wybór klienta

W typowym stowarzyszonej scenariusza uczenia się, mamy dużą populację potencjalnie setki milionów urządzeń klienckich, z których tylko niewielka część może być aktywna i dostępna dla szkolenia w danym momencie (na przykład może to być ograniczone do klientów będących podłączony do źródła zasilania, a nie do sieci z pomiarem i w inny sposób bezczynny). Ogólnie rzecz biorąc, zestaw klientów dostępnych do udziału w szkoleniu lub ocenie jest poza kontrolą programisty. Ponadto, jak to niepraktyczne koordynować miliony klientów, typowy tura szkolenia lub oceny obejmie tylko część z dostępnych klientów, która może być próbą losowo .

Kluczową konsekwencją tego jest to, że obliczenia sfederowane, z założenia, są wyrażane w sposób, który jest nieświadomy dokładnego zbioru uczestników; wszystko przetwarzanie jest wyrażona jako operacji zbiorczych na abstrakcyjnym grupy anonimowych klientów, i że grupa może się różnić od jednej rundzie szkolenia do drugiego. Rzeczywiste powiązanie obliczenia z konkretnymi uczestnikami, a tym samym z konkretnymi danymi, które wprowadzają do obliczenia, jest zatem modelowane poza samym obliczeniem.

Aby zasymulować realistyczne wdrożenie kodu nauczania sfederowanego, zazwyczaj napiszesz pętlę szkoleniową, która wygląda tak:

trainer = tff.learning.build_federated_averaging_process(...)
state = trainer.initialize()
federated_training_data = ...

def sample(federate_data):
  return ...

while True:
  data_for_this_round = sample(federated_training_data)
  state, metrics = trainer.next(state, data_for_this_round)

W celu ułatwienia tego, przy użyciu TFF w symulacjach stowarzyszony dane są akceptowane jako Python list s, z jednego elementu na uczestnictwo urządzenie klienckie do reprezentowania danego urządzenia lokalnego tf.data.Dataset .

Abstrakcyjne interfejsy

W celu ujednolicenia postępowania z symulowanych zbiorów danych federacyjnych, TFF stanowi streszczenie interfejsu tff.simulation.datasets.ClientData , która pozwala wyliczyć zbiór klientów, a na budowę tf.data.Dataset zawierający dane konkretnego klient. Ci tf.data.Dataset S może być podawane bezpośrednio jako dane wejściowe do wytworzonych stowarzyszonych obliczeń w trybie chętnie.

Należy zauważyć, że możliwość dostępu do tożsamości klientów jest funkcją, którą zapewniają tylko zestawy danych do użytku w symulacjach, w których może być potrzebna możliwość uczenia się na danych z określonych podzbiorów klientów (np. do symulacji dziennej dostępności różnych rodzaje klientów). Skompilowane obliczenia i podstawowego wykonawcze nie pociąga za sobą żadnych pojęcie tożsamości klienta. Po danych z określonego podzbioru klientów został wybrany jako wejście, na przykład, w wywołaniu tff.templates.IterativeProcess.next , tożsamość klienta nie pojawiają się w nim.

Dostępne zbiory danych

Mamy poświęcone przestrzeni nazw tff.simulation.datasets dla zbiorów danych, które wdrażają tff.simulation.datasets.ClientData interfejs do zastosowania w symulacjach i zaszczepiono go z 2 zestawów danych w celu wsparcia klasyfikacji obrazu i generowanie tekstu tutoriale. Zachęcamy do wniesienia własnych zbiorów danych do platformy.