В этом документе представлен базовый уровень TFF, который служит основой для федеративного обучения , а также возможные будущие федеративные алгоритмы, не связанные с обучением.
Для более подробного ознакомления с Federated Core прочтите следующие руководства, поскольку они на примерах знакомят с некоторыми фундаментальными понятиями и демонстрируют шаг за шагом построение простого алгоритма федеративного усреднения.
Пользовательские федеративные алгоритмы, часть 1: Введение в федеративное ядро .
Пользовательские федеративные алгоритмы, часть 2. Реализация федеративного усреднения .
Мы также рекомендуем вам ознакомиться с федеративным обучением и соответствующими учебными пособиями по классификации изображений и генерации текста , поскольку использование Federated Core API (FC API) для федеративного обучения обеспечивает важный контекст для некоторых решений, которые мы сделали в проектирование этого слоя.
Обзор
Цели, предполагаемое использование и область применения
Federated Core (FC) лучше всего понимать как среду программирования для реализации распределенных вычислений, т. е. вычислений, в которых участвуют несколько компьютеров (мобильные телефоны, планшеты, встроенные устройства, настольные компьютеры, датчики, серверы баз данных и т. д.), каждый из которых может выполнять не- тривиальную обработку локально и общаться по сети для координации своей работы.
Термин «распределенный» является очень общим, и TFF не охватывает все возможные типы распределенных алгоритмов, поэтому мы предпочитаем использовать менее общий термин «федеративные вычисления» для описания типов алгоритмов, которые могут быть выражены в этой структуре.
Хотя определение термина «федеративные вычисления» полностью формальным образом выходит за рамки этого документа, подумайте о типах алгоритмов, которые вы можете увидеть в псевдокоде в исследовательской публикации , описывающей новый алгоритм распределенного обучения.
Вкратце, цель FC — обеспечить столь же компактное представление на аналогичном псевдокоду уровне абстракции логики программы, которая не является псевдокодом, а скорее исполняется в различных целевых средах.
Ключевой определяющей характеристикой типов алгоритмов, для выражения которых предназначен FC, является то, что действия участников системы описываются коллективно. Таким образом, мы склонны говорить о каждом устройстве, локально преобразующем данные, и об устройствах, координирующих работу с помощью централизованного координатора, транслирующего , собирающего или агрегирующего их результаты.
Хотя TFF был разработан для того, чтобы выйти за рамки простых архитектур клиент-сервер , понятие коллективной обработки является фундаментальным. Это связано с происхождением TFF в федеративном обучении, технологии, изначально разработанной для поддержки вычислений над потенциально конфиденциальными данными, которые остаются под контролем клиентских устройств и которые нельзя просто загрузить в централизованное место по соображениям конфиденциальности. Хотя каждый клиент в таких системах вносит данные и вычислительную мощность для вычисления результата системой (результат, который, как мы обычно ожидаем, будет иметь ценность для всех участников), мы также стремимся сохранить конфиденциальность и анонимность каждого клиента.
Таким образом, хотя большинство платформ для распределенных вычислений предназначены для выражения обработки с точки зрения отдельных участников, то есть на уровне обмена отдельными сообщениями «точка-точка», и взаимозависимости локальных переходов состояний участника с входящими и исходящими сообщениями Federated Core TFF предназначен для описания поведения системы с глобальной общесистемной точки зрения (аналогично, например, MapReduce ).
Следовательно, хотя распределенные платформы общего назначения могут предлагать такие операции, как отправка и получение, в качестве строительных блоков, FC предоставляет такие строительные блоки, как tff.federated_sum
, tff.federated_reduce
или tff.federated_broadcast
, которые инкапсулируют простые распределенные протоколы.
Язык
Интерфейс Python
TFF использует внутренний язык для представления объединенных вычислений, синтаксис которого определяется сериализуемым представлением в вычислений.proto . Однако пользователям FC API обычно не требуется напрямую взаимодействовать с этим языком. Вместо этого мы предоставляем API Python (пространство имен tff
), которое окружает его и позволяет определять вычисления.
В частности, TFF предоставляет декораторы функций Python, такие как tff.federated_computation
, которые отслеживают тела декорированных функций и создают сериализованные представления логики объединенных вычислений на языке TFF. Функция, украшенная tff.federated_computation
действует как носитель такого сериализованного представления и может встраивать его как строительный блок в тело другого вычисления или выполнять его по требованию при вызове.
Вот только один пример; Дополнительные примеры можно найти в руководствах по пользовательским алгоритмам .
@tff.federated_computation(federated_language.FederatedType(np.float32, federated_language.CLIENTS))
def get_average_temperature(sensor_readings):
return tff.federated_mean(sensor_readings)
Читатели, знакомые с TensorFlow без особого энтузиазма, найдут этот подход аналогом написания кода Python, который использует такие функции, как tf.add
или tf.reduce_sum
в разделе кода Python, определяющем граф TensorFlow. Хотя код технически выражен на Python, его цель — создать сериализуемое представление tf.Graph
, находящегося под ним, и именно граф, а не код Python, выполняется внутри среды выполнения TensorFlow. Аналогично, можно думать о tff.federated_mean
как о вставке объединенной операции в объединенное вычисление, представленное get_average_temperature
.
Частично причина определения языка FC связана с тем фактом, что, как отмечалось выше, федеративные вычисления определяют распределенное коллективное поведение, и поэтому их логика нелокальна. Например, TFF предоставляет операторы, входные и выходные данные которых могут находиться в разных местах сети.
Это требует языка и системы типов, отражающих понятие распределенности.
Тип системы
Federated Core предлагает следующие категории типов. При описании этих типов мы указываем на конструкторы типов, а также вводим компактные обозначения, поскольку это удобный способ описания типов вычислений и операторов.
Во-первых, вот категории типов, которые концептуально аналогичны тем, которые встречаются в существующих основных языках:
Тензорные типы (
federated_language.TensorType
). Как и в TensorFlow, они имеютdtype
иshape
. Единственное отличие состоит в том, что объекты этого типа не ограничиваются экземплярамиtf.Tensor
в Python, которые представляют выходные данные операций TensorFlow в графе TensorFlow, но могут также включать в себя единицы данных, которые могут быть созданы, например, как выходные данные распределенного протокол агрегации. Таким образом, тип тензора TFF — это просто абстрактная версия конкретного физического представления такого типа в Python или TensorFlow.TensorTypes
TFF может быть более строгим в своей (статической) обработке фигур, чем TensorFlow. Например, система типов TFF рассматривает тензор с неизвестным рангом как присваиваемый из любого другого тензора того жеdtype
, но не присваиваемый какому-либо тензору с фиксированным рангом. Такая обработка предотвращает определенные сбои во время выполнения (например, попытку преобразовать тензор неизвестного ранга в форму с неправильным числом элементов) за счет большей строгости в том, какие вычисления TFF принимает как действительные.Компактное обозначение тензорных типов —
dtype
илиdtype[shape]
. Например,int32
иint32[10]
— это типы целых чисел и векторов int соответственно.Типы последовательностей (
federated_language.SequenceType
). Это абстрактный эквивалент TFF конкретной концепцииtf.data.Dataset
в TensorFlow. Элементы последовательностей могут использоваться последовательно и могут включать сложные типы.Компактное представление типов последовательностей —
T*
, гдеT
— тип элементов. Например,int32*
представляет целочисленную последовательность.Именованные типы кортежей (
federated_language.StructType
). Это способ TFF создания кортежей и словарных структур, которые имеют заранее определенное количество элементов определенных типов, именованных или безымянных. Важно отметить, что концепция именованного кортежа в TFF охватывает абстрактный эквивалент кортежей аргументов Python, то есть коллекции элементов, из которых некоторые, но не все, имеют имена, а некоторые являются позиционными.Компактное обозначение именованных кортежей —
<n_1=T_1, ..., n_k=T_k>
, гдеn_k
— необязательные имена элементов, аT_k
— типы элементов. Например,<int32,int32>
— это компактное обозначение пары безымянных целых чисел, а<X=float32,Y=float32>
— компактное обозначение пары чисел с плавающей запятой с именамиX
иY
, которые могут представлять точку на плоскости. . Кортежи могут быть вложенными, а также смешиваться с другими типами, например,<X=float32,Y=float32>*
будет компактным обозначением последовательности точек.Типы функций (
federated_language.FunctionType
). TFF — это среда функционального программирования, в которой функции рассматриваются как первоклассные значения . Функции имеют не более одного аргумента и ровно один результат.Компактное обозначение функций:
(T -> U)
, гдеT
— тип аргумента, аU
— тип результата, или( -> U)
если аргумента нет (хотя функции без аргументов являются вырожденными концепция, которая существует в основном только на уровне Python). Например(int32* -> int32)
— это обозначение типа функций, которые сводят целочисленную последовательность к одному целочисленному значению.
Следующие типы относятся к аспекту распределенных систем вычислений TFF. Поскольку эти концепции в некоторой степени уникальны для TFF, мы рекомендуем вам обратиться к руководству по пользовательским алгоритмам для получения дополнительных комментариев и примеров.
Тип размещения . Этот тип еще не представлен в общедоступном API, за исключением двух литералов
federated_language.SERVER
иfederated_language.CLIENTS
, которые можно рассматривать как константы этого типа. Однако он используется внутри компании и будет представлен в общедоступном API в будущих выпусках. Компактное представление этого типа —placement
.Размещение представляет собой коллектив участников системы, играющих определенную роль. Первоначальный выпуск ориентирован на клиент-серверные вычисления, в которых участвуют две группы: клиенты и сервер (последний можно рассматривать как одноэлементную группу). Однако в более сложных архитектурах могут быть и другие роли, например промежуточные агрегаторы в многоуровневой системе, которые могут выполнять разные типы агрегации или использовать типы сжатия/распаковки данных, отличные от тех, которые используются либо сервером, либо сервером. клиенты.
Основная цель определения понятия размещений — создание основы для определения объединенных типов .
Федеративные типы (
federated_language.FederatedType
). Значением объединенного типа является значение, которое размещается группой участников системы, определенной определенным размещением (например,federated_language.SERVER
илиfederated_language.CLIENTS
). Интегрированный тип определяется значением размещения (таким образом, это зависимый тип ), типом составляющих членов (какой контент каждый из участников размещает локально) и дополнительным битомall_equal
, который указывает, все ли участники являются локальными. хостинг того же элемента.Компактное обозначение объединенного типа значений, включающего элементы (компоненты-члены) типа
T
, каждый из которых размещен в группе (размещении)G
— этоT@G
или{T}@G
с установленным или не установленным битомall_equal
соответственно.Например:
{int32}@CLIENTS
представляет собой объединенное значение , состоящее из набора потенциально различных целых чисел, по одному на каждое клиентское устройство. Обратите внимание, что мы говорим об одном объединенном значении , охватывающем несколько элементов данных, которые появляются в разных местах сети. Можно рассматривать его как своего рода тензор с «сетевым» измерением, хотя эта аналогия не идеальна, поскольку TFF не разрешает произвольный доступ к компонентам-членам федеративного значения.{<X=float32,Y=float32>*}@CLIENTS
представляет собой объединенный набор данных , значение, состоящее из нескольких последовательностей координатXY
, по одной последовательности на каждое клиентское устройство.<weights=float32[10,5],bias=float32[5]>@SERVER
представляет именованный кортеж тензоров веса и смещения на сервере. Поскольку мы опустили фигурные скобки, это означает, что установлен битall_equal
, т. е. существует только один кортеж (независимо от того, сколько реплик серверов может быть в кластере, содержащем это значение).
Строительные блоки
Язык Federated Core — это форма лямбда-исчисления с несколькими дополнительными элементами.
Он предоставляет следующие абстракции программирования, которые в настоящее время представлены в общедоступном API:
Вычисления TensorFlow (
tff.tensorflow.computation
). Это разделы кода TensorFlow, завернутые в TFF как повторно используемые компоненты с помощью декоратораtff.tensorflow.computation
. У них всегда есть функциональные типы, и в отличие от функций в TensorFlow они могут принимать структурированные параметры или возвращать структурированные результаты типа последовательности.Вот один пример: вычисление TF типа
(int32* -> int)
которое использует операторtf.data.Dataset.reduce
для вычисления суммы целых чисел:@tff.tensorflow.computation(federated_language.SequenceType(np.int32)) def add_up_integers(x): return x.reduce(np.int32(0), lambda x, y: x + y)
Внутренние или федеративные операторы (
tff.federated_...
). Это библиотека функций, таких какtff.federated_sum
илиtff.federated_broadcast
, которые составляют основную часть API FC, большинство из которых представляют операторы распределенной связи для использования с TFF.Мы называем их встроенными , потому что, подобно внутренним функциям , они представляют собой открытый расширяемый набор операторов, которые понимаются TFF и компилируются в код нижнего уровня.
Большинство этих операторов имеют параметры и результаты объединенных типов, и большинство из них представляют собой шаблоны, которые можно применять к различным типам данных.
Например,
tff.federated_broadcast
можно рассматривать как оператор шаблона функционального типаT@SERVER -> T@CLIENTS
.Лямбда-выражения (
tff.federated_computation
). Лямбда-выражение в TFF эквивалентноlambda
илиdef
в Python; он состоит из имени параметра и тела (выражения), содержащего ссылки на этот параметр.В коде Python их можно создать, украсив функции Python атрибутом
tff.federated_computation
и определив аргумент.Вот пример лямбда-выражения, о котором мы уже упоминали ранее:
@tff.federated_computation(federated_language.FederatedType(np.float32, federated_language.CLIENTS)) def get_average_temperature(sensor_readings): return tff.federated_mean(sensor_readings)
Литералы размещения . На данный момент используются только
federated_language.SERVER
иfederated_language.CLIENTS
, чтобы можно было определять простые вычисления клиент-сервер.Вызовы функций (
__call__
). Все, что имеет функциональный тип, может быть вызвано с использованием стандартного синтаксиса Python__call__
. Вызов представляет собой выражение, тип которого совпадает с типом результата вызываемой функции.Например:
add_up_integers(x)
представляет собой вызов вычисления TensorFlow, определенного ранее для аргументаx
. Тип этого выражения —int32
.tff.federated_mean(sensor_readings)
представляет собой вызов оператора федеративного усреднения дляsensor_readings
. Тип этого выражения —float32@SERVER
(при условии контекста из примера выше).
Формирование кортежей и выбор их элементов. Выражения Python формы
[x, y]
,x[y]
илиxy
, которые появляются в телах функций, украшенныхtff.federated_computation
.