【问题标题】:Fastest way to compress a tensor in Pytorch在 Pytorch 中压缩张量的最快方法
【发布时间】:2021-10-14 07:33:58
【问题描述】:

假设我有一个小范围内的整数 Torch 张量 0,...,R(例如,R=31)。

我想以接近向量熵的方式以压缩形式存储到磁盘。

我知道的压缩技术(例如,霍夫曼和算术编码)在本质上似乎都是串行的。

  • 是否有快速的 Torch 熵压缩实现?

我很乐意使用现成的实现,但如果有人知道合适的算法,我也可以尝试自己实现。

【问题讨论】:

  • 你能澄清一下你的范围符号吗?它真的只是(包括)031 之间的整数吗?请添加有关张量大小的信息。
  • 你为什么要求“最快的方式”而不是指定什么对你来说足够快?

标签: python pytorch compression


【解决方案1】:

根据您的描述,您可以简单地将五位整数打包成一个位流。使用移位、或和和位运算符(<<>>|&)很容易压缩和解压缩。如果您的整数均匀分布在 0..31 中,并且没有重复的模式,那将尽您所能。

另一方面,如果整数分布明显偏斜或存在重复模式,则应使用现有的无损压缩器,例如 zlib、zstd 或 lzma2 (xz)。对于其中任何一个,每个字节输入一个整数。

要并行计算,您可以将 225 个整数分解为许多小的子集,每个子​​集都可以独立压缩。您可以每人降低几十个 K,可能几乎没有开销损失或压缩损失。您需要对数据进行试验。

【讨论】:

  • 那么你将需要使用霍夫曼或其他一些熵编码。您应该使用现成的压缩器,例如 zlib 或 zstd。每个字节给压缩器一个整数。
  • 我不知道您对“连续性”的担忧是什么。当然是连载。
  • 因为比特流必须串行生成,因为任何点的比特位置取决于它前面的数据。如果您想将输入分解为块以进行并行处理,那是完全可行的。向量有多大?
  • 大约 2^25 个条目。
  • @MA 请将此信息添加到问题中。谢谢。
【解决方案2】:

torch.save 将使用 pickle 协议存储它。 如果你想节省空间,在保存之前量化这些向量应该会有所帮助。

另外,你可以试试 zlib 模块:

https://github.com/jonathantompson/torchzlib

另一种方法是将其转换为 numpy 数组,然后使用那里可用的一些压缩方法。

参考:

Compress numpy arrays efficiently

【讨论】:

  • 谢谢,但是 numpy 压缩不是串行运行并且不利用 GPU 吗?如果您愿意运行压缩算法,那么与 pickle 相比,一般情况下您无法节省空间,这是不正确的。问题是我认识的太慢了。
  • I/O 操作不太可能使用任何 GPU 处理。一种可能的路径是在保存向量之前运行压缩算法。量化是 pytorch 中一种非常常见的压缩技术。它只会将双浮点数转换为浮点数或整数,保留大部分原始信息。 pytorch.org/docs/stable/quantization.html
  • 确实,我想在保存之前压缩矢量。我认为这些量化不考虑向量的熵,并可能引入错误。我正在寻找无损压缩。
  • 如果我错了,请纠正我,但是,鉴于你有一堆“小范围”张量,你可以使用多线程来并行化打开 -> 压缩 -> 保存的过程。
  • 他们一次来一个,我想以最小的开销存储它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2023-03-28
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多