写在前面
跳过了模型训练和保存两节,模型训练的例子已经学习过,都是重复的内容,不进行详细的学习了,除非要使用类似的函数。
因此接下来开始学习初学教程的最后一节:使用静态图加速,希望能学习到一些内容。
动态图
看了mindspore介绍,应该整体思路是和tensorflow2.0更接近的,或者说是融合了pytorch+tensorflow+numpy,也不能说不好,但是暂时还没看出来有哪些特别的优势。
下面是类似pytorch eager模式的使用例子:
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
ms.set_context(mode=ms.PYNATIVE_MODE) # 使用set_context进行动态图模式的配置
class Network(nn.Cell):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.dense_relu_sequential = nn.SequentialCell(
nn.Dense(28*28, 512),
nn.ReLU(),
nn.Dense(512, 512),
nn.ReLU(),
nn.Dense(512, 10)
)
def construct(self, x):
x = self.flatten(x)
logits = self.dense_relu_sequential(x)
return logits
model = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)
好奇为什么可以直接进行推理,dense中的w和b都还没有定义呢,查看一下:
import mindspore as ms
from mindspore import nn
# 创建一个Dense层
dense_layer = nn.Dense(28*28, 512)
# 打印初始化的权重和偏置
print("Weights:", dense_layer.weight.asnumpy())
print("Bias:", dense_layer.bias.asnumpy())
结果如下:
看起来是一些随机值。
静态图
装饰器
使用较简单的装饰器方式,对静态图进行加速。
也可以直接调用装饰器函数
局部加速方法:
context维度开启加速
直接通过设置变量,进行全局的加速。
看了上面两个加速方式,这里做的还是比较好的。
由于我接触过torch_npu,知道他们是能完全向pytorch进行兼容的,看来底层的ascend算子抽离的还是不错的,除此之外也一定是能兼容tensorflow的。然后还独自揉了一个mindspore,是花了不少人力物力的,如果没有真正的商业化起来,可能亏损比较大了。还是希望能做好的。
打卡
完成本节,几乎就完成了新手村的一些例子。接下来希望可以学习一些大语言模型或者并行训练的任务。