PaddlePaddle / PaddleCustomDevice

PaddlePaddle custom device implementaion. (『飞桨』自定义硬件接入实现)
Apache License 2.0
68 stars 142 forks source link

【npu】Auto cann export #1392

Closed RICHARDNAN closed 2 weeks ago

RICHARDNAN commented 2 weeks ago

PR Category

Execute Infrastructure ### PR Types Others ### Description

paddle支持Ascend npu profiling数据自动解析及合并timeline 使用demo: 1.创建一个网络模型的训练脚本 2.导入接口,from paddle.device.npu import cann_parse_enabled 3.在训练函数 train(model)的训练循环中使用性能分析器 Profiler 来记录性能数据。在训练结束时调用cann_parse_enabled自动解析接口进行解析

import paddle
import paddle.profiler as profiler
from paddle_custom_device.npu.profile import cann_parse_enabled

def train(model):
    print('start training ... ')
    # turn into training mode
    model.train()

    opt = paddle.optimizer.Adam(learning_rate=learning_rate,
                                parameters=model.parameters())

    train_loader = paddle.io.DataLoader(cifar10_train,
                                        shuffle=True,
                                        batch_size=batch_size,
                                        num_workers=1)

    valid_loader = paddle.io.DataLoader(cifar10_test, batch_size=batch_size)

    # 创建性能分析器相关的代码
    def my_on_trace_ready(prof): # 定义回调函数,性能分析器结束采集数据时会被调用
      callback = profiler.export_chrome_tracing('./profiler_demo') # 创建导出性能数据到 profiler_demo 文件夹的回调函数
      callback(prof)  # 执行该导出函数

    p = profiler.Profiler(scheduler = [3,14], on_trace_ready=my_on_trace_ready, timer_only=False, record_shapes=True) # 初始化 Profiler 对象

    p.start() # 性能分析器进入第 0 个 step

    for epoch in range(epoch_num):
        for batch_id, data in enumerate(train_loader()):
            x_data = data[0]
            y_data = paddle.to_tensor(data[1])
            y_data = paddle.unsqueeze(y_data, 1)

            logits = model(x_data)
            loss = F.cross_entropy(logits, y_data)

            if batch_id % 1000 == 0:
                print("epoch: {}, batch_id: {}, loss is: {}".format(epoch, batch_id, loss.numpy()))
            loss.backward()
            opt.step()
            opt.clear_grad()

            p.step() # 指示性能分析器进入下一个 step
            if batch_id == 19:
              p.stop() # 关闭性能分析器
              cann_parse_enabled('./profiler_demo') #在此调用自动解析以及合并timeline接口
              return 

此示例表示在第20个batch结束时,停止性能分析器并调用 cann_parse_enabled 进行数据的自动解析。

输出结果:在./ascend_profiling/PROF_000001_2024xxxxxxxxxx_xxxxxxxx文件夹下生成mindstudio_profiler_output、mindstudio_profiler_log文件夹,以及在mindstudio_profiler_output文件夹下生成paddle框架和Ascend npu合并后的timeline trace_view_yyyy_mm_dd.json

合并后的timeline截图: trace_view_yyyy_mm_dd.json mergedjson

paddle-bot[bot] commented 2 weeks ago

Thanks for your contribution!

RICHARDNAN commented 2 weeks ago

这个建议在npu目录下加一个profile 目录吧

好的,已解决