基于Mindspore2.0的GPT2预训练模型迁移教程

摘要: 这篇文章主要目的是为了让大家能够清楚如何用MindSpore2.0来进行模型的迁移。

本文分享自华为云社区《MindNLP-基于Mindspore2.0的GPT2预训练模型迁移教程》,作者: Super_WZB。

前言

动机

大家好,我是Super_WZB,最近MindSpore快要上线2.0版本了,由于之前主要是参与MindSpore的开发工作,一直想找机会多用一用。而自春节开始也是参与到了一项基于MindSpore的迁移工作,积攒了一些经验,搞了一下GPT2的模型迁移工作。目前初步实现了GPT2 Model最基础模型的推理,输出精度能够和hugging face中基于Pytorch的实现完全对标。整个流程我感觉非常的顺利,并且也切实的体会到MindSpore目前已经可以说是从“可用”进化到了“易用”的阶段。出于MindSpore布道师的职责,同时更是自己想要分享MindSpore2.0的使用感受,写下这篇基于MindSpore2.0的模型迁移教程,供大家参考。

目的

这篇文章主要目的是为了让大家能够清楚如何用MindSpore2.0来进行模型的迁移,因此更加注重整体的开发流程介绍,针对迁移中代码的编写不会详细讲解,但是会给出样例以及供查阅的文档链接。最终希望读者能够了解迁移模型需要做什么,每一步应该怎么做,做完了应该怎么验证。话不多说,直接开始:

1、前期准备

本章节介绍开发的前期准备工作,简要介绍环境配置、MindSpore安装和寻找迁移参考代码的途径,每一部分的详细操作大家可以百度搜索一下,相关博客非常多,这里就不赘述。这一章节非常的基础,如果已经是老手可以直接跳过。

1.1 寻找参照样例

既然是迁移工作,那么第一件事肯定是确定自己想要迁移的模型,然后找到该模型的开源代码,提供以下几个途径供大家寻找源码,基本上比较知名的模型通过以下几种方式都是可以找到相应代码的:

  • 模型论文源码:一般知名的模型和机构发布的论文和模型都是有开源的,可以直接在github搜这个模型的名字或者论文的题目,找到对应机构的仓库即可

  • Paper With Code:Paper With Code是一个整合论文和相应开源代码的网址,其中可以查到绝大多数论文以及多框架版本的实现,如果觉得官方的看不懂的话,可以找一些高引用的其他框架版本作为参考源码。

  • Hugging Face:Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商,他们本来打算创业做聊天机器人,然后在github上开源了一个Transformers库,虽然聊天机器人业务没搞起来,但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超100,000个预训练模型,10,000个数据集,变成了机器学习界的github。那其实看起来这个网站和PaperWithCode很类似,但是它胜在有模型使用教程,同时有演示窗口,并且调用非常方便。

1.2 Git操作

找到了参考代码之后,大家会发现这些源码基本上都是保存在GitHub上的,因此为了更方便的查阅我们需要迁移的代码,以及跳转和搜索可能存在的依赖函数,我建议大家把参考代码Clone到本地,然后进行对照开发:

常用的git操作可以参考这篇博客:Git的下载、安装与使用

1.3 环境配置

1.3.1 自有硬件

如果大家自己有硬件资源,比如CPU、GPU、服务器,那么可以在自己的电脑本地配置神经网络的运行环境,主要包括以下步骤:

  • 安装anaconda:anaconda是一个非常便捷好用的包管理工具,基本上大家都使用它来管理python运行环境,安装流程参考:anaconda安装-超详细版-CSDN博客

  • 创建并激活虚拟环境:安装好了anaconda之后就可以创建虚拟环境了,之所以要创建自己的虚拟环境是因为不同的项目和开发者需要的运行环境不同,需要的包不同,即使需要同样的包可能需求的版本也不同,因此最好是对每一个项目创建一个单独的虚拟环境,以免影响他人使用,创建虚拟环境流程参考:使用 Anaconda 创建 Python 虚拟环境-CSDN博客

  • 安装依赖包:python开发的一大优势就是有非常多可以直接安装调用的依赖包,这些包中包含了大量奇奇怪怪非常有用的接口,可以大大简化python项目的开发难度。因此大部分基于python的项目都导入了非常多的依赖包,在运行之前必须将它们都安装好否则会报错,依赖包通常采用pip安装的方式,可以从以下几个网址下载:

    PyPI · The Python Package Index(官网,可能需要科学上网,不该镜像的话默认从这里下载)

    pip更换软件源方法-CSDN博客(如果官网下载异常,可以参考博客切换以下国内镜像)

    http://mirrors.aliyun.com/pypi/simple/ (阿里云镜像)
    https://pypi.mirrors.ustc.edu.cn/simple/ (中国科技大学镜像)
    http://pypi.douban.com/simple/ (豆瓣镜像)
    https://pypi.tuna.tsinghua.edu.cn/simple/ (清华大学镜像)
    http://pypi.mirrors.ustc.edu.cn/simple/(中科科学技术大学镜像)

1.3.2 启智社区

OpenI 启智 新一代人工智能开源开放平台

启智AI协作平台,简称启智社区 ,是一个开源在线Web应用,旨在为人工智能算法、模型开发提供在线协同工作环境,它提供了代码托管、数据集管理与共享、免费云端算力资源支持(GPU/NPU)、共享镜像等功能。

启智平台是可以直接在线创建网络运行环境的平台,里面可以白嫖GPU/NPU资源,配置也非常容易,个人感觉非常的好用,如果大家没有自己的硬件资源的话可以创建一个账号,用启智来进行调试:

GPU调试参考:OpenIOSSG/MNIST_PytorchExample_GPU - OpenI - 启智AI开源社区提供普惠算力!

NPU调试参考:OpenIOSSG/MNIST_Example NPU - OpenI - 启智AI开源社区提供普惠算力!

1.4 安装MindSpore

1.4.1 MindSpore简介

安装之前,请允许我先介绍和宣传一下MindSpore:MindSpore官网介绍

昇思MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标。

其中,易开发表现为API友好、调试难度低;高效执行包括计算效率、数据预处理效率和分布式训练效率;全场景则指框架同时支持云、边缘以及端侧场景。

昇思MindSpore总体架构如下图所示:

  • ModelZoo(模型库):ModelZoo提供可用的深度学习算法网络,也欢迎更多开发者贡献新的网络(ModelZoo地址)。
  • Extend(扩展库):昇思MindSpore的领域扩展库,支持拓展新领域场景,如GNN/深度概率编程/强化学习等,期待更多开发者来一起贡献和构建。
  • Science(科学计算):MindScience是基于昇思MindSpore融合架构打造的科学计算行业套件,包含了业界领先的数据集、基础模型、预置高精度模型和前后处理工具,加速了科学行业应用开发。
  • Expression(全场景统一API):基于Python的前端表达与编程接口,支持两个融合(函数/OOP编程范式融合、AI+数值计算表达融合)以及两个统一(动静表达统一、单机分布式表达统一)。
  • 第三方前端:支持第三方多语言前端表达,未来计划陆续提供C/C++、华为自研编程语言前端-仓颉(目前还处于预研阶段)等第三方前端的对接工作,引入更多的第三方生态。
  • Data(数据处理层):提供高效的数据处理、常用数据集加载等功能和编程接口,支持用户灵活地定义处理注册和pipeline并行优化。
  • Compiler(AI编译器):图层的核心编译器,主要基于端云统一的MindIR实现三大功能,包括硬件无关的优化(类型推导、自动微分、表达式化简等)、硬件相关优化(自动并行、内存优化、图算融合、流水线执行等)、部署推理相关的优化(量化、剪枝等)。
  • Runtime(全场景运行时):昇思MindSpore的运行时系统,包含云侧主机侧运行时系统、端侧以及更小IoT的轻量化运行时系统。
  • Insight(可视化调试调优工具):昇思MindSpore的可视化调试调优工具,能够可视化地查看训练过程、优化模型性能、调试精度问题、解释推理结果。
  • Armour(安全增强库):面向企业级运用时,安全与隐私保护相关增强功能,如对抗鲁棒性、模型安全测试、差分隐私训练、隐私泄露风险评估、数据漂移检测等技术。

对昇思MindSpore感兴趣的开发者,可以参与昇思MindSpore的社区并一键三连。

1.4.2 MindSpore安装

MindSpore官网就有非常详细的安装教程,大家可以按照官网的步骤进行安装:

MindSpore安装指南

 

2、网络迁移

神经网络其实可以理解为搭积木,而不同框架就可以理解为不同品牌的积木包,比如有乐高、森宝、启蒙等等,不同品牌的积木包中肯定有非常多的积木是类似可代替的。

比如A品牌推出了一个Super Mario超级马里奥的积木套装,而我们手头有B品牌的零散积木,只要我们有了这个Super Mario的搭建步骤图,我们同样可以用B品牌的积木构造出一个基本相同的Super Mario。

那么我们将品牌A替换为框架A、品牌B替换为MindSpore、积木替换为需要用到的API接口,构建图替换为GPT2的论文。那么:

我们有了基于框架A的GPT2模型,而我们手头有MindSpore中大量的可调用接口,那么我们只需要参照GPT2的网络结构图和原论文,就可以用MindSpore写出一个基本相同的GPT2模型,这个过程就是模型迁移。

经过上面的例子,大家应该大致了解网络迁移是在干个什么事情,而实际上网络的迁移工作也非常简单,主要考验开发者对于网络模型构建以及多种深度学习框架的熟悉情况。不过不同的模型网络结构肯定是不相同的,因此本章节只会介绍迁移流程和每一步应该做什么,具体怎么迁移就需要大家读懂源码,然后参照我给出的api映射表具体问题具体分析。

首先介绍一下后续迁移讲解用到的资源情况:

2.1 源码下载

2.1.1 参考源码下载

前往huggingface/transformers仓库下载transformers包

之后找到迁移需要用到的configguration_gpt2.py配置文件和modeling_gpt2.py模型文件(没有后缀的一般是pytorch实现,带tf的是tensorflow实现,我个人对于pytorch更熟悉一些所以选择pytorch版本进行迁移)

使用pycharm远程连接,可以直接访问文件代码:

2.3.1 MindNLP仓库下载

由于迁移之后的源码是需要合入到MindNLP仓库的,因此大家需要去MindNLP官方GitHub仓库进行一键三连(watch+fork+star)

目前MindNLP中已经有了Bert模型的迁移代码,因此我们是可以将这个bert.py与hugging face中的bert代码进行对比来学习应该如何迁移的:

下载好之后同样用pycharm打开,刚下载的mindnlp打开图示的models界面是没有gpt2这个文件夹的,这个是大家需要根据自己的模型创建的,用于存放之后迁移之后的相关文件。我的是GPT2所以创建为gpt2,其他模型同理。

之后在该文件夹下新建init___.py、config_gpt2.py、gpt2.py三个文件,作用分别是:

  • 使得当前文件夹可以被识别为一个模块用于import和调用
  • GPT2参数文件
  • GPT2模型文件

2.2 API映射

下载好了参考源码和MindNLP仓库之后我们就可以正式开始网络迁移了,经过上面搭积木的例子,大家其实应该知道我们需要做的其实就是把参考源码中所使用框架(我参考的是pytorch,之后都以它来讲解)的API替换为MindSpore中的API即可。

2.2.1 直接API映射

下面举一个非常简单的例子:

GPT2MLP的迁移:

得益于MindSpore中API命令的规范化和统一化,我们可以发现从左边基于pytorch的实现迁移到右边基于mindspore的实现基本上可以直接复制粘贴,图中的Conv1D和ACT2FN是左边hugging face源码自己封装的类别,后面会讲解。而这个GPT2MLP中其他的代码基本上是直接照搬即可,唯一的差异就是这个nn.Dropout()中的参数有些许不同,这个在2.3API差异中会介绍。

通过这一个例子大家会发现其实迁移还是非常简单的,只要把代码逻辑甚至直接把代码搬过来就行了。这得益于目前MindSpore完善的API接口库,大部分神经网络需要用到的接口都是有的,并且对于输入输出等参数的设置也是向大众的一致标准靠齐的,所以会用其他框架就一定能很快的上手MindSpore(打波小广告哈哈哈)。

下面是更多直接API映射的例子:

大家会发现,这些直接API映射的例子里面存在一些参数或者名字不对应的情况,这将会在2.3 API差异中为大家讲解。

2.2.2 hugging face自封装类别和函数迁移

还是以GPT2MLP举例,其中的Conv1D类别是hugging face实现GPT2时自己封装好的类别:

那我们需要做的其实也很简单,把这个类别也迁移过来就好了。而关于这个类别该迁移到哪个文件,这个可以选择迁移到自己的模型文件(即gpt2.py),也可以参照hugging face中的文件路径在MindNLP中相应路径新建文件来保存。我这里以迁移到gpt2.py为例:

迁移之后呢,这个hugging face自定义的Conv1D类别我们也可以直接使用啦:

2.3 API差异

接下来讲一下迁移中出现的API名字或者参数存在差异的问题,API差异主要包括API命名差异、API参数差异、API功能差异。

2.3.1 命名差异

命名差异就是说MindSpore某个接口和pytorch等其他框架的功能是一致的,但是API的名字不同,这时候我们就需要查询pytorch等其他框架中某个API在MindSpore的名字叫啥,而这就需要用到MindSpore官方给出的pytorch/tensorflow API映射表:

可以看到其中收纳了绝大多数常用的API接口,我们只需要在网页中搜索原来pytorch/tensorflow的API名就可以找到MindSpore这边对应的API名字,并且MindSpore这边还非常细致的给出了每个API映射之间的关系,是完全一致、还是存在差异,点赞。

PyTorch与MindSpore API映射表

TensorFlow与MindSpore API映射表

这两张映射表非常重要,是迁移的基础,一定要收藏、一定要收藏、一定要收藏

比如这张图中的差异nn.ModuleList是因为Pytorch中网络都继承了nn.Module类别,而MindSpore网络继承的是nn.Cell类别,因此命名有些不同:

这个差异是可以在映射表中查到的,并且没有显示存在差异,所以我们直接给它替换掉就解决啦:

2.3.2 参数差异

(1)参数值差异

参数值差异是指pytorch/tensorflow与MindSpore中API的名字相同,但是一些参数的名字或者参数的含义不同,导致API在使用时功能会产生差异,比如最经典的nn.Dropout§差异:

PyTorch中默认输入nn.Dropout(0.2)时代表有每个参数有20%的概率被丢弃,而如果在MindSpore中不指定参数名直接输入nn.Dropout(0.2)的话代表每个参数有(1 - 0.2)即80%的概率被丢弃。这就是一个非常经典,如果大家有长期使用MindSpore的话肯定知道的差异,当然最新的版本中已经提示这种默认写法将会删除,之后就也可以直接使用nn.Dropout(0.2)啦:

(2)参数初始化差异

这一块主要是有一些网络API的参数在初始化时存在不同,不要小看初始化的差异,有时候网络结构都是对的,但是结果就是对标补上,很有可能就是某些网络的参数初始化不一样,导致结果大相径庭。

比如将PyTorch线性层nn.Linear()映射为MindSpore线性层nn.Dense():

从Pytorch的官网来看,他的nn.Linear线性层中的weight和bias应该是用均匀分布初始化的

而MindSpore中的nn.Dense线性层中weight使用normal初始化的,而bias使用zeros初始化的

2.3.3 功能差异

其实大部分的功能差异都是因为2.3.2中参数没设置好,但是也存在一小部分API确实是功能有差异,这里举一个很简单的例子:

torch中的Tensor.transpose在MindSpore中应该是swapaxes

而MindSpore中的Tensor.transpose实际上对应torch.Tensor.permute

所以如果不仔细检查,看到mindspore中有transpose API就直接迁移过来的话最后的结果往往是不正确。因此大家在迁移时一定要仔细核对每一步迁移的API是否是正确的映射,多查表、多查表、多查表!!!

2.4 API缺失

极少出的情况会出现pytorch/tensorflow中的API在MindSpore查不到的情况:

  • 如果缺失的API是非常重要并且常用,那么大家可以在mindspore官方gitee仓库中提交issue申请补充该API(但是一般常用的APi都已经有了,很少有这种情况)
  • 如果该API在numpy中有相应实现,我们可以调用numpy的 API生成数据之后再用mindspore.Tensor包装起来:

比如mindspore中没有这个finfo API

我们可以用numpy.finfo得到相同的数据之后包装成mindspore.Tensor

  • 如果该API使用频率不高,并且numpy中也没有相应实现,那么我们可以自己用python写一个类来实现该API的功能。即写一个类,实现其初始化函数和运行函数,然后调用即可,具体实现方法这里就不赘述。

2.5 注意事项

  • 如果存在Dropout、BatchNorm等训练和预测阶段行为不一致的,或存在随机性的,需要将模块设置为预测模式:
    Pytorch:module.eval()
    MindSpore: cell.set_train(False)
  • MindSpore和Pytorch的参数命名可能不同,如:
    Pytorch: nn.Embedding.weight, MindSpore: nn.Embedding.embedding_table
    Pytorch: nn.BatchNorm1d.weight, MindSpore: nn.BatchNorm1d.gamma
    Pytorch: nn.BatchNorm1d.bias, MindSpore: nn.BatchNorm1d.beta
  • 由于框架机制不同,Pytorch部分操作无需转换,直接删除即可:

Tensor.contiguous()

Tensor.to(device)

3、迁移验证

清楚了网络迁移应该干什么,以及如何查找对应的API之后,我们就可以对自己迁移的网络进行验证了,验证主要包括两个方面:输出shape验证、输出精度验证,验证流程从小到大依次为单模块验证、整网验证、checkpoint验证。

3.1 单模块验证

单模块验证就是对网络中每个单独的模块进行验证,比如对于迁移好的GPT2MLP:

我们需要对它进行测试验证,那怎么做呢?实际上网络说复杂了是网络,说简单点就是一堆函数的拼接,我们测试的一个模块就是一个小的函数,只不过它是一个类别的正向运行函数(forward/construct,只是命名差异,pytorch中叫forward,mindspore中叫construct)罢了。所以想要验证迁移结果是否正确,我们只需要实例化迁移前和迁移后的两个类别,然后给他们的正向运行函数输入相同的数值,再对标两个函数的输出结果即可。以下给出简单的实现:

import numpy as np
import modeling_gpt2, gpt2, configuration_gpt2, config_gpt2
if __name__ == "__main__":
 config_pt = configuration_gpt2.GPT2Config() // 获取pytorch的配置
 config_ms = config_gpt2.GPT2Config() // 获取mindspore的配置
 pt_net = modeling_gpt2.GPT2MLP(config_pt) // 实例化pytorch的GPT2MLP模块
 ms_net = gpt2.GPT2MLP(config_ms) // 实例化mindsproe的GPT2MLP模块
 input_np = np.random.randint(0, 10, (2, 512)) // 使用numpy随机生成一个shape为(2, 512)的numpy.array
 pt_input = torch.tensor(input_np) // 将numpy.array转化为pytorch.Tensor
 ms_input = mindspore.Tensor(input_np) // 将numpy.array转化为mindspore.Tensor
 pt_out = pt_net(pt_input) // 调用pytorch正向函数GPT2MLP.forward()计算结果
 ms_out = ms_net(ms_input) // 调用mindspore正向函数GPT2MLP.construct()计算结果
 assert pt_out.size() == ms_out.shape // 对比pytorch和mindspore输出的shape,必须相同否则迁移出错
    loss = 1e-3 // 精度误差一般为1e-5,最大为1e-3,必须小于1e-3否则迁移出错
 assert np.allclose(pt_out.detach().numpy(), ms_out.asnumpy(), loss, loss) // 将结果全部转成array然后对比精度

最终我们的目的就是要给pytorch和mindspore的两个模块输入相同的数据,他们的输出shape完全一致,精度误差在1e-3之内就代表该模块基本迁移成功了。每个模块都这样子验证正确之后,我们就可以尝试把整个网络搭建起来然后进行验证了

3.2 整网验证

整网验证其实和每个模块测试验证没啥区别,网络说白了就是个大函数,所以就把GPT2MLP改成GPT2Model其实就差不多了,无非就是输出可能多几个。

当然我说的仅仅只是测试代码很好写,和模块测试没啥区别,但是整个网络连起来之后可能会出现单模块测试时未出现的bug,这也很正常,如果出现bug一点点debug检查就好了。

import numpy as np
import modeling_gpt2, gpt2, configuration_gpt2, config_gpt2
if __name__ == "__main__":
 config_pt = configuration_gpt2.GPT2Config() // 获取pytorch的配置
 config_ms = config_gpt2.GPT2Config() // 获取mindspore的配置
 pt_net = modeling_gpt2.GPT2Model(config_pt) // 实例化pytorch的GPT2MLP模块
 ms_net = gpt2.GPT2Model(config_ms) // 实例化mindsproe的GPT2MLP模块
 input_np = np.random.randint(0, 10, (2, 512)) // 使用numpy随机生成一个shape为(2, 512)的numpy.array
 pt_input = torch.tensor(input_np) // 将numpy.array转化为pytorch.Tensor
 ms_input = mindspore.Tensor(input_np) // 将numpy.array转化为mindspore.Tensor
 pt_out = pt_net(pt_input) // 调用pytorch正向函数GPT2MLP.forward()计算结果
 ms_out = ms_net(ms_input) // 调用mindspore正向函数GPT2MLP.construct()计算结果
 assert pt_out.size() == ms_out.shape // 对比pytorch和mindspore输出的shape,必须相同否则迁移出错
    loss = 1e-3 // 精度误差一般为1e-5,最大为1e-3,必须小于1e-3否则迁移出错
 assert np.allclose(pt_out.detach().numpy(), ms_out.asnumpy(), loss, loss) // 将结果全部转成array然后对比精度

最终我们需要达到的目的和模块验证一致,向pytorch和mindspore的整个网络输入相同的数据,最终要求网络输出的个数相同、shape一致、精度误差在1e-3以内。满足以上要求我们就可以进行最后的checkpoint验证了。

3.3 checkpoint验证

以上的验证都是在检查网络的流程以及计算是否正确,而其中网络的参数都是随机初始化的,而为了达到迁移的最终目的:”直接调用训练好的预训练模型,可以达到与原论文相同的结果“。我们必须将预训练好的模型参数checkpoint导入进来,然后在”指定参数“的情况下再进行一次整网验证,如果也能够满足网络输出的个数相同、shape一致、精度误差在1e-3以内的要求,那么我们的checkpoint验证也就成果啦,这就说明这个GPT2Model真正迁移成功了。下面我简要介绍一下应该如何进行checkpoint验证

3.3.1 checkpoint下载

一般NLP这边的大模型官方是有预训练的参数的,但是有些官方放出来的网站死活就是打不开,因此我还是推荐大家使用hugging face中来下载checkpoint:

以GPT2为例,我们前往GPT2的hugging face网址gpt2 at main (http://huggingface.co),点击其中的Files and version,这个界面存放了gpt2不同版本的配置文件以及模型预训练参数,我使用的是pytorch版本,因此我下载pytorch_model.bin以及pytorch和tensorflow通用的config.json配置文件。

将pytorch_model.bin和config.json上传到服务器的同一个文件夹内:

接下来进行checkpoint的导入和转换

3.3.2 checkpoint导入与转换

由于我们手上的是pytorch的预训练参数,所以我们先参照hugging face中提供的使用样例将这个pytorch_model.bin导入

(1)导入pytorch预训练参数

import torch
from transformers import GPT2Model, GPT2Config
model_name = '/home/xxxxxx/wzb/mindnlp/pt_pretrained' // pytorch checkpoint存放路径
model_config = GPT2Config.from_pretrained(model_name) // 导入GPT2配置
pt_net = GPT2Model.from_pretrained(model_name, config=model_config) // 导入GPT2 checkpoint中的参数

(2)创建MindSpore的GPT2Model模型

import mindspore
from mindnlp.models.gpt2 import gpt2, config_gpt2
ms_config = config_gpt2.GPT2Config() // 获取mindspore GPT2配置
ms_net = gpt2.GPT2Model(config=ms_config) // 创建mindspore GPT2Model

(3)核对参数是否对应

获取pytorch和mindspore的网络参数字典,而由于pytorch和mindspore中有部分网络参数的命名不同,所以我们需要核对一下两边的参数是不是都能对应的上:

pt_dict = pt_net.state_dict() // 获取pytorch整网参数字典
ms_dict = ms_net.parameters_dict() // 获取mindspore整网参数字典

常见参数命名差异对比

获取了pt_dict和ms_dict之后我们可以将他们打印出来看看参数是否能够对应:

for pt_key in pt_dict: // 打印pytorch所有参数名
 print(pt_key)
print("+++++++++++++++++++++++++++++++++++++++++") // 分界线
for ms_key in ms_dict: // 打印mindspore所有参数名
print(ms_key)

打印出来之后自己人眼核对那可太累了,我推荐大家使用excel来进行比对。由于print()会自动换行,所以我们将pytorch和mindspore的参数复制之后直接粘贴到excel表格中的两列,复制好之后第一件事就是直接看一下两边的参数个数是否相同(查看这两列的行数是否相同):

粘贴之后,由于我们知道存在一些命名的差异,因此我们点击mindspore这一列然后ctrl+f之后选择替换,将gamma换成weight,将beta换成bias,得到:

之后我们利用Excel的Exact()函数直接比较pytorch和mindspore每一行的字符串是否相同:

可以看到,除了前两行,后面的参数都是一致的,而前两行不一致其实也是正常的,因为只有一个embeeding层,所以我就没有将embedding_table替换为weight,实际上是对的,至此参数全部对应正确后核对结束。

(4)参数导入

参数对应一致后,我们需要将pytorch网络的参数导入mindspore的网络,同时需要注意对名称不一致参数的替换处理:

for key, parameter in ms_net.parameters_and_names(): // 获取ms模型的参数名和数值
 if 'embedding_table' in key: // 参数名中的embedding_table替换为weight
        key = key.replace('embedding_table', 'weight')
 elif 'gamma' in key:
        key = key.replace('gamma', 'weight') // 参数名中的gamma替换为weight
 elif 'beta' in key:
        key = key.replace('beta', 'bias') // 参数名中的beta替换为bias
 // 依据key获取pytorch中相应参数的数值并赋给mindspore当前参数parameter,上面替换参数名就是为了get(key)的时候不会找不到
    parameter.set_data(mindspore.Tensor(pt_dict.get(key).detach().numpy()))

参数全部正确导入之后我们就可以进入最终的checkpoint整网验证了

3.3.3 checkpoint整网验证

获取了Pytorch和MindSpore导入了参数的网络后,我们就可以和之前的3.2整网验证一样,构造输入然后验证输出是否对标,最终整体代码如下:

import torch
import mindspore
import numpy as np
from transformers import GPT2Model, GPT2Config
from mindnlp.models.gpt2 import gpt2, config_gpt2
if __name__ == "__main__":
 model_name = '/home/xxxxxx/wzb/mindnlp/pt_pretrained'
 model_config = GPT2Config.from_pretrained(model_name)
 pt_net = GPT2Model.from_pretrained(model_name, config=model_config)
 ms_config = config_gpt2.GPT2Config()
 ms_net = gpt2.GPT2Model(config=ms_config)
 pt_dict = pt_net.state_dict()
 ms_dict = ms_net.parameters_dict()
 for key, parameter in ms_net.parameters_and_names():
 if 'embedding_table' in key:
            key = key.replace('embedding_table', 'weight')
 elif 'gamma' in key:
            key = key.replace('gamma', 'weight')
 elif 'beta' in key:
            key = key.replace('beta', 'bias')
        parameter.set_data(mindspore.Tensor(pt_dict.get(key).detach().numpy()))
 input_ids = np.random.randint(0, 10, (2, 512))
 pt_input = torch.tensor(input_ids)
 ms_input = mindspore.Tensor(input_ids)
 pt_out = pt_net(pt_input)
 ms_out = ms_net(ms_input)
 assert pt_out.size() == ms_out.shape
 print("shape对标通过")
    loss = 1e-3
 assert np.allclose(pt_out.detach().numpy(), ms_out.asnumpy(), loss, loss)
 print("精度对标通过,误差:%f", loss)

如果最终输出个数、shape和精度全部通过,那么恭喜你网络GPT2Model迁移成功,之后你只需要重复以上的操作,把其他的GPT2变形全部迁移成功,本次MindNLP的预训练模型迁移工作就做完成了,完结撒花!!!

总结

通过本文的阅读,大家应该是能够了解MindNLP的预训练模型迁移工作需要做什么,怎么做以及怎么验证结果。而如果大家能够独立完成一个Model的迁移工作,就会发现目前的MindSpore2.0.0实际上已经比较好用了,API丰富并且映射表格非常详细,对于差异的描述也非常清晰,报错信息也比之前精准多了(当然还是需要努力)。看来在大家共同的努力下,MindSpore还是取得了非常显著的提升,当然距离最初设想的动静统一目标还是有不小的差距,还是需要不断的查漏补缺。

综合来说,国产深度学习框架的发展道阻且长、任重而道远,很开心自己能够为其贡献自己的一份力。同时作为昇思MindSpore的布道师我想说:从未使用过MindSpore的同学可以基于这篇文章来体验一下MindSpore,曾经使用过但是因为各种原因“退坑”了的同学也不妨试一下MindSpore2.0,真的比以前的体验好了很多!

点击关注,第一时间了解华为云新鲜技术~

相关推荐

AI Agent如何通过MCP连接到华为云RDS Supabase应用平台

Schema元数据列出所有可访问的表(按schema分组)。Schema元数据列出表的列及元数据(类型/默认值/约束)。Schema元数据列出所有约束(PK/FK/UNIQUE/CHECK/EXCLUDE)。可按schema/表/类型过滤。Schema元数据列出所有外键关系。可按schema/表过滤。Schema元数据列出所有索引及定义和大小。可按schema/表过滤。Schema元数据列出已应用的数据库迁移记录。Schema元数据列出已安装的PostgreSQL扩展。

华为云官方博客 256

华为大数据Flink让每一 CU 算力,跑出开源 5.74 倍的性能

1. 开源Apache Flink 已成为业界流计算事实标准,但在极端重负载场景下存在性能瓶颈。2. 华为大数据Flink通过多项自研深度优化,在执行计划、算子执行、状态存储三个层面构建协同的优化体系。3. Nexmark Benchmark 测试结果:整体性能提升 5.74 倍,极端重负载场景性能领先最高 18.3 倍。4. 100% 兼容 Apache Flink 1.20,业务代码零改造,无缝迁移。

华为云官方博客 207

LakeAgent实战 | 业务分析篇从一句提问到业务分析

本文以“订单金额变化”分析为例,展示LakeAgent如何通过自然语言提问,结合DataArtsStudio的数据资产与专业技能,帮助业务人员快速定位数据、生成SQL、追踪血缘、生成报告。从问题出发,逐步实现数据发现、变化洞察、原因追溯与团队协作,最终形成可复用的分析流程与企业规则,显著提升数据分析效率与一致性。

华为云官方博客 247

华为云RDS Supabase AI应用已开放公测 :30分钟搭建AI应用后端

认证、存储、实时推送、数据库API——4个后端模块,传统开发需要数周。今天,你只需要30分钟。AI创业公司的全栈开发工程师。上周老板说"下周要上线的AI对话应用,后端你来搞"——认证鉴权、数据库接口、文件存储、实时推送,每一个模块都需要数周搭建,而市场不会等你。小张打开华为云RDS Supabase,30分钟搭好认证、数据库API、对象存储,剩下的时间全用来打磨AI交互体验。基于开源Supabase+华为云RDS PostgreSQL全托管能力,为开发者提供。

华为云官方博客 237

如何使用RDS Supabase后端BaaS能力:数据库函数(Database Function)

上一篇介绍了 Database Data API——建表即自动生成增删改查接口,解决单表读写,但聚合统计、跨表事务、字段自动维护等逻辑已超出其能力边界。本篇推进到数据库函数(Database Function):把业务逻辑封装进数据库,前端通过 .rpc() 调用,由触发器自动响应数据变更。上一篇中,小张基于 Data API 完成了产品目录的建表与基础读写。但新需求随之而来:按分类统计产品数与价格区间、上架新品同时写产品表与定价表、产品修改后自动刷新更新时间。

华为云官方博客 338

如何使用RDS Supabase后端BaaS能力:创表即生成API(Database Data API)

认证、存储、实时推送、数据库API——4个后端模块,传统开发要数周。本系列逐个拆解,首篇聚焦数据库API(Database Data API):建表即得 API,无需手写后端。小张,AI创业公司的全栈工程师。老板让他做个产品目录页,展示产品与价格、支持上下架。传统做法要搭后端、写接口、配权限,工期少说1-2周;而在华为云RDS Supabase,建两张表、应用 SDK 直连,几分钟增删改查全跑通。

华为云官方博客 352

从一句话到一个能出去的链接,AI开发者空间做了什么

自行搭建的 Agent、正在使用的开源项目、团队既有的工具,都可以接入,可以通过AI创建或者手动搭建环境;华为云 AI开发者空间——面向开发者的云端一站式开发平台,做的就是把这段路接上:环境免安装,浏览器打开即为完整的 Linux 运行环境,预置的 AI 智能体开箱即用。第一个任务建议选能出结果的:做一个游戏、生成一个页面、创建一台实例,从需求走到可访问的链接,一次就能看清这个环境在做什么。沙箱是一个完整的 Linux 环境,依赖、服务、端口都是真实的,不是模拟。环境释放后,权限随之失效。

华为云官方博客 312

华为云码道配置自定义大模型,四种方式完整实操

案例介绍。

华为云官方博客 502

图数据库:实现穿透式监管的数据基座

穿透式监管标志着国企监管从“管企业”向“管资本”转型过程中的关键一跃。而图数据库正是这一跃的技术支点。从股权穿透到资金链穿透,从供应链穿透到数据穿透,华为GES图数据库正在将“穿透式监管”从理念变为可落地、可操作的实践。无论是天眼查式的全量链路查询,还是某集团财经的税务规则判断,抑或是芯片供应链式的部件风险分析,乃至通过Palantir构建决策知识图谱,其底层逻辑都是一致的——用图的力量,穿透一切形式的“隔离层”,直抵风险本质与责任核心。

华为云官方博客 597

《公共云三十问》正式收官,奔赴企业AI百场景新征程

今年6月底,公共云产业联盟重点推出《公共云三十问》专栏,以每周三问的节奏,连载十周,解读《先进公共云》白皮书,分享国计民生系列案例,旨在凝聚共识、推动落地实践。同时,专栏分析公共云在产业升级、民生福祉、科技创新、全球发展等方面的作用,梳理中国特色公共云发展路径:以普惠云拓展用云广度,以智算云提升用云深度,以自主云夯实用云厚度,以全球云打开用云跨度。这十问从专属云、行业云切入,深入政务、金融、交通、电力、钢铁、化工、油气、制造等国计民生场景,回答公共云“怎么用”。

华为云官方博客 431

开发者小技巧|IAM配置,让码道代码智能体连续30天免登录

案例介绍。

华为云官方博客 604

码道深度对接CodeArts,让需求自动落地为代码

案例介绍。

华为云官方博客 670

【公共云三十问 之三十】拥抱AI,企业如何建设面向智能体的专属云?

企业可分阶段建设覆盖开发、运行、运营及安全的一体化智能体平台——从构建一站式、高低码协同的智能体开发平台,到打造高性能、极致弹性的运行时环境,再到搭建AgentOps驱动的持续运营与运维体系,同时构建端到端、多层次的全链路安全防护体系。在数据湖建设方面,遵循“存量复用、平滑演进、AI导向、分步迭代”原则,分三阶段推进——打造AI多模数据湖核心能力、完成存算分离与统一元数据管理、实现闭环赋能全面支撑智能体规模化落地,在保护既有投资的前提下将传统数据平台转型为AI数据专属供给平台。

华为云官方博客 776

【公共云三十问 之二十九】国计民生之制造:制造云如何重塑数智时代的新质生产力?

平台打通软件交付的完整路径,覆盖需求管理、代码托管、代码检查、编译构建、制品仓库、部署、测试等关键环节,支持大模型能力融入研发全流程,实现从需求到交付的端到端管理。通过构建“研发一朵云”,方案打破地域与组织壁垒,实现跨团队协同开发,有效缩短软件交付周期,助力工业制造企业从“传统研发”走向“敏捷研发”,加速数智化转型进程。当制造云真正成为数据流通的平台、AI创新的底座,公共云的社会价值将从基础设施层向生产场景层持续延伸,为新型工业化建设和制造强国战略注入源源不断的动力,重塑数智时代的中国制造新质生产力。

华为云官方博客 758

告别重复手工迁仓,码道MCP+Skill实现仓库批量迁移

案例介绍。

华为云官方博客 740

【公共云三十问 之二十八】国计民生之油气:智算云如何叩响数智时代的“地心蓝金”?

西南油气田以“向地球深部要资源”为战略方向,联合以华为云Stack为代表的公共云服务商共同打造统一算力底座,建设西南区域数据湖与通用技术平台,构建“勘探开发工程技术、天然气生产过程管控、天然气产运储销”等三个一体化协同应用场景,支撑油气勘探、开发生产、管输储运等全业务链的数智化转型。当智算云真正成为数据流通的平台、AI创新的底座,油气田得以将算力效能、数据价值与智能技术深度融入勘探开发全链条,将“看不见的算力”转化为“摸得着的储量”,以智能化手段持续降低勘探风险、缩短发现周期、提高采收效率,确保生产安全。

华为云官方博客 592

【公共云三十问 之二十七】国计民生之化工:数智云如何重塑传统化工新范式?

在架构方面,方案构建云边协同的统一体系,涵盖AI协同、数据协同与运营协同三大维度——总部集中训练大模型,边缘节点负责推理执行,云边持续迭代,实现“边用边学”的智能闭环,模型平均精度提升20%以上。此外,方案提供一站式企业级工业物联网平台、数据湖与数据治理平台,覆盖工业数据分析“采、存、算、管、用”全流程,打通生产现场与管理系统间的数据壁垒,有效消除数据孤岛。层面,方案充分发挥软硬协同优势,实现计算、存储、网络与云平台的深度协同,训练线性度超95%,为大模型训练推理提供强劲算力支撑。▲化工“数智”新模式。

华为云官方博客 640

【公共云三十问 之二十六】国计民生之钢铁:数智云如何淬炼中国钢铁新力量?

同时,构建云边端协同的统一架构,支撑集团总部与各生产基地两级协同发展——总部集中训练大模型,边缘节点负责推理执行,云边持续迭代,实现训推一体化的资源调度与高效协同,为钢铁行业的数智化转型构建了坚实的算力底座。层面,方案构建覆盖“工业数采→边缘IT/OT融合→统一数据湖→数据治理平台→数据应用”全链路的一站式数据治理与流通平台,打通生产现场与管理系统间的数据壁垒,让数据“采得到、流得动、用得好”,加速数据价值从生产现场向经营决策层流动释放。湘潭钢铁集团的钢铁数智云,是钢铁工业智能云建设的标杆案例。

华为云官方博客 501

LakeWatch——MRS 智能运维Agent

从资源池、队列、作业等多个维度,对集群CPU与内存资源进行精细化分析与对比,直观呈现不同时间段的空闲、满载等使用状态,识别资源浪费,指导治理优化,为扩缩容决策提供数据支撑。对HDFS存储进行多维度深度分析(目录、用户、用户组等),涵盖使用量、增量、文件大小分布及数据热度等指标,帮助快速识别增长较快的目录、长期未访问的文件,统计目录文件数量与小文件占比,评估HDFS总存储量与扩缩容需求,为存储治理与资源规划提供全面数据支撑。Agent主动巡检,识别异常趋势并提前预警,让运维从"事后处理"转向"事前预防"。

华为云官方博客 480

华为云专题文档发布:丰富的AI案例、选型指导和概念解读

发布 “云服务选型”、“云计算概念”专题,提供云服务选型指导,助您选择匹配业务的云服务,解读云计算相关概念,开启云上学习之路。开发者工具和文档专区上线,提供从学习、实践到反馈的全链路支持。帮助中心新增100余篇AI案例。

华为云官方博客 272

一个人,也能用AI做点“星东西”

华为云星耀创想者大赛-2026华为云OPC创意大赛等你来~

华为云官方博客 269

从需求到可执行工作项:MCP+Skill 让智能体规划真正落地

回顾整个体验,以前让智能体帮我拆需求,它是洋洋洒洒给我列了一大篇 Markdown,看着挺像那么回事,但最后还是得我一条条往 CodeArts Req 里搬,搬完再手动挂父子关系、排日期,拆需求五分钟,搬运两小时。现在好了,MCP 给智能体接上了"手",Skill 给它装上了"项目经理的脑子",一句话下去,34 个工作项连带排期、层级关系全给我建好了,甘特图一拉,齐刷刷都在两周内,节省了多少工作量啊,美滋滋。本次实操在码道代码智能体基础上,构建了一套"需求→可执行工作项"的自动化规划方案。

华为云官方博客 528

华为云码道「码力续航计划」更新!

✅上新GLM‑5.3‑Flash,高速响应,代码生成、工程解析、Agent调试高效输出。新增GLM‑5.3‑Flash福利模型,每日解锁1000万免费Tokens。● 本次活动共发放总量价值100万元Tokens,发完即止!把耗算力的编码重活,交给华为云码道代码智能体🚀🚀。● 每日额度准时刷新,当日清零、次日满血重置。✅复杂算法、大项目解析、批量代码生成随便跑。✅不用抠额度、不用算消耗,放开调试大胆迭代。✅无需额外操作,登录即送,直接切换模型使用。● 把算力交给码道,让撸码不再内耗👏🏻。

华为云官方博客 616

【公共云三十问 之二十四】国计民生之交通:交通云如何铺就数智通衢新坦途?

交通行业作为支撑实体经济的关键基础设施,涵盖公路、铁路、机场、港口、地铁等众多子领域,其中,公路网络作为综合交通运输体系的基础骨架,承担着全国超过70%的客货运量,其数字化、智能化转型的需求尤为迫切。方面,提供Agent开发框架、知识库管理、RAG工程、意图识别、静态应用编排及模型评测等能力,支持客户将行业知识、业务流程与AI能力深度融合,快速构建面向收费稽核、路网调度、应急处置等场景的智能应用。开发并实现落地应用,全面覆盖建设、管理、养护、运营、服务、安全、办公七大业务领域。

华为云官方博客 443

【公共云三十问 之二十五】国计民生之电力:电力云如何点亮数智电力新引擎?

方案构建了覆盖数据获取、质量评估到标准化处理的全链路能力。基于公共云服务商智算底座及气象大模型,通过时空图神经网络重新建模产流机制,中国华电建成超50TB多源融合数据集,突破时空建模与机理融合等五大关键技术,短期径流预测精度较传统机理模型提升5个百分点以上,实现15天中期径流预测精度超85%,推理效率达秒级。基于气象大模型的基础架构与预训练能力,客户可直接在大模型之上开展增量训练与微调,充分利用场站所在区域的高精度历史数据(如3公里、1公里分辨率),针对不同场站和区域的地形地貌与气候特征进行模型调优。

华为云官方博客 366

邀请函|第三届“兴智杯”全国人工智能创新应用大赛开幕式,期待您现场莅临

AI 算法工程师、大模型应用开发、智能编码、国产软硬件栈开发者、开源开发者。大赛官方参赛对象就包含企事业单位开发者团队、个人开发者中华人民共...诉求:了解本届赛题方向、对接算力 / 技术资源、认识同行、获取参赛信息。意向参赛团队、往届参赛选手、技术团队负责人、个人独立开发者。

华为云官方博客 459

码道LSP:打通“最后一公里”,让AI真正懂你的项目

用AI代码智能体分析项目时,您是否遇到过这样的困境:查询方法调用链、字段改动影响范围,返回一堆杂乱文本,夹杂注释、日志、无关代码,需要人工逐一筛选复核。根源在于传统方案只会文本检索,大模型拿到的是原始源码文本,缺少代码语义信息。华为云码道CodeArts代码智能体接入LSP能力,尝试解决这个开发痛点。

华为云官方博客 528

【公共云三十问 之二十三】国计民生之金融:金融云如何开启数智金融新篇章?

然而,金融行业在上云之路上仍面临多重深层挑战。在AI应用方面,邮储银行基于“1+2+3”顶层设计,系统化构建了1套数据规范、2大数据集体系、3大核心平台,“邮智”大模型围绕经营营销、对客服务、风险管理、智慧运营以及智能办公等重点领域覆盖前、中、后台领域230多个智能应用场景。层面,方案在安全合规的基础上,依托全栈技术创新,充分发挥软硬协同优势,推动计算、存储、网络、操作系统与云平台深度协同,构建高可靠、高可用、高安全、高可维、高性能的云基础设施与数据库体系,为金融核心业务系统云化迁移提供坚实支撑。

华为云官方博客 502

【公共云三十问 之二十二】国计民生之政务:政务云如何成为数字政府的“数智底座”?

其中,华为云Stack作为核心支撑服务商,依托“数字广州创新实验室”,推出“智导政通”智能导办应用,以意图理解和文本生成为技术基础,将一体化大模型适配政务服务大厅、自助终端、移动端、PC端等多端入口,已完成超过2200项政务事项的优化,让政务服务从“一网通办”迈向“一网智办”。在运维运营领域,提供一体化运维能力。在数据要素领域,打造AI可信数据空间解决方案,通过“一湖一链一中枢”的三层架构,构筑“全域入湖、可信流通、AI好用”三大核心能力,帮助政务客户实现数据“供得出、流得动、用得好、保安全”。

华为云官方博客 505

终端也能AI原生开发|Hermes对接码道CLI,解锁Vibe Coding新体验

本文介绍如何通过Hermes工具集成华为云CodeArts代码智能体CLI,实现终端智能开发。内容包含:1)开通CodeArts代码智能体并安装CLI工具;2)配置Hermes环境;3)分析CodeArts CLI三大优势:统一入口、API实时透传、企业级IAM鉴权;4)实操演示通过Hermes调用CLI生成HTML贪吃蛇游戏;5)指导连接飞书实现多端协同开发。方案能有效解决开发工具碎片化、环境维护复杂等问题,提升研发效率。整个配置过程约45分钟,体验版免费使用。

华为云官方博客 329
上一篇: 云图说丨Astro Canvas一站式数据可视化开发,分钟级构建业务大屏
下一篇: 详解AQS的7个同步组件
华为云开发者联盟
华为云开发者联盟 企业官方账号 企业官方账号
博客等级 码龄10年 72万+粉丝 5981原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值