DynamicQuantize¶
此层对其输入张量执行动态块量化,并输出量化数据和计算的块比例因子。块大小目前限制为 16,并且分块轴的大小必须可被 16 整除且为编译时常量。
第一个输入(索引 0)是要量化的张量。其数据类型必须是 DataType::kFLOAT、DataType::kHALF 或 DataType::kBF16 之一。
第二个输入(索引 1)是双重量化比例因子。它是一个标量比例因子,用于量化计算的块比例因子。
属性¶
axis
被切分成块的轴。轴必须是最后一个维度或倒数第二个维度。
block_size
使用共享比例因子量化的元素数量。目前仅支持 16 个元素的块。
output_type
量化输出张量的数据类型,必须是 DataType::kFP4。
scale_type
用于量化输入数据的比例因子数据类型,必须是 DataType::kFP8。
输入¶
input:T1
类型的张量。
double_quant_scale:T1
或 float32 类型的张量。提供标量双重量化比例。double_quant_scale 张量必须是构建时常量。
输出¶
output_data:T2
类型的张量。
output_scale:T3
类型的张量。
数据类型¶
T1:float16
, bfloat16
, float32
T2:float4
T3:float8
形状信息¶
input 和 output_data 是相同形状的 2D 或 3D 张量。output_scale 具有与 input 相同的形状,但由 axis
指定的维度除外,在该维度中发生分块。例如,对于输入形状 (D0, D1, D2), axis=2
,output_scale 形状为 (D0, D1, D2/block_size)
。
double_quant_scale 是包含单个标量的张量。
DLA 支持¶
不支持。
示例¶
动态量化 (DynamicQuantize)
in1 = network.add_input("input", trt.float32, (2, 32))
# Define double quant scale factor
dbl_quant_scale_data = np.asarray([1], dtype=np.float32)
dbl_quant_scale = network.add_constant(shape=(1,), weights=dbl_quant_scale_data).get_output(0)
# Add the DynamicQuantizeLayer
block_size = 16
axis = 1
dynq = network.add_dynamic_quantize(in1, axis, block_size, trt.fp4, trt.fp8)
dynq.set_input(1, dbl_quant_scale)
data_f4 = dynq.get_output(0)
scale_f8 = dynq.get_output(1)
# Dequantize the scale (per-tensor)
dequantize_scale = network.add_dequantize(scale_f8, dbl_quant_scale, trt.float32)
scale_f32 = dequantize_scale.get_output(0)
# Dequantize the data (per-block)
dequantize_data = network.add_dequantize(data_f4, scale_f32, trt.float32)
data_dq = dequantize_data.get_output(0)
# Mark dequantized data as netowrk output
network.mark_output(data_dq)
inputs[in1.name] = np.array(
[
[0.0, 0.3, 0.6, 1.0, 1.3, 1.6, 1.9, 2.3, 2.6, 2.9, 3.2, 3.5, 3.9, 4.2, 4.5, 4.8,
5.2, 5.5, 5.8, 6.1, 6.5, 6.8, 7.1, 7.4, 7.7, 8.1, 8.4, 8.7, 9., 9.4, 9.7, 10.0],
[3.0, 3.3, 3.6, 4.0, 3.3, 3.6, 3.9, 3.3, 2.6, 2.9, 3.2, 3.5, 3.9, 4.2, 4.5, 4.8,
-5.2, -5.5, -5.8, -6.1, -5.5, -5.8, 5.1, 5.4, 5.7, 5.1, 5.4, 5.7, 6., 6.4, 4.7, 6.0],
]
)
outputs[dequantize_data.get_output(0).name] = dequantize_data.get_output(0).shape
expected[dequantize_data.get_output(0).name] = np.array(
[
[0.00, 0.41, 0.41, 0.81, 1.22, 1.62, 1.62, 2.44, 2.44, 3.25, 3.25, 3.25, 3.25, 4.87, 4.87, 4.87,
4.87, 4.87, 6.50, 6.50, 6.50, 6.50, 6.50, 6.50, 6.50, 6.50, 9.75, 9.75, 9.75, 9.75, 9.75, 9.75],
[3.25, 3.25, 3.25, 3.25, 3.25, 3.25, 3.25, 3.25, 2.44, 3.25, 3.25, 3.25, 3.25, 4.87, 4.87, 4.87,
-4.50, -4.5, -6.75, -6.75, -4.5, -6.75, 4.5, 4.5, 6.75, 4.5, 4.5, 6.75, 6.75, 6.75, 4.5, 6.75]
]
)
C++ API¶
有关 C++ IDynamicQuantizeLayer 算子的更多信息,请参阅 C++ IDynamicQuantizeLayer 文档。
Python API¶
有关 Python IDynamicQuantizeLayer 算子的更多信息,请参阅 Python IDynamicQuantizeLayer 文档。