框架互换,全程无忧!|昇思MindSpore第三方框架迁移使用FAQ

Q1: 请问想加载PyTorch预训练好的模型用于MindSpore模型finetune有什么方法?

A1: 需要把PyTorch和MindSpore的参数进行一一对应,因为网络定义的灵活性,所以没办法提供统一的转化脚本。

一般情况下,CheckPoint文件中保存的就是参数名和参数值,调用相应框架的读取接口后,获取到参数名和数值后,按照MindSpore格式,构建出对象,就可以直接调用MindSpore接口保存成MindSpore格式的CheckPoint文件了。

其中主要的工作量为对比不同框架间的parameter名称,做到两个框架的网络中所有parameter name一一对应(可以使用一个map进行映射),下面代码的逻辑转化parameter格式,不包括对应parameter name。

import torchimport mindspore as ms

def pytorch2mindspore(default_file = 'torch_resnet.pth'):

    # read pth file

    par_dict = torch.load(default_file)['state_dict']

    params_list = []

    for name in par_dict:

        param_dict = {}

        parameter = par_dict[name]

        param_dict['name'] = name

        param_dict['data'] = ms.Tensor(parameter.numpy())

        params_list.append(param_dict)

    ms.save_checkpoint(params_list,  'ms_resnet.ckpt')

Q2: 怎么将PyTorch的dataset转换成MindSpore的dataset

A2: MindSpore和PyTorch的自定义数据集逻辑是比较类似的,需要用户先定义一个自己的dataset类,该类负责定义__init__,__getitem__,__len__来读取自己的数据集,然后将该类实例化为一个对象(如: dataset/dataset_generator),最后将这个实例化对象传入GeneratorDataset(mindspore用法)/DataLoader(pytorch用法),至此即可以完成自定义数据集加载了。而MindSpore在GeneratorDataset的基础上提供了进一步的map->batch操作,可以很方便的让用户在map内添加一些其他的自定义操作,并将其batch起来。 对应的MindSpore的自定义数据集加载如下:

# 1 Data enhancement,shuffle,sampler.class Mydata:

    def __init__(self):

        np.random.seed(58)

        self.__data = np.random.sample((5, 2))

        self.__label = np.random.sample((5, 1))

    def __getitem__(self, index):

        return (self.__data[index], self.__label[index])

    def __len__(self):

        return len(self.__data)dataset_generator = Mydata()dataset = ds.GeneratorDataset(dataset_generator, ["data", "label"], shuffle=False)# 2 Customized data enhancementdataset = dataset.map(operations=pyFunc, {other_params})# 3 batchdataset = dataset.batch(batch_size, drop_remainder=True)

Q3: 其他框架的脚本或者模型怎么迁移到MindSpore?

A3: 关于脚本或者模型迁移,可以查询MindSpore官网中关于迁移指南的介绍。

Q4: MindConverter转换TensorFlow脚本报错提示terminate called after throwing an instance of 'std::system_error', what(): Resource temporarily unavailable, Aborted (core dumped)

A4: 该问题由TensorFlow导致。脚本转换时,需要通过TensorFlow库加载TensorFlow的模型文件,此时TensorFlow会申请相关资源进行初始化,若申请资源失败(可能由于系统进程数超过Linux最大进程数限制),TensorFlow C/C++层会出现Core Dumped问题。详细信息请参考TensorFlow官方ISSUE,如下ISSUE仅供参考: TF ISSUE 14885TF ISSUE 37449

Q5: MindConverter是否可以在ARM平台运行?

A5: MindConverter同时支持X86、ARM平台,若在ARM平台运行需要用户自行安装模型所需的依赖包和运行环境。

Q6: 为什么使用MindConverter进行模型转换需要很长时间(超过十分钟),而模型并不大?

A6: MindConverter进行转换时,需要使用Protobuf对模型文件进行反序列化,请确保Python环境中安装的Protobuf采用C++后端实现,检查方法如下,若输出为Python,则需要安装采用C++实现的Python Protobuf(下载Protobuf源码并进入源码中的python子目录,使用python setup.py install –cpp_implementation进行安装);若输出为cpp,转换过程仍耗时较长,请在转换前使用添加环境变量export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp。

from google.protobuf.internal import api_implementation

print(api_implementation.Type())

Q7: 使用.pb文件进行转换时,已确定model_fileshapeinput_nodesoutput_nodes均无误,并且环境中的依赖库已经正常安装,但是仍然报异常代码1000001,可能是什么原因?

A7: 请检查生成该.pb文件所使用的TensorFlow版本不高于用于转换时安装的TensorFlow版本,避免由于旧版本TensorFlow无法解析新版本生成的.pb文件,而导致的模型文件解析失败。

Q8: 出现报错信息[ERROR] MINDCONVERTER: [BaseConverterError] code: 0000000, msg: {python_home}/lib/libgomp.so.1: cannot allocate memory in static TLS block时,应该怎么处理?

A8: 该问题通常是由于环境变量导入不正确导致的。建议用户设置export LD_PRELOAD={python_home}/lib/libgomp.so.1.0.0这一环境变量,然后重新尝试进行转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值