初探 MindSpore(一):PyTorch 用户先从哪里开始
初探 MindSpore一先建立最基本的框架认识对 PyTorch 用户来说MindSpore 不是一套需要从头理解的框架但也绝不是“把 API 名字改掉就能迁过去”的另一层皮。MindSpore 官方文档本身就是按这个思路组织的一方面提供了面向 PyTorch 的 API Mapping Table另一方面又单独提供了差异说明页并明确提醒两边 API 在参数、输入输出、逻辑功能和具体适用场景上都可能不同。官方入口文档MindSpore 官方文档https://www.mindspore.cn/docs/PyTorch API Mapping Tablehttps://www.mindspore.cn/docs/en/master/note/api_mapping/pytorch_api_mapping.htmlDifferences Between MindSpore and PyTorchhttps://www.mindspore.cn/docs/en/r2.0/migration_guide/typical_api_comparision.html仓库mindspore-ai/mindsporehttps://github.com/mindspore-ai/mindsporemindspore-ai/docshttps://github.com/mindspore-ai/docsmindspore-ai/modelshttps://github.com/mindspore-ai/modelsnn.Module - nn.CellPyTorch 用户进入 MindSpore首先要改的是对网络组织方式的理解而不是某个层的名字。MindSpore 官方 API 文档对mindspore.nn.Cell的定义很直接它是神经网络的基本构建块模型或网络层都应该继承这个基类。官方差异说明页则明确写到MindSpore 的nn.Cell与 PyTorch 的nn.Module扮演相同角色二者都用于构建图结构。因此进入 MindSpore 时最先应该建立的不是“某个算子怎么替换”而是下面这条关系nn.Module在 MindSpore 中最接近的对应物是nn.Cell。这不是经验性概括而是官方文档已经明确给出的结构对应关系。接受这一点之后再看 MindSpore 网络代码阅读成本会明显下降。forward - constructPyTorch 用户第一次看 MindSpore 代码最容易卡住的地方通常不是 Tensor也不是层定义而是找不到熟悉的forward()。MindSpore 官方教程和Cell文档的写法是一致的在继承nn.Cell时通常在__init__中定义层在construct()中定义前向计算。最小对照如下# PyTorchimporttorch.nnasnnclassNet(nn.Module):def__init__(self):super().__init__()self.fcnn.Linear(10,2)defforward(self,x):returnself.fc(x)# MindSporeimportmindspore.nnasnnclassNet(nn.Cell):def__init__(self):super().__init__()self.fcnn.Dense(10,2)defconstruct(self,x):returnself.fc(x)这段代码里最重要的变化只有两个基类从nn.Module变成了nn.Cell前向入口从forward()变成了construct()至于Linear - Dense那是后一步要处理的局部接口替换真正先要适应的是网络骨架本身。API 对照表的使用边界官方 API Mapping Table 的用途很明确帮用户找到大致对应项。官方同时明确提醒映射关系不意味着参数、输入输出、逻辑功能和具体使用场景完全一致。这句话非常关键。因为它实际上规定了正确的使用方式先查 Mapping Table找到对应入口。再看差异页确认行为是否一致。如果跳过第二步迁移时最容易出的问题不是“没有这个 API”而是“找到了 API但默认行为已经变了”。官方差异说明页不是附属材料而是迁移过程的一部分。一个最小示例下面这个例子足够说明问题。# PyTorchimporttorchimporttorch.nnasnnclassNet(nn.Module):def__init__(self):super().__init__()self.fcnn.Linear(10,2)defforward(self,x):returnself.fc(x)netNet()xtorch.randn(4,10)ynet(x)print(y.shape)# MindSporeimportnumpyasnpimportmindsporeasmsimportmindspore.nnasnnclassNet(nn.Cell):def__init__(self):super().__init__()self.fcnn.Dense(10,2)defconstruct(self,x):returnself.fc(x)netNet()xms.Tensor(np.random.randn(4,10),ms.float32)ynet(x)print(y.shape)如果只从表面看这段改写像是在做三件事nn.Module - nn.Cellforward - constructnn.Linear - nn.Dense但真正重要的其实只有前两件。因为它们决定了 MindSpore 网络代码的基本组织方式。Dense只是一个具体层的替换Cell和construct才是后面所有网络、训练包装和图构建逻辑的基础。训练封装仍然沿着Cell展开为什么要把Cell放在最前面因为它不只是“写一个网络类”的基类后面的训练封装也继续沿着这个体系展开。例如官方TrainOneStepCell文档明确写到它是训练封装类用优化器包装网络并在construct函数中创建反向图和参数更新逻辑。这说明Cell在 MindSpore 里不是局部概念而是贯穿网络定义和训练封装的基本结构。因此PyTorch 用户进入 MindSpore最先要适应的不是“某个层怎么写”而是“MindSpore 把更多东西收进了Cell体系里”。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2418684.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!