Package: jointml-client
Joint-mlДанный пакет помогает реализовать удобный интрерфейс для использования вашей модели
в федеративном обучении на нашей платформе.УстановкаУстанавливаем joint-ml с помощью pip:pipinstalljointml-clientСоздание клиентаТребованияДля установки и запуска проекта, необходим Python>=3.8.0Шаг 1: Создаем модульСоздайте python файл, который называется "client_methods.py" в корневом каталоге вашего git репозитория:client_methods.pyШаг 2: В файле client_methods.py необходимо реализовать методы: load_model, get_dataset, train, test:Метод 1: load_model:Метод для генерации модели.На вход будут подаваться параметры, указанные на сервисе как Init Parameters.
Обязательные параметры, которые необходимо учитывать разработчику ML:init_parameters- параметры, которые разработчик ML указывает на сайте в разделе Init ParametersВозвращает: (nn.Module) - модель.defload_model(n_features,hidden_dim)->nn.Module:model=Net(n_features,hidden_dim)returnmodelМетод 2: get_dataset:Метод для чтения, предобработки и разбития датасета(with_split=True).На вход будут подаваться dataset_path, with_split,
а также параметры, которые разработчик ML укажет в коде как необходимые(специфические для каждого отдельного пользователя)
Тут описывается вся логика предобработки датасета.
Обязательные параметры, которые необходимо учитывать разработчику ML:dataset_path(str)- путь до csv-файла с датасетом;with_split(bool)- булева переменная, говорящая о необходимости разбития датасета на выборки(train, valid, test).
Если True, тогда следует после предобработки данных разбить их на одну из следующих выборок - (train, test), (train, valid, test).
Если False, тогда требуется лишь предобработка данных и возвращение лишь подготовленного датасета (
в дальнейшем будет использоваться для получения предсказаний модели на данных пользователя).Возвращает один из следующих кортежей:(torch.utils.data.Dataset, torch.utils.data.Dataset, torch.utils.data.Dataset) - возвращается при with_split=True. В будущем используется как train_set, valid_set и test_set(torch.utils.data.Dataset, torch.utils.data.Dataset) - возвращается при with_split=True. В будущем используется как train_set и test_set(torch.utils.data.Dataset) - возвращается при with_split=False. В будущем используется как test_set(выборка для тестирования модели на весах)defget_dataset(dataset_path:str,with_split:bool,test_size:float,shuffle:bool)->Union[Tuple[torch.utils.data.Dataset,torch.utils.data.Dataset,torch.utils.data.Dataset],Tuple[torch.utils.data.Dataset,torch.utils.data.Dataset],Tuple[torch.utils.data.Dataset]]:transactions,labels=load_dataset(dataset_path)ifwith_split:x_train,x_test,y_train,y_test=train_test_split(transactions,labels,test_size=test_size,shuffle=shuffle)x_train,x_test=preprocess_data(x_train,x_test)train_set=TransactionsDataset(x_train,y_train)test_set=TransactionsDataset(x_test,y_test)returntrain_set,test_setelse:x_test=preprocess_set(transactions)test_set=TransactionsDataset(x_test,labels)returntest_setМетод 3: train:Метод для тренировки модели, полученной из метода load_model.На вход будут подаваться: модель, сгенерированная методом load_model, train_set полученный из метода get_dataset, valid_set(опционально) полученный из
метода get_dataset(если возврат выборки предусмотрен разработчиком ML в методе get_dataset), а также
параметры, которые разработчик ML укажет в коде как необходимые(специфические для каждого отдельного пользователя).Обязательные параметры, которые необходимо учитывать разработчику ML:model(nn.Module)- модель, полученная из метода load_model;train_set(torch.utils.data.Dataset)- тренировочная выборка, полученная из метода get_dataset;valid_set(torch.utils.data.Dataset)- валидационная выборка, полученная из метода get_dataset; Подается на вход только если в методеget_dataset предусмотрено получениевалидационной выборки и ее возврата;train_parameters- параметры, которые разработчик ML указывает на сайте в разделе Train Parameters.Возвращает (List[Metric], nn.Module) - кортеж состоящий из:1. Список метрик полученных в ходе обучения;2. Обученной модели.defget_dataset(dataset_path:str,with_split:bool,test_size:float,shuffle:bool)->Union[Tuple[torch.utils.data.Dataset,torch.utils.data.Dataset,torch.utils.data.Dataset],Tuple[torch.utils.data.Dataset,torch.utils.data.Dataset],Tuple[torch.utils.data.Dataset]]:transactions,labels=load_dataset(dataset_path)ifwith_split:x_train,x_test,y_train,y_test=train_test_split(transactions,labels,test_size=test_size,shuffle=shuffle)x_train,x_test=preprocess_data(x_train,x_test)train_set=TransactionsDataset(x_train,y_train)test_set=TransactionsDataset(x_test,y_test)returntrain_set,test_setelse:x_test=preprocess_set(transactions)test_set=TransactionsDataset(x_test,labels)returntest_setМетод 4: test:Метод для тестирования модели на данных.На вход подается model, полученная из load_model; return_output и булева переменная,
говорящая о необходимости возврата выхода из модели на данных;
test_set - тестировочная выборка, полученная из get_dataset,
а также параметры, которые разработчик ML укажет в коде как необходимые(специфические для каждого отдельного пользователя).
Обязательные параметры, которые необходимо учитывать разработчику ML:model(nn.Module)- модель, полученный из метода load_modeltest_set(torch.utils.data.Dataset)- тестировочная выборка, полученная из метода get_datasetreturn_output(bool)- булева переменная, говорящая о необходимости возвращать ответы моделиtest_parameters- параметры, которые разработчик ML указывает на сайте в разделе Test ParametersВозвращает один из следующих кортежей:(List[Metric]) - метрики полученные в ходе тестирования модели на данных;(List[Metric], list) - метрики и ответы модели полученные в ходе тестирования модели на данных(только если return_output=True).deftest(model:torch.nn.Module,test_set:torch.utils.data.Dataset,return_output:bool)->Union[Tuple[List[Metric]],Tuple[List[Metric],list]]:test_loss=0.0model.eval()loss_fn=BCELoss()test_dataloader=DataLoader(test_set)outputs=[]labels=np.array([])fori,datainenumerate(test_dataloader):transactions,label=data['transaction'],data['label']transactions=transactions.reshape(transactions.shape[0],1,transactions.shape[1])output=model(transactions)loss=loss_fn(output,label)test_loss+=loss.item()outputs.append(output.cpu().detach().numpy().reshape(-1))labels=np.hstack([labels,label.cpu().reshape(-1)])test_loss/=len(test_dataloader)test_loss_metric=Metric(name="test_loss")test_loss_metric.log_value(test_loss)test_roc_auc_score=roc_auc_score(labels,np.array(outputs))test_roc_auc_score_metric=Metric(name="test_roc_auc_score")test_roc_auc_score_metric.log_value(test_roc_auc_score)ifreturn_output:return([test_loss_metric,test_roc_auc_score_metric],outputs)else:return([test_loss_metric,test_roc_auc_score_metric])Выкладываем код с реализованным классом Сlient в GitHubНеобходимо выложить готовый клиент в открытый GitHub репозиторий в ветку с именем master