本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
PAI模型倉庫FastNN(Fast Neural Networks)是一個基于PAISoar的分布式神經網絡倉庫。目前FastNN已經支持了Inception、Resnet、VGG等經典算法,后續會逐步開放更多的先進模型。目前FastNN已經內置于Designer平臺中,并且可以直接在該平臺中使用。
公共云GPU服務器即將過保下線,您可以繼續提交CPU版本的TensorFlow任務。如需使用GPU進行模型訓練,請前往DLC提交任務,具體操作請參見創建訓練任務。
準備數據源
為了方便在PAI控制臺上試用FastNN,cifar10、mnist、flowers數據已下載并轉換為tfrecord后存儲在公開OSS上,可通過PAI的讀數據表或OSS數據同步組件訪問。存儲OSS的路徑如下。
數據集 | 分類數 | 訓練集 | 測試集 | 存儲路徑 |
mnist | 10 | 3320 | 350 |
|
cifar10 | 10 | 50000 | 10000 |
|
flowers | 5 | 60000 | 10000 |
|
FastNN庫已支持讀取tfrecord格式的數據,并基于TFRecordDataset接口實現dataset pipeline以供模型訓練試用,幾乎可掩蓋數據預處理時間。另外,由于目前FastNN庫在數據分片方面不夠精細,建議您在準備數據時,盡量保證數據能平均分配到每臺機器,即:
每個tfrecord文件的樣本數量基本一致。
每個worker處理的tfrecord文件數量基本一致。
如果數據格式同為tfrecord,可參考datasets目錄下的cifar10、mnist和flowers等各文件實現dataset pipeline。以cifar10數據為例,實現方法如下。
假設cifar10數據的key_to_features格式為如下。
features={
'image/encoded': tf.FixedLenFeature((), tf.string, default_value=''),
'image/format': tf.FixedLenFeature((), tf.string, default_value='png'),
'image/class/label': tf.FixedLenFeature(
[], tf.int64, default_value=tf.zeros([], dtype=tf.int64)),
}
在datasets目錄下創建數據解析文件cifar10.py,并編輯內容。
"""Provides data for the Cifar10 dataset. The dataset scripts used to create the dataset can be found at: datasets/download_and_covert_data/download_and_convert_cifar10.py """ from __future__ import division from __future__ import print_function import tensorflow as tf """Expect func_name is ‘parse_fn’ """ def parse_fn(example): with tf.device("/cpu:0"): features = tf.parse_single_example( example, features={ 'image/encoded': tf.FixedLenFeature((), tf.string, default_value=''), 'image/format': tf.FixedLenFeature((), tf.string, default_value='png'), 'image/class/label': tf.FixedLenFeature( [], tf.int64, default_value=tf.zeros([], dtype=tf.int64)), } ) image = tf.image.decode_jpeg(features['image/encoded'], channels=3) label = features['image/class/label'] return image, label
在datasets/dataset_factory.py中補足dataset_map。
from datasets import cifar10 datasets_map = { 'cifar10': cifar10, }
執行任務腳本時,指定參數dataset_name=cifar10和train_files=cifar10_train.tfrecord,即可使用cifar10數據進行模型訓練。
如果您需要讀取其他的格式數據,需自行實現dataset pipeline構建邏輯(參考utils/dataset_utils.py)。
超參文件說明
PAI-FastNN支持以下類型的超參:
數據集參數:確定訓練集的基本屬性的參數,例如訓練集存儲路徑dataset_dir。
數據預處理參數:數據預處理函數及dataset pipeline相關參數。
模型參數:模型訓練基本參數,包括model_name、batch_size等。
學習率參數:學習率及其相關調優參數。
優化器參數:優化器及其相關參數。
日志參數:關于輸出日志的參數。
性能調優參數:混合精度等其他調優參數。
超參文件的格式如下。
enable_paisora=True
batch_size=128
use_fp16=True
dataset_name=flowers
dataset_dir=oss://pai-online-beijing.oss-cn-beijing-internal.aliyuncs.com/fastnn-data/flowers/
model_name=inception_resnet_v2
optimizer=sgd
num_classes=5
job_name=worker
數據集參數
名稱
類型
描述
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。
數據預處理參數
名稱
類型
描述
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,表示不打開。
模型參數
名稱
類型
描述
task_type
string
任務類型,取值包括:
pretrain:模型預訓練,默認。
finetune:模型調優
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。
學習率參數
名稱
類型
描述
warmup_steps
integer
逆衰減學習率的迭代數,默認為0。
warmup_scheme
string
學習率逆衰減的方式。取值為t2t(Tensor2Tensor),表示初始化為指定學習率的1/100,然后exponentiate逆衰減到指定學習率為止。
decay_scheme
string
學習率衰減的方式。可選值:
luong234:在2/3的總迭代數之后,開始4次衰減,衰減系數為1/2。
luong5:在1/2的總迭代數之后,開始5次衰減,衰減系數為1/2。
luong10:在1/2的總迭代數之后,開始10次衰減,衰減系數為1/2。
learning_rate_decay_factor
float
指定學習率衰減系數,默認為0.94。
learning_rate_decay_type
string
指定學習率衰減類型,可選值:fixed、exponential(默認)和polynomial。
learning_rate
float
指定學習率初始值,默認為0.01。
end_learning_rate
float
指定衰減時學習率值的下限,默認為0.0001。
優化器參數
名稱
類型
描述
optimizer
string
指定優化器名稱。可選值:adadelta、 adagrad、adam、ftrl、momentum、sgd、rmsprop、adamweightdecay, 默認為rmsprop。
adadelta_rho
float
adadelta的衰減系數,默認為0.95。
adagrad_initial_accumulator_value
float
AdaGrad積累器的起始值,默認為0.1。是AdaGrad優化器專用參數。
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。
日志參數
名稱
類型
描述
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。
性能調優參數
名稱
類型
描述
use_fp16
bool
是否進行半精度訓練,默認為True。
loss_scale
float
訓練中loss值scale的系數,默認為1.0。
enable_paisoar
bool
是否使用paisoar框架,默認True。
protocol
string
默認grpc.rdma集群可以使用grpc+verbs,提升數據存取效率。
開發主文件
如果已有模型無法滿足您的需求,您可以通過繼承dataset、models和preprocessing接口進一步開發。在此之前需要了解FastNN庫的基本流程(以images為例,代碼入口文件為train_image_classifiers.py),整體代碼架構流程如下。
# 根據model_name初始化models中對應模型得到network_fn,并可能返回輸入參數train_image_size。
network_fn = nets_factory.get_network_fn(
FLAGS.model_name,
num_classes=FLAGS.num_classes,
weight_decay=FLAGS.weight_decay,
is_training=(FLAGS.task_type in ['pretrain', 'finetune']))
# 根據model_name或preprocessing_name初始化相應數據預處理函數得到preprocess_fn。
preprocessing_fn = preprocessing_factory.get_preprocessing(
FLAGS.model_name or FLAGS.preprocessing_name,
is_training=(FLAGS.task_type in ['pretrain', 'finetune']))
# 根據dataset_name,選擇正確的tfrecord格式,同步調用preprocess_fn解析數據集得到數據dataset_iterator。
dataset_iterator = dataset_factory.get_dataset_iterator(FLAGS.dataset_name,
train_image_size,
preprocessing_fn,
data_sources,
# 調用network_fn、dataset_iterator,定義計算loss的函數loss_fn。
def loss_fn():
with tf.device('/cpu:0'):
images, labels = dataset_iterator.get_next()
logits, end_points = network_fn(images)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=tf.cast(logits, tf.float32), weights=1.0)
if 'AuxLogits' in end_points:
loss += tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=tf.cast(end_points['AuxLogits'], tf.float32), weights=0.4)
return loss
# 調用PAI-Soar API封裝loss_fn、tf原生optimizer。
opt = paisoar.ReplicatedVarsOptimizer(optimizer, clip_norm=FLAGS.max_gradient_norm)
loss = optimizer.compute_loss(loss_fn, loss_scale=FLAGS.loss_scale)
# 根據opt和loss形式化定義training tensor。
train_op = opt.minimize(loss, global_step=global_step)