文档
注册
评分
提单
论坛
小AI

fixpipe

功能说明

矩阵计算完成后,对结果进行处理,例如对计算结果进行加偏置和对数据进行量化、并把数据从L1OUT 搬迁到GM Memory 中。

函数原型

fixpipe(dst, src, cburst_num, burst_len, dst_stride, src_stride, extend_params=None)

参数说明

表1 参数说明

参数名称

输入/输出

含义

dst

输出

目的操作数的起始 element,支持的数据类型为 Tensor(float16,float32,int32),具体参考表2,tensor的scope为GM或UB。

经过fixpipe处理,在加偏置、量化等操作以外,会将矩阵计算中多申请的数据删除。

该接口用于处理conv2d数据时dst格式为[cout_blocks, howo, 16]

该接口用于处理matmul数据时dst格式为[N1, m, N0]

注:cout_blocks及howo含义请参考conv2d参数说明参数说明

N1, m, N0含义请参考matmul参数说明参数说明

src

输入

源操作数的起始 element,支持的数据类型为 Tensor(float32,int32),具体参考表2。tensor 的scope为L1OUT。

源操作数是矩阵计算后的结果,

该接口用于处理conv2d数据时格式为[cout_blocks, round_howo, 16]。

该接口用于处理matmul数据时格式为[N1, M, N0]。

注:cout_blocks及round_howo含义请参考conv2d参数说明参数说明

N1, M, N0含义请参考matmul参数说明参数说明

cburst_num

输入

传输数据片段数目,取值范围:cburst_num∈[1, 4095],支持的数据类型为:立即数(int)。

该接口用于处理conv2d数据时矩阵计算后的结果格式为[cout_blocks,round_howo,16],cburst_num设为cout_blocks即可。

该接口用于处理matmul数据时矩阵计算后的结果格式为[N1, M, N0],cburst_num设为N1即可。

注:cout_blocks及round_howo含义请参考conv2d参数说明参数说明

N1, M, N0含义请参考matmul参数说明参数说明

burst_len

输入

连续传输数据片段长度,取值范围:burst_len∈[1, 65535],单位:32B。

支持的数据类型为:立即数(int)。

对于src,每个burst有效的数据片段长度为:

  • 该接口用于处理conv2d数据时应为howo*16*src_dtype_size/32,单位为32B。
  • 该接口用于处理matmul数据时应为m*N0*src_dtype_size/32,单位为32B。

dst_stride

输入

目的tensor相邻连续数据片段间隔(前burst尾与后burst头),取值范围:dst_stride∈[0, 65535], 单位:32B。支持的数据类型为:立即数(int)。

src_stride

输入

源tensor相邻连续数据片段间隔(前burst尾与后burst头),取值范围:src_stride∈[0, 65535], 单位:256 elements。支持的数据类型为:立即数(int)。

保留接口,为了计算数据准确性,填0即可。

extend_params

(针对Atlas 200/300/500 推理产品

Atlas 训练系列产品

Atlas推理系列产品(Ascend 310P处理器)AI Core)

输入

扩展参数,数据类型为字典。默认值为None。 当前支持三个key,分别为"bias","quantize_params"和"relu"。具体内容如下:

1、key: "bias"

value:默认值为None,即不使能添加偏置功能。

若使能,value为偏置操作数的起始 element,支持的数据类型为 Tensor(int32, float32),需与src的数据类型保持一致,shape形状为[Cout,]

Cout :若src为conv2d输出,为卷积核个数;若src为matmul输出,为N方向长度。

tensor 的scope为L1

2、key : "quantize_params"

value: 默认值为None,即不使能量化功能。

使能时value为字典,字典中包含两个key,分别为"mode"和"mode_param"

"mode"对应value支持数据类型为字符串,支持如下几种量化模式:

  • "int322fp16": int32 量化成float16
  • "fp322fp16": float32量化成float16

"mode_param"对应value为如下三种:

  • scalar(float16)或立即数(float): 表示单个scale 值,仅mode为"int322fp16"时支持。
  • tensor(float16):shape为[16],scope为L1,分别作用于cout的16个channel,仅当不使能bias功能且mode为"int322fp16"时支持。
  • None,当mode为"fp322fp16"时应设置为None。

3、key:"relu":

value:默认值为False,支持的类型为bool类型。False:不使能relu功能;True:使能relu功能

注意事项:

  • 仅当不使能bias功能时支持relu。
  • 当使能量化功能,且参数为"mode":"int322fp16", "mode_param":scalar(float16)或立即数(float)时,不支持relu功能。

extend_params

该参数说明适用于以下型号:

Atlas A2训练系列产品/Atlas 800I A2推理产品

输入

扩展参数,数据类型为字典。默认值为None。 当前支持两个key,分别为"quantize_params"和"relu"。具体内容如下:

1、key : "quantize_params"

value: 默认值为None,即不使能量化功能。

使能时value为字典,字典中包含两个key,分别为"mode"和"mode_param"

"mode"对应value支持数据类型为字符串,支持如下几种量化模式:

  • "int322fp16": int32 量化成float16
  • "fp322fp16": float32量化成float16

"mode_param"对应value为如下三种:

  • scalar(float32)或立即数(float): 表示单个scale 值,仅mode为"int322fp16"时支持。
  • tensor(float32):shape为[cburst_num, 16],scope为GM,分别作用于conv2d或matmul输出的cout个channel轴数据,仅当mode为"int322fp16"时支持。
  • None,当mode为"fp322fp16"时应设置为None。

2、key:"relu":

value:默认值为False,支持的类型为bool类型。False:不使能relu功能;True:使能relu功能。

注:量化功能和relu功能可以同时使能。

表2 src和dst的数据类型组合

src.dtype

dst.dtype

extend_params["quantize_params"]

float32

float16

"fp322fp16"

int32

float16

"int322fp16"

float32

float32

None

int32

int32

None

支持的型号

Atlas 200/300/500 推理产品

Atlas 训练系列产品

Atlas推理系列产品(Ascend 310P处理器)AI Core

Atlas A2训练系列产品/Atlas 800I A2推理产品

Atlas 200/500 A2推理产品

注意事项

  • 当src和dst的数据类型一致时,extend_params参数的key:quantize_params不生效。
  • 单步调试时间比较长,不建议使用。
  • 当extend_params中同时使能多个功能时,执行顺序如下所示,不使能的功能请忽略:bias->quantize->relu。
  • 该接口不支持与vector相关指令一起使用。
  • 操作数地址偏移对齐要求请见通用约束
  • 对于量化输入的单scale或Tensor float32数据类型说明如下:

    (1)标准的IEEE 754 float32格式为:1bit符号位,8bits指数位,23bits尾数位;当前float32格式为:1bit符号位,8bits指数位,10bits尾数位;

    (2)如果用户提供的是标准的IEEE 754 float32输入,API内部会处理成芯片支持的float32格式进行计算,此时如果golden数据生成过程中使用的是标准的IEEE 754 float32数据,则可能引入精度不匹配问题,需要修正golden数据的生成,将量化参数的23bits尾数位的低13bits数据位清零再参与量化计算。

返回值

调用示例

  • 示例:src和dst的数据类型分别为int32和float16,无bias,量化mode_param为tensor
    from tbe import tik
    tik_instance = tik.Tik()
    dtype_size = {
        "int8": 1,
        "uint8": 1,
        "int16": 2,
        "uint16": 2,
        "float16": 2,
        "int32": 4,
        "uint32": 4,
        "float32": 4,
        "int64": 8,
    }
    fm_dtype = "int8"
    ker_dtype = "int8"
    deq_dtype="float16"
    dst_dtype = "int32"
    fm_shape = [1, 4, 4, 32]
    kernel_shape = [1, 2, 2, 32, 32]
    dst_shape = [2, 16, 16]
    dst_l1_shape = [2, 16, 16]
    deq_shape = [16]
    # 卷积步长, [stride_h, stride_w]
    stride = [1, 1]
    # padding行数/列数,格式是[pad_left, pad_right, pad_top, pad_bottom]
    pad = [0, 0, 0, 0]
    # 空洞卷积参数,格式[dilation_h, dilation_w];
    dilation = [1, 1]
    # padding填充值的数值
    pad_value = 0
    # 定义tensor
    feature_map_gm = tik_instance.Tensor(fm_dtype, fm_shape, name='feature_map_gm', scope=tik.scope_gm)
    weight_gm = tik_instance.Tensor(ker_dtype, kernel_shape, name='weight_gm', scope=tik.scope_gm)
    deqscale_gm = tik_instance.Tensor(deq_dtype, deq_shape, name='deqscale_gm', scope=tik.scope_gm)
    dst_gm = tik_instance.Tensor(deq_dtype, dst_shape, name='dst_gm', scope=tik.scope_gm)
    feature_map = tik_instance.Tensor(fm_dtype, fm_shape, name='feature_map', scope=tik.scope_cbuf)
    weight = tik_instance.Tensor(ker_dtype, kernel_shape, name='weight', scope=tik.scope_cbuf)
    deqscale = tik_instance.Tensor(deq_dtype, deq_shape, name='deqscale', scope=tik.scope_cbuf)
    dst_l1out = tik_instance.Tensor(dst_dtype, dst_l1_shape, name='dst_l1out', scope=tik.scope_cbuf_out)
    # 将数据从gm搬入源操作数tensor
    tik_instance.data_move(feature_map, feature_map_gm, 0, 1, 16, 0, 0)
    tik_instance.data_move(weight, weight_gm, 0, 1, 128, 0, 0)
    tik_instance.data_move(deqscale, deqscale_gm, 0, 1, 1, 0, 0)
    # 进行卷积操作
    tik_instance.conv2d(dst_l1out, feature_map, weight, fm_shape, kernel_shape, stride, pad, dilation, pad_value)
    # fixpipe实现量化
    # 传输数据片段数目, 处理conv2d数据时矩阵计算后的结果cburst_num设为cout_blocks, 处理matmul数据时矩阵计算后的结果cburst_num设为N1
    cburst_num = dst_l1_shape[0]
    # 连续传输数据片段长度,处理conv2d数据时应为howo*16*src_dtype_size/32, 处理matmul数据时应为m*N0*src_dtype_size/32
    burst_len = dst_l1_shape[1] *16 * dtype_size[dst_dtype] // 32
    # dst_stride/src_stride tensor相邻连续数据片段间隔,前burst尾与后burst头,此处暂为连续计算,以0 为例
    dst_stride, src_stride = 0, 0
    
    tik_instance.fixpipe(dst_gm, dst_l1out, cburst_num, burst_len, dst_stride, src_stride, extend_params={"bias": None, "quantize_params": {"mode": "int322fp16", "mode_param": deqscale}})
    tik_instance.BuildCCE(kernel_name="fixpipe", inputs=[feature_map_gm, weight_gm, deqscale_gm], outputs=[dst_gm])

    结果示例:

    输入数据:
    feature_map_gm:
    [[[[3, 2, 4, 2, ..., 4, 3]]]]
    weight_gm:
    [[[[[0, -5, -3, ..., -4, -2]]]]]
    deqscale_gm:
    [ 0.1214, -0.2238, ..., 0.4883, 0.2788]
    输出数据:
    dst_gm:
    [[[-13.48, 39.38, -114.8, 30.38, ..., 9.766, -24.81]]]
  • 示例:src和dst的数据类型分别为int32和float16,无bias,量化mode_param为scalar
    from tbe import tik
    tik_instance = tik.Tik()
    dtype_size = {
        "int8": 1,
        "uint8": 1,
        "int16": 2,
        "uint16": 2,
        "float16": 2,
        "int32": 4,
        "uint32": 4,
        "float32": 4,
        "int64": 8,
    }
    fm_dtype = "int8"
    ker_dtype = "int8"
    deq_dtype="float16"
    dst_dtype = "int32"
    fm_shape = [1, 4, 4, 32]
    kernel_shape = [1, 2, 2, 32, 32]
    dst_shape = [2, 16, 16]
    dst_l1_shape = [2, 16, 16]
    # 卷积步长, [stride_h, stride_w]
    stride = [1, 1]
    # padding行数/列数,格式是[pad_left, pad_right, pad_top, pad_bottom]
    pad = [0, 0, 0, 0]
    # 空洞卷积参数,格式[dilation_h, dilation_w];
    dilation = [1, 1]
    # padding填充值的数值
    pad_value = 0
    # 定义tensor
    feature_map_gm = tik_instance.Tensor(fm_dtype, fm_shape, name='feature_map_gm', scope=tik.scope_gm)
    weight_gm = tik_instance.Tensor(ker_dtype, kernel_shape, name='weight_gm', scope=tik.scope_gm)
    dst_gm = tik_instance.Tensor(deq_dtype, dst_shape, name='dst_gm', scope=tik.scope_gm)
    feature_map = tik_instance.Tensor(fm_dtype, fm_shape, name='feature_map', scope=tik.scope_cbuf)
    weight = tik_instance.Tensor(ker_dtype, kernel_shape, name='weight', scope=tik.scope_cbuf)
    dst_l1out = tik_instance.Tensor(dst_dtype, dst_l1_shape, name='dst_l1out', scope=tik.scope_cbuf_out)
    # 将数据从gm搬入源操作数tensor
    tik_instance.data_move(feature_map, feature_map_gm, 0, 1, 16, 0, 0)
    tik_instance.data_move(weight, weight_gm, 0, 1, 128, 0, 0)
    scalar = tik_instance.Scalar(dtype="float32", init_value=2)
    # 进行卷积操作
    tik_instance.conv2d(dst_l1out, feature_map, weight, fm_shape, kernel_shape, stride, pad, dilation, pad_value)
    # fixpipe实现量化
    # 传输数据片段数目, 处理conv2d数据时矩阵计算后的结果cburst_num设为cout_blocks, 处理matmul数据时矩阵计算后的结果cburst_num设为N1
    cburst_num = dst_l1_shape[0]
    # 连续传输数据片段长度,处理conv2d数据时应为howo*16*src_dtype_size/32, 处理matmul数据时应为m*N0*src_dtype_size/32
    burst_len = dst_l1_shape[1] *16 * dtype_size[dst_dtype] // 32
    # dst_stride/src_stride tensor相邻连续数据片段间隔,前burst尾与后burst头,此处暂为连续计算,以0 为例
    dst_stride, src_stride = 0, 0
    tik_instance.fixpipe(dst_gm, dst_l1out, cburst_num, burst_len, dst_stride, src_stride, extend_params={"quantize_params": {"mode": "int322fp16", "mode_param": scalar}})
    tik_instance.BuildCCE(kernel_name="fixpipe", inputs=[feature_map_gm, weight_gm], outputs=[dst_gm])
    

    结果示例:

    输入数据:
    feature_map_gm:
    [[[[-3,  4, -3, -1, ...,4, -1]]]]
    weight_gm:
    [[[[[ 1,  4, -3,...,-1, -4, -2]]]]]
    输出数据:
    dst_gm:
    [[[ -78.  120.  -76.  144. -114. ...0.    0.    0.]]]
  • 示例:src和dst的数据类型分别为float32和float16,有bias,量化mode_param为None
    from tbe import tik
    tik_instance = tik.Tik()
    # 定义tensor
    feature_map_gm = tik_instance.Tensor("float16", [2, 4, 4, 16], name='feature_map_gm', scope=tik.scope_gm)
    weight_gm = tik_instance.Tensor("float16", [2, 2, 2, 16, 16], name='weight_gm', scope=tik.scope_gm)
    bias_gm = tik_instance.Tensor("float32", (16,), name='bias_gm', scope=tik.scope_gm)
    dst_gm = tik_instance.Tensor("float16", [1, 4, 16], name='dst_gm', scope=tik.scope_gm)
    feature_map = tik_instance.Tensor("float16", [2, 4, 4, 16], name='feature_map', scope=tik.scope_cbuf)
    weight = tik_instance.Tensor("float16", [2, 2, 2, 16, 16], name='weight', scope=tik.scope_cbuf)
    bias = tik_instance.Tensor("float32", (16,), name='bias', scope=tik.scope_cbuf)
    dst_l1out = tik_instance.Tensor("float32", [1, 16, 16], name='dst_l1out', scope=tik.scope_cbuf_out)
    # 将数据从gm搬入源操作数tensor
    tik_instance.data_move(feature_map, feature_map_gm, 0, 1, 32, 0, 0)
    tik_instance.data_move(weight, weight_gm, 0, 1, 128, 0, 0)
    tik_instance.data_move(bias, bias_gm, 0, 1, 2, 0, 0)
    # 进行卷积操作
    tik_instance.conv2d(dst_l1out, feature_map, weight, [2, 4, 4, 16], [2, 2, 2, 16, 16], [1, 1], [0, 0, 0, 0], [2, 2], 0)
    # fixpipe实现bias功能和量化功能
    tik_instance.fixpipe(dst_gm, dst_l1out, 1, 8, 0, 0, extend_params={"bias": bias, "quantize_params": {"mode": "fp322fp16", "mode_param": None}})
    tik_instance.BuildCCE(kernel_name="conv2d", inputs=[feature_map_gm, weight_gm, bias_gm], outputs=[dst_gm])

    结果示例:

    输入数据
    feature_map_gm:
    [[[[0.0, 0.01, 0.02, 0.03, 0.04, ..., 5.09, 5.1, 5.11]]]]
    weight_gm:
    [[[[[0.0, 0.01, 0.02, 0.03, 0.04, ..., 20.46, 20.47]]]]]
    bias_gm:
    [0.0, 1.0, 2.0, 3.0, ..., 14.0, 15.0]
    
    输出数据
    dst_gm:
    [[[3568., 3614., 3660., 3704., 3750., 3794., 3840., 3884., 3930.,
       3976., 4020., 4066., 4110., 4156., 4200., 4250.],
      [3754., 3802., 3850., 3900., 3948., 3996., 4044., 4094., 4140.,
       4188., 4240., 4290., 4336., 4384., 4430., 4480.],
      [4308., 4370., 4424., 4484., 4544., 4600., 4660., 4716., 4776.,
       4830., 4892., 4950., 5010., 5068., 5124., 5184.],
      [4496., 4556., 4616., 4680., 4740., 4804., 4864., 4924., 4988.,
       5050., 5108., 5172., 5230., 5296., 5356., 5416.]]]
  • 示例:src和dst的数据类型分别为float32和float16,有bias,量化mode_param为None
    from tbe import tik
    tik_instance = tik.Tik()
    # 定义tensor
    feature_map_gm = tik_instance.Tensor("float16", [2, 4, 4, 16], name='feature_map_gm', scope=tik.scope_gm)
    weight_gm = tik_instance.Tensor("float16", [2, 2, 2, 16, 16], name='weight_gm', scope=tik.scope_gm)
    bias_gm = tik_instance.Tensor("float32", (16,), name='bias_gm', scope=tik.scope_gm)
    dst_gm = tik_instance.Tensor("float16", [1, 4, 16], name='dst_gm', scope=tik.scope_gm)
    feature_map = tik_instance.Tensor("float16", [2, 4, 4, 16], name='feature_map', scope=tik.scope_cbuf)
    weight = tik_instance.Tensor("float16", [2, 2, 2, 16, 16], name='weight', scope=tik.scope_cbuf)
    bias = tik_instance.Tensor("float32", (16,), name='bias', scope=tik.scope_cbuf)
    dst_l1out = tik_instance.Tensor("float32", [1, 16, 16], name='dst_l1out', scope=tik.scope_cbuf_out)
    # 将数据从gm搬入源操作数tensor
    tik_instance.data_move(feature_map, feature_map_gm, 0, 1, 32, 0, 0)
    tik_instance.data_move(weight, weight_gm, 0, 1, 128, 0, 0)
    tik_instance.data_move(bias, bias_gm, 0, 1, 2, 0, 0)
    # 进行卷积操作
    tik_instance.conv2d(dst_l1out, feature_map, weight, [2, 4, 4, 16], [2, 2, 2, 16, 16], [1, 1], [0, 0, 0, 0], [2, 2], 0, bias=bias)
    # fixpipe实现bias功能和量化功能
    tik_instance.fixpipe(dst_gm, dst_l1out, 1, 8, 0, 0, extend_params={"quantize_params": {"mode": "fp322fp16", "mode_param": None}})
    tik_instance.BuildCCE(kernel_name="conv2d", inputs=[feature_map_gm, weight_gm, bias_gm], outputs=[dst_gm])

    结果示例:

    输入数据
    feature_map_gm:
    [[[[0.0, 0.01, 0.02, 0.03, 0.04, ..., 5.09, 5.1, 5.11]]]]
    weight_gm:
    [[[[[0.0, 0.01, 0.02, 0.03, 0.04, ..., 20.46, 20.47]]]]]
    bias_gm:
    [0.0, 1.0, 2.0, 3.0, ..., 14.0, 15.0]
    
    输出数据
    dst_gm:
    [[[3568., 3614., 3660., 3704., 3750., 3794., 3840., 3884., 3930.,
       3976., 4020., 4066., 4110., 4156., 4200., 4250.],
      [3754., 3802., 3850., 3900., 3948., 3996., 4044., 4094., 4140.,
       4188., 4240., 4290., 4336., 4384., 4430., 4480.],
      [4308., 4370., 4424., 4484., 4544., 4600., 4660., 4716., 4776.,
       4830., 4892., 4950., 5010., 5068., 5124., 5184.],
      [4496., 4556., 4616., 4680., 4740., 4804., 4864., 4924., 4988.,
       5050., 5108., 5172., 5230., 5296., 5356., 5416.]]]
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词