MNIST_Example/README.md

7.8 KiB
Raw Permalink Blame History

如何在启智平台上进行模型训练 - NPU版本

1. 启智集群NPU训练任务的超参数及使用方法

请将示例代码中openi.py拷贝到自己仓库

  1. 关于超参数:

    --multi_data_url  选择的单数据集或多数据集的obs路径
    --pretrain_url    选择的单模型或多模型文件的obs路径
    --train_url       训练结果回传到启智平台的obs路径
    obs路径可以理解为云上的存储路径
    
  2. 在代码中定义:

    parser.add_argument('--multi_data_url',
                        help='使用单数据集或多数据集时,需要定义的参数',
                        default= '[{}]')  
    
    parser.add_argument('--pretrain_url',
                    help='使用单模型或多模型时,需要定义的参数',
                    default=  '[{}]')   
    
    parser.add_argument('--train_url',
                        help='回传结果到启智,需要定义的参数',
                        default= '')  
    
  3. 在代码中使用:

    from openi import openi_multidataset_to_env as DatasetToEnv
    from openi import pretrain_to_env
    from openi import env_to_openi
    if __name__ == "__main__":
        data_dir = '/cache/data'  
        train_dir = '/cache/output'
        pretrain_dir = '/cache/pretrain'
    
        if not os.path.exists(data_dir):
            os.makedirs(data_dir)  
        if not os.path.exists(train_dir):
            os.makedirs(train_dir)
        if not os.path.exists(pretrain_dir):
            os.makedirs(pretrain_dir)
    
        ###拷贝云上的数据集到训练镜像
        DatasetToEnv(args.multi_data_url, data_dir)
        ###拷贝云上的预训练模型文件到训练环境
        pretrain_to_env(args.pretrain_url, pretrain_dir)
        ###上传训练结果到启智平台   
        env_to_openi(train_dir,args.train_url)
    
  4. 在代码中数据集的使用方式data_dir + 数据集名称

    ds_train = create_dataset_parallel(os.path.join(data_dir + "/MNISTData", "train"),  cfg.batch_size)
    
  5. 在代码中预训练模型文件的使用方式pretrain_dir + 模型文件名称

    load_param_into_net(network, load_checkpoint(os.path.join(pretrain_dir, "checkpoint_lenet-1_1875.ckpt")))
    
  6. 在代码中回传结果:

    env_to_openi(train_dir,args.train_url)
    

2. 智算集群NPU训练任务的超参数及使用方法

  1. 关于超参数:

    --multi_data_url  选择的单数据集或多数据集的obs路径
    --pretrain_url    选择的单模型或多模型的obs路径
    /cache/output       训练结果回传到启智平台的镜像内路径
    obs路径可以理解为云上的存储路径
    
  2. 在代码中定义:

    parser.add_argument('--multi_data_url',
                        help='使用单数据集或多数据集时,需要定义的参数',
                        default= '[{}]')  
    
    parser.add_argument('--pretrain_url',
                    help='使用预训练单模型或多模型时,需要定义的参数',
                    default=  '[{}]')   
    
  3. 在代码中使用:

    from openi import c2net_multidataset_to_env as DatasetToEnv
    from openi import pretrain_to_env
    if __name__ == "__main__":
        data_dir = '/cache/data'  
        train_dir = '/cache/output'
        pretrain_dir = '/cache/pretrain'
    
        if not os.path.exists(data_dir):
            os.makedirs(data_dir)  
        if not os.path.exists(train_dir):
            os.makedirs(train_dir)
        if not os.path.exists(pretrain_dir):
            os.makedirs(pretrain_dir)
    
        ###拷贝云上的数据集到训练镜像
        DatasetToEnv(args.multi_data_url, data_dir)
        ###拷贝云上的预训练模型文件到训练环境
        pretrain_to_env(args.pretrain_url, pretrain_dir)
        ###上传训练结果到启智平台   
        outputDirectory = train_dir 
    
  4. 在代码中数据集的使用方式data_dir + 数据集名称

    ds_train = create_dataset_parallel(os.path.join(data_dir + "/MNISTData", "train"),  cfg.batch_size)
    
  5. 在代码中预训练模型文件的使用方式pretrain_dir + 模型文件名称

    load_param_into_net(network, load_checkpoint(os.path.join(pretrain_dir, "checkpoint_lenet-1_1875.ckpt")))
    
  6. 在代码中回传结果:

    #需要将结果输出到/cache/output文件夹下才能在启智平台下载结果
    train_dir = '/cache/output' 
    outputDirectory = train_dir 
    

3.启智集群和智算集群的NPU训练样例

启智集群的示例代码:
  • 启智集群训练示例请参考示例中train.py的代码注释
  • 启智集群加载模型的训练示例请参考示例中 pretrain.py的代码注释
  • 启智集群的推理示例请参考示例中inference.py的代码注释
  • 启智集群训练任务已经将ImageNet-1k数据集挂载到训练镜像具体使用方法请参考示例中read_imagenet.py的代码注释
  • 继续训练功能示例代码请参考启智集群train_continue.py ,启智与智算的用法相同
智算集群的示例代码:

4.创建NPU训练示例任务界面教程

5.FAQ

5.1 关于启智平台公共库函数openi.py

基于启智集群和智算集群训练的所有共用函数都放在openi.py里将openi.py文件拷贝到自己的仓库里就可直接调用

主要使用的方法有以下几个:

openi_multidataset_to_env  启智集群任务将数据集拷贝到训练镜像
c2net_multidataset_to_env  智算集群任务将数据集拷贝到训练镜像
pretrain_to_env            将预训练模型文件拷贝到训练镜像
env_to_openi               将训练镜像的输出结果拷贝回启智平台
obs_copy_file              通过mox拷贝文件
obs_copy_folder 	   通过mox拷贝文件夹

5.2. 如何进行集群间代码迁移

两个集群间的代码迁移只需要改动数据集部分和上传训练结果部分,其他的使用方式一样

例如迁移启智的代码到智算时,只需要在导入包函数时,替换 openi_multidataset_to_env c2net_multidataset_to_env,并去掉相关的上传结果代码即 env_to_openi

5.3. 训练环境与调试环境区别:

当在调试环境下调试好代码后,需要参照训练环境的示例进行配置,才能创建训练任务

若想要使用调试环境的多卡并行训练,可参考示例调试环境多卡并行示例

5.4. 解决参数报错问题:

请在代码中加入 args, unknown = parser.parse_known_args(),可忽略掉 --ckpt_url--data_url等参数报错问题

5.5. 多卡训练任务如何只让数据集只拷贝一次

使用缓存文件和local_rank%8作为判断若第0卡拷贝完成则其它卡不拷贝并在第0卡拷贝数据完成后才执行之后的代码

if local_rank%8==0:
    DatasetToEnv(args.multi_data_url,data_dir)
    #Set a cache file to determine whether the data has been copied to obs. 
    #If this file exists during multi-card training, there is no need to copy the dataset multiple times.
    f = open("/cache/download_input.txt", 'w')  
    f.close()
    try:
        if os.path.exists("/cache/download_input.txt"):
            print("download_input succeed")
    except Exception as e:
        print("download_input failed")
while not os.path.exists("/cache/download_input.txt"):
    time.sleep(1) 

对于示例代码有任何问题欢迎在本项目中提issue。