量化线性¶
QuantizeLinear - 23¶
版本¶
域名:
mainsince_version:
23函数:
Falsesupport_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_point 和 y 必须具有相同的类型。y_zero_point 通常不用于量化到 float8 和 4bit 类型,但为了保持一致性,量化公式保持不变,并且属性 y_zero_point 的类型仍然决定了量化类型。
x 和 y_scale 允许具有不同的类型。y_scale 的类型决定了 x 和 y_scale 之间除法操作的精度,除非指定了 precision 属性。
支持三种量化粒度,由y_scale的形状决定。
在所有情况下,y_zero_point必须与y_scale具有相同的形状。
每张量(每层)量化:
y_scale是一个标量。按轴量化:比例必须是一个一维张量,其长度与量化轴的长度相同。对于输入形状
(D0, ..., Di, ..., Dn)和axis=i,y_scale是一个长度为Di的一维张量。分块量化:比例的形状与输入的形状相同,除了一个维度,在该维度上执行分块。给定
x的形状(D0, ..., Di, ..., Dn),axis=i,以及块大小B:y_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_dtype和y_zero_point,则output_dtype必须为T3。精度 - INT (默认为
'0'):(可选)
x和y_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¶
版本¶
域名:
mainsince_version:
21函数:
Falsesupport_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/Rounding。y_zero_point和y必须具有相同的类型。y_zero_point通常不用于量化到 float8 类型,但为了保持一致性,量化公式保持不变,并且属性y_zero_point的类型仍然决定了量化类型。 有三种支持的量化粒度,由y_scale的形状决定。 在所有情况下,y_zero_point必须与y_scale具有相同的形状。每张量(每层)量化:
y_scale是一个标量。按轴量化:比例必须是一个一维张量,其长度与量化轴的长度相同。对于输入形状
(D0, ..., Di, ..., Dn)和axis=i,y_scale是一个长度为Di的一维张量。分块量化:比例的形状与输入的形状相同,除了一个维度,在该维度上执行分块。给定
x的形状(D0, ..., Di, ..., Dn),axis=i,以及块大小B:y_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_dtype和y_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¶
版本¶
域名:
mainsince_version:
19函数:
Falsesupport_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¶
版本¶
域名:
mainsince_version:
13函数:
Falsesupport_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¶
版本¶
域名:
mainsince_version:
10函数:
Falsesupport_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位整数张量。