保存模型训练数据缓存的一些忠告
很多时候我们搞NLP的需要处理文本,而文本feed给模型之前肯定要经过tokenization(分词)、serialize(序列化)、vectorization(向量化)。这个过程中我们多半会选择把预处理好的数据先cache起来,这样就不用下一次跑代码的时候重新处理了,尤其是像embedding之类的,比方说ELMO。但是这个cache的过程中也有很多问题,自己总结了两点经验:如果你想要cache
·
很多时候我们搞NLP的需要处理文本,而文本feed给模型之前肯定要经过tokenization(分词)、serialize(序列化)、vectorization(向量化)。这个过程中我们多半会选择把预处理好的数据先cache起来,这样就不用下一次跑代码的时候重新处理了,尤其是像embedding之类的,比方说ELMO。
但是这个cache的过程中也有很多问题,自己总结了两点经验:
- 如果你想要cache一些缓存,比方说elmo representation,那么我劝你还是放弃吧,很麻烦的。时间复杂度高是一个,关键是就算cache成功,load过来就直接把你RAM搞大(我试过pickle load,随后立即封装Dataset,因为有re的关系吧,RAM占用居高),一般想要cache,选择那些dim为1的,比方说Bert的token_idx.
- 有关于存储:
- 尽量别用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),速度也快。我也是偶然发现的,没有试过好不好用,先马住。

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)