全部產品
Search
文件中心

Platform For AI:模型倉庫(FastNN)

更新時間:Jul 13, 2024

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

  • 北京: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/

cifar10

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

60000

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介面實現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)),
}
  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,即可使用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

    指定輸入資料解析檔案的名稱。取值包括:mockcifar10mnistflowers,取值說明請參見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

    指定學習率衰減類型,可選值:fixedexponential(預設)和polynomial

    learning_rate

    float

    指定學習率初始值,預設為0.01。

    end_learning_rate

    float

    指定衰減時學習率值的下限,預設為0.0001。

  • 最佳化器參數

    名稱

    類型

    描述

    optimizer

    string

    指定最佳化器名稱。可選值:adadeltaadagradadamftrlmomentumsgdrmspropadamweightdecay, 預設為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)