华为最新开源框架mindspore学习

最近的项目用到了mindspore框架,关于如何手把手在自己电脑上运行一个完整的例子,大家可以去官网中的教程中查看:https://www.mindspore.cn/tutorial/training/zh-CN/master/quick_start/quick_start.html

你也可以直接跳过基础版,使用进阶版,如何利用华为载有Ascend(昇腾910,华为自研的人工智能芯片)的服务器上运行代码,大家按照这个例子来:https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/use_on_the_cloud.html#ai

这里有几个问题需要大家注意一下:

1.如何创建OBS桶;

2.如何创建训练任务;

3.深入认识--data_url和--train_url这两个参数,这两个参数需要你在自己的代码中进行一个重写,即你加载的数据集以及训练的输出是需要在代码中给出参数的,不必赋值(赋值在创建训练任务的的时候自动进行),写出即可:

例:

//-----------------------------------------------------------------------------------------------------//

下面是我在项目过程中遇到的一些问题和相应的解决方法:

1.最开始,我是参照这个链接来运行(这是另一种使用服务器的方法,即不用在线创建训练作业)的,教你如何在Pycharm上使用相关toolkit使用modelarts(即华为的服务器平台),但是我忽略了一点

扫描二维码关注公众号,回复: 12646875 查看本文章

,这个例子中使用的深度学习框架是MXNet,我仿照他的方式对我使用mindspore框架的源码进行修改,最关键的部分就是参考它是如何将 数据集路径 加载进来的,仿照他的方式改好后,产生了第一个令我头大的问题:

ValueError: The folder s3://modelarts-zjw/Mnist_data/train/ does not exist or permission denied!,即我的路径是不存在的或者没有访问权限,我分别再代码里添加了
1.os.file.exist(path),来检验是否存在,输出True
2.os.access(path,R_OK),检验是否有权限读取,输出False
事实证明,问题出现在了这里,这个问题我尝试解决了很久,但没有能够解决,因为是mindspore的源码报错,后来官方给的说法是,使用Pycharm这种方法确实不行,原因大概是,服务器在执行时,会在服务器本地创建一个桶的虚拟映射(类似缓存),进而达到访问桶中数据的目的,通过在网页上创建训练任务可以完成这种映射,但是在pycharm上不可以,目前只在使用mindspore框架时遇到了这种问题。所以建议大家不要用pycharm,还是直接在网页上创建训练任务比较靠谱。

//------------------------------------------------------------------------------------------------------//

1.自定义 callback 类

我们可以理解为回调函数,正是通过这种回调函数可以实现我们对训练过程中的参数进行打印,举个例子:
 

class EvalCallBack(Callback):
    def __init__(self, batch_size):
        super(EvalCallBack, self).__init__()
        self.batch_size = batch_size
        self.last_step = 0
        self.epoch_begin_time = 0

    def step_begin(self, run_context):
        self.step_begin_time = time.time() #在每一个step开始时,获取当前时间

    def step_end(self, run_context):
        step_time = time.time() - self.step_begin_time #在每一个step结束时,计算每个step花费的时间
        print(f'step time: {step_time}')

    def epoch_begin(self, run_context):
        self.epoch_begin_time = time.time() #在每一个epoch开始时,获取当前时间

    def epoch_end(self, run_context):
        params = run_context.original_args()
        cost_time = time.time() - self.epoch_begin_time
        train_steps = params.cur_step_num -self.last_step #获取epoch结束时一共经过了多少个step
        print("----")
        print(f'epoch {params.cur_epoch_num} cost time = {cost_time}, train step num: {train_steps}, '
              f'one step time: {1000*cost_time/train_steps} ms, '
              )
        self.last_step = run_context.original_args().cur_step_num

这里值得注意的是:step_num = len(dataset) // batch_size 

还有loss,也可以通过回调来进行打印

loss = LossMoniter()

这样就可以实现每一个step结束后,打印这个step的loss值

def epoch_end(self, run_context):
        params = run_context.original_args()
        cost_time = time.time() - self.epoch_begin_time
        loss = params.net_outputs
        train_steps = params.cur_step_num -self.last_step #获取epoch结束时一共经过了多少个step
        print("----")
        print(f'epoch {params.cur_epoch_num} cost time = {cost_time}, train step num: {train_steps}, '
              f'one step time: {1000*cost_time/train_steps} ms, '
              f'loss: {loss}' 
              )
        self.last_step = run_context.original_args().cur_step_num

2.自定义保存ckpt文件和计算图

#这里解释一下这两个参数, 1.save_checkpoint_steps:每xx个step保存一次ckpt文件
2.keep_checkpoint_max:最多保存多少个ckpt文件,从最后一个算起,最先保存的会被删掉

config_ck = CheckpointConfig(save_checkpoint_steps = 900, keep_checkpoint_max = 10)

#1.prefix:ckpt文件的名称
#2.directory:模型保存的位置,我们又见到了train_url这个参数
#3.config_ck:配置方式

ckpoint_cb = ModelCheckpoint(prefix = "checkpoint_lenet", directory=args.train_url, config = config_ck)
    

这里又有一个小问题,就是,我发现即使我的路径是完全没得问题的,但是当模型运行结束后,我去查看我桶中特定的路径,并没有发现保存的文件。于是我就采用了这样的方式

import mox
mox.file.shift('os', 'mox')#将原有的os文件操作替换为mox,(如果需要)

print(f'Start save model')
local_checkpoint_path = './cache/model_path' #在服务器上设置一个文件夹,用来暂时保存模型
config_ck = CheckpointConfig(save_checkpoint_steps = 900, keep_checkpoint_max = 10)
ckpoint_cb = ModelCheckpoint(prefix = "checkpoint_lenet", directory=local_checkpoint_path, config = config_ck)#注意这里将模型先保存在服务器中的文件夹
mox.file.copy_parallel(src_url=local_checkpoint_path, dst_url=args.train_url)#再将服务器文件
夹里的文件copy到桶里的文件夹

注意:

  • MoXing是华为云ModelArts团队自研的分布式训练加速框架,它构建于开源的深度学习引擎TensorFlow、MXNet、PyTorch、Keras之上。 相对于TensorFlow和MXNet原生API而言,MoXing API让模型代码的编写更加简单,允许用户只需要关心数据输入(input_fn)和模型构建(model_fn)的代码,即可实现任意模型在多GPU和分布式下的高性能运行,降低了TensorFlow和MXNet的使用门槛。另外,MoXing-TensorFlow还将支持自动超参选择和自动模型结构搜索,用户无需关心超参和模型结构,做到模型全自动学习。学习链接:https://github.com/huaweicloud/ModelArts-Lab/tree/master/docs/moxing_api_doc

猜你喜欢

转载自blog.csdn.net/qq_41368074/article/details/109790513