Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

一点疑问 Kernel_select.md #439

Open
qzylalala opened this issue Mar 29, 2023 · 0 comments
Open

一点疑问 Kernel_select.md #439

qzylalala opened this issue Mar 29, 2023 · 0 comments

Comments

@qzylalala
Copy link

qzylalala commented Mar 29, 2023

### 算子选择的过程
前文介绍了算子选择主要是针对IR图中的每一个操作节点选择出最为合适的算子。其中算子信息主要包括了支持设备类型、数据类型和数据排布格式三个方面。经过编译器前端类型推导与静态分析的阶段后,IR图中已经推导出了用户代码侧的数据类型。下面介绍算子选择的基本过程。
如图 :numref:`select_kernel`所示,展示了算子选择过程。首先,选择算子执行的硬件设备。不同的硬件设备上,算子的实现、支持数据类型、执行效率通常会有所差别。这一步往往是用户自己指定的,若用户未指定,则编译器后端会为用户匹配一个默认的设备。
然后,后端会根据IR图中推导出的数据类型和内存排布格式选择对应的算子。
![算子选择过程](../img/ch05/select_kernel.png)
:width:`800px`
:label:`select_kernel`
理想情况下算子选择所选择出的算子类型,应该与用户预期的类型保持一致。但是由于软硬件的限制,很可能算子的数据类型不能满足用户所期待的数据类型,此时需要对该节点进行升精度或者降精度处理才能匹配到合适的算子。比如在MindSpore 的Ascend后端由于硬件限制导致Conv2D算子只存在float16一种数据类型。如果用户设置的整网使用的数据类型为float32数据,那么只能对Conv2D算子的输入数据进行降精度处理,即将输入数据类型从float32转换成float16。

这里我一直有一个疑问,现在支持把一个网络的算子 offload 到多个 backend 吗?

在为算子选择一个合适的 backend 时候考虑的事情感觉是十分复杂的,不能简单的认为这个后端更适合这个算子就直接 offload 到这个 backend。

举一个例子,一个网络前面的所有算子都非常适合 GPU,全部 offload 到 GPU 上,但是现在紧接着有一个 算子可能更适合 其他的 backend A,如果 offload 到 A 上的话,数据搬运的开销可能远远大于算子本身在 backend A 上执行带来的提升。

所以想请问一下,算子卸载一般是怎么做的呀,是会具体考虑到各种开销,然后去综合评估吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant