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* 运算。
在实践中,我发现适用于此的规则是:
当权重变量输入算术运算时,添加一个 fake_quant_with_min_max_vars 来根据权重的最小值/最大值计算其最小值/最大值。
在任何算术操作之后添加 fake_quant_with_min_max_vars ,该操作在训练时累积到每个操作的专用最小/最大变量中,并且仅在评估时使用变量。
将适当的 fake_quant* 操作添加到模型的最顶层输入(如果它是通过某种形式的嵌入查找驱动的模型,则不需要)。这包括传入的常量,除非它们是默认范围。
如果您这样做,通常会遇到每个张量都被量化而没有冗余/冲突的量化参数的情况。根据模型的不同,可能需要额外的细微差别和其他技巧才能真正让 toco/tflite 能够仅使用量化类型运行它。
我不太熟悉执行此操作的自动化工具,但我相信这是他们在重写图表时采用的一般方法。它们还具有一些显着的复杂性来检测和解决某些模式,当尝试在 graphdef 级别(相对于某些事情更明显的源级别)进行盲注转换时,这些模式需要额外的处理。
为了让“手动”方法不会太繁琐,我编写/使用了一些库,这些库只是让我通过辅助函数传递重要的张量来注释它们,这些函数遵循模型级别的参数集,让我调整量化策略层按层。
哈。
| 归档时间: |
|
| 查看次数: |
1820 次 |
| 最近记录: |