全部产品
云市场

模型仓库(FastNN)

更新时间:2019-09-18 10:11:38

PAI-FastNN(Fast Neural Networks)是一个基于PAISoar的分布式神经网络仓库。目前FastNN已经支持了Inception、Resnet、VGG等经典算法,后续会逐步开放更多地先进模型。目前FastNN已经内置于PAI-Studio平台中,如需试用请登录PAI-Studio,找到首页模板创建实验即可。

自定义开发方法

1.数据源准备

为了方便在PAI平台试用FastNN,cifar10、mnist、flowers数据已下载并转换为tfrecord后存储在公开oss上,可通过阿里机器学习平台PAI的“读取文件数据”或“读OSS数据组“件访问。存储oss路径如下:

数据集 分类数 训练集 测试集 存储路径
mnist 10 3320 350 北京:oss://pai-online-beijing.oss-cn-beijing-internal.aliyuncs.com/fastnn-data/mnist/ 上海:oss://pai-online.oss-cn-shanghai-internal.aliyuncs.com/fastnn-data/mnist/
cifar10 10 50000 10000 北京:oss://pai-online-beijing.oss-cn-beijing-internal.aliyuncs.com/fastnn-data/cifar10/ 上海:oss://pai-online.oss-cn-shanghai-internal.aliyuncs.com/fastnn-data/cifar10/
flowers 5 60000 10000 北京:oss://pai-online-beijing.oss-cn-beijing-internal.aliyuncs.com/fastnn-data/flowers/ 上海:oss://pai-online.oss-cn-shanghai-internal.aliyuncs.com/fastnn-data/flowers/

数据源直接写入组件即可访问:

FastNN库已实现支持读取tfrecord格式的数据,并基于TFRecordDataset接口实现dataset pipeline以供模型训练试用,几乎可掩盖数据预处理时间。另外,目前实现逻辑在数据分片实现不够精细,要求用户在数据准备时尽量保证数据能平均分配到每台机器,即:

  • 每个tfreocrd文件的样本数量几乎一样;
  • 每个worker处理的tfrecord文件数几乎一致。

若数据格式同为tfrecord,可参考datasets目录下cifar10/mnist/flowers各文件等,以cifar10数据为例:

  • 假设cifar10数据的key_to_features格式为:
  1. features={
  2. 'image/encoded': tf.FixedLenFeature((), tf.string, default_value=''),
  3. 'image/format': tf.FixedLenFeature((), tf.string, default_value='png'),
  4. 'image/class/label': tf.FixedLenFeature(
  5. [], tf.int64, default_value=tf.zeros([], dtype=tf.int64)),
  6. }
  • 在datasets目录下创建数据解析文件cifar10.py,并编辑内容示例如下:
  1. """Provides data for the Cifar10 dataset.
  2. The dataset scripts used to create the dataset can be found at:
  3. datasets/download_and_covert_data/download_and_convert_cifar10.py
  4. """
  5. from __future__ import division
  6. from __future__ import print_function
  7. import tensorflow as tf
  8. """Expect func_name is ‘parse_fn’
  9. """
  10. def parse_fn(example):
  11. with tf.device("/cpu:0"):
  12. features = tf.parse_single_example(
  13. example,
  14. features={
  15. 'image/encoded': tf.FixedLenFeature((), tf.string, default_value=''),
  16. 'image/format': tf.FixedLenFeature((), tf.string, default_value='png'),
  17. 'image/class/label': tf.FixedLenFeature(
  18. [], tf.int64, default_value=tf.zeros([], dtype=tf.int64)),
  19. }
  20. )
  21. image = tf.image.decode_jpeg(features['image/encoded'], channels=3)
  22. label = features['image/class/label']
  23. return image, label
  • 在datasets/dataset_factory.py补足dataset_map
  1. from datasets import cifar10
  2. datasets_map = {
  3. 'cifar10': cifar10,
  4. }
  • 执行任务脚本时,可通过指定参数dataset_name=cifar10和train_files=cifar10_train.tfrecord使用cifar10数据进行模型训练。

如需读取其他数据格式,需要自行实现dataset pipeline构建逻辑(参考utils/dataset_utils.py)。

2.超参文件说明

支持以下类型的超参:

  • 数据集参数:确定训练集的基本属性,如训练集存储路径dataset_dir;
  • 数据预处理参数:数据预处理函数及dataset pipeline相关参数;
  • 模型参数:模型训练基本超參,包括model_name、batch_size等;
  • 学习率参数:学习率及其相关调优参数;
  • 优化器参数:优化器及其相关参数;
  • 日志参数:关于输出日志的参数;
  • 性能调优参数:混合精度等其他调优参数。

超参文件,例:

2.1 数据集参数

#名称 #类型 #描述
dataset_name string 指定输入数据解析文件的名称,当前取值包括“mock”、“cifar10”、“mnist”、“flowers”(详见images/datasets目录下所有的数据解析文件)。默认使用模拟数据mock
dataset_dir string 指定输入数据集的绝对路径,默认设置为None
num_sample_per_epoch integer 指定数据集总样本数,一般用来配合学习率的衰减
num_classes integer 指定样本分类数,默认100。
train_files string 指定所有训练数据的文件名,文件间分隔符为逗号,如”0.tfrecord,1.tfrecord”

2.2 数据预处理参数

#名称 #类型 #描述
preprocessing_name string 和model_name共同指定数据预处理的方法名,当前取值范围详见images/preprocessing目录下的preprocessing_factory文件。默认不做数据预处理,设置为None。
shuffle_buffer_size integer 在生成数据流水线时以样本为粒度进行shuffle的缓存池大小,默认1024
num_parallel_batches integer 与batch_size乘积为map_and_batch的并行线程数,协助指定解析样本的并行粒度,默认设置为8
prefetch_buffer_size integer 指定数据流水线预取数据的批数,默认设置为32
num_preprocessing_threads integer 指定数据流水线进行并行数据预取的线程数,默认设置为16
datasets_use_caching bool 以内存为开销进行输入数据的压缩缓存,默认不打开,设置为False

2.3 模型参数

#名称 #类型 #描述
task_type string 取值包括“pretrain”、“finetune”,分别表示模型预训练和模型调优, 默认进行模型预训练,取值“pretrain”
model_name string 指定进行训练的模型,取值包括images/models下所有的模型,可参考images/models/model_factory文件中所有定义的模型进行model_name的设置,默认设置为inception_resnet_v2
num_epochs integer 指定训练集训练轮数,默认训练集共训练100遍
weight_decay float 指定模型训练时权重的衰减系数, 默认0.00004
max_gradient_norm float 指定是否根据全局归一化值进行梯度裁剪, 默认取值为None,不进行梯度裁剪
batch_size integer 指定单卡一次迭代处理的数据量, 默认32
model_dir string 指定重载checkpoint的路径,默认为None,即不进行模型调优
ckpt_file_name string 指定重载checkpoint的文件名,默认为None

2.4 学习率参数

#名称 #类型 #描述
warmup_steps integer 指定逆衰减学习率的迭代数. 默认0
warmup_scheme string 指定学习率逆衰减的方式. 取值可选:’t2t’ 指Tensor2Tensor, 初始化为指定学习率的1/100,然后exponentiate逆衰减到指定学习率为止
decay_scheme string 指定学习率衰减的方式. 取值可选:1、luong234: 在2/3的总迭代数之后, 开始4次衰减,衰减系数为1/2; 2、luong5: 在1/2的总迭代数之后, 开始5次衰减,衰减系数为1/2; 3、luong10: 在1/2的总迭代数之后, 开始10次衰减,衰减系数为1/2.
learning_rate_decay_factor float 指定学习率衰减系数, 默认0.94
learning_rate_decay_type string 指定学习率衰减类型. 取值可选”fixed”, “exponential”, “polynomial”, 默认exponential
learning_rate float 指定学习率初始值,默认0.01
end_learning_rate float 指定衰减时学习率值的下限,默认0.0001

2.5 优化器参数

#名称 #类型 #描述
optimizer string 指定优化器名称, 取值可选”adadelta”、 “adagrad”、”adam”、”ftrl”、”momentum”、”sgd”、”rmsprop”、“adamweightdecay”, 默认”rmsprop”
adadelta_rho float adadelta的衰减系数, default 0.95, specially for Adadelta
adagrad_initial_accumulator_value float AdaGrad积累器的起始值, 默认0.1, Adagrada优化器专用参数
adam_beta1 float 一次动量预测的指数衰减率, 默认0.9, Adam优化器专用参数
adam_beta2 float 二次动量预测的指数衰减率, 默认0.999, Adam优化器专用参数
opt_epsilon float 优化器偏置值, 默认1.0, Adam优化器专用参数
ftrl_learning_rate_power float 学习率参数的幂参数, 默认-0.5, Ftrl优化器专用参数
ftrl_initial_accumulator_value float FTRL积累器的起始, 默认0.1, Ftrl优化器专用参数
ftrl_l1 float FTRL l1正则项, 默认0.0, Ftrl优化器专用参数
ftrl_l2 float FTRL l2正则项, 默认0.0, Ftrl优化器专用参数
momentum float MomentumOptimizer的动量参数, 默认0.9, Momentum优化器专用参数
rmsprop_momentum float RMSPropOptimizer的动量参数, 默认0.9
rmsprop_decay float RMSProp的衰减系数, 默认0.9

2.6 日志参数

#名称 #类型 #描述
stop_at_step integer 指定训练总迭代数, 默认100
log_loss_every_n_iters integer 指定打印loss信息的迭代频率, 默认10
profile_every_n_iters integer 指定打印timeline的迭代频率, 默认0
profile_at_task integer 指定输出timeline的机器对应索引, 默认0,对应chief worker
log_device_placement bool 指定是否输出device placement信息, 默认False
print_model_statistics bool 指定是否输出可训练变量信息, 默认false
hooks string 指定训练hooks, 默认”StopAtStepHook,ProfilerHook,LoggingTensorHook,CheckpointSaverHook”

2.7 性能调优参数

#名称 #类型 #描述
use_fp16 bool 指定是否进行半精度训练, 默认True
loss_scale float 指定训练中loss值scale的系数, 默认1.0
enable_paisoar bool 指定是否使用paisoar,默认True.
protocol string 默认grpc.rdma集群可用“grpc+verbs”提升数据存取效率

3.主文件开发

若已有模型等实现满足不了需求,可通过继承dataset/models/preprocessing接口进一步开发。在此之前需要了解FastNN库的基本流程(以images为例,代码入口文件为train_image_classifiers.py),整体代码架构流程如下:

  1. # 根据model_name初始化models中对应模型得到network_fn,并可能返回输入参数train_image_size;
  2. network_fn = nets_factory.get_network_fn(
  3. FLAGS.model_name,
  4. num_classes=FLAGS.num_classes,
  5. weight_decay=FLAGS.weight_decay,
  6. is_training=(FLAGS.task_type in ['pretrain', 'finetune']))
  7. # 根据model_name或preprocessing_name初始化相应数据预处理函数得到preprocess_fn;
  8. preprocessing_fn = preprocessing_factory.get_preprocessing(
  9. FLAGS.model_name or FLAGS.preprocessing_name,
  10. is_training=(FLAGS.task_type in ['pretrain', 'finetune']))
  11. # 根据dataset_name,选择正确的tfrecord格式,同步调用preprocess_fn解析数据集得到数据dataset_iterator;
  12. dataset_iterator = dataset_factory.get_dataset_iterator(FLAGS.dataset_name,
  13. train_image_size,
  14. preprocessing_fn,
  15. data_sources,
  16. # 调用network_fn、dataset_iterator,定义计算loss的函数loss_fn:
  17. def loss_fn():
  18. with tf.device('/cpu:0'):
  19. images, labels = dataset_iterator.get_next()
  20. logits, end_points = network_fn(images)
  21. loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=tf.cast(logits, tf.float32), weights=1.0)
  22. if 'AuxLogits' in end_points:
  23. loss += tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=tf.cast(end_points['AuxLogits'], tf.float32), weights=0.4)
  24. return loss
  25. # 调用PAI-Soar API封装loss_fn、tf原生optimizer
  26. opt = paisoar.ReplicatedVarsOptimizer(optimizer, clip_norm=FLAGS.max_gradient_norm)
  27. loss = optimizer.compute_loss(loss_fn, loss_scale=FLAGS.loss_scale)
  28. # 根据opt和loss形式化定义training tensor
  29. train_op = opt.minimize(loss, global_step=global_step)