量化线性

QuantizeLinear - 23

版本

  • 名称: QuantizeLinear (GitHub)

  • 域名: main

  • since_version: 23

  • 函数: False

  • support_level: SupportType.COMMON

  • 形状推断: True

此版本的运算符自版本23起可用。

摘要

线性量化运算符消耗一个高精度张量、一个比例和一个零点来计算低精度/量化张量。比例因子和零点必须具有相同的形状,决定了量化的粒度。量化公式为 y = saturate((x / y_scale) + y_zero_point)

饱和度根据以下公式进行计算:

  • uint16: [0, 65535]

  • int16: [-32768, 32767]

  • uint8: [0, 255]

  • int8: [-128, 127]

  • uint4: [0, 15]

  • int4: [-8, 7]

对于 (x / y_scale),它四舍五入到最接近的偶数。详情请参考 https://en.wikipedia.org/wiki/Rounding

y_zero_pointy 必须具有相同的类型。y_zero_point 通常不用于量化到 float8 和 4bit 类型,但为了保持一致性,量化公式保持不变,并且属性 y_zero_point 的类型仍然决定了量化类型。 xy_scale 允许具有不同的类型。y_scale 的类型决定了 xy_scale 之间除法操作的精度,除非指定了 precision 属性。

支持三种量化粒度,由y_scale的形状决定。 在所有情况下,y_zero_point必须与y_scale具有相同的形状。

  • 每张量(每层)量化:y_scale 是一个标量。

  • 按轴量化:比例必须是一个一维张量,其长度与量化轴的长度相同。对于输入形状 (D0, ..., Di, ..., Dn)axis=iy_scale 是一个长度为 Di 的一维张量。

  • 分块量化:比例的形状与输入的形状相同,除了一个维度,在该维度上执行分块。给定x的形状(D0, ..., Di, ..., Dn)axis=i,以及块大小By_scale的形状是(D0, ..., ceil(Di/B), ..., Dn)

属性

  • axis - INT (默认为 '1'):

    (可选)输入张量的去量化维度的轴。仅用于逐轴和块量化。负值表示从后向前计算维度。接受的范围是[-r, r-1],其中r = rank(input)。当输入的秩为1时,应用逐张量量化,在这种情况下轴是不必要的。

  • block_size - INT (默认值为 '0'):

    (可选)量化块的大小(每个比例复制的次数)。仅用于块量化。块大小是一个正整数。给定x形状(D0, ..., Di, ..., Dn)y_scale形状(S0, ... Si, ...Sn)axis=i,可接受的范围是[ceil(Di/Si), ceil(Di/(Si-1))-1]

  • output_dtype - INT (默认为 '0'):

    (可选)输出数据类型。如果未提供,则从y_zero_point数据类型(T3)推断输出数据类型。如果既未提供output_dtype也未提供y_zero_point,则输出数据类型为uint8。如果同时指定了output_dtypey_zero_point,则output_dtype必须为T3

  • 精度 - INT (默认为 '0'):

    (可选)xy_scale 之间除法运算的精度。如果未提供,则与 y_scale 的类型相同。

  • saturate - INT (默认值为 '1'):

    该参数定义了当输入值超出目标类型范围时,转换的行为方式。它仅适用于float 8量化(float8e4m3fn, float8e4m3fnuz, float8e5m2, float8e5m2fnuz)。默认情况下为true。所有情况都在操作符描述中插入的两个表格中进行了详细描述。

输入

在2到3个输入之间。

  • x(异构) - T1:

    N-D 全精度输入张量,将被量化。

  • y_scale (异质的) - T2:

    用于进行量化的比例,以获得y。对于每张量/每层量化,比例是一个标量;对于每轴量化,它是一个一维张量;对于分块量化,它具有与输入相同的形状,除了执行分块的维度。

  • y_zero_point(可选,异构)- T3:

    进行量化以获得y的零点。形状必须匹配y_scale。如果未指定,默认值为0的uint8。

输出

  • y (异构) - T3:

    N维量化输出张量。它与输入x具有相同的形状。

类型约束

  • T1 在 ( tensor(bfloat16), tensor(float), tensor(float16), tensor(int32) ) 中:

    输入‘x’的类型。

  • T2 在 ( tensor(bfloat16), tensor(float), tensor(float16), tensor(int32) ) 中:

    输入‘y_scale’的类型。

  • T3 在 ( tensor(float4e2m1), tensor(float8e4m3fn), tensor(float8e4m3fnuz), tensor(float8e5m2), tensor(float8e5m2fnuz), tensor(int16), tensor(int4), tensor(int8), tensor(uint16), tensor(uint4), tensor(uint8) ):

    输入 y_zero_point 和输出 y 的类型。

QuantizeLinear - 21

版本

  • 名称: QuantizeLinear (GitHub)

  • 域名: main

  • since_version: 21

  • 函数: False

  • support_level: SupportType.COMMON

  • 形状推断: True

此版本的运算符自版本21起可用。

摘要

线性量化操作符消耗一个高精度张量、一个比例和一个零点来计算低精度/量化张量。比例因子和零点必须具有相同的形状,决定了量化的粒度。量化公式为 y = saturate((x / y_scale) + y_zero_point)。饱和操作根据以下方式进行:

  • uint16: [0, 65535]

  • int16: [-32768, 32767]

  • uint8: [0, 255]

  • int8: [-128, 127]

  • uint4: [0, 15]

  • int4: [-8, 7] 对于 (x / y_scale),它会四舍五入到最接近的偶数。详情请参考 https://en.wikipedia.org/wiki/Roundingy_zero_pointy 必须具有相同的类型。y_zero_point 通常不用于量化到 float8 类型,但为了保持一致性,量化公式保持不变,并且属性 y_zero_point 的类型仍然决定了量化类型。 有三种支持的量化粒度,由 y_scale 的形状决定。 在所有情况下,y_zero_point 必须与 y_scale 具有相同的形状。

  • 每张量(每层)量化:y_scale 是一个标量。

  • 按轴量化:比例必须是一个一维张量,其长度与量化轴的长度相同。对于输入形状 (D0, ..., Di, ..., Dn)axis=iy_scale 是一个长度为 Di 的一维张量。

  • 分块量化:比例的形状与输入的形状相同,除了一个维度,在该维度上执行分块。给定x的形状(D0, ..., Di, ..., Dn)axis=i,以及块大小By_scale的形状是(D0, ..., ceil(Di/B), ..., Dn)

属性

  • axis - INT (默认为 '1'):

    (可选)输入张量的去量化维度的轴。仅用于逐轴和块量化。负值表示从后向前计算维度。接受的范围是[-r, r-1],其中r = rank(input)。当输入的秩为1时,应用逐张量量化,在这种情况下轴是不必要的。

  • block_size - INT (默认值为 '0'):

    (可选)量化块的大小(每个比例复制的次数)。仅用于块量化。块大小是一个正整数。给定x形状(D0, ..., Di, ..., Dn)y_scale形状(S0, ... Si, ...Sn)axis=i,可接受的范围是[ceil(Di/Si), ceil(Di/(Si-1))-1]

  • output_dtype - INT (默认为 '0'):

    (可选)输出数据类型。如果未提供,则从y_zero_point数据类型(T2)推断输出数据类型。如果既未提供output_dtype也未提供y_zero_point,则输出数据类型为uint8。如果同时指定了output_dtypey_zero_point,则output_dtype必须为T2

  • saturate - INT (默认值为 '1'):

    该参数定义了当输入值超出目标类型范围时,转换的行为方式。它仅适用于float 8量化(float8e4m3fn, float8e4m3fnuz, float8e5m2, float8e5m2fnuz)。默认情况下为true。所有情况都在操作符描述中插入的两个表格中进行了详细描述。

输入

在2到3个输入之间。

  • x(异构) - T1:

    N-D 全精度输入张量,将被量化。

  • y_scale (异构) - T1:

    用于进行量化的比例,以获得y。对于每张量/每层量化,比例是一个标量;对于每轴量化,它是一个一维张量;对于分块量化,它具有与输入相同的形状,除了执行分块的维度。

  • y_zero_point (可选, 异构) - T2:

    进行量化以获得y的零点。形状必须匹配y_scale。如果未指定,默认值为0的uint8。

输出

  • y (异构) - T2:

    N维量化输出张量。它与输入x具有相同的形状。

类型约束

  • T1 在 ( tensor(bfloat16), tensor(float), tensor(float16), tensor(int32) ) 中:

    输入‘x’的类型。

  • T2 在 ( tensor(float8e4m3fn), tensor(float8e4m3fnuz), tensor(float8e5m2), tensor(float8e5m2fnuz), tensor(int16), tensor(int4), tensor(int8), tensor(uint16), tensor(uint4), tensor(uint8) ):

    输入 y_zero_point 和输出 y 的类型。

QuantizeLinear - 19

版本

  • 名称: QuantizeLinear (GitHub)

  • 域名: main

  • since_version: 19

  • 函数: False

  • support_level: SupportType.COMMON

  • 形状推断: True

此版本的运算符自版本19起可用。

总结

线性量化操作符。它消耗一个高精度张量、一个比例和一个零点来计算低精度/量化张量。 比例因子和零点必须具有相同的形状,并且可以是用于每张量/每层量化的标量,或用于每轴量化的一维张量。 量化公式为 y = saturate ((x / y_scale) + y_zero_point)。 对于饱和,如果它是uint8,则饱和到[0, 255],如果它是int8,则饱和到[-128, 127]。 对于(x / y_scale),它四舍五入到最接近的偶数。详情请参阅 https://en.wikipedia.org/wiki/Rounding。 'y_zero_point' 和 'y' 必须具有相同的类型。 'y_zero_point' 通常不用于量化到 float8e4m3fn, float8e4m3fnuz, float8e5m2, float8e5m2fnuz, 但为了保持一致性,量化公式保持不变, 并且属性 'y_zero_point' 的类型仍然决定量化类型。

属性

  • axis - INT (默认为 '1'):

    (可选)输入张量量化维度的轴。对于每个张量的量化,此参数将被忽略。负值表示从后向前计算维度。可接受的范围是[-r, r-1],其中r = rank(input)。

  • saturate - INT (默认值为 '1'):

    该参数定义了当输入值超出目标类型范围时,转换的行为方式。它仅适用于float 8量化(float8e4m3fn, float8e4m3fnuz, float8e5m2, float8e5m2fnuz)。默认情况下为true。所有情况都在操作符描述中插入的两个表格中进行了详细描述。

输入

在2到3个输入之间。

  • x(异构) - T1:

    N-D 全精度输入张量,将被量化。

  • y_scale (异构) - T1:

    用于进行量化以获取‘y’的比例。它可以是标量,这意味着每个张量/层的量化,或者是一维张量用于每轴量化。

  • y_zero_point (可选, 异构) - T2:

    进行量化以获得‘y’的零点。形状必须与y_scale匹配。如果未指定,则默认为uint8,零点为0。

输出

  • y (异构) - T2:

    N维量化输出张量。它与输入‘x’具有相同的形状。

类型约束

  • T1 在 ( tensor(bfloat16), tensor(float), tensor(float16), tensor(int32) ) 中:

    将‘x’限制为float、float16、bfloat16或int32张量。

  • T2 在 ( tensor(float8e4m3fn), tensor(float8e4m3fnuz), tensor(float8e5m2), tensor(float8e5m2fnuz), tensor(int8), tensor(uint8) ):

    将‘y_zero_point’和‘y’限制为8位整数/浮点数张量。

QuantizeLinear - 13

版本

  • 名称: QuantizeLinear (GitHub)

  • 域名: main

  • since_version: 13

  • 函数: False

  • support_level: SupportType.COMMON

  • 形状推断: True

此版本的运算符自版本13起可用。

摘要

线性量化操作符。它消耗一个高精度张量、一个比例尺和一个零点来计算低精度/量化张量。 比例因子和零点必须具有相同的形状,并且可以是用于每张量/每层量化的标量,或者是用于每轴量化的一维张量。 量化公式为 y = saturate ((x / y_scale) + y_zero_point)。 对于饱和,如果它是uint8,则饱和到[0, 255],如果它是int8,则饱和到[-128, 127]。 对于(x / y_scale),它四舍五入到最接近的偶数。详情请参阅https://en.wikipedia.org/wiki/Rounding。'y_zero_point'和'y'必须具有相同的类型。

属性

  • axis - INT (默认为 '1'):

    (可选)输入张量量化维度的轴。对于每个张量的量化,此参数将被忽略。负值表示从后向前计算维度。可接受的范围是[-r, r-1],其中r = rank(input)。

输入

在2到3个输入之间。

  • x(异构) - T1:

    N-D 全精度输入张量,将被量化。

  • y_scale (异构) - tensor(float):

    用于进行量化以获取‘y’的比例。它可以是标量,这意味着每个张量/层的量化,或者是一维张量用于每轴量化。

  • y_zero_point (可选, 异构) - T2:

    进行量化以获得‘y’的零点。形状必须与y_scale匹配。如果未指定,则默认为uint8,零点为0。

输出

  • y (异构) - T2:

    N维量化输出张量。它与输入‘x’具有相同的形状。

类型约束

  • T1 在 ( tensor(float), tensor(int32) ) 中:

    将‘x’限制为浮点数或int32张量。

  • T2 在 ( tensor(int8), tensor(uint8) ) 中:

    将‘y_zero_point’和‘y’限制为8位整数张量。

QuantizeLinear - 10

版本

  • 名称: QuantizeLinear (GitHub)

  • 域名: main

  • since_version: 10

  • 函数: False

  • support_level: SupportType.COMMON

  • 形状推断: True

此版本的运算符自版本10起可用。

摘要

线性逐张量/逐层量化操作符。它消耗一个高精度张量、一个比例和一个零点来计算低精度/量化张量。 量化公式为 y = saturate ((x / y_scale) + y_zero_point)。对于饱和,如果它是uint8,则饱和到[0, 255],如果它是int8,则饱和到[-128, 127]。 对于(x / y_scale),它四舍五入到最接近的偶数。详情请参阅https://en.wikipedia.org/wiki/Rounding。'y_zero_point'和'y'必须具有相同的类型。

输入

在2到3个输入之间。

  • x(异构) - T1:

    N-D 全精度输入张量,将被量化。

  • y_scale (异构) - tensor(float):

    用于进行量化以获取‘y’的比例。它是一个标量,意味着是每个张量/层的量化。

  • y_zero_point (可选, 异构) - T2:

    进行量化以获得‘y’的零点。它是一个标量,这意味着是每个张量/层的量化。如果未指定,默认值为uint8类型的0。

输出

  • y (异构) - T2:

    N维量化输出张量。它与输入‘x’具有相同的形状。

类型约束

  • T1 在 ( tensor(float), tensor(int32) ) 中:

    将‘x’限制为浮点数或int32张量。

  • T2 在 ( tensor(int8), tensor(uint8) ) 中:

    将‘y_zero_point’和‘y’限制为8位整数张量。