Fast Neural Network (FastNN) は、PAISoarフレームワークに基づく分散型ニューラルネットワークライブラリです。 FastNNには、Inception、Residual networks (ResNet) 、Visual Geometry Group (VGG) などの一般的なニューラルネットワークが含まれており、将来的にはより高度なモデルをリリースする予定です。 FastNNは、Platform for AI (PAI) のMachine Learning Designerモジュールに統合されています。 PAIコンソールでFastNNを使用できます。
GPUアクセラレーションサーバーは段階的に廃止されます。 CPUサーバーで実行されるTensorFlowタスクを送信できます。 モデルトレーニングにGPU高速化インスタンスを使用する場合は、Deep Learning Containers (DLC) に移動してジョブを送信します。 詳細については、「トレーニングジョブの送信」をご参照ください。
データセットの準備
パッチを入手するために PAIコンソールでFastNNを簡単に使用できます。 CIFAR-10、MNIST、および花のデータセットがダウンロードされ、TFRecordファイルに変換され、Object Storage Service (OSS) に保存されます。 PAIの [読み取りテーブル] または [OSSデータ同期] コンポーネントを使用して、データセットにアクセスできます。 次の表に、データセットのOSSストレージパスを示します。
データセット | データセット内のクラス数 | トレーニングデータセットのサンプル数 | テストデータセットのサンプル数 | ストレージパス |
MNIST | 10 | 3320 | 350 |
|
CIFAR-10 | 10 | 50000 | 10000 |
|
flowers | 5 | 60,000 | 10000 |
|
FastNNは、TFRecordファイルに保存されているデータを読み取ることができます。 TFRecordDatasetクラスを使用して、モデルトレーニング用のデータセットパイプラインを構築できます。これにより、データの前処理に必要な時間が短縮されます。 さらに、FastNNはきめ細かいデータ分割をサポートしていません。 ワーカー間でデータを均等に分散するために、次のルールを適用することを推奨します。
各TFRecordファイルは、等しい数のサンプルを含む。
各ワーカーは、同数のTFRecordファイルを処理します。
データセットがTFRecordファイルに保存されている場合は、FastNNコードをダウンロードし、データセットディレクトリのサンプルファイルを使用して、cifar10.py、mnist.py、flowers.pyなどのデータセットパイプラインを構築できます。 次の例では、CIFAR-10データセットが使用されています。
CIFAR-10データセットのフィーチャの形式は次のとおりです。
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を追加して、CIFAR-10データセットをモデルトレーニングに使用します。
他の形式のデータセットを読み取るには、utils/dataset_utils.pyファイルを参照して、データセットパイプラインを構築します。
ハイパーパラメータファイルを準備する
FastNNは、次のタイプのハイパーパラメータをサポートします。
データセットハイパーパラメータ: トレーニングデータセットの基本属性。 たとえば、dataset_dirハイパーパラメーターは、トレーニングデータセットのストレージパスを指定します。
データ前処理ハイパーパラメータ: データ前処理関数とデータセットパイプラインパラメータ。
モデルハイパーパラメータ: モデルトレーニングの基本パラメータ (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。 詳細については、image_models/datasetsディレクトリのdataset_factory.pyファイルをご参照ください。 デフォルト値: mock。
dataset_dir
String
入力データセットの絶対パス。 デフォルト値 : なし。
num_sample_per_epoch
integer
データセット内のサンプルの総数。 このパラメーターの値に基づいて学習率を調整します。
num_classes
integer
データセット内のクラスの数。 デフォルト値:100
train_files
String
すべてのトレーニングデータを含むファイルの名前。 複数の名前はコンマ (,) で区切ります。 例: 0.tfrecord,1.tfrecord
データ前処理ハイパーパラメータ
パラメーター
データ型
説明
前処理_name
String
このパラメーターは、データ前処理関数の名前を指定するためにmodel_nameパラメーターとともに使用されます。 有効な値の詳細については、image_models/preprocessingディレクトリのpreprocessing_factory.pyファイルをご参照ください。 デフォルト値: なし。データが前処理されないことを指定します。
shuffle_buffer_size
integer
データパイプラインが作成されたときのサンプルベースのシャッフルのバッファプールのサイズ。 デフォルト値: 1024。
num_parallel_バッチ
integer
並列スレッドの数。これにbatch_sizeパラメーターの値を掛けて、map_and_batchパラメーターの値を取得します。 このパラメーターは、解析サンプルの並列粒度を指定するために使用されます。 デフォルト値: 8。
prefetch_buffer_size
integer
データパイプラインによってプリフェッチされるデータバッチの数。 デフォルト値: 32。
num_preprocessing_スレッド
integer
同時にデータをプリフェッチするためにデータパイプラインによって使用されるスレッドの数。 デフォルト値: 16。
datasets_use_caching
bool
メモリを使用して圧縮入力データのキャッシュを有効にするかどうかを指定します。 デフォルト値: False。キャッシュを無効にすることを指定します。
モデルのハイパーパラメータ
パラメーター
データ型
説明
task_type
String
タスクの ID を設定します。 有効な値:
pretrain: モデル事前トレーニング。 デフォルト値です。
finetune: モデルのチューニング。
model_name
String
トレーニングするモデルの名前。 有効な値には、image_models/modelsディレクトリのすべてのモデルが含まれます。 このパラメーターは、image_models/models/model_factory.pyファイルで定義されたモデルに基づいて設定できます。 デフォルト値: inception_resnet_v2
num_epochs
integer
トレーニングデータセットのトレーニングラウンドの数。 デフォルト値:100
weight_decay
float
モデルトレーニング中の重量減衰係数。 デフォルト値: 0.00004
max_gradient_norm
float
グローバル正規化値に基づいてグラデーションクリッピングを実行するかどうかを指定します。 デフォルト値: なし。グラデーションクリッピングを実行しないことを指定します。
batch_size
integer
GPUが各イテレーションで処理するデータの量。 デフォルト値: 32。
model_dir
String
モデルのリロードに使用されるチェックポイントファイルのパス。 デフォルト値: None。モデルのチューニングを実行しないことを指定します。
ckpt_file_name
String
モデルのリロードに使用されるチェックポイントファイルの名前。 デフォルト値 : なし。
学習率ハイパーパラメータ
パラメーター
データ型
説明
warmup_ステップ
integer
学習レートの逆減衰の反復回数。 デフォルト値:0
ウォームアップ_スキーム
String
学習レートの逆減衰スキーム。 値をt2t (Tensor2Tensor) に設定します。 この値は、次のスキームを指定します。指定された学習レートの1/100で学習レートを初期化し、指定された学習レートに到達するために逆指数関数的減衰に従います。
decay_scheme
String
学習率の減衰スキーム。 有効な値:
luong234: 全反復の3分の2が完了した後、4ステップ減衰スキームを開始する。 各ステップは、学習率を1/2減少させる。
luong5: 全反復の半分が完了した後、5ステップ減衰スキームを開始する。 各ステップは、学習率を1/2減少させる。
luong10: 全反復の半分が完了した後、10ステップ減衰スキームを開始する。 各ステップは、学習率を1/2減少させる。
learning_rate_decay_ファクター
float
学習率の減衰の要因。 デフォルト値: 0.94
learning_rate_decay_タイプ
String
学習率の減衰のタイプ。 有効な値: fixed、exponential、polynomial。 デフォルト値: exponential。
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 このパラメーターは、optimizerパラメーターをadadeltaに設定した場合にのみ有効です。
adagrad_initial_accumulator_value
float
Adagradアキュムレータの初期値。 デフォルト値: 0.1 このパラメーターは、optimizerパラメーターをadagradに設定した場合にのみ有効です。
adam_beta1
float
一次運動量予測における指数関数的減衰率。 デフォルト値: 0.9 このパラメーターは、optimizerパラメーターをadamに設定した場合にのみ有効です。
adam_beta2
float
二次運動量予測における指数関数的減衰率。 デフォルト値: 0.999 このパラメーターは、optimizerパラメーターをadamに設定した場合にのみ有効です。
opt_イプシロン
float
オプティマイザのオフセット。 デフォルト値 : 1.0 このパラメーターは、optimizerパラメーターをadamに設定した場合にのみ有効です。
ftrl_learning_rate_power
float
学習率のべき等パラメータ。 デフォルト値: -0.5 このパラメーターは、optimizerパラメーターをftrlに設定した場合にのみ有効です。
ftrl_initial_accumulator_value
float
FTRLアキュムレータの開始点。 デフォルト値: 0.1 このパラメーターは、optimizerパラメーターをftrlに設定した場合にのみ有効です。
flr_l1
float
FTRL l1の正則化項。 デフォルト値: 0.0 このパラメーターは、optimizerパラメーターをftrlに設定した場合にのみ有効です。
flr_l2
float
FTRLl2の正則化項。 デフォルト値: 0.0 このパラメーターは、optimizerパラメーターをftrlに設定した場合にのみ有効です。
勢い
float
momentumオプティマイザのMomentumパラメーター。 デフォルト値: 0.9 このパラメーターは、オプティマイザーパラメーターをmomentumに設定した場合にのみ有効です。
rmsprop_勢い
float
RMSPropオプティマイザの運動量パラメーター。 デフォルト値: 0.9 このパラメーターは、オプティマイザーパラメーターをrmspropに設定した場合にのみ有効です。
rmsprop_decay
float
RMSPropオプティマイザの減衰係数。 デフォルト値: 0.9 このパラメーターは、オプティマイザーパラメーターをrmspropに設定した場合にのみ有効です。
Logハイパーパラメータ
パラメーター
データ型
説明
stop_at_ステップ
integer
トレーニングエポックの総数。 デフォルト値:100
log_loss_every_n_iters
integer
損失情報が印刷される反復頻度。 デフォルト値は 10 です。
profile_every_n_iters
integer
タイムラインが印刷される反復頻度。 デフォルト値:0
profile_at_task
integer
タイムラインを生成するマシンのインデックス。 デフォルト値: 0。チーフワーカーのインデックスに対応します。
log_device_配置
bool
デバイス配置情報を印刷するかどうかを指定します。 デフォルト値:False。
print_model_統計
bool
トレーニング可能な変数情報を印刷するかどうかを指定します。 デフォルト値:false
フック
String
トレーニングフック。 デフォルト値: StopAtStepHook、ProfilerHook、LoggingTensorHook、CheckpointSaverHook
パフォーマンス調整ハイパーパラメータ
パラメーター
データ型
説明
_fp16を使用
bool
半精度トレーニングを実行するかどうかを指定します。 デフォルト値は True です。
loss_scale
float
トレーニング中の損失関数のスケーリング係数。 デフォルト値 : 1.0
_paisoarを有効にする
bool
PAISoarフレームワークを使用するかどうかを指定します。 デフォルト値は True です。
プロトコル
String
デフォルト値: grpc.rdma。これは、クラスターがgRPCリモートプロシージャコール (gRPC) を使用してデータアクセス効率を向上させることを指定します。
メインファイルを開発する
既存のFastNNモデルが要件を満たせない場合は、データセット、モデル、および前処理APIを使用してさらに開発できます。 開発の前に、FastNNモデルの基本ロジックに精通していることを確認してください。 FastNNコードをダウンロードすると、train_image_classifiers.pyエントリファイルで画像分類モデルの基本ロジックを表示できます。 サンプルコード:
# Initialize the model by using the model_name parameter to create the network_fn function. The input parameter train_image_size may be returned.
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']))
# Initialize the preprocess_fn function by using the model_name or preprocessing_name parameter.
preprocessing_fn = preprocessing_factory.get_preprocessing(
FLAGS.model_name or FLAGS.preprocessing_name,
is_training=(FLAGS.task_type in ['pretrain', 'finetune']))
# Select the valid TFRecord format based on the dataset_name parameter and synchronously call the preprocess_fn function to parse the dataset and obtain the dataset_iterator object.
dataset_iterator = dataset_factory.get_dataset_iterator(FLAGS.dataset_name,
train_image_size,
preprocessing_fn,
data_sources,
# Call the network_fn and dataset_iterator.get_next functions to define the loss_fn function that is used to calculate the loss.
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
# Call the PAI-Soar API to encapsulate the native TensorFlow optimizer and the loss_fn function.
opt = paisoar.ReplicatedVarsOptimizer(optimizer, clip_norm=FLAGS.max_gradient_norm)
loss = optimizer.compute_loss(loss_fn, loss_scale=FLAGS.loss_scale)
# Define training tensors based on the value of the opt and loss parameter.
train_op = opt.minimize(loss, global_step=global_step)