rasa对话系统踩坑记(九)

实现在rasa-core中给policy提速

之前在rasa对话系统踩坑记(六)中提到过EmbeddingPolicyKerasPolicy运行起来特别慢,原因是作者没有充分利用CPU资源,没有使用GPU资源,然后我对其进行了优化,并且也给rasa-core提交了pull request。之所以拖到现在才写这块的总结,因为期间一直在让Ghostvv给我review代码(不得不说德国人的认真劲让我吃了不少苦头),然后每次都是晚上他给我提修改建议,白天我改过来,所以比较慢,而且开始为了跑通Travis CI花了好久。到目前为止还没有被merge到rasa-core主线上,只能耐心等待。

具体的实现真的很简单,只是加了个tensorflow session config的配置。做这个优化的初衷是因为我们实际训练story真的好慢好慢,而且还只是用的KerasPolicy,慢到开始怀疑是不是服务器太烂。然后同组的飞龙同学发现rasa-core的policy没有支持GPU的配置,待加上了之后让本来需要半天才能跑完的模型半小时就结束了。

一开始我是在自定义的policy上将继承的policy的对应方法进行了重写,比如:

config_proto = {
    "device_count": cpu_count(),
    "inter_op_parallelism_threads": 0,
    "intra_op_parallelism_threads": 0,
    "allow_growth": True
}

def get_config_proto(config_proto_params):
    # 配置configProto
    config = tf.ConfigProto(
        device_count={
            'CPU': config_proto_params.get('device_count')
        },
        inter_op_parallelism_threads=config_proto_params.get('inter_op_parallelism_threads', 0),
        intra_op_parallelism_threads=config_proto_params.get('intra_op_parallelism_threads', 0),
        gpu_options={
            'allow_growth': config_proto_params.get('allow_growth', True)
        }
    )
    return config
class CustomPolicy(KerasPolicy):
    def model_architecture(self, input_shape, output_shape):
        """Build a Keras model and return a compiled model."""
        ...

    def train(self, training_trackers, domain, **kwargs):
        ...

        self.graph = tf.Graph()
        with self.graph.as_default():
            self.session = tf.Session(config=get_config_proto(config_proto))
            ...

    @classmethod
    def load(cls, path):
        ...
                graph = tf.Graph()
                with graph.as_default():
                    session = tf.Session(config=get_config_proto(config_proto))
                    ...
        ...

这里是继承自KerasPolicy,并且将其中的trainload方法重置了,在tf.Session加上了config的参数配置。tf.ConfigProto这里主要设置了4个参数,分别的含义是:

  • device_count:告诉tf Session使用CPU数量上限,如果你的CPU数量较多,可以适当加大这个值
  • inter_op_parallelism_threads: 控制运算符op内部的并行,当运算符op为单一运算符,并且内部可以实现并行时,如矩阵乘法,reduce_sum之类的操作,可以通过设置intra_op_parallelism_threads 参数来并行, intra代表内部。
  • intra_op_parallelism_threads:控制多个运算符op之间的并行计算,当有多个运算符op,并且他们之间比较独立,运算符和运算符之间没有直接的路径Path相连。Tensorflow会尝试并行地计算他们,使用由inter_op_parallelism_threads参数来控制数量的一个线程池。
  • allow_growth:如果设置为True,将动态申请显存

但是这样做就很麻烦,每次都要将KerasPolicy方法重置。所以后面想到的是直接给官网提意见,提pr。和Ghostvv沟通后,需要在KerasPolicyEmbeddingPolicy都要将其实现。看似很简单,只要在两个policytrainload方法上加上tf.ConfigProto就行了,事实也只需要如此。但作为开源项目可不单单做这些就可以了。需要考虑统一性、复用性和简洁性。最终是在Policy这个父类上加了
_load_tf_config的静态方法和tf_defaults静态属性,并在KerasPolicyEmbeddingPolicy_load_params方法上分别对其parameters进行了merge。代码如下:

def _load_params(self, **kwargs: Dict[Text, Any]) -> None:
        self.config = copy.deepcopy(dict(self.defaults, **self.tf_defaults))
        self.config.update(kwargs)

        self._tf_config = self._load_tf_config(self.config)
        self._load_nn_architecture_params(self.config)
        self._load_embedding_params(self.config)
        self._load_regularization_params(self.config)
        self._load_attn_params(self.config)
        self._load_visual_params(self.config)

还有在数据存储这块,最终也是将_load_tf_config返回的值进行了pickle的存储。省去了每次都要调用_load_tf_config这个方法。细节这块现在还只能看pull request 1494,等合并到主线,就可以使用了。

很期待成为rasa-core的contributor,之前已经很水的成为rasa-nlu的contributor了。原创文章,转载请说明出处

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