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)