Fast Neural Network (FastNN) は、PAISoar フレームワークに基づく分散ニューラルネットワークライブラリです。FastNN は、Inception、Residual Networks (ResNet)、Visual Geometry Group (VGG) などの一般的なニューラルネットワークをサポートしており、将来的にはより高度なモデルをリリースする予定です。FastNN は、Platform for AI (PAI) の Machine Learning Designer に統合されています。 PAI制御台PAI コンソールで FastNN を使用できます。
GPU アクセラレーションサーバーは段階的に廃止されます。CPU サーバーで実行される TensorFlow タスクを送信できます。モデルトレーニングに GPU インスタンスを使用する場合は、Deep Learning Containers (DLC) にアクセスしてジョブを送信してください。詳細については、「トレーニングジョブを送信する」をご参照ください。
データセットを準備する
で FastNN を簡単に使用できます。 PAI コンソール CIFAR-10、MNIST、および flowers データセットはダウンロードされ、TFRecord ファイルに変換された後、Object Storage Service (OSS) に保存されます。 [Read Table] コンポーネントまたは [OSS Data Synchronization] コンポーネントを使用して、データセットにアクセスできます。次の表は、データセットの OSS ストレージパスを示しています。
データセット | データセット内のクラス数 | トレーニングデータセット内のサンプル数 | テストデータセット内のサンプル数 | ストレージパス |
MNIST | 10 | 3320 | 350 |
|
CIFAR-10 | 10 | 50000 | 10000 |
|
flowers | 5 | 60000 | 10000 |
|
FastNN は、TFRecord ファイルに保存されているデータを読み取ることができます。 TFRecordDataset クラスを使用して、モデルトレーニング用のデータセットパイプラインを構築できます。これにより、データの前処理に必要な時間が短縮されます。さらに、FastNN は詳細なデータパーティションをサポートしていません。ワーカー間でデータを均等に分散させるために、次のルールを適用することをお勧めします。
各 TFRecord ファイルには、同じ数のサンプルが含まれています。
各ワーカーは、同じ数の TFRecord ファイルを処理します。
データセットが TFRecord ファイルに保存されている場合は、FastNN コードをダウンロードし、datasets ディレクトリのサンプルファイル (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 という名前のファイルを作成し、ファイルを編集します。
"""Cifar10 データセットのデータを提供します。 データセットの作成に使用されたデータセットスクリプトは、次の場所にあります。 datasets/download_and_covert_data/download_and_convert_cifar10.py """ from __future__ import division from __future__ import print_function import tensorflow as tf """func_name が '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, labeldatasets ディレクトリで、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。
データの前処理のハイパーパラメーター
パラメーター
タイプ
説明
preprocessing_name
string
このパラメーターは、model_name パラメーターと共に使用して、データの前処理関数の名前を指定します。有効な値については、image_models/preprocessing ディレクトリの preprocessing_factory.py ファイルを参照してください。デフォルト値: なし。これは、データが前処理されないことを指定します。
shuffle_buffer_size
integer
データパイプラインの作成時に、サンプルベースのシャッフルのバッファープールのサイズ。デフォルト値: 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
トレーニングするモデルの名前。有効な値には、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
モデルの再読み込みに使用するチェックポイントファイルのパス。デフォルト値: なし。これは、モデルチューニングが実行されないことを指定します。
ckpt_file_name
string
モデルの再読み込みに使用するチェックポイントファイルの名前。デフォルト値: なし。
学習率のハイパーパラメーター
パラメーター
タイプ
説明
warmup_steps
integer
学習率の逆減衰の反復回数。デフォルト値: 0。
warmup_scheme
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_factor
float
学習率減衰の係数。デフォルト値: 0.94。
learning_rate_decay_type
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_epsilon
float
オプティマイザーのオフセット。デフォルト値: 1.0。このパラメーターは、optimizer パラメーターを adam に設定した場合にのみ有効です。
ftrl_learning_rate_power
float
学習率のべき等パラメーター。デフォルト値: -0.5。このパラメーターは、optimizer パラメーターを ftrl に設定した場合にのみ有効です。
ftrl_initial_accumulator_value
float
FTRL アキュムレータの開始点。デフォルト値: 0.1。このパラメーターは、optimizer パラメーターを ftrl に設定した場合にのみ有効です。
ftrl_l1
float
FTRL l1 の正則化項。デフォルト値: 0.0。このパラメーターは、optimizer パラメーターを ftrl に設定した場合にのみ有効です。
ftrl_l2
float
FTRL l2 の正則化項。デフォルト値: 0.0。このパラメーターは、optimizer パラメーターを ftrl に設定した場合にのみ有効です。
momentum
float
Momentum オプティマイザーのモーメンタムパラメーター。デフォルト値: 0.9。このパラメーターは、optimizer パラメーターを momentum に設定した場合にのみ有効です。
rmsprop_momentum
float
RMSProp オプティマイザーのモーメンタムパラメーター。デフォルト値: 0.9。このパラメーターは、optimizer パラメーターを rmsprop に設定した場合にのみ有効です。
rmsprop_decay
float
RMSProp オプティマイザーの減衰係数。デフォルト値: 0.9。このパラメーターは、optimizer パラメーターを rmsprop に設定した場合にのみ有効です。
ログのハイパーパラメーター
パラメーター
タイプ
説明
stop_at_step
integer
トレーニングエポックの総数。デフォルト値: 100。
log_loss_every_n_iters
integer
損失情報が出力される反復頻度。デフォルト値: 10。
profile_every_n_iters
integer
タイムラインが出力される反復頻度。デフォルト値: 0。
profile_at_task
integer
タイムラインを生成するマシンのインデックス。デフォルト値: 0。これはチーフワーカーのインデックスに対応します。
log_device_placement
bool
デバイス配置情報を出力するかどうかを指定します。デフォルト値: False。
print_model_statistics
bool
トレーニング可能な変数情報を出力するかどうかを指定します。デフォルト値: false。
hooks
string
トレーニングフック。デフォルト値: StopAtStepHook,ProfilerHook,LoggingTensorHook,CheckpointSaverHook。
パフォーマンチューニングのハイパーパラメーター
パラメーター
タイプ
説明
use_fp16
bool
半精度トレーニングを実行するかどうかを指定します。デフォルト値: True。
loss_scale
float
トレーニング中の損失関数のスケーリング係数。デフォルト値: 1.0。
enable_paisoar
bool
PAISoar フレームワークを使用するかどうかを指定します。デフォルト値: True。
protocol
string
デフォルト値: grpc.rdma。これは、クラスターが gRPC Remote Procedure Calls (gRPC) を使用してデータアクセス効率を向上させることを指定します。
メインファイルを開発する
既存の FastNN モデルが要件を満たしていない場合は、データセット、モデル、および前処理 API を使用してさらに開発を行うことができます。開発前に、FastNN モデルの基本ロジックをよく理解しておいてください。FastNN コードをダウンロードした場合は、train_image_classifiers.py エントリファイルで画像分類モデルの基本ロジックを確認できます。サンプルコード:
# model_name パラメーターを使用してモデルを初期化し、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.get_next 関数を呼び出して、損失の計算に使用する 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 を呼び出して、ネイティブ TensorFlow オプティマイザーと loss_fn 関数をカプセル化します。
opt = paisoar.ReplicatedVarsOptimizer(optimizer, clip_norm=FLAGS.max_gradient_norm)
loss = optimizer.compute_loss(loss_fn, loss_scale=FLAGS.loss_scale)
# opt パラメーターと loss パラメーターの値に基づいてトレーニングテンソルを定義します。
train_op = opt.minimize(loss, global_step=global_step)