Skip to content

thu-pacman/AIPerf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

4dc060a · Nov 2, 2023

History

44 Commits
Oct 26, 2023
Oct 26, 2023
Nov 2, 2023
Oct 26, 2023
Oct 26, 2023
Oct 26, 2023
Nov 22, 2021
May 11, 2022
Nov 22, 2021
Nov 22, 2021
Oct 31, 2023
Nov 23, 2022
Oct 14, 2022
Nov 22, 2021
Nov 22, 2021
Nov 22, 2021
Nov 22, 2021
Mar 7, 2023
Nov 14, 2022
Oct 14, 2022

Repository files navigation

开发单位:清华大学(THU),鹏城实验室(PCL)

特别感谢国防科技大学窦勇老师及其团队的宝贵意见和支持

AIPerf Benchmark v1.0

Benchmark结构设计

关于AIPerf设计理念,技术细节,以及测试结果,请参考论文:https://arxiv.org/abs/2008.07141

AIPerf Benchmark基于微软NNI开源框架,以自动化机器学习(AutoML)为负载,使用network morphism进行网络结构搜索和TPE进行超参搜索。

部署 AIPerf

0. 支持环境

  • cuda driver <= 11.8

    由于tensorflow对高版本cuda driver支持的问题等,目前AIPerf无法在更高版本cuda driver下正常运行,需集群管理员自行降低版本

1. 环境NFS准备

AIPerf代码等文件必须放置在共享存储下,能被所有计算节点访问到

具体如何配置NFS请自行查阅资料或者联系集群管理员

2. 数据集准备

数据集下载

Imagenet官方地址:http://www.image-net.org/index

官方提供四种数据集: Flowers、CIFAR-10、MNIST、ImageNet-2012 前三个数据集数据量小,直接调用相关脚本自动会完成下载、转换(TFRecord格式)的过程,在 /userhome/AIPerf/scripts/build_data目录下执行以下脚本:

cd  /userhome/AIPerf/scripts/build_data
./download_imagenet.sh

原始的ImageNet-2012下载到当前的imagenet目录并包含以下两个文件:

  • ILSVRC2012_img_val.tar
  • ILSVRC2012_img_train.tar

TFReord制作

训练集和验证集需要按照1000个子目录下包含图片的格式,处理步骤:

  1. 将train 和 val 的数据按照文件夹分类
  2. 指定参数运行build_imagenet_data.py

可以按照以下步骤执行: 假设数据存放在/userhome/AIPerf/scripts/build_data/imagenet目录下,TFRecord文件的输出目录是/userhome/AIPerf/scripts/build_data/ILSVRC2012/output

# 做验证集
cd  /userhome/AIPerf/scripts/build_data
mkdir -p ILSVRC2012/raw-data/imagenet-data/validation/  
tar -xvf imagenet/ILSVRC2012_img_val.tar -C ILSVRC2012/raw-data/imagenet-data/validation/
python preprocess_imagenet_validation_data.py ILSVRC2012/raw-data/imagenet-data/validation/ imagenet_2012_validation_synset_labels.txt

# 做训练集
mkdir -p ILSVRC2012/raw-data/imagenet-data/train/
tar -xvf imagenet/ILSVRC2012_img_train.tar -C ILSVRC2012/raw-data/imagenet-data/train/ && cd ILSVRC2012/raw-data/imagenet-data/train
find . -name "*.tar" | while read NAE ; do mkdir -p "${NAE%.tar}"; tar -xvf "${NAE}" -C "${NAE%.tar}"; rm -f "${NAE}"; done
cd -

# 请注意 如果您使用的框架非TensorFlow 则不需要下面制作TFRecord的步骤!
# 执行转换
mkdir -p ILSVRC2012/output
python build_imagenet_data.py --train_directory=ILSVRC2012/raw-data/imagenet-data/train --validation_directory=ILSVRC2012/raw-data/imagenet-data/validation --output_directory=ILSVRC2012/output --imagenet_metadata_file=imagenet_metadata.txt --labels_file=imagenet_lsvrc_2015_synsets.txt

对TensorFlow 上面步骤执行完后,路径ILSVRC2012/output包含128个validation开头的验证集文件和1024个train开头的训练集文件。需要分别将验证集和数据集移动到slave节点的物理机上

mkdir -p /root/datasets/imagenet/train
mkdir -p /root/datasets/imagenet/val
mv ILSVRC2012/output/train-* /root/datasets/imagenet/train
mv ILSVRC2012/output/validation-* /root/datasets/imagenet/val

对其他模型,分别将解压后验证集和数据集移动到slave节点的物理机上,这一部分可以根据框架需求自行调整

# 对 PyTorch
mkdir -p /root/datasets/imagenet/
mv ILSVRC2012/train /root/datasets/imagenet
mv ILSVRC2012/val /root/datasets/imagenet

为了使读数据不成为训练瓶颈,有条件的集群最好能够将数据放在每台机器的本地存储(而不是共享存储)并在训练时从本地存储读数据

3. 项目安装

重要的环境变量声明

# 假设共享存储目录为/share/
export AIPERF_WORKDIR=/share/aiperf_workspace
export AIPERF_SLAVE_WORKDIR=/root/
export AIPERF_MASTER_IP=10.0.1.100
export AIPERF_MASTER_PORT=9987
  • AIPERF_WORKDIR

    AIPerf工作目录,必须在共享存储上,能被所有节点访问到

    AIPerf代码,部分log文件等将会被放到这个目录

  • AIPERF_SLAVE_WORKDIR

    计算节点工作目录,不需要在共享存储上(也可以放在共享存储)

    部分计算节点log文件将会被生成到这个目录下

  • AIPERF_MASTER_IP

    AIPerf调度服务IP,即控制节点IP

  • AIPERF_MASTER_PORT

    AIPerf调度服务端口

在共享存储上创建AIPerf工作目录

mkdir -p $AIPERF_WORKDIR

下载AIPerf到AIPerf工作目录

git clone https://github.com/thu-pacman/AIPerf.git $AIPERF_WORKDIR/AIPerf
  • AIPerf目录下有aiperf_setenv.sh文件,可以通过这个来统一设置环境变量

    # 设置aiperf_setenv.sh里的环境变量
    # 使用环境变量
    source $AIPERF_WORKDIR/AIPerf/aiperf_setenv.sh

安装项目依赖

安装CUDA与cuDNN

结合集群情况自行安装在计算节点

  • 请确保CUDA版本,cuDNN版本和计算框架的一致性,对于tensorflow计算框架,可参考官方文档
配置python依赖

对于控制节点安装依赖

python3 -m pip install -r $AIPERF_WORKDIR/AIPerf/requirements_master.txt

对于所有计算节点安装依赖

python3 -m pip install -r $AIPERF_WORKDIR/AIPerf/requirements_slave.txt
# 根据CUDA版本,cuDNN版本选择计算框架版本,例如对于CUDA 11.2,cuDNN 8.1,可选择tensorflow 2.5.0
python3 -m pip install tensorflow==2.5.0
  • 请确保CUDA版本,cuDNN版本和计算框架的一致性,对于tensorflow计算框架,可参考官方文档

安装AIPerf

编译安装

控制节点所有计算节点安装AutoML组件

cd $AIPERF_WORKDIR/AIPerf/src/sdk/pynni/
python3 -m pip install -e .

控制节点安装aiperf控制组件

cd $AIPERF_WORKDIR/AIPerf/src/aiperf_manager/
python3 -m pip install -e .

检查aiperf安装

执行

aiperf --help

正常打印帮助信息表示安装成功

下载模型权重

将权重文件resnet50_weights_tf_dim_ordering_tf_kernels.h5下载并放到$AIPERF_WORKDIR

mv resnet50_weights_tf_dim_ordering_tf_kernels.h5 $AIPERF_WORKDIR
(确认md5sum结果为a7b3fe01876f51b976af0dea6bc144eb)

4. 启动测试(命令都在控制节点执行)

启动调度服务

配置计算节点信息

进入 ${AIPERF_WORKDIR}/AIPerf/aiperf_ctrl配置 servers.json ,每张计算卡的描述包括ipCUDA_VISIBLE_DEVICES两部分,应保证servers.json的list的长度恰好等于等待测试的计算节点总数

例如,若该集群有2个节点,每个节点有4张卡,则编写如下

[
    {
        "ip": "172.23.33.33",
        "tag": "",
        "status": "waiting",
        "CUDA_VISIBLE_DEVICES": "0,1,2,3"
    },
    {
        "ip": "172.23.33.34",
        "tag": "",
        "status": "waiting",
        "CUDA_VISIBLE_DEVICES": "0,1,2,3"
    }   
]

配置计算节点初始化环境

请修改${AIPERF_WORKDIR}/AIPerf/aiperf_ctrl/server_env_init.sh以适配计算节点的环境加载

例如,若计算节点需加载spack环境,并用spack load加载cuda/cudnn环境,则编写如下

# 计算节点环境加载 根据计算节点实际环境编写
. /share/aiperf_workspace/spack/share/spack/setup-env.sh
spack config add modules:prefix_inspections:lib64:[LD_LIBRARY_PATH]
spack config add modules:prefix_inspections:lib:[LD_LIBRARY_PATH]

spack load python
spack load [email protected]
spack load [email protected]

调度服务启动

cd $AIPERF_WORKDIR/AIPerf/aiperf_ctrl
python3 manage.py runserver ${AIPERF_MASTER_IP}:${AIPERF_MASTER_PORT}

保持该服务一直运行

启动AIPerf测试

启动实验

为了使结果有效,测试满足的基本条件是:

  1. 测试运行时间应不少于1小时;
  2. 测试的计算精度不低于FP-16;
  3. 测试完成时所取得的最高正确率应大于70%;

初始化配置

(以下操作均在控制节点进行) 根据需求修改${AIPERF_WORKDIR}/AIPerf/examples/trials/network_morphism/imagenet/config.yml配置

可选参数 说明 默认值
1 trialConcurrency 同时运行的trial数 1
2 maxExecDuration 设置测试时间(单位 :h) 12
3 CUDA_VISIBLE_DEVICES 指定测试程序可用的gpu索引 0,1,2,3,4,5,6,7
4 srun:--cpus-per-task=30 参数为slurm可用cpu核数减 1 30
5 --slave 跟 trialConcurrency参数保持一致 1
6 --ip master节点ip,直接使用默认值 ${AIPERF_MASTER_IP}
7 --batch_size batch size 448
8 --epochs 正常训练epoch数 60
9 --initial_lr 初始学习率 1e-1
10 --final_lr 最终学习率 0
11 --train_data_dir 训练数据集路径 None
12 --val_data_dir 验证数据集路径 None
13 --warmup_1 warm up机制第一轮epoch数 15
14 --warmup_2 warm up机制第二轮epoch数 30
15 --warmup_3 warm up机制第三轮epoch数 45
16 --num_parallel_calls tfrecord数据加载加速 48

可参照如下配置(注意要修改数据集位置):

authorName: default
experimentName: example_imagenet-network-morphism-test
trialConcurrency: 2
maxExecDuration: 24h
maxTrialNum: 9999
trainingServicePlatform: local
useAnnotation: false
logLevel: trace
tuner:
  #choice: TPE, Random, Anneal, Evolution, BatchTuner, NetworkMorphism
  #SMAC (SMAC should be installed through nnictl)
  builtinTunerName: NetworkMorphism
  classArgs:
    #choice: maximize, minimize
    optimize_mode: maximize
    #for now, this tuner only supports cv domain
    task: cv
    #input image width
    input_width: 224
    #input image channel
    input_channel: 3
    #number of classes
    n_output_node: 1000
trial:
  command: CUDA_VISIBLE_DEVICES=0 \
           python3 imagenet_train.py \
           --slave 2 \
           --ip ${AIPERF_MASTER_IP} \
           --batch_size 448 \
           --epoch 60 \
           --initial_lr 1e-1 \
           --final_lr 0 \
           --train_data_dir /share/sth/train/ \
           --val_data_dir /share/sth/val/

  codeDir: .
  gpuNum: 0
  • 注意配置文件中slave参数需要和trialConcurrency参数一致,修改为计算节点个数
  • 修改CUDA_VISIBLE_DEVICES为计算节点所用的GPU
  • 需要修改--train_data_dir和--var_data_dir的位置以指向计算节点数据集存储位置

运行benchmark

${AIPERF_WORKDIR}/AIPerf/examples/trials/network_morphism/imagenet/目录下执行以下命令运行用例

注:若使用pyTorch,请在 ${AIPERF_WORKDIR}/AIPerf/examples/trials/network_morphism/imagenetTorch/下执行

aiperf create -c config.yml

如何停止

直接ctrl-c终止aiperf create -c config.yml,然后执行

# 清理所有计算节点上的训练进程
aiperf clean

查看运行过程

当测试运行过程中,运行以下程序会在终端打印experiment的Error、Score、Regulated Score等信息

python3 $AIPERF_WORKDIR/AIPerf/scripts/reports/report.py --id  experiment_ID  

同时会产生实验报告存放在experiment_ID的对应路径${AIPERF_WORKDIR}/mountdir/nni/experiments/experiment_ID/results目录下

实验成功时报告为 Report_Succeed.html

实验失败时报告为 Report_Failed.html

实验失败会报告失败原因,请查阅AI Benchmark测试规范分析失败原因

停止实验

停止expriments, 退出前台的aiperf进程,然后调用aiperf clean清理所有计算节点未结束的进程,最后退出aiperf调度服务即可

保存日志&结果数据

运行以下程序可将测试产生的日志以及数据统一保存到${AIPERF_WORKDIR}/mountdir/nni/experiments/experiment_ID/results/logs中,便于实验分析

python3 $AIPERF_WORKDIR/AIPerf/scripts/reports/report.py --id  experiment_ID  --logs True

由于实验数据在复制过程中会导致额外的网络、内存、cpu等资源开销,建议在实验停止/结束后再执行日志保存操作。

5. 测试参数设置及推荐环境配置

可变设置

  1. slave计算节点的GPU卡数:默认将单个物理服务器作为一个slave节点,并使用其所有GPU;
  2. 深度学习框架:默认使用keras+tensorflow;
  3. 数据集加载方式:默认将数据预处理成TFRecord格式,以加快数据加载的效率;
  4. 数据集存储方式:默认采用网络共享存储;
  5. 超参设置:默认初始batch size=448,默认初始学习率=0.1,默认最终学习率=0,默认正常训练epochs=60,默认从第四轮trial开始,每个trial搜索1次,默认超参为kernel size和batch size。

推荐环境配置

  • 软件:TensorFlow2.5.0,CUDA11.2,cuDNN8.1,python3.8

6. 二次开发与迁移

请参考二次开发参考文档

7. Benchmark报告反馈

若测试中遇到问题,请联系[email protected],并附上${AIPERF_WORKDIR}/mountdir/nni/experiments/experiment_ID/results/中的html版报告。

许可

基于 MIT license