尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PyPTO HistType 详解:掌控 vf.histograms 直方图的累加与频次统计模式

PyPTO HistType 详解:掌控 vf.histograms 直方图的累加与频次统计模式 人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载导读HistType是 PyPTOParallel Tensor/Tile Operation 编程范式中用于定义vf.histograms直方图统计模式的枚举类型它决定直方图统计结果是频次统计还是累计统计。本文围绕 HistType.md 展开深入讲解HistType两个枚举成员的语义差异、产品支持情况、与BinType的配合关系、底层指令实现chistv2/dhistv2以及完整的可运行示例帮助读者在 Ascend 950 系列产品上正确编写直方图统计的 Vector Function 内核。一、HistType 是什么在 PyPTO 的 SIMD 编程模型中vf.histograms 用于对DT_UINT8类型的源寄存器数据进行直方图统计。而HistType正是该函数的统计模式参数hist_type对应的枚举类型用于指定统计结果是累加统计还是频次统计。从定义上看HistType是一个标准的enum.Enum枚举位于pypto_pro.language命名空间下与 BinType分桶类型、MaskPattern、MergeMode等一同构成 PyPTO 的枚举体系属于reg_computation/types/类型目录下的核心配置枚举之一。二、枚举成员详解HistType仅包含两个成员分别对应直方图统计的两种模式class HistType(enum.Enum): ACCUMULATE ... # 累加模式默认统计结果累加到目标寄存器已有值上 FREQUENCY ... # 频次模式统计每个索引值的出现次数2.1 ACCUMULATE累计统计默认模式ACCUMULATE是hist_type参数的默认取值。在该模式下目标寄存器dst的第 n 个元素表示源寄存器src中从 0 到 n 的所有数值在对应区间中出现的总频率即累计分布。以低位模式BIN0为例dst的第 n 个元素统计的是src中值落在低位区间[0-127]内、且数值从 0 累加到 n 的累计出现次数高位模式BIN1下则统计值落在高位区间[128-255]内的累计分布。无论哪种分桶统计结果都会在目的寄存器原始数据的基础上进行累加。2.2 FREQUENCY频次统计FREQUENCY模式下dst的第 n 个元素表示源寄存器src中数值 n 的出现次数频次直方图。在低位模式BIN0下统计src中 index 为[0-127]范围内前半部分各个值的出现频率在高位模式BIN1下则统计[128-255]范围内后半部分的频率。同样统计结果会在dst原始数据的基础上进行累加。两种模式的直观差异可以参考vf.histograms文档中的官方示意图图1histograms 频率统计FREQUENCY——dst 中第 n 个元素表示 src 中数值 n 的出现次数图2histograms 累计统计ACCUMULATE——dst 中第 n 个元素表示 src 中从 0 到 n 的所有数值在对应区间中出现的总频率三、产品支持情况根据 HistType.md 的说明HistType所服务的直方图统计能力在不同产品上的支持情况如下产品支持情况Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品不支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品不支持也就是说使用HistType参与直方图统计的内核当前仅在 Ascend 950 系列产品上可用。在编写跨产品兼容的内核时需要根据目标硬件做特性判断避免在不支持的产品上运行包含vf.histograms的内核。四、原型定义与源码实现4.1 Python 层枚举定义HistType的 Python 原型定义如下见 HistType.mdclass HistType(enum.Enum): ACCUMULATE ... # 累加模式默认统计结果累加到目标寄存器已有值上 FREQUENCY ... # 频次模式统计每个索引值的出现次数该枚举通过pypto_pro.language包对外导出见 python/pypto_pro/language/init.py同时在pypto.ir命名空间下也有同名导出见 python/pypto/ir.py方便用户在 Vector Function 或 IR 层面直接引用。4.2 C 绑定实现在底层HistType由 C 侧的ir::HistType枚举通过 pybind11 绑定到 Python见 python/src/bindings/ir/ir.cpppy::enum_ir::HistType(ir, HistType, Rpbdoc( Histogram statistical mode for vf.histograms. Members: ACCUMULATE accumulate counts onto existing dst values (cumulative, default) FREQUENCY frequency count (per-bin occurrence count of each exact value))pbdoc) .value(ACCUMULATE, ir::HistType::ACCUMULATE) .value(FREQUENCY, ir::HistType::FREQUENCY);从绑定注释可以确认一个关键实现事实ACCUMULATE对应底层chistv2指令累计直方图FREQUENCY对应底层dhistv2指令频次直方图。这说明HistType的选择会直接映射到不同的硬件指令发射路径而不仅仅是软件层的计数逻辑差异。4.3 参数校验接线在 Vector Function 的调用解析层python/pypto_pro/language/parser/_call_parser.pyhistograms的hist_type关键字参数会被校验为HistType类型hist_type: (HistType,)确保传入非法值时能在解析阶段即被拦截而不是等到代码生成阶段才报错。五、在 vf.histograms 中使用 HistType5.1 函数原型与参数位置HistType作为vf.histograms的可选关键字参数hist_type使用完整函数原型为histograms(src, preg, bin_type: Optional[BinType] None, hist_type: Optional[HistType] None)参数说明参数输入/输出说明src输入源操作数reg_tensor类型数据类型为DT_UINT8待统计的数据取值范围 0~255。mask 位为 0 时对应位置的数值不参与统计preg输入mask_reg指定参与统计的元素范围mask 位为 1 时该元素参与统计为 0 时不参与统计dtype 需为DT_UINT8b8 粒度bin_type输入可选分桶类型对应BinType。BIN0默认统计值在[0, 127]范围内的频率/累计频率BIN1统计值在[128, 255]范围内的频率/累计频率统计时数值减去 128 映射到 dst 对应位置hist_type输入可选统计模式对应HistType。ACCUMULATE默认累计统计dst 第 n 个元素表示 src 中从 0 到 n 的所有数值在对应区间中出现的总频率FREQUENCY频率统计dst 第 n 个元素表示 src 中数值 n 的出现次数。两种模式的结果均在 dst 原始数据基础上累加5.2 与 BinType 的配合关系HistType与BinType是两个正交的维度需要组合使用BinType决定统计哪个区间BIN0 对应低半区[0-127]BIN1 对应高半区[128-255]后者统计时数值需减去 128 再映射到 dst 位置HistType决定怎么统计ACCUMULATE 做累计从 0 到 n 的总频率FREQUENCY 做逐值频次数值 n 的出现次数。例如bin_typeBinType.BIN1, hist_typeHistType.FREQUENCY表示统计src中值落在[128, 255]区间内每个具体数值的出现次数dst[n]对应数值(n128)的统计结果。5.3 基础调用示例HistType.md 给出的最小调用示例如下import pypto_pro.language as pl pl.vector_function def vf_kernel(): dst vf.histograms(src, preg, hist_typepl.HistType.FREQUENCY)在实际内核中还需要配合vf.create_mask创建谓词掩码、vf.full初始化目标寄存器详见下文注意事项以及vf.load_align/vf.store_align完成数据搬运。六、完整实战示例直方图统计内核结合vf.histograms的完整示例见 histograms.md下面给出一个可在 Ascend 950 系列产品上运行的完整内核。该示例统计一个[1, 256]的 UINT8 tile 中低位区间[0-127]的累计分布并写入[1, 128]的 UINT16 输出import os import pypto_pro.language as pl import torch import torch_npu pl.vector_function def example_vf(src_tile, dst_tile): preg_b8 vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_UINT8) preg_b16 vf.create_mask(patternpl.MaskPattern.ALL, dtypepl.DT_UINT16) vreg vf.load_align(src_tile, 0, dtypepl.DT_UINT8) dst_reg vf.full(0, preg_b16, dtypepl.DT_UINT16) dst_reg vf.histograms(vreg, preg_b8, bin_typepl.BinType.BIN0, hist_typepl.HistType.ACCUMULATE) vf.store_align(dst_tile, dst_reg, preg_b16) pl.jit() def example_kernel( a: pl.Tensor[[pl.DYNAMIC, pl.DYNAMIC], pl.DT_UINT8], out: pl.Tensor[[pl.DYNAMIC, pl.DYNAMIC], pl.DT_UINT16], ): tf_src pl.TileType(shape[1, 256], dtypepl.DT_UINT8, target_memorypl.MemorySpace.Vec) tf_dst pl.TileType(shape[1, 128], dtypepl.DT_UINT16, target_memorypl.MemorySpace.Vec) in_a_grp pl.make_tile_group(typetf_src, addrs0x0, mutex_ids[0]) in_a in_a_grp.current() t_out_grp pl.make_tile_group(typetf_dst, addrs0x100, mutex_ids[1]) t_out t_out_grp.current() with pl.section_vector(): pl.load(in_a, a, [0, 0]) example_vf(in_a, t_out) pl.store(out, t_out, [0, 0]) def test_example(): device_id int(os.environ.get(TILE_FWK_DEVICE_ID, 0)) device fnpu:{device_id} core_nums 1 torch.npu.set_device(device) a torch.randint(0, 256, [1, 256], devicedevice, dtypetorch.uint8) out torch.empty([1, 128], devicedevice, dtypetorch.int16) example_kernelNone, core_nums torch.npu.synchronize() src_np a.cpu().numpy().flatten() expected torch.zeros(128, dtypetorch.int32, devicedevice) for v in src_np: if v 127: expected[v:] 1 torch.testing.assert_close(out[0].to(torch.int32), expected, rtol0, atol0) if __name__ __main__: test_example() print(PASSED)示例中的校验逻辑清晰地印证了ACCUMULATE模式的语义对每个v 127的源数据将expected[v:]全部加 1即从数值 v 到区间末尾的累计计数最终与硬件直方图结果逐元素比对。七、使用注意事项使用HistType参与直方图统计时需要特别留意以下几点目标寄存器必须预初始化histograms是原地累加指令dst寄存器既被读又被写。首次调用前必须通过vf.full(0, ...)将dst初始化为零后续dst vf.histograms(...)复用同一寄存器继续累加。这一点在 vf.histograms 的返回值说明和_vf_api.py的 API 文档python/pypto_pro/language/_vf_api.py中均有明确强调。注意累加溢出dst数据类型为DT_UINT16最大值为 65535。当累计次数可能逼近该上限时需考虑分段统计或改用更高位宽的处理策略。寄存器容量VL寄存器位宽为 256 Byte 时dst可存储 128 个 uint16 元素恰好对应[0-127]BIN0或[128-255]映射后的 128 个分桶。mask 语义mask 位为 0 时源操作数src对应位置的数值不参与统计dst对应位置的值为原有值即对该位置 src 不存在的值进行统计。产品限制当前仅 Ascend 950PR / Ascend 950DT 支持Atlas A2 / A3 系列不支持。八、仓库中的实现佐证HistType在仓库中的完整实现链路如下读者可据此深入理解文档定义HistType.md本主题文档、vf.histograms函数配套文档、BinType.md配套分桶类型C 枚举绑定python/src/bindings/ir/ir.cpp明确了 ACCUMULATE/FREQUENCY 与 chistv2/dhistv2 指令的对应关系Python 导出python/pypto_pro/language/init.py、python/pypto/ir.pyAPI 声明与参数校验python/pypto_pro/language/_vf_api.pyhistograms的 docstring 与签名、python/pypto_pro/language/parser/_call_parser.pyhist_type类型校验测试用例python/tests/st/pypto_pro/frontend/lightning_indexer/test_quant_lightning_indexer_vf.py在量化 lightning indexer 场景中以hist_typepl.HistType.ACCUMULATE配合BIN0/BIN1组合调用vf.histograms验证了HistType在实际算子中的使用方式。结语HistType虽是一个仅含两个成员的枚举却是 PyPTO 直方图统计能力的关键开关ACCUMULATE与FREQUENCY分别映射到底层 chistv2/dhistv2 两条指令路径配合BinType的分桶区间选择即可完成频次直方图或累计直方图统计。在 Ascend 950 系列产品上编写 Vector Function 内核时正确选择HistType并遵循预初始化 dst、注意 UINT16 溢出等约束即可写出正确高效的直方图统计算子。赞分享人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载相关推荐pypto.Tensor.cumsum 详解基于 CANN PyPTO 的按轴累积和计算pypto.Tensor.cumsum 详解基于 CANN PyPTO 的按轴累积和计算 导读 本文围绕 PyPTO 张量 API 中的 cumsum 按指人工智能编译器模型编译高性能计算深度学习CANNPyPTO Tensor.index_add 指南Ascend NPU 上的按索引累加算子详解PyPTO Tensor.index_add 指南Ascend NPU 上的按索引累加算子详解 导读 本文以 CANN PyPTO 官方 API 文档 pyp人工智能编译器模型编译高性能计算深度学习CANNTelegraf Histogram 聚合器插件完整指南分桶统计、累计与非累计直方图配置实战Telegraf Histogram 聚合器插件完整指南分桶统计、累计与非累计直方图配置实战 本文以 Telegraf 官方 histogram 聚合器插件可观测性指标监控运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表