Keras模式下使能训练迭代循环下沉
在Ascend平台可以直接使用Keras原生API进行训练时,一次session.run调用在昇腾AI处理器执行训练迭代的次数固定为1。如需减少Host与Device间的交互次数,缩短训练时长,需要通过model_to_npu_estimator接口,将通过Keras构建的模型转换为NPUEstimator对象,同时通过NPURunConfig中的iterations_per_loop参数,指定一次session.run调用时在昇腾AI处理器执行训练迭代的次数。
TensorFlow原始代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from tensorflow.python.keras.layers import Input, Dense from tensorflow.python.keras.models import Model # This returns a tensor inputs = Input(shape=(224, 224, 3)) # This creates a model that includes # the Input layer and three Dense layers keras_model = ResNet50(input_tensor=inputs, weights=None, include_top=True) keras_model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy') keras_model.fit_generator( train_generator, steps_per_epoch=100, epochs=10) |
迁移后的代码:
1 2 3 4 5 6 7 8 9 | from npu_bridge.npu_init import * run_config = NPURunConfig(save_checkpoints_steps=2, model_dir=model_path, iterations_per_loop=10) # 将通过Keras构建的模型转换为NPUEstimator对象 est_resnet = keras_to_npu.model_to_npu_estimator(keras_model=keras_model, config=run_config) # 执行训练 est_resnet.train(input_fn=lambda: input_fn(), max_steps=1000) |
另外,还需要将Keras的数据预处理部分迁移为NPUEstimator中input_fn,请用户自行实现,下面仅给出迁移示例。以下示例中,Keras的数据预处理方式为从文件夹中读取图片数据,并自动打标签,经过数据增强resize、归一化、水平翻转等操作,最终输出数据;而Estimator模式下,数据预处理方式采用相同的从文件list中读取的方式,区别在于需要提前读取好文件名的list,并给每张图片打上标签输出标签的list。同样的经过归一化、resize、水平翻转的数据增强操作,输出数据。
TensorFlow原始代码:
1 2 3 4 5 6 7 8 | # keras从文件夹中读取图片 train_datagen = ImageDataGenerator(rescale=1./255, horizontal_flip=True) train_generator = train_datagen.flow_from_directory('data/', target_size=(224, 224, 3), batch_size=32, class_mode='sparse') |
迁移后的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 函数的功能是将filename对应的图片文件读进来,并缩放到统一的大小 def _parse_function(filename, label): image = tf.read_file(filename) image = tf.image.decode_image(image) image = image / 255.0 image = tf.image.resize_images(image, [224, 224, 3]) image = tf.image.random_flip_left_right(image) return image, label def input_fn(): # 图片文件的列表,图片的list需要用户自己生成 filenames = tf.constant(["/data/image1.jpg", "/data/image2.jpg", ...]) # label[i]就是图片filenames[i]的label, label的list需要用户自己生成 labels = tf.constant([0, 5, ...]) # 此时dataset中的一个元素是(filename, label) dataset = tf.data.Dataset.from_tensor_slices((filenames, labels)).repeat(10) # 此时dataset中的一个元素是(image_resized, label) dataset = dataset.map(_parse_function) # 此时dataset中的一个元素是(image_resized_batch, label_batch) dataset = dataset.shuffle().batch(32) return dataset |
其他说明:Keras的callback回调函数在转换为NPUEstimator对象后无法使用。
检查iterations_per_loop生效
开启“训练迭代循环下沉”功能后,可通过查看Host侧INFO日志中是否存在关键字“Insert op success”来判断iterations_per_loop是否生效。
可通过如下命令设置Host侧日志级别为INFO,INFO日志的默认输出路径为“$HOME/ascend/log/run/plog/”。
export ASCEND_GLOBAL_LOG_LEVEL=1
父主题: 训练迭代循环下沉