MNIST_Example/README.md

228 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 如何在启智平台上进行模型训练 - NPU版本
## 1.启智集群和智算集群的NPU训练样例
###### 启智集群的示例代码:
- 启智集群训练示例请参考示例中[train.py](./train.py)的代码注释
- 启智集群**加载模型**的训练示例请参考示例中 [pretrain.py](./pretrain.py)的代码注释
- 启智集群的推理示例请参考示例中[inference.py](./inference.py)的代码注释
- 启智集群训练任务已经将ImageNet-1k数据集挂载到训练镜像具体使用方法请参考示例中[read_imagenet.py](./read_imagenet.py)的代码注释
- 继续训练功能示例代码请参考启智集群[train_continue.py](./train_continue.py) ,启智与智算的用法相同
###### 智算集群的示例代码:
- 智算网络集群训练示例请参考示例中[train_for_c2net.py](./train_for_c2net.py)的代码注释
- 智算网络集群**加载模型**的训练示例请参考示例中[pretrain_for_c2net.py](./pretrain_for_c2net.py)的代码注释
## 2. 启智集群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)
```
## **3. 智算集群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
```
## 4.[创建NPU训练示例任务界面教程](./Example_Picture/快速创建NPU训练任务.md)
## 5.FAQ
### 5.1 关于启智平台公共库函数[openi.py](./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.3.1. 调试环境如何下载数据集和预训练模型文件
使用方法:
```
import moxing as mox
mox.file.copy("s3url", "your_local_file_path")
```
使用示例:假如在详情页中数据集的路径是 `s3:///urchincache/attachment/e/0/e027fb4c-2706-4212-8e6f-a875c489c1da/MNISTData.zip`
你在notebook中的路径是`/home/ma-user/work`
则可以使用下面的方法将数据集拷贝到调试环境内:
```
import moxing as mox
mox.file.copy("s3:///urchincache/attachment/e/0/e027fb4c-2706-4212-8e6f-a875c489c1da/MNISTData.zip", "/home/ma-user/work/MNISTData.zip")
```
##### 5.3.2. 调试环境与训练环境之间的代码迁移
当在调试环境下调试好代码后,需要参照训练环境的示例进行配置,才能创建训练任务
若想要使用调试环境的多卡并行训练,可参考示例[调试环境多卡并行示例](https://git.openi.org.cn/OpenIOSSG/MNIST_Example_NPU_Debug)
### 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。