Anylearn自定义算法训练跟踪

本地快速开始 中曾经介绍过, Anylearn后端引擎不仅支持Anylearn算法库内置的标准算法, 也可以通过宽松的执行环境支持用户自定义的自定义算法。

然而,未经过标准化封装的算法的训练过程不尽相同, 可能有各式各样的迭代方式、进度、中间结果等等, 很难做到通用的训练跟踪。 因此,Anylearn SDK提供了一套简洁的接口, 用户只需要在自定义的算法中增加微量的代码, 调用这些接口, 便能做到在Anylearn中对训练过程进行有效跟踪。

自定义算法Hello world

我们以一个简单的Hello world级的算法为例, 阐述如何使用Anylearn SDK的训练跟踪功能。 以下是训练 Fashion MNIST数据集 的一个CNN的主体代码:

# 主体逻辑,忽略部分细节
class EpochEndCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        acc = logs['val_acc'] if 'val_acc' in logs else logs['val_accuracy']
        print(f"Current acc: {acc}")

parser = argparse.ArgumentParser()
(X_train, y_train), (X_test, y_test) = load_data_local(path=args.data_path)
# ......

# Build model
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, [3, 3], activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
    # ......
])
opt = tf.keras.optimizers.Adam(_learning_rate)
model.compile(optimizer=opt,
            loss=tf.keras.losses.SparseCategoricalCrossentropy(),
            metrics=['accuracy'])
# ......

# Train
model.fit(dset_train,
        callbacks=callbacks,
        epochs=_epochs)
# Test
test_loss, test_acc = model.evaluate(dset_test, verbose=2)
# Save
model.save(_model_dir)

集成Anylearn SDK使得Anylearn可以对训练进行跟踪

只需简单地修改上述CNN的代码, 导入Anylearn SDK、调用中间结果汇报接口、调用最终结果汇报接口, 即可让Anylearn对训练过程进行跟踪:

+ import anylearn
  class EpochEndCallback(tf.keras.callbacks.Callback):
      def on_epoch_end(self, epoch, logs=None):
          acc = logs['val_acc'] if 'val_acc' in logs else logs['val_accuracy']
-         print(f"Current acc: {acc}")
+         anylearn.report_intermediate_metric(acc)

  parser = argparse.ArgumentParser()
  (X_train, y_train), (X_test, y_test) = load_data_local(path=args.data_path)
  # ......

  # Build model
  model = tf.keras.Sequential([
      tf.keras.layers.Conv2D(32, [3, 3], activation='relu'),
      tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
      # ......
  ])
  opt = tf.keras.optimizers.Adam(_learning_rate)
  model.compile(optimizer=opt,
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])
  # ......

  # Train
  model.fit(dset_train,
          callbacks=callbacks,
          epochs=_epochs)
  # Test
  test_loss, test_acc = model.evaluate(dset_test, verbose=2)
+ anylearn.report_final_metric(test_acc)
  # Save
  model.save(_model_dir)

接口参考

anylearn.report_intermediate_metric(metric: float)[源代码]

向Anylearn后端引擎汇报模型训练的中间结果指标。

参数

metric – 中间结果指标的值,浮点数类型。

anylearn.report_final_metric(metric: float)[源代码]

向Anylearn后端引擎汇报模型训练的最终结果指标。

参数

metric – 最终结果指标的值,浮点数类型。

anylearn.applications.tracking.get_incontainer_train_task()[源代码]

从Anylearn后端引擎的当前训练环境(容器)中获取训练任务对象。

返回

当前训练环境中的训练对象。

返回类型

TrainTask