#58 接口开发指南

Open
created 1 year ago by laich · 3 comments
laich commented 1 year ago
MSAdapter的主要功能是提供兼容PyTorch和MindSpore的接口。在接口兼容开发过程中,大概有如下步骤: 环境准备:MindSpore2.0.0.dev20221107、PyTorch1.12 #### 1. 接口功能兼容梳理 MSAdapter的接口和PyTorch对标,从功能上映射到MindSpore对应的接口。由于两个框架的接口实现方式存在差异,所以首先需要梳理两者的差异,例如: ![image](/attachments/a90a2b40-879b-4dfb-bc03-e3f343360d4e) **需要注意的是,接口对标前请选定正确的版本:[MindSpore2.0.0官网](https://www.mindspore.cn/docs/zh-CN/master/index.html)和[PyTorch1.12官网](https://pytorch.org/docs/1.12/)** #### 2. 功能开发 根据接口分类在对应的目录下修改/新建py文件,功能开发时原则上要对标接口的所有功能,包含参数个数、功能、取值类型和范围、默认值、返回值类型和个数、精度等。开发过程中的一些规范和注意事项如下: * 接口注释的示例中用法鼓励改成如下方式,尽量只修改import,保留原有用法。 > import ms_adapter.pytorch as torch > import ms_adapter.pytorch.nn as nn > m = nn.ReLU() > input = torch.randn(2) > output = m(input) * 接口兼容对标实现时,尽量用同等级接口做映射,例如nn接口也用nn下接口映射,如果由于功能上无法对标再考虑functional类的接口组合使用。可同步需求给MS框架。 * 调用MindSpore的对外接口和方法(API),如功能上必须使用内部方法,需经评审讨论。 * 如果接口中存在不需要兼容,或者暂时不支持的参数或属性,统一调用unsupportedattr()方法,方便后续统一整改处理。 * 功能代码里不要用assert(测试代码除外),不支持的功能需要拦截报错。 * 接口功能实现要通用:Pynative(优先)/Graph模式下功能正确;Ascend(主要)/GPU/CPU硬件平台。 * 接口功能代码中不能有依赖pytorch等其他第三方的实现。 *(持续补充)* #### 3. 新增测试用例 新增接口开发后,需要同步添加测试用例来看护已实现功能,这样可以保证其他人合入代码时不会影响自己代码功能: * 在/MSAdapter/src/branch/master/testing/ut/对应目录下增加接口的测试用例文件。 * 测试代码如果需要ms和pytorch进行结果比较,先执行pytorch代码,后执行ms代码;相反的话在GPU后端可能导致CUPTI占用问题影响性能数据正确性。 * 代码一定要自验通过,尽量以可验证的方式进行看护,不要直接print;优先以graph模式验证,如果graph模式有问题,以pynative模式验证,同时反馈graph模式问题。 * 注意:ut测试用例运行时间必须尽量短,受设备资源限制,太久的用例不适合作为门禁用例看护。 #### 4. 代码合入 合并请求创建完成后,会自动触发CI门禁检查,包含ut基本用例测试和代码规范检查,确保合入的代码不会影响主仓上面已有功能。如果门禁检查成功,可以找相关审核人员合入代码;反之,则需要修复错误,修复代码合入后重新门禁检查。 为提高代码提交的效率,建议先在本地执行门禁检查:"bash run.sh". 其中,run.sh包含如下三个步骤操作: * python setup.py install ---安装 * bash ./testing/ut/runtest.sh ---运行所有UT门槛用例 * bash ./pylint_check.sh ---运行pylint代码检查 在开发过程中也可以根据需求单独执行上述任一项。
laich added this to the V20221011 milestone 1 year ago
laich closed this issue 1 year ago
laich reopened this issue 1 year ago
zoulq changed title from 算子开发 to 接口开发指南 1 year ago
zoulq commented 1 year ago
Collaborator
### **接口对标约束场景(10-31更新):** 1. PyTorch官网已声明废弃参数,如reduce,MSAdatper兼容时需要有warning提示,对应参数功能无需映射转换。 2. PyTorch官网声明为beta阶段参数,如layout,MSAdatper兼容时需要有warning提示,对应参数功能无需映射转换。 3. 因设计机制不同,PyTorch特有参数,如Tensor中的require_grad,device参数无法映射转换,当用户设置了该参数时,需要丢弃并warning提示。 4. 涉及原地修改的参数,如out,in_place也无需对齐(PyTorch中已明确不推荐使用),MSAdatper兼容时判断该参数取值后要提示错误。
zoulq commented 1 year ago
Collaborator
### **开发经验&规范总结:** 1. MSAdapter tensor在调用mindspore接口前,需要转换成mindspore tensor,从mindspore接口返回的tensor需要转换成MSAdapter tensor。 2. Tensor下方法可以调用mindspore的接口,但不能调用MSAdapter下其他nn/functional接口,避免循环调用。 3. nn接口中含有weight等parameter参数的,需要重写初始化函数reset_parameters。 4. 当接口中含有inplace或out这种原地操作实现时,必须保证返回值和input/out是相同的对象(指针)。---待确认是否统一改成不支持。 5. 调用mindspore.ops.Xxx(首字母大写)和nn接口时,要避免重复初始化导致性能低,因此一般只能在init阶段进行初始化,首选调用mindspore.ops.xxx(首字母小写)。 6. PyTorch框架特定支持内容,例如`__constants__`不需要迁移兼容。
ZezhengZ commented 1 year ago
excellent work
Sign in to join this conversation.
No Label
No Milestone
No Assignees
3 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.