235 lines
9.0 KiB
Markdown
235 lines
9.0 KiB
Markdown
# 此仓库不再维护
|
||
|
||
|
||
# 如何在启智平台上进行模型训练 - NPU版本
|
||
请将示例代码中openi.py拷贝到自己仓库
|
||
|
||
## 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路径
|
||
--model_url 可选,训练结果回传到启智平台的obs路径,否则请将输出设置为/cache/output文件夹
|
||
obs路径可以理解为云上的存储路径
|
||
```
|
||
2. 在代码中定义:
|
||
|
||
```
|
||
parser.add_argument('--multi_data_url',
|
||
help='使用单数据集或多数据集时,需要定义的参数',
|
||
default= '[{}]')
|
||
|
||
parser.add_argument('--pretrain_url',
|
||
help='非必选,只有在界面上选择模型时才需要,使用预训练单模型或多模型时,需要定义的参数',
|
||
default= '[{}]')
|
||
parser.add_argument('--model_url',
|
||
help='使用智算集群回传结果到启智,需要定义的参数',
|
||
default= '')
|
||
```
|
||
3. 在代码中使用:
|
||
|
||
```
|
||
from openi import c2net_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.model_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.model_url)
|
||
或是将输出文件夹设置为/cache/output
|
||
```
|
||
|
||
## 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. 如何进行集群间代码迁移**
|
||
|
||
两个集群间的代码迁移只需要改动数据集部分和上传训练结果部分,注意智算集群的上传超参数是train_url,智算集群是model_url
|
||
|
||
例如迁移启智的代码到智算时,只需要在导入包函数时,替换 `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。
|