すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:FastNN

最終更新日:Jul 22, 2024

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

  • 中国 (北京): 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/

CIFAR-10

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

60,000

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クラスを使用して、モデルトレーニング用のデータセットパイプラインを構築できます。これにより、データの前処理に必要な時間が短縮されます。 さらに、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)),
}
  1. 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
  2. datasetsディレクトリで、dataset_factory.pyファイルを開き、dataset_mapパラメーターを設定します。

    from datasets import cifar10
    datasets_map = {
        'cifar10': cifar10,
    }
  3. トレーニングジョブを実行するときに、コマンドに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

    解析する入力データセットの名前。 有効な値: mockcifar10mnistflowers。 詳細については、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

    学習率の減衰のタイプ。 有効な値: fixedexponentialpolynomial。 デフォルト値: exponential。

    learning_rate

    float

    初期学習率。 デフォルト値: 0.01

    end_learning_rate

    float

    減衰中の最小学習レート。 デフォルト値: 0.0001

  • Optimizerハイパーパラメータ

    パラメーター

    データ型

    説明

    オプティマイザ

    String

    オプティマイザの名前。 有効な値: adadeltaadagradadamftrlmomentumsgdrmspropadamweightdecay。 デフォルト値: 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)