alibaba / x-deeplearning

An industrial deep learning framework for high-dimension sparse data
Apache License 2.0
4.26k stars 1.03k forks source link

怎么生成DIEN模型的graph_ulf.txt这个文件呢?graph.txt文件目前是生成了的,graph_ulf.txt在xdl训练产生的模型转换为blaze模型时需要。 #298

Open wheatx opened 4 years ago

wheatx commented 4 years ago

麻烦帮解决下这个问题吧。前期已经花费了不少时间了处理各种问题了,现在这步卡着过不去,这个文件又很难手动写出来,相关文档太少了,真的需要这个文件graph_ulf.txt

larsoncs commented 4 years ago

同问

lovickie commented 4 years ago

撰写说明文档 https://github.com/alibaba/x-deeplearning/blob/master/blaze/blaze/model_importer/ulf.md

wheatx commented 4 years ago

撰写说明文档 https://github.com/alibaba/x-deeplearning/blob/master/blaze/blaze/model_importer/ulf.md

DIEN中,RNN相关的那些可能比较难参考这个文档写出来,其它的部分倒是可以参考DIN的那个

lovickie commented 4 years ago

这是tdm模型的例子 https://github.com/alibaba/x-deeplearning/blob/master/blaze/tools/example_model/tdm_att/model/graph_ulf.txt

wheatx commented 4 years ago

嗯。但是DIEN中RNN那块好像没有可以参考的不然直接看DIN的这个https://github.com/alibaba/x-deeplearning/blob/master/blaze/tools/example_model/din/model/graph_ulf.txt 还会更好写呢。

lovickie commented 4 years ago

RNN的话,参考一下 https://github.com/alibaba/x-deeplearning/blob/master/blaze/blaze/model_importer/ulf.md#gru_layer

wheatx commented 4 years ago

image 比如图中的dynamic_rnn层 要用ulf的哪个layper, ulf.md中gru_layer也没有例子,其它layer都有例子

MaButing commented 4 years ago

比如图中的dynamic_rnn层 要用ulf的哪个layper, ulf.md中gru_layer也没有例子,其它layer都有例子

例子如下:

layer_params {
  name : "gru"
  type : "gru_layer"
  bottom : "input_tensor"
  top : "output_tensor"
}

这里 input_tensor和output_tensor都是shape为[batch_size, seq_length, num_units]的三维张量。 其语义与下面的tf代码相同:

cell = tf.nn.rnn_cell.GRUCell(num_units=num_units)
output_tensor, _ = tf.nn.dynamic_rnn(cell, inputs=input_tensor)

我们之后会将文档中的例子补充完整。

wheatx commented 4 years ago

rnn_outputs2, final_state2 = dynamic_rnn(VecAttGRUCell(attention_size*8, kernel_initializer=get_tf_initializer()), inputs=rnn_outputs, att_scores=tf.expand_dims(alphas, -1), sequence_length=seq_len, dtype=tf.float32, scope="gru2") 请教下DIEN下,RNN2的写法,多了个alphas

MaButing commented 4 years ago

rnn_outputs2, final_state2 = dynamic_rnn(VecAttGRUCell(attention_size*8, kernel_initializer=get_tf_initializer()), inputs=rnn_outputs, att_scores=tf.expand_dims(alphas, -1), sequence_length=seq_len, dtype=tf.float32, scope="gru2") 请教下DIEN下,RNN2的写法,多了个alphas

你指的是这个吗?这个dynamic_rnn是自己实现的,不是tf原生的语义,所以暂时还没有支持。

wheatx commented 4 years ago

但是,看你们既然放了dien的xdl版 那应该线上是有上线dien的吧。那应该也是通过blaze上的。这一步不是一定要经过的么。那你们目前是怎么解决的呢。理论上一定要写Ulf出来才可以吧。

wheatx commented 4 years ago

我发现我发的跟你发的不一样哈,你发的好像用你之前发我的就可以处理吧,然后我发的是https://github.com/alibaba/x-deeplearning/blob/master/xdl-algorithm-solution/DIEN/script/model.py里的,rnn2跟rnn1处理的方式不一样是这样的:rnn_outputs2, final_state2 = dynamic_rnn(VecAttGRUCell(self.hidden_size, kernel_initializer=get_tf_initializer()), inputs=rnn_outputs, att_scores=tf.expand_dims( alphas, -1), sequence_length=self.tensors.seq_len, dtype=tf.float32, scope="gru2")

MaButing commented 4 years ago

我发现我发的跟你发的不一样哈,你发的好像用你之前发我的就可以处理吧,然后我发的是[https://github.com/alibaba/x-deeplearning/blob/master/xdl-algorithm-solution/DIEN/script/model.py里的,rnn2跟rnn1处理的方式不一样

https://github.com/mouna99/dien/blob/1f314d16aa1700ee02777e6163fb8ca94e3d2810/script/model.py#L289 同一个函数,att_scores是一个可选参数。

wheatx commented 4 years ago

了解了。也就是说。目前只有rnn1可以用gru_layer写,rnn2多了个参数的现在还不行是吗,或者说你们是怎么解决的,还是说,像旧版一样不传att_scores,只用rnn1的结果就好了

MaButing commented 4 years ago

了解了。也就是说。目前只有rnn1可以用gru_layer写,rnn2多了个参数的现在还不行是吗,或者说你们是怎么解决的,还是说,像旧版一样不传att_scores,只用rnn1的结果就好了

可以像rnn1一样用,但视具体情况可能需要算法上做微调校准以保证效果。

wheatx commented 4 years ago

嗯嗯,如果有支持传att_scores的写法,有机会可以告知下,如果能放出dien的ulf文件就更好了。

wheatx commented 4 years ago

imagef 也就是说现在基本只能先用gru att gru 这种模式了。gru vec attgru还用不了没错吧。

MaButing commented 4 years ago

也就是说现在基本只能先用gru att gru 这种模式了。gru vec attgru还用不了没错吧。 对,blaze的RNN里只实现了GRUCell,没有实现QAAttGRUCell。

wheatx commented 4 years ago

image` 好的,从paper来看这一块对AUC的提升并没有很大,主要的提升来自辅助Loss带来接近4个点的提升

wheatx commented 4 years ago

在问一个问题,从源码中可以看出dynamic_rnn最后会返回一个pair,pair里会有两个pair (outputs, state),但是从之前对gru_layer的回复来看怎么好像只返回了outputs ,state并没有返回呢。因为state在后面的代码中会用到。

MaButing commented 4 years ago

在问一个问题,从源码中可以看出dynamic_rnn最后会返回一个pair,pair里会有两个pair (outputs, state),但是从之前对gru_layer的回复来看怎么好像只返回了outputs ,state并没有返回呢。因为state在后面的代码中会用到。

gru里的hidden state就是输出,这里的返回值state其实就是output里的最后一个batch。

wheatx commented 4 years ago

听说XDL团队正在修复BUG,不需ulf文件了,直接graph.txt就可以转成blaze需要的模型?

MaButing commented 4 years ago

听说XDL团队正在修复BUG,不需ulf文件了,直接graph.txt就可以转成blaze需要的模型?

对,针对tdm-att的一些问题#254修的,在分支blaze-fix-v1.2上。DIEN你也可以尝试一下能不能跑通。有问题也请及时提出来。

wheatx commented 4 years ago

尝试用graph.txt替换graph_ulf.txt 并加上-t 5参数,执行model_converter_example.sh 最后得到结果 image 在尝试执行 model_optimizer_example.sh 得到 [INFO ] [2019-12-03 02:25:13] [27686] [/home/wujunqing/x-deeplearning/blaze/blaze/optimizer/optimizer.h:34] optimizer op num: 0 -> 0 op个数为0

wheatx commented 4 years ago

model_converter_example.sh中的一些日志,很多OP没注册 image

MaButing commented 4 years ago

尝试用graph.txt替换graph_ulf.txt 并加上-t 5参数,执行model_converter_example.sh 最后得到结果 image 在尝试执行 model_optimizer_example.sh 得到 [INFO ] [2019-12-03 02:25:13] [27686] [/home/wujunqing/x-deeplearning/blaze/blaze/optimizer/optimizer.h:34] optimizer op num: 0 -> 0 op个数为0

这是DIEN模型是吧,那看来是不行。这些OP都是sparse部分的,blaze只支持了少量的sparse op,这些不支持。有一个办法,你可以把backend op暨dense部分单独拿出来,那个应该是可以转换的,不过这样你可能需要自己处理sparse部分,也就是embedding的逻辑,估计挺麻烦的。

wheatx commented 4 years ago

是的。你说的应该是这个地方吧 image 那是不是DIEN基本就跑不通了。

MaButing commented 4 years ago

那是不是DIEN基本就跑不通了。

是的。我查了一下当时的记录,sparse部分只是针对tdm模型做的,支持的op只有XdlImporter构造函数里的那些。

wheatx commented 4 years ago

好的。了解了哈

wheatx commented 4 years ago

我现在还是尝试用ulf版本的在写,gru那边稍稍做了下改动用了rnn1 rrn2 att 这样的,然后现在还有一个点不明白的,DIEN不是有辅助LOSS么,辅助LOSS那边的网络在ULF定义后如何跟主网络做结合呢。

MaButing commented 4 years ago

不管什么loss对于inference来说是不感知的,所以不用配。

wheatx commented 4 years ago

aux_loss = auxiliary_loss(rnn_outputs[:, :-1, :], item_his_eb[:, 1:, :], item_ehis_eb[:, 1:, :], mask[:, 1:], stag="gru") 也就是说,连这个方法里的concat, auxiliary_net , reshape相关的也都不用管对吗

MaButing commented 4 years ago

aux_loss = auxiliary_loss(rnn_outputs[:, :-1, :], item_his_eb[:, 1:, :], item_ehis_eb[:, 1:, :], mask[:, 1:], stag="gru") 也就是说,连这个方法里的concat, auxiliary_net , reshape相关的也都不用管对吗

对。inference的时候,和最终分数没有依赖关系的中间结果都是不需要算的。