1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ItisDL-FATE

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
develop_guide.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 12:14 0aa7b70

Разработка руководств для создания исполняемого модуля алгоритма FATE

В этом документе описывается, как разработать модуль алгоритма, который можно вызывать в архитектуре FATE.

Для разработки модуля необходимо выполнить следующие 5 шагов:

  1. Определить объект параметров Python, который будет использоваться в этом модуле.
  2. Определить конфигурационный файл JSON модуля.
  3. Определить конфигурацию по умолчанию для времени выполнения модуля в формате JSON.
  4. Определить файл transfer_variable в формате JSON, если модулю требуется федерация.
  5. Определить свой модуль, который должен наследовать класс model_base.

В следующих разделах мы подробно опишем эти 5 шагов на примере toy_example.

Шаг 1. Определение объекта параметров, который будет использовать этот модуль

Объект параметров — это единственный способ передать определяемые пользователем параметры времени выполнения в разрабатываемый модуль, поэтому каждый модуль имеет свой собственный объект параметров.

Чтобы определить пригодный к использованию объект параметров, потребуются три шага:

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.

Шаг 3. Определение default runtime conf этого модуля (необязательно)

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" }, ... }

Шаг 4. Определение transfer variable json этого модуля и создание объекта transfer variable (необязательно)

Этот шаг необходим только тогда, когда этот модуль является федеративным, то есть существует информационное взаимодействие между различными сторонами. Обратите внимание, что этот файл json должен быть помещён в папку federatedml/transfer_variable_conf. В файле json сначала необходимо определить имя объекта transfer_variable, например, «HeteroLRTransferVariable». Затем определите transfer_variables. Transfer_variable включает три поля:

а. имя переменной.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/ItisDL-FATE.git
git@api.gitlife.ru:oschina-mirror/ItisDL-FATE.git
oschina-mirror
ItisDL-FATE
ItisDL-FATE
master