華為模型王者挑戰(zhàn)賽經(jīng)驗(yàn)總結(jié)
一、為什么參加
歲月寒冬,不知不覺沉迷模型王者挑戰(zhàn)賽已經(jīng)1年了,去年這時候開始了第一屆模型王者挑戰(zhàn)賽,當(dāng)時覺得昇騰芯片有點(diǎn)意思,抱著學(xué)習(xí)的態(tài)度就報了第一屆的模型王者挑戰(zhàn)賽,其實(shí)當(dāng)時也沒想過拿獎之類的,畢竟那都是大佬的事情,我這種菜鳥能參加已經(jīng)是一個很不錯的學(xué)習(xí)機(jī)會了。畢竟自己本身也是特別喜歡通過實(shí)踐去學(xué)習(xí)知識技能,個人感覺那樣的話你可以學(xué)的比純粹看書或者看文檔一步一步干巴巴的學(xué)要有效率很多。這也就是為什么參加,回首過往時間飛逝,初識參與模型王者挑戰(zhàn)賽已經(jīng)1年了。一年間從第一屆玩到第二屆,總體玩的還是蠻開心的。也通過大佬們的代碼學(xué)習(xí)到很多新的知識點(diǎn)
二、模王賽帶來的收獲
第一屆模型王者挑戰(zhàn)賽畢竟初生牛犢不怕虎,算子做了很多的模型基本上感覺把能做的tensorflow的模型都做了一遍,有ds-cnn、psnet、easnet、vavue等等,基本上第一屆能做的大多都跑過,也就是因?yàn)榕苓^這么多,所以第一屆的收獲就是掌握了sess、Estimator,這兩個常用API移植方法。
兩種API通用的操作都是先引入一個庫
from npu_bridge.npu_init import *
sess.run遷移主要代碼:
#創(chuàng)建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 # 必須顯式關(guān)閉 config.graph_options.rewrite_options.memory_optimization = RewriterConfig.OFF # 必須顯式關(guān)閉
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" )
一般拿到一個模型需要一直先找到這兩塊進(jìn)行一個修改。當(dāng)然有些模型還會有dropout,這個的話也建議改成npu上的dropout,類似代碼如下:
layers = npu_ops.dropout()
第一屆模型王者挑戰(zhàn)賽的話收獲,白銀賽段運(yùn)氣不錯DS-CNN模型運(yùn)氣好僥幸拿到了一個第一,到達(dá)黃金賽段后性能和精度都比大佬差了一點(diǎn)點(diǎn)。當(dāng)時嘗試了很多的方法,修改超參,嘗試不同的優(yōu)化器等等,但是都沒有太大變化。于是就嘗試了profiling和autotune這兩種文檔庫里有的方法進(jìn)行一個優(yōu)化,但是還是和大佬的性能和精度差一點(diǎn)點(diǎn)。所以只能拿到了一個二等獎,不過對于當(dāng)初來參加就是抱著學(xué)習(xí)的態(tài)度來的我,感覺已經(jīng)很不錯了。但是輸總要找到問題所在,于是我去看了下合入倉庫的代碼,發(fā)現(xiàn)大佬代碼上也做了一些優(yōu)化。突然發(fā)現(xiàn)又增長了一些知識。
第二屆模型王者挑戰(zhàn)賽和第一屆驚人的相似,也是靠運(yùn)氣拿到了白銀賽的第一,白銀賽只要達(dá)標(biāo)就可以了。只能說是運(yùn)氣比較好吧。到了黃金賽又遇到了好多大佬,突然發(fā)現(xiàn)難度一定上升很多了,不過既然是來學(xué)習(xí)的也就沒什么壓力了,第二屆模型王者挑戰(zhàn)賽掌握了使用precision_tool工具進(jìn)行精度調(diào)優(yōu)的手段,所以也算是有所收獲。通過這個工具可以分析出有哪些算子精度不太行,然后通過編寫json文件加入到黑名單從而提升他的精度。第二屆選擇的VIDENN模型性能完全沒有問題,和GPU幾乎是一樣,可能還比GPU要快一點(diǎn),所以就沒有做什么性能優(yōu)化。主要還是把心思放在精度優(yōu)化,最優(yōu)的超參也只做到了33.59,離33.66的精度要有還差一點(diǎn),雖然差不多了,但是精度這東西就是要不能有誤差的。所以只能繼續(xù)努力了。無奈快到ddl還是沒有肝出來,后來看到大佬們都做出來了,也就放棄了。
開始轉(zhuǎn)戰(zhàn)NLRN,NLRN這個模型是使用Estimator,但是修改代碼后發(fā)現(xiàn)他的性能比GPU要差很多。最初的設(shè)想是是不是需要改成sess方式,但是嘗試了下好像難度不小,隨后就死馬當(dāng)活馬醫(yī)提了一個issue,慢慢分析。但是最終等到ddl過了還是沒找到問題優(yōu)化。后來我想了下會不會這個方式也需要做一下mix混合精度。于是差了一下文檔進(jìn)行了修改
主要代碼如下:
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,
通過這樣修改以后,訓(xùn)練的性能頓時突飛猛進(jìn)。也算是找到了問題所在,也掌握了新的技能。
同時我又回看了一下VIDENN這個模型,突然想到以前哪個訓(xùn)練營講到過loss_scale,會不會TensorFlow也有類似東西。正巧在啟智社區(qū)搜索dscnn代碼的時候發(fā)現(xiàn)了已經(jīng)提交的冠軍代碼,的確是做了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設(shè)置到500,等待他訓(xùn)練完成后他的PSNR值,訓(xùn)練的都能打到34.01,后來進(jìn)行了test,最終結(jié)果33.71
三、模王賽的不足
通過兩屆模型王者爭霸賽充分體現(xiàn)出了自己對于模型性能優(yōu)化以及精度優(yōu)化還是存在很多不足的。尤其是精度優(yōu)化這一塊,還有很多的知識技能需要去學(xué)習(xí)掌握。后來學(xué)習(xí)昇騰的道路漫漫長。但是不會因?yàn)槟M踬惖氖【筒辉谔剿鲗W(xué)習(xí)這一塊,反而更勵志找到不足努力去補(bǔ)齊知識技能的空缺,期待未來再有類似活動的時候再一次過來挑戰(zhàn)檢驗(yàn)自己學(xué)習(xí)的成果。也期待昇騰未來也能有更多類似的活動,通過比賽活動掌握知識發(fā)現(xiàn)不足從而讓自己學(xué)的更加扎實(shí),是一個永恒的目標(biāo)。第二屆模型王者挑戰(zhàn)賽的落幕是一段昇騰模型移植及優(yōu)化學(xué)習(xí)的結(jié)束,但是同時又是一段新的昇騰模型移植優(yōu)化相關(guān)技術(shù)學(xué)習(xí)的開啟,努力朝著做更好的自己繼續(xù)努力。
昇騰 機(jī)器學(xué)習(xí)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。