2020-10-09

联邦学习中通过request与中心节点通信

import requests
import json
import os

'''def cost_time(func):
    @wraps(func)
    def wraper(*args, **kwargs):
        start = time.time()
        t = func(*args, **kwargs)
        print('[run time] [%s] run time is %.2f' % (func.__name__, time.time() - start))
        return t
    return wraper'''


class RequestCommunicate(object):
    def __init__(self):
        self.ip_port = ""

    def request_join_federated(self, client_id, model_name,model_description):
        """
        Call the api request to join the joint
        Arguments:
            client_id(string): the mark for client
            model_name(string):  example--> 'C_BiLSTMCRF_NER'
        Return:
            whether_join(boolean): if join federated learning,
                                    True is join, False is not join.
            model_id(string): Unique ID of the model used for push and pull
            model_name(string): the name for model used for push and pull
            model_version(string): the version for model for push
        """
        print('[join api] start!!',flush=True)
        url = self.ip_port + "/join"
        data = {
            "client_id": client_id,
            "model_name": model_name,
            "model_description":model_description
        }
        ret = requests.get(url, params=data)
        ret = json.loads(ret.content)
        print('[join api] return: ', ret,flush=True)
        if ret['code'] == 1:
            whether_join = True
            model_id = ret['model_id']
            model_name = ret['model_name']
            model_version = ret['model_version']
            print('join accept: ', model_id, model_name, model_version,flush=True)
        else:
            print('join failed! ', ret['code'], ret['msg'],flush=True)
            whether_join = False
            model_id, model_name, model_version = "", "", ""

        return whether_join, model_id, model_name, model_version

    def request_check_model(self, voc_tag_maps, client_id):
        """
        Post requests, Call the api request to check model and return dictionary
        Arguments:
            voc_tag_maps(dictionary): vocabulary and label dictionary
                   example: {'vocab': {'安':0, '平':1, '中':2, '国':3,},
                             'tag_map': {'O': 0, 'B-BODY': 5, 'E-BODY': 6, },
                             }
            client_id(string): the mark for client
        Return:
            vob_dictionary(dictionary): global dictionary from central which like voc_tag_maps

        Notes:
            format: "pytorch", "tensorflow" et
            class_name: the name of model class. example: BiLSTMCRF
            class_filename: the model script name. example: base_model
            they are change for different file named
        :return:
        """
        print('[check api] start!!',flush=True)
        filename = os.path.join(os.getcwd(), 'base_model.py')
        files = {
            "model_binary": open(filename, "rb")
        }
        # with open(filename,'rb') as f:
        #     files=f.read()
        # f.close()
        url = self.ip_port + '/check_model'
        postdata = {"client_id": client_id,
                    "format": "pytorch",
                    "class_name": "BiLSTMCRF",
                    "class_filename": "base_model",
                    "reserve_param": json.dumps(voc_tag_maps)}
        ret = requests.post(url, data=postdata,files=files)
        ret = json.loads(ret.content)
        vob_dictionary = None
        if ret['code'] == 1:
            vob_dictionary = {'vocab': ret['vocab'],
                              'tag_map': ret['tag_map'],
                             }
            print('check accept!',flush=True)
        else:
            print('check failed! ', ret['msg'],flush=True)
        return vob_dictionary

    def push_model_to_cloud(self, post_data,modelfilename='model_cache/local_model.pth'):
        """
        Call the api to push the model to cloud
        Arguments:
            post_data(dictionary):
                client_id (string): the mark for client
                model_id (string):  get from  request_join_federated
                model_name(string): get from request_join_federated
                model_version(string): add 1 Iteratively
                                       based getted from request_join_federated
        Notes:
            format: "pytorch", "tensorflow" et
        """
        print('[push api] start!!',flush=True)
        url = self.ip_port + '/update_model'
        filename = modelfilename
        files = {
            "files": open(filename, "rb")
        }
        postdata = {"client_id": post_data["client_id"],
                    "model_id": post_data["model_id"],
                    "model_name": post_data["model_name"],
                    "model_version": post_data["model_version"],
                    "format": "pytorch",
                    "reserve_param": ""}

        r = requests.post(url, data=postdata, files=files)
        print('push response: ', r.content,flush=True)

    def pull_model_from_cloud(self, post_data, modelfilename='model_cache/fl_model.pth'):
        """
        Call the api to pull the average model to cloud.
        average model is saved in 'modelfilename'.
        Arguments:
            post_data(dictionary):
                client_id (string): the mark for client
                model_id (string):  get from  request_join_federated
                model_name(string): get from request_join_federated
        Notes:
            format: "pytorch", "tensorflow" et
        """
        print('[pull request api] : start !!',flush=True)
        url = self.ip_port + '/download_model'
        data = {"client_id": post_data["client_id"],
                "model_id": post_data["model_id"],
                "model_name": post_data["model_name"],
                "format": "pytorch",
                "source":"hangyeai",
                "reserve_param": ""}
        save_model_name=modelfilename
        ret = requests.get(url, params=data)
        with open(save_model_name, "wb") as f:
            f.write(ret.content)
        print("[pull success!!!]",flush=True)
        new_name=ret.headers['Content-Disposition']
        return(new_name[:-4].split("_")[-1])

    def upload_status(self,post_data):
        print('[upload metric api] start!!',flush=True)
        url = self.ip_port + '/upload_status'
        r = requests.get(url, params = post_data)
        print('upload status response: ', r.content,flush=True)

    def quit(self,post_data):
        print('[quit api] start!!',flush=True)
        url = self.ip_port + '/quit'
        r = requests.get(url, params = post_data)
        print('quit response: ', r.content,flush=True)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342