tf.fake_quant_with_min_max_args 和 tf.fake_quant_with_min_max_vars 有什么区别

Fer*_*ndo 4 python quantization tensorflow

我很想了解张量流函数之间的差异

tf.fake_quant_with_min_max_args
tf.fake_quant_with_min_max_vars
Run Code Online (Sandbox Code Playgroud)

正如他们的 API 中一样,它们的描述几乎相同。我通常通过手动量化所需的节点tf.fake_quant_with_min_max_vars,尽管我不确定它是否正确。

例如,权重应该使用 吗tf.fake_quant_with_min_max_args

同样,查看 的代码quantize.Quantize,我确实明白它基本上会迭代图形,找到兼容的张量并根据 global_step 添加用于身份/量化的节点。但是,我是否应该理解并非所有操作都是量化的(例如 conv1d,尽管 conv2d 和 mat/mul 是量化的)。图书馆以后会支持所有的操作吗?

小智 5

就命名而言,这有点用词不当。'args' 变体使用属性来表达最小值/最大值,因此仅对固定范围有效。“vars”变体采用任意张量作为最小/最大。这些是实际变量还是其他计算值取决于您的量化方法。“vars”变体具有最小/最大梯度,因此可以进行训练。许多训练方法只是在训练时使用批次的最小值/最大值来计算它们,然后使用指数移动平均值将它们累积到不可训练的变量中。然后在评估时,使用最小/最大变量代替计算的最小/最大。

如果手动添加它们,您需要确保所有算术运算(add、mul 等,但不是转置、重塑等)的输入在输入的张量上具有适当的 fake_quant* 运算。

在实践中,我发现适用于此的规则是:

  1. 当权重变量输入算术运算时,添加一个 fake_quant_with_min_max_vars 来根据权重的最小值/最大值计算其最小值/最大值。

  2. 在任何算术操作之后添加 fake_quant_with_min_max_vars ,该操作在训练时累积到每个操作的专用最小/最大变量中,并且仅在评估时使用变量。

  3. 将适当的 fake_quant* 操作添加到模型的最顶层输入(如果它是通过某种形式的嵌入查找驱动的模型,则不需要)。这包括传入的常量,除非它们是默认范围。

如果您这样做,通常会遇到每个张量都被量化而没有冗余/冲突的量化参数的情况。根据模型的不同,可能需要额外的细微差别和其他技巧才能真正让 toco/tflite 能够仅使用量化类型运行它。

我不太熟悉执行此操作的自动化工具,但我相信这是他们在重写图表时采用的一般方法。它们还具有一些显着的复杂性来检测和解决某些模式,当尝试在 graphdef 级别(相对于某些事情更明显的源级别)进行盲注转换时,这些模式需要额外的处理。

为了让“手动”方法不会太繁琐,我编写/使用了一些库,这些库只是让我通过辅助函数传递重要的张量来注释它们,这些函数遵循模型级别的参数集,让我调整量化策略层按层。

哈。