В этом документе описывается, как разработать модуль алгоритма, который можно вызывать в архитектуре FATE.
Для разработки модуля необходимо выполнить следующие 5 шагов:
В следующих разделах мы подробно опишем эти 5 шагов на примере toy_example.
Объект параметров — это единственный способ передать определяемые пользователем параметры времени выполнения в разрабатываемый модуль, поэтому каждый модуль имеет свой собственный объект параметров.
Чтобы определить пригодный к использованию объект параметров, потребуются три шага:
a. Откройте новый файл Python и переименуйте его в xxx_param.py, где xxx — это имя вашего модуля, и поместите его в папку federatedm/param/. Класс объекта, определённый в xxx_param.py, должен наследовать от класса BaseParam, определённого в federatedml/param/base_param.py. b. В методе init вашего класса параметров следует указать все параметры, которые использует модуль. c. Переопределите интерфейс проверки BaseParam, иначе возникнет ошибка «не реализовано». Метод проверки используется для проверки переменных параметров.
Возьмём в качестве примера объект параметров гетеро lr. Файл Python находится в federatedml/param/logistic_regression_param.py.
Во-первых, он наследует от BaseParam:
class LogisticParam(BaseParam):
Затем определите все переменные параметров в методе init.
def __init__(self, penalty='L2',
eps=1e-5, alpha=1.0, optimizer='sgd', party_weight=1,
batch_size=-1, learning_rate=0.01, init_param=InitParam(),
max_iter=100, converge_func='diff',
encrypt_param=EncryptParam(), re_encrypt_batches=2,
encrypted_mode_calculator_param=EncryptedModeCalculatorParam(),
need_run=True, predict_param=PredictParam(), cv_param=CrossValidationParam()):
super(LogisticParam, self).__init__()
self.penalty = penalty
self.eps = eps
self.alpha = alpha
self.optimizer = optimizer
self.batch_size = batch_size
self.learning_rate = learning_rate
self.init_param = copy.deepcopy(init_param)
self.max_iter = max_iter
self.converge_func = converge_func
self.encrypt_param = copy.deepcopy(encrypt_param)
self.re_encrypt_batches = re_encrypt_batches
self.party_weight = party_weight
self.encrypted_mode_calculator_param = copy.deepcopy(encrypted_mode_calculator_param)
self.need_run = need_run
self.predict_param = copy.deepcopy(predict_param)
self.cv_param = copy.deepcopy(cv_param)
Как показано в примере выше, параметр также может быть классом Param, который наследуется от BaseParam. Значение по умолчанию этого параметра является экземпляром этого класса. Затем выделяется глубокая копия этого экземпляра для присвоения классу. Функция deepcopy используется, чтобы избежать риска одинаковых указателей во время выполнения задачи.
После правильного определения класса предоставленный анализатор параметров может рекурсивно анализировать значение каждого атрибута.
Наконец, переопределите интерфейс проверки:
def check(self):
descr = "logistic_param's"
if type(self.penalty).__name__ != "str":
raise ValueError(
"logistic_param's penalty {} not supported, should be str type".format(self.penalty))
else:
self.penalty = self.penalty.upper()
if self.penalty not in ['L1', 'L2', 'NONE']:
raise ValueError(
"logistic_param's penalty not supported, penalty should be 'L1', 'L2' or 'none'")
if type(self.eps).__name__ != "float":
raise ValueError(
"logistic_param's eps {} not supported, should be float type".format(self.eps)) **Настройка conf нового модуля**
Цель определения настройки conf — чтобы модуль fate_flow извлекал этот файл для получения информации о том, как запустить программу модуля.
a. Определите настройку conf в federatedml/conf/setting_conf/, назовите её xxx.json, где xxx — это модуль, который вы хотите разработать. Обратите внимание, что имя «xxx» очень строгое, потому что когда синтаксический анализатор dsl fate_flow извлекает модуль «xxx» в job dsl, он просто объединяет имя модуля «xxx» с «.json» и извлекает настройку conf в federatedml/conf/setting_conf/xxx.json.
b. Спецификация полей настройки conf json: * module_path: префикс пути программы разрабатываемого модуля; * default_runtime_conf: конф, в которой определены некоторые переменные параметров по умолчанию, которые будут описаны в шаге 3; * param_class: путь к определению класса param, описанному в шаге 1, это объединение пути файла параметра python и имени объекта параметра. * role: { * guest: суффикс пути для запуска гостевой программы; * host: суффикс пути для запуска хост-программы; * arbiter: суффикс пути для запуска арбитражной программы. Более того, если этому модулю не нужна федерация, то есть все стороны запускают один и тот же файл программы, «guest|host|arbiter» — это ещё один способ определить ключи ролей.
Рассмотрим hetero-lr для пояснения. Пользователи могут найти его в federatedml/conf/setting_conf/HeteroLR.json:
{ "module_path": "federatedml/logistic_regression/hetero_logistic_regression", "default_runtime_conf": "logistic_regression_param.json", "param_class": "federatedml/param/logistic_regression_param.py/LogisticParam", "role": { "guest": { "program": "hetero_lr_guest.py/HeteroLRGuest" }, "host": { "program": "hetero_lr_host.py/HeteroLRHost" }, "arbiter": { "program": "hetero_lr_arbiter.py/HeteroLRArbiter" } } }
Посмотрите на приведённое выше содержимое в HeteroLR.json. HeteroLR — это федеративный модуль, его гостевая программа определена в federatedml/logistic_regression/hetero_logistic_regression/hetero_lr_guest.py, а HeteroLRGuest — объект класса гостя. Те же правила применяются к классу хоста и классу арбитра. Fate_flow объединяет module_path и program роли для запуска этого модуля. «param_class» указывает, что объект класса параметров HeteroLR определён в «federatedml/param/logistic_regression_param.py», а имя класса — LogisticParam. А default runtime conf находится в federatedml/param/logistic_regression_param.py.
Default runtime conf устанавливает значения по умолчанию для переменных, определённых в классе параметров, которые будут использоваться в случае отсутствия пользовательской конфигурации.
Его следует поместить в federatedml/conf/default_runtime_conf (соответствует полю «default_runtime_conf» setting_conf, это необязательный выбор для написания такого файла json).
Например, в «federatedml/conf/default_runtime_conf/logistic_regression_param.json» записаны значения по умолчанию для HeteroLR:
{ "penalty": "L2", "optimizer": "sgd", "eps": 1e-5, "alpha": 0.01, "max_iter": 100, "converge_func": "diff", "re_encrypt_batches": 2, "party_weight": 1, "batch_size": 320, "learning_rate": 0.01, "init_param": { "init_method": "random_normal" }, ... }
Этот шаг необходим только тогда, когда этот модуль является федеративным, то есть существует информационное взаимодействие между различными сторонами. Обратите внимание, что этот файл json должен быть помещён в папку federatedml/transfer_variable_conf. В файле json сначала необходимо определить имя объекта transfer_variable, например, «HeteroLRTransferVariable». Затем определите transfer_variables. Transfer_variable включает три поля:
а. имя переменной.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )