华为模型王者挑战赛经验总结

举报
JeffDing 发表于 2021/12/30 14:52:34 2021/12/30
【摘要】 一、为什么参加岁月寒冬,不知不觉沉迷模型王者挑战赛已经1年了,去年这时候开始了第一届模型王者挑战赛,当时觉得昇腾芯片有点意思,抱着学习的态度就报了第一届的模型王者挑战赛,其实当时也没想过拿奖之类的,毕竟那都是大佬的事情,我这种菜鸟能参加已经是一个很不错的学习机会了。毕竟自己本身也是特别喜欢通过实践去学习知识技能,个人感觉那样的话你可以学的比纯粹看书或者看文档一步一步干巴巴的学要有效率很多。这...

一、为什么参加

岁月寒冬,不知不觉沉迷模型王者挑战赛已经1年了,去年这时候开始了第一届模型王者挑战赛,当时觉得昇腾芯片有点意思,抱着学习的态度就报了第一届的模型王者挑战赛,其实当时也没想过拿奖之类的,毕竟那都是大佬的事情,我这种菜鸟能参加已经是一个很不错的学习机会了。毕竟自己本身也是特别喜欢通过实践去学习知识技能,个人感觉那样的话你可以学的比纯粹看书或者看文档一步一步干巴巴的学要有效率很多。这也就是为什么参加,回首过往时间飞逝,初识参与模型王者挑战赛已经1年了。一年间从第一届玩到第二届,总体玩的还是蛮开心的。也通过大佬们的代码学习到很多新的知识点

二、模王赛带来的收获

第一届模型王者挑战赛毕竟初生牛犊不怕虎,算子做了很多的模型基本上感觉把能做的tensorflow的模型都做了一遍,有ds-cnn、psnet、easnet、vavue等等,基本上第一届能做的大多都跑过,也就是因为跑过这么多,所以第一届的收获就是掌握了sess、Estimator,这两个常用API移植方法。

两种API通用的操作都是先引入一个库

from npu_bridge.npu_init import *

sess.run迁移主要代码:

#创建session
config = tf.ConfigProto()
custom_op = config.graph_options.rewrite_options.custom_optimizers.add()
custom_op.name = "NpuOptimizer"
config.graph_options.rewrite_options.remapping = RewriterConfig.OFF  # 必须显式关闭
config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF  # 必须显式关闭

Estimator迁移主要代码:

npu_config=NPURunConfig(
  model_dir=FLAGS.model_dir,
  save_checkpoints_steps=FLAGS.save_checkpoints_steps,
  session_config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=False) 
  )

mnist_classifier=NPUEstimator(
  model_fn=cnn_model_fn,
  config=npu_config,
  model_dir="/tmp/mnist_convnet_model"
  )

一般拿到一个模型需要一直先找到这两块进行一个修改。当然有些模型还会有dropout,这个的话也建议改成npu上的dropout,类似代码如下:

layers = npu_ops.dropout()

第一届模型王者挑战赛的话收获,白银赛段运气不错DS-CNN模型运气好侥幸拿到了一个第一,到达黄金赛段后性能和精度都比大佬差了一点点。当时尝试了很多的方法,修改超参,尝试不同的优化器等等,但是都没有太大变化。于是就尝试了profiling和autotune这两种文档库里有的方法进行一个优化,但是还是和大佬的性能和精度差一点点。所以只能拿到了一个二等奖,不过对于当初来参加就是抱着学习的态度来的我,感觉已经很不错了。但是输总要找到问题所在,于是我去看了下合入仓库的代码,发现大佬代码上也做了一些优化。突然发现又增长了一些知识。

第二届模型王者挑战赛和第一届惊人的相似,也是靠运气拿到了白银赛的第一,白银赛只要达标就可以了。只能说是运气比较好吧。到了黄金赛又遇到了好多大佬,突然发现难度一定上升很多了,不过既然是来学习的也就没什么压力了,第二届模型王者挑战赛掌握了使用precision_tool工具进行精度调优的手段,所以也算是有所收获。通过这个工具可以分析出有哪些算子精度不太行,然后通过编写json文件加入到黑名单从而提升他的精度。第二届选择的VIDENN模型性能完全没有问题,和GPU几乎是一样,可能还比GPU要快一点,所以就没有做什么性能优化。主要还是把心思放在精度优化,最优的超参也只做到了33.59,离33.66的精度要有还差一点,虽然差不多了,但是精度这东西就是要不能有误差的。所以只能继续努力了。无奈快到ddl还是没有肝出来,后来看到大佬们都做出来了,也就放弃了。

开始转战NLRN,NLRN这个模型是使用Estimator,但是修改代码后发现他的性能比GPU要差很多。最初的设想是是不是需要改成sess方式,但是尝试了下好像难度不小,随后就死马当活马医提了一个issue,慢慢分析。但是最终等到ddl过了还是没找到问题优化。后来我想了下会不会这个方式也需要做一下mix混合精度。于是差了一下文档进行了修改

主要代码如下:

session_config = tf.ConfigProto()
  custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add()
  custom_op.name = "NpuOptimizer"
  custom_op.parameter_map["use_off_line"].b = True
  custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_precision")
  custom_op.parameter_map["modify_mixlist"].s = tf.compat.as_bytes('./ops_info.json')
  session_config.graph_options.rewrite_options.remapping = RewriterConfig.OFF
  session_config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF
  session_config.gpu_options.allow_growth = hparams.allow_growth
  if hparams.xla:
    session_config.graph_options.optimizer_options.global_jit_level = (
        tf.OptimizerOptions.ON_1)
  run_config = NPURunConfig(
      model_dir=hparams.job_dir,
      tf_random_seed=hparams.random_seed,
      save_summary_steps=hparams.save_summary_steps,
      save_checkpoints_steps=hparams.save_checkpoints_steps,
      log_step_count_steps=250,
      precision_mode="allow_mix_precision",
      session_config=session_config,      

通过这样修改以后,训练的性能顿时突飞猛进。也算是找到了问题所在,也掌握了新的技能。

同时我又回看了一下VIDENN这个模型,突然想到以前哪个训练营讲到过loss_scale,会不会TensorFlow也有类似东西。正巧在启智社区搜索dscnn代码的时候发现了已经提交的冠军代码,的确是做了loss_scale manager代码,于是我尝试着加上这段代码

loss_scale_manager = ExponentialUpdateLossScaleManager(init_loss_scale=2**32, incr_every_n_steps=1000, decr_every_n_nan_or_inf=2, decr_ratio=0.5)
loss_scale_optimizer = NPULossScaleOptimizer(opt, loss_scale_manager)
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
	self.train_op = loss_scale_optimizer.minimize(self.loss)

然后讲epoch设置到500,等待他训练完成后他的PSNR值,训练的都能打到34.01,后来进行了test,最终结果33.71

三、模王赛的不足

通过两届模型王者争霸赛充分体现出了自己对于模型性能优化以及精度优化还是存在很多不足的。尤其是精度优化这一块,还有很多的知识技能需要去学习掌握。后来学习昇腾的道路漫漫长。但是不会因为模王赛的失败就不在探索学习这一块,反而更励志找到不足努力去补齐知识技能的空缺,期待未来再有类似活动的时候再一次过来挑战检验自己学习的成果。也期待昇腾未来也能有更多类似的活动,通过比赛活动掌握知识发现不足从而让自己学的更加扎实,是一个永恒的目标。第二届模型王者挑战赛的落幕是一段昇腾模型移植及优化学习的结束,但是同时又是一段新的昇腾模型移植优化相关技术学习的开启,努力朝着做更好的自己继续努力。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。