



# 如何在启智平台上进行模型训练 - GPU版本
- 启智集群单数据集的训练，启智集群多数据集的训练，智算集群的单数据集训练，这3个的训练使用方式不同，请注意区分：
  - 启智集群单数据集的训练示例请参考示例中[train.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/train.py)的代码注释
  - 启智集群多数据集的训练示例请参考示例中[train_for_multidataset.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/train_for_multidataset.py)的代码注释
  - 智算集群单数据集的训练示例请参考示例中[train_for_c2net.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/train_for_c2net.py)的代码注释

- 启智集群中单数据集和多数据集的区别在于使用方式不同：
	如本示例中单数据集MNISTDataset_torch.zip的使用方式是:数据集位于/dataset/下
	多数据集时MNISTDataset_torch.zip的使用方式是：数据集位于/dataset/MNISTDataset_torch/下

## 1 概述
- 本项目以#LeNet5-MNIST-PyTorch为例，简要介绍如何在启智AI协同平台上使用Pytorch完成训练任务，包括单数据集的训练，多数据集的训练，智算网络的训练，旨在为AI开发者提供启智训练示例。
- 用户可以直接使用本项目提供的数据集和代码文件创建自己的训练任务。

## 2 准备工作
- 启智平台使用准备，本项目需要用户创建启智平台账户，克隆代码到自己的账户，上传数据集，具体操作方法可以通过访问[OpenI_Learning](https://git.openi.org.cn/zeizei/OpenI_Learning)项目学习小白训练营系列课程进行学习。

### 2.1 数据准备
#### 数据集获取
- 如果你需要试运行本示例，则无需再次上传数据集，因为本示例中的数据集MnistDataset_torch.zip已经设置为公开数据集，可以直接引用,数据集也可从本项目的数据集目录中下载并查看数据结构，[MNISTDataset_torch.zip数据集下载](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/datasets?type=0),[mnist_epoch1_0.73.pkl.zip数据集下载](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/datasets?type=0)。
- 数据文件说明
	- MNISTData数据集是由10类28∗28的灰度图片组成，训练数据集包含60000张图片，测试数据集包含10000张图片。
  	- 数据集压缩包的目录结构如下：
		>		MNISTDataset_torch.zip
		>		├── test
		>       │     └── MNIST
		>       │           │── raw
		>       │           │    ├── t10k-images-idx3-ubyte
		>		│           │    └── t10k-labels-idx1-ubyte
		>  		│           │    ├── train-images-idx3-ubyte
  		>    	│	        │    └── train-labels-idx1-ubyte
		>       │           └── processed
		>  		│                ├── test.pt
		>    	│	             └── training.pt
		>		└── train
		>             └── MNIST
		>                   │── raw
		>                   │    ├── t10k-images-idx3-ubyte
		>		            │    └── t10k-labels-idx1-ubyte
		>  		            │    ├── train-images-idx3-ubyte
		>    		        │    └── train-labels-idx1-ubyte
		>                   └── processed
		>  		                 ├── test.pt
		>     	                 └── training.pt

		> 		mnist_epoch1_0.73.pkl.zip
		>  		├── mnist_epoch1_0.73.pkl

#### 数据集上传
使用GPU进行训练，需要在GPU芯片上运行，所以上传的数据集需要传到GPU界面。(此步骤在本示例中不需要，可直接选择公开数据集MNISTDataset_torch.zip)
### 2.2 执行脚本准备
#### 示例代码
- 示例代码可从本仓库中下载，[代码下载](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU)
- 代码文件说明
	- [train.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/train.py)，用于单数据集训练的脚本文件。具体说明请参考[train.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/train.py)
    - [train_for_multidataset.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/train_for_multidataset.py)，用于多数据集训练的脚本文件。具体说明请参考[train_for_multidataset.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/train_for_multidataset.py)
    - [train_for_c2net.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/train_for_c2net.py)，用于智算网络训练的脚本文件。具体说明请参考[train_for_c2net.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/train_for_c2net.py)
  
	- [model.py](https://git.openi.org.cn/OpenIOSSG/MNIST_PytorchExample_GPU/src/branch/master/model.py)，使用的训练网络，在单数据集训练，多数据集训练，智算网络训练中使用到。

## 3 创建训练任务
准备好数据和执行脚本以后，需要创建训练任务将Pytorch脚本运行。首次使用的用户可参考本示例代码。
### 训练界面示例
由于A100的适配性问题，A100需要使用cuda11以上的cuda版本，目前平台已提供基于A100的cuda基础镜像，只需要选择对应的公共镜像：
![avatar](Example_picture/适用A100的基础镜像.png)
训练界面参数参考如下：
![avatar](Example_picture/基础镜像.png)


表1 创建训练作业界面参数说明

| 参数名称             | 说明        |
| ----------------- | ----------- |
| 计算资源              |  选择CPU/GPU |
| 代码分支              |  选择仓库代码中要使用的代码分支，默认可选择master分支 |
| 镜像                 |  镜像选择已在调试环境中调试好的镜像，目前版本请选择基础镜像：平台提供基于A100的cuda基础镜像，如dockerhub.pcl.ac.cn:5000/user-images/openi:cuda111_python37_pytorch191|
| 启动文件              |  启动文件选择代码目录下的启动脚本train.py  |
| 数据集                 |  数据集选择已上传到启智平台的公共数据集MnistDataset_torch.zip |
| 运行参数              |  增加运行参数可以向脚本中其他参数传值，如epoch_size |
| 资源规格                 |  规格选择含有GPU个数的规格|

## 4 查看运行结果
### 4.1 在训练作业界面可以查看运行日志
目前训练任务的日志只能在代码中print输出，参考示例train.py代码相关print
### 4.2 训练结束后可以下载模型文件
![avatar](Example_picture/结果下载.png)

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