保存模型训练数据缓存的一些忠告

很多时候我们搞NLP的需要处理文本,而文本feed给模型之前肯定要经过tokenization(分词)、serialize(序列化)、vectorization(向量化)。这个过程中我们多半会选择把预处理好的数据先cache起来,这样就不用下一次跑代码的时候重新处理了,尤其是像embedding之类的,比方说ELMO。

但是这个cache的过程中也有很多问题,自己总结了两点经验:

  1. 如果你想要cache一些缓存,比方说elmo representation,那么我劝你还是放弃吧,很麻烦的。时间复杂度高是一个,关键是就算cache成功,load过来就直接把你RAM搞大(我试过pickle load,随后立即封装Dataset,因为有re的关系吧,RAM占用居高),一般想要cache,选择那些dim为1的,比方说Bert的token_idx.
  2. 有关于存储:
    • 尽量别用pickle这个包,网上很多流传有leak问题先不说,我在用的时候最大的一个问题就是慢,还有就和第1点一样,它很占用内存。在把python对象,比方说dict序列化的时候的RAM占用,会是磁盘disk上的4、5倍左右。你存储的数据可能才几十mb,但是在内存里面cache的时候会涨到好几百mb,这个已经逼近或者完全超出普通服务器的top line了。
    • 另外torch.save也尽量别用,虽然他比pickle的诟病少一点,主要原因太慢了,比pickle还要慢上好几倍。
    • 推荐最多的是用json,既快又安全。但是它也有不足,就是没办法和pickle一样和python生态那么契合,比方说python的tuple就没办法保存成json,serialize的时候tuple就会被json转为list,在有些有特定需求的场合就不太可以适用了。
    • klepto一个代替普通python dict降低cpu内存积累消耗的理想选择,它大致上的功能就是把你内存里生成的高占用缓存数据,主动地先保存到disk里面去,等要用到的时候还可以load回来,同时保证这个obj原有的特性(比方说你要保存的dict对象,有个字段是python tuple,把这个dict保存之后load回来,那个字段属性还是一个python tuple),速度也快。我也是偶然发现的,没有试过好不好用,先马住。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值