AutoTune自动调优
功能介绍
Auto Tune工具的作用就是充分利用硬件资源进行算子的自动调优。用户在生成网络模型时,仅需要打开auto_tune_mode开关使能Auto Tune工具,就可以在算子编译时自动调用Auto Tune工具进行算子调优,调优后的结果会放在自定义的知识库中,在后续调用相关算子时便可直接享受到调优后的算子性能。
Auto Tune工具包含RL和GA两种调优模式:
- RL(Reinforcement Learning)即强化学习。
RL调优模式主要支持elewise、broadcast、reduce类的算子,主要调优原理为:将Schedule过程抽象为基于蒙特卡洛树搜索(Monte Carlo tree search:MCTS,一种用于某些决策过程中的启发式搜索算法)的决策链,然后使用NN(Neural Networks)指导决策,其中NN基于RL进行训练生成。
- GA(Genetic Algorithm)即遗传算法。
GA调优模式主要支持cube类的算子,主要调优原理为:通过多级组合优化生成调优空间,加入人工经验进行剪枝,排序,提高调优的效率;利用遗传算法进行多轮的参数寻优,从而获得最优的tiling策略。
默认训练过程中进行AutoTune自动调优,如需使能,请参考本节内容修改训练脚本。
Estimator模式修改
- 检查迁移后的脚本是否存在“init_resource”。
- 如果存在,则需要参考下面示例进行修改;修改完后,执行下一步。
- 如果不存在,则直接执行下一步。
if __name__ == '__main__': session_config = tf.ConfigProto() custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = "NpuOptimizer" custom_op.parameter_map["auto_tune_mode"].s = tf.compat.as_bytes("RL,GA") (npu_sess, npu_shutdown) = init_resource(config=session_config) tf.app.run() shutdown_resource(npu_sess, npu_shutdown) close_session(npu_sess)
- 在迁移后的脚本中找到“npu_run_config_init”,例如:
session_config = tf.ConfigProto(allow_soft_placement=True) run_config = tf.estimator.RunConfig( train_distribute=distribution_strategy, session_config=session_config, save_checkpoints_secs=60*60*24) classifier = tf.estimator.Estimator( model_fn=model_function, model_dir=flags_obj.model_dir, config=npu_run_config_init(run_config=run_config))
- 配置“auto_tune_mode”:
session_config = tf.ConfigProto(allow_soft_placement=True) custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = 'NpuOptimizer' custom_op.parameter_map["auto_tune_mode"].s = tf.compat.as_bytes("RL,GA") run_config = tf.estimator.RunConfig( train_distribute=distribution_strategy, session_config=session_config, save_checkpoints_secs=60*60*24) classifier = tf.estimator.Estimator( model_fn=model_function, model_dir=flags_obj.model_dir, config=npu_run_config_init(run_config=run_config))
- 如果脚本中的运行配置函数,例如RunConfig中没有传入session_config参数,需要自行传入session_config:
session_config = tf.ConfigProto() custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = 'NpuOptimizer' custom_op.parameter_map["auto_tune_mode"].s = tf.compat.as_bytes("RL,GA") run_config = tf.estimator.RunConfig( train_distribute=distribution_strategy, session_config=session_config, save_checkpoints_secs=60*60*24) classifier = tf.estimator.Estimator( model_fn=model_function, model_dir=flags_obj.model_dir, config=npu_run_config_init(run_config=run_config))
sess.run模式修改
- 检查迁移后的脚本是否存在“init_resource”。
- 如果存在,则需要参考下面示例进行修改;修改完后,执行下一步。
- 如果不存在,则直接执行下一步。
if __name__ == '__main__': session_config = tf.ConfigProto() custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = "NpuOptimizer" custom_op.parameter_map["auto_tune_mode"].s = tf.compat.as_bytes("RL,GA") (npu_sess, npu_shutdown) = init_resource(config=session_config) tf.app.run() shutdown_resource(npu_sess, npu_shutdown) close_session(npu_sess)
- 在脚本中找到“npu_config_proto”:
with tf.Session(config=npu_config_proto()) as sess: sess.run(tf.global_variables_initializer()) interaction_table.init.run()
- 配置“auto_tune_mode”:
config_proto = tf.ConfigProto() custom_op = config_proto.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = 'NpuOptimizer' custom_op.parameter_map["auto_tune_mode"].s = tf.compat.as_bytes("RL,GA") config = npu_config_proto(config_proto=config_proto) with tf.Session(config=config) as sess: sess.run(tf.global_variables_initializer()) interaction_table.init.run()
tf.keras模式修改
- 检查迁移后的脚本是否存在“init_resource”。
- 如果存在,则需要参考下面示例进行修改;修改完后,执行下一步。
- 如果不存在,则直接执行下一步。
if __name__ == '__main__': session_config = tf.ConfigProto() custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = "NpuOptimizer" custom_op.parameter_map["auto_tune_mode"].s = tf.compat.as_bytes("RL,GA") (npu_sess, npu_shutdown) = init_resource(config=session_config) tf.app.run() shutdown_resource(npu_sess, npu_shutdown) close_session(npu_sess)
- 在脚本中找到“set_keras_session_npu_config”:
import tensorflow as tf import tensorflow.python.keras as keras from tensorflow.python.keras import backend as K from npu_bridge.npu_init import * npu_keras_sess = set_keras_session_npu_config() #数据预处理... #模型搭建... #模型编译... #模型训练...
- 配置“auto_tune_mode”:
import tensorflow as tf import tensorflow.python.keras as keras from tensorflow.python.keras import backend as K from npu_bridge.npu_init import * config_proto = tf.ConfigProto() custom_op = config_proto.graph_options.rewrite_options.custom_optimizers.add() custom_op.name = 'NpuOptimizer' custom_op.parameter_map["auto_tune_mode"].s = tf.compat.as_bytes("RL,GA") npu_keras_sess = set_keras_session_npu_config(config=config_proto) #数据预处理... #模型搭建... #模型编译... #模型训练...
父主题: 更多特性