Python API 使用指南
1. 概述
msPTI Python API 提供了高层封装,使 Python 开发者能够快速接入 NPU 性能数据采集能力。Python API 围绕 Monitor 模式设计,每个 Monitor 负责一种类型的数据采集。
1.1 Monitor 设计模式
每个 Monitor 遵循统一的生命周期:
创建 Monitor → start(回调函数) → 执行业务代码 → stop()
start():启动采集,注册用户回调。stop():停止采集,触发 Flush 确保所有数据已消费。set_buffer_size(size):设置内部缓冲区大小(最大 256 MB)。flush_all():手动刷新缓冲区。
1.2 可用 Monitor
| Monitor | 数据类 | 采集内容 |
|---|---|---|
KernelMonitor |
KernelData |
NPU Kernel 执行耗时 |
HcclMonitor |
HcclData |
HCCL 通信操作(带宽、耗时) |
CommunicationMonitor |
CommunicationData |
通信算子数据(数据类型、算法等) |
MstxMonitor |
MarkerData, RangeMarkerData |
用户自定义打点(瞬时/范围) |
所有 Monitor 均在 mspti 包顶层暴露,可直接导入:
from mspti import KernelMonitor, KernelData
from mspti import HcclMonitor, HcclData
from mspti import CommunicationMonitor, CommunicationData
from mspti import MstxMonitor, MarkerData, RangeMarkerData
2. 数据结构
2.1 KernelData
class KernelData:
kind: MsptiActivityKind # 活动类型
start: int # 开始时间戳(ns)
end: int # 结束时间戳(ns)
device_id: int # 设备 ID
stream_id: int # 流 ID
correlation_id: int # 关联 ID
type: str # Kernel 类型
name: str # Kernel 名称
2.2 HcclData
class HcclData:
kind: MsptiActivityKind # 活动类型
start: int # 开始时间戳(ns)
end: int # 结束时间戳(ns)
device_id: int # 设备 ID
stream_id: int # 流 ID
bandwidth: float # 带宽(GB/s)
name: str # 通信算子名
comm_name: str # 通信组名
2.3 CommunicationData
class CommunicationData:
kind: MsptiActivityKind # 活动类型
data_type: MsptiCommunicationDataType # 数据类型
count: int # 数据计数
device_id: int # 设备 ID
stream_id: int # 流 ID
start: int # 开始时间戳(ns)
end: int # 结束时间戳(ns)
alg_type: str # 算法类型
name: str # 算子名
comm_name: str # 通信组名
correlation_id: int # 关联 ID
2.4 MarkerData(瞬时标记)
class MarkerData:
kind: MsptiActivityKind # 活动类型
flag: MsptiActivityFlag # 标记标志
source_kind: MsptiActivitySourceKind # 数据来源
timestamp: int # 时间戳(ns)
id: int # 标记 ID
object_id: MsptiObjectId # 对象标识
name: str # 标记名称
domain: str # 所属域
2.5 RangeMarkerData(范围标记)
class RangeMarkerData:
kind: MsptiActivityKind # 活动类型
source_kind: MsptiActivitySourceKind # 数据来源
id: int # 标记 ID
object_id: MsptiObjectId # 对象标识
name: str # 标记名称
domain: str # 所属域
start: int # 范围开始时间戳(ns)
end: int # 范围结束时间戳(ns)
2.6 MsptiObjectId
class MsptiObjectId:
process_id: int # 进程 ID
thread_id: int # 线程 ID
device_id: int # 设备 ID
stream_id: int # 流 ID
3. KernelMonitor 使用指南
3.1 基本用法
from mspti import KernelMonitor, KernelData
def on_kernel(data: KernelData):
print(f"Kernel: {data.name}, type={data.type}, "
f"start={data.start}, end={data.end}, "
f"duration={(data.end - data.start) / 1000} us")
monitor = KernelMonitor()
monitor.start(on_kernel)
# 执行业务代码
monitor.stop()
3.2 完整示例(单卡)
import torch
import torch_npu
from mspti import KernelMonitor, KernelData
def kernel_parser(data: KernelData):
duration_us = (data.end - data.start) / 1000
print(f"[Kernel] {data.name} | {data.type} | "
f"{duration_us:.2f} us | device={data.device_id}")
monitor = KernelMonitor()
monitor.start(kernel_parser)
# 执行 NPU 计算
x = torch.randn(1024, 1024, dtype=torch.float16).npu()
y = torch.randn(1024, 1024, dtype=torch.float16).npu()
for _ in range(10):
z = torch.matmul(x, y)
torch.npu.synchronize()
monitor.stop()
4. HcclMonitor 使用指南
采集 HCCL 通信操作的耗时和带宽信息。
from mspti import HcclMonitor, HcclData
def on_hccl(data: HcclData):
print(f"[HCCL] {data.name} | comm={data.comm_name} | "
f"bandwidth={data.bandwidth:.2f} GB/s | "
f"duration={(data.end - data.start) / 1000:.2f} us")
monitor = HcclMonitor()
monitor.start(on_hccl)
# 执行分布式训练代码(all_reduce 等)
monitor.stop()
5. CommunicationMonitor 使用指南
采集通信算子的详细信息,包括数据类型、算法类型等。
from mspti import CommunicationMonitor, CommunicationData
def on_comm(data: CommunicationData):
print(f"[COMM] {data.name} | alg={data.alg_type} | "
f"type={data.data_type} | count={data.count} | "
f"duration={(data.end - data.start) / 1000:.2f} us")
monitor = CommunicationMonitor()
monitor.start(on_comm)
# 执行分布式训练代码
monitor.stop()
6. MstxMonitor 使用指南
采集用户自定义的打点数据,支持瞬时标记和范围标记两种模式。
6.1 基本用法
from mspti import MstxMonitor, MarkerData, RangeMarkerData
def on_marker(data: MarkerData):
print(f"[MARK] {data.name} | timestamp={data.timestamp}")
def on_range(data: RangeMarkerData):
print(f"[RANGE] {data.name} | domain={data.domain} | "
f"start={data.start}, end={data.end}, "
f"duration={(data.end - data.start) / 1000:.2f} us")
monitor = MstxMonitor()
monitor.start(on_marker, on_range)
# 执行业务代码
monitor.stop()
6.2 与 PyTorch MSTX 集成的完整示例
import os
import threading
import time
import logging
from multiprocessing import Queue
import torch
import torch_npu
from mspti import MstxMonitor, MarkerData, RangeMarkerData
data_queue = Queue()
logging.basicConfig(level=logging.INFO)
def range_parser(data: RangeMarkerData):
data_queue.put(data)
def consumer():
while True:
if not data_queue.empty():
data = data_queue.get()
if data is None:
break
duration_us = (data.end - data.start) / 1000
logging.info(f"Range: {data.name}, {duration_us:.2f} us")
else:
time.sleep(0.1)
def test():
consumer_thread = threading.Thread(target=consumer)
consumer_thread.start()
# 创建并启动 MstxMonitor
monitor = MstxMonitor()
monitor.start(range_parser)
# 执行带打点的 NPU 计算
device = int(os.getenv('LOCAL_RANK', '0'))
torch.npu.set_device(device)
x = torch.randn(256, 256, dtype=torch.float16).npu()
y = torch.randn(256, 256, dtype=torch.float16).npu()
stream = torch_npu.npu.current_stream()
range_id = torch_npu.npu.mstx.range_start("matmul_range", stream)
z = torch.matmul(x, y)
torch_npu.npu.mstx.range_end(range_id)
torch.npu.synchronize()
# 停止采集
monitor.stop()
data_queue.put(None)
consumer_thread.join()
if __name__ == "__main__":
test()
6.3 域控制
MstxMonitor 支持按域动态启停打点采集:
# 创建域(通过 MSTX API)
domain_name = "my_domain"
# 关闭指定域的采集
monitor.disable_domain(domain_name)
# 重新开启指定域的采集
monitor.enable_domain(domain_name)
7. 高级用法
7.1 多线程消费者模式
在高吞吐场景下,建议使用独立线程消费回调数据,避免阻塞采集回调:
from multiprocessing import Queue
import threading
from mspti import KernelMonitor, KernelData
data_queue = Queue(maxsize=10000)
def kernel_parser(data: KernelData):
data_queue.put(data)
def consumer():
while True:
data = data_queue.get()
if data is None:
break
# 处理数据
process_kernel_data(data)
# 启动消费者线程
consumer_thread = threading.Thread(target=consumer)
consumer_thread.start()
# 启动采集
monitor = KernelMonitor()
monitor.start(kernel_parser)
# ... 执行业务代码 ...
monitor.stop()
# 通知消费者退出
data_queue.put(None)
consumer_thread.join()
7.2 同时使用多个 Monitor
多个 Monitor 可以同时运行,互不干扰:
from mspti import KernelMonitor, CommunicationMonitor
kernel_mon = KernelMonitor()
comm_mon = CommunicationMonitor()
kernel_mon.start(kernel_callback)
comm_mon.start(comm_callback)
# 执行业务代码
kernel_mon.stop()
comm_mon.stop()
7.3 设置缓冲区大小
在启动采集前调整缓冲区大小:
monitor = KernelMonitor()
monitor.set_buffer_size(64) # 设置 64 MB 缓冲区
monitor.start(callback)
缓冲区大小上限为 256 MB,默认值由 C 扩展决定。
8. 运行方式
8.1 环境要求
- Python 3.8+
- CANN 软件(含 msPTI Python 包)
- PyTorch + torch_npu(执行 NPU 计算时需要)
- 需设置
LD_PRELOAD环境变量:
export LD_PRELOAD=${ASCEND_HOME_PATH}/lib64/libmspti.so
8.2 单卡运行
export LD_PRELOAD=${ASCEND_HOME_PATH}/lib64/libmspti.so
python your_script.py
8.3 多卡分布式运行
export LD_PRELOAD=${ASCEND_HOME_PATH}/lib64/libmspti.so
torchrun --nproc_per_node=8 your_script.py
9. 完整样例参考
| 样例 | 说明 |
|---|---|
samples/python_monitor/ |
KernelMonitor + CommunicationMonitor 的基本用法 |
samples/python_mstx_monitor/ |
MstxMonitor 的自定义打点用法 |