deep-ctr-prediction
deep-ctr-prediction copied to clipboard
关于工业级生产tfrecord的疑问,希望作者帮我解惑
一般做法是用spark生成tfrecord再拉到本地GPU跑,但是如果CTR数据集如果小的话(2000W条以下,50个特征以下),能读进内存里,发现用tf.data.TFRecordDataset反而很慢。
本人用pandas读进内存再用tf.keras.utils.sequence构造数据生成器,大概只需要20ms/step 但用tf.data.TFRecordDataset就上升到了2s/step 总共21个step每个epoch
不知道作者是否有些建议给我,指点迷津。 例如生成tfrecord的内部格式是如何的,我现在是一个record有n个特征(key) 等等的建议,谢谢作者
抱歉,刚看到,tfrecord本身存在一些缺陷,低层采用pb,解析速度较慢,而且工业界分布式hadoop/spark生成tfrecord,int型只提供int64,所以可能tfrecord样本比原始csv样本还大很多,占用存储空间, 由于推荐模型本身网络比较简单,再加上tfrecord格式解析慢,可能用GPU训练并不比cpu快多少。 你这个相差这么多,感觉应该不至于,你检查看看应该是其他什么问题导致的,另外,你可以看看tensorflow的dataset API, 有一些参数可以调调,比如sloppy参数设为true等等。
抱歉,刚看到,tfrecord本身存在一些缺陷,低层采用pb,解析速度较慢,而且工业界分布式hadoop/spark生成tfrecord,int型只提供int64,所以可能tfrecord样本比原始csv样本还大很多,占用存储空间, 由于推荐模型本身网络比较简单,再加上tfrecord格式解析慢,可能用GPU训练并不比cpu快多少。 你这个相差这么多,感觉应该不至于,你检查看看应该是其他什么问题导致的,另外,你可以看看tensorflow的dataset API, 有一些参数可以调调,比如sloppy参数设为true等等。
谢谢作者回复,我现在优化过后的tfrecord读取速度是200-300ms,相比也还是慢点,能接受,我再认真研读一下dataset的api
@TzeSing 要注意map的位置,放的不对会非常慢
@TzeSing 要注意map的位置,放的不对会非常慢
我是batch后map(tf.io.parse_example)的