建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
092713ie8gnff9tx2p8m72.jpg MindSpore!这款刚刚开源的深度学习框架我爱了 知乎大咖入驻昇腾社区 B站UP主入驻昇腾社区

yehx

发帖: 9粉丝: 0

级别 : 新手上路

发消息 + 关注

发表于2020-5-28 23:02:00 388 5
直达本楼层的链接
楼主
显示全部楼层
[问题求助] 使用beta版本Mindstudio在cloud测试自定义算子的性能

[问题背景]


从文档中只看到,目前自定义算子开发,可以在simulation模式下profile性能。但是没有看到官方提供在云上profile真实硬件算子性能的方法。

我尝试使用了tensorflow的profile工具,抓下了timeline的trace文件。(具体方法参见:https://stackoverflow.com/questions/34293714/can-i-measure-the-execution-time-of-individual-operations-with-tensorflow/37774470#37774470

Matmul测试的timeline (图中的时间单位显示可能是错误的,8s的运行时间有些夸张;大概是us,这个不太确定)

image.png

  • 我也测试了样例给出的自定义add算子,发现运算都是执行在"/job:localhost/replica:0/task:0/device:CPU:0 Compute"上

  • matmul (batch matrix mutiplication, batch=32, M=N=K=512)指定在cpu上运算和指定在ai_core上运算,timeline trace中花费的时间基本相同

指定在ai_core上运行的trace结果(duration: 8042456 ps;这里的时间单位也许不对,或者profile的数据不准):

image.png

指定在cpu上运行的trace结果(duration: 8035130 ps):

image.png

  • 理论上在一个昇腾910芯片上(32个DaVinci core;每个core一个CUBE: 16*16*16)上计算一个batch matmul (batch=32, M=N=K=512),花费的理想时间大概是:32*512*512*512/(32*16*16*16)=32768 cycles,如果运行频率是1GHz的话,时间是32.768us。感觉和8us的trace结果也对不起来

  • 用更大的矩阵(batch=32, M=N=K=1024)测试,得到时间63980205 ps,大约是前面矩阵乘(batch=32, M=N=K=512)的运算时间的8倍,符合预期。

  • matmul的cce算子仿真(M=N=K=512)性能如下图,看起来CUBE的时间只占了很小一部分,数据搬移和向量运算占了很大比重。这个不知道是不是仿真不准确的问题?

image.png

image.png


[我的问题]

  • 为什么matmul运算没有使用ai_core专用硬件运算,而是使用device上的cpu运算?

  • 怎么确定算子是运行在cpu上还是ai_core上?

  • 使用tensorflow的profile方法,是否可以得到在昇腾芯片上的一些profile信息?如果不行的话,要怎么做才能对运行在云上的昇腾硬件的算子进行性能评估?因为开发自定义算子的话,除了仿真之外,也希望得到真实硬件上的性能。毕竟仿真只是一个参考

  • 使用仿真的方法,测试基本的cce算子matmul,发现CUBE运算的占比很低,这个仿真的真实性如何?自定义算子开发是否可以依赖这个仿真结果?


[附:测试代码片段]

--------------------------------------------- 附部分测试代码(tf_matmul.py):

...

def config(excute_type):

    if excute_type == 'ai_core':

        session_config = tf.ConfigProto(

            allow_soft_placement=True,

            log_device_placement=False)

        custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add()

        custom_op.name = "NpuOptimizer"

        custom_op.parameter_map["enable_data_pre_proc"].b = True

        custom_op.parameter_map["mix_compile_mode"].b = True

        custom_op.parameter_map["use_off_line"].b = True

        custom_op.parameter_map["min_group_size"].b = 1


    elif excute_type == 'cpu':

        session_config = tf.ConfigProto(

            allow_soft_placement=True,

            log_device_placement=False)


def profile_on_aicore(op):

    with tf.Session(config=config('ai_core')) as session:

        run_options = tf.compat.v1.RunOptions(trace_level=tf.compat.v1.RunOptions.FULL_TRACE)

        run_metadata = tf.compat.v1.RunMetadata()

        result_ai_core = session.run(op, options=run_options, run_metadata=run_metadata)


        # Create the Timeline object, and write it to a json

        tl = timeline.Timeline(run_metadata.step_stats)

        ctf = tl.generate_chrome_trace_format()

        with open('timeline_aicore.json', 'w') as f:

            f.write(ctf)

...

shape_params1 = (32,512,512)

shape_params2 = (32,512,512)

dtype_params = "float16"

x = np.random.uniform(-2, 2, size=shape_params1).astype(dtype_params)

y = np.random.uniform(-2, 2, size=shape_params2).astype(dtype_params)

out = tf.matmul(x,y)

profile_on_aicore(out)

...

举报
分享

分享文章到朋友圈

分享文章到微博

捕虫少年

发帖: 0粉丝: 0

级别 : 版主

发消息 + 关注

发表于2020-6-3 19:43:18
直达本楼层的链接
沙发
显示全部楼层

你好,问题已收录,我们会尽快给您安排专家解答

点赞 评论 引用 举报

fulltower

发帖: 10粉丝: 2

级别 : 版主

发消息 + 关注

发表于2020-6-3 22:11:09
直达本楼层的链接
板凳
显示全部楼层

不太清楚这种测试方式的原理是什么,但matmul算子包括add应该是在AICORE上运行的,

我们有profiling工具可以测试性能,但由于无法登陆物理环境,所以当前910环境无法测试,后续的版本会支持310环境,因此待新版本发布后可在310环境使用profiling工具,后续我们也会陆续支持在910环境使用profiling工具。

matmul不涉及vector计算,所以能否将开发的matmul算子实现文件发一下

点赞 评论 引用 举报

yehx

发帖: 9粉丝: 0

级别 : 新手上路

发消息 + 关注

发表于2020-6-3 22:53:26
直达本楼层的链接
地板
显示全部楼层

附上了用来测试的matmul.py文件和tf_matmul.py文件。基本上是仿照你们add的例子做的,还没有加上其他功能。


分别跑了cpu的配置和ai_core的配置。

一开始用python自带的time.time很难测出在硬件上实际花费的时间

然后用tensorflow的自带的trace功能,想尝试把timeline的trace抓下来,然后压缩后用moxing.file.copy到我的obs去看。但是抓下来的数据好像也有问题。

可能不能直接这样用。

不知道你们的profile工具是否也可以远程节点使用,还是说只能在本地使用?

mytest_files.zip 8.42 KB,下载次数:2

点赞 评论 引用 举报

yehx

发帖: 9粉丝: 0

级别 : 新手上路

发消息 + 关注

发表于2020-6-3 23:07:34
直达本楼层的链接
5#
显示全部楼层

另外关于simulation模式的几个疑问:

(1)

我看到在仿真时ca_model(可能是cycle精确模型吧)读取了davinci_cloud.spec文件,里面定义了一些davinci的架构参数,其中有关DDR的部分,

bandwidth_limit = "32",这一项是什么意思呢?这个数值如果代表带宽的话,那为什么比davinci_mini.spec中的小(67)呢?

davinci_cloud.spec

image.png


davinci_mini.spec

image.png


(2)

从Perf Consumption Graph看,Vector操作部分花费的cycle最多

image.png


但是从Perf. consumption data图中看,又是scalar指令的cycle数最高。

image.png


这两种统计图给出的结果为什么不一样呢?

点赞 评论 引用 举报

yehx

发帖: 9粉丝: 0

级别 : 新手上路

发消息 + 关注

发表于2020-6-4 22:01:59
直达本楼层的链接
6#
显示全部楼层

在仿真下测试了下卷积,看起来利用率比512x512x512的矩阵乘好多了,CUBE的利用率高了好多(大概占总时间的70%左右)。batch=32时,每个AI_CORE都被利用起来了。除了从核外存储(假定是L2吧)拷贝到L1的时间、最后从UB拷贝回到L2,大部分数据搬移都可以和计算并行起来。很赞。

- 不知道为什么向L2的写回时间是从L2读取时间的4倍(我的测试例子,写数据应该只是读数据/参数的2倍)?

- CUBE统计出来的cycle数,大致符合预期

- 根据MTE2统计信息,计算出来BIU的读入速度大概是98 B/cycle (<128 B/cycle)。符合davinci_cloud.spec中BIU的bus port width (128 B)。不过spec里描述有两个ports,也许这里只能用到一个??或者是受限于L2分配给每个core的带宽?

- 根据MTE3统计信息,计算出来BIU的写出速度大概是49 B/cycle (<64 B/cycle),比BIU bus write带宽低一倍,不知道为何?

- 另外vector操作中有一些bank conflict,也不知道原因?

- 后面准备尝试下和其他算子融合。不知道哪里有比较完整的融合规则说明?比如conv+relu,conv+bn。不知道conv + conv是否可以融合,前一个conv的输出可以作为下一个conv的输入,不需要数据搬移到L2/DDR;以前看TVM好像还没有支持这个。

image.png



点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册