【TF/Guide筆記】 12. Performance
????performance一章里詳細(xì)的介紹了function,大部分跟之前推理的結(jié)果差不多,這里做一些修正:
計算圖并沒有延遲計算的操作,在調(diào)用function的時候,建圖和跑圖是同時完成的,那看來tape.gradient的確可能產(chǎn)生冗余計算
關(guān)于多態(tài),文檔給出了詳細(xì)規(guī)則,對于primitive和nested類型,可以認(rèn)為它判斷值是否完全一致,但對于其他自定義類型,是怎樣都會觸發(fā)多態(tài)的。對于tensor,框架會判斷shape是否一致,也可以手動指定None維來避免多態(tài)
autograph對于分支的包裝,只會操作條件為tensor的if語句。循環(huán)也差不多,只是對for的對象為dataset的時候做了特殊判斷
????后面講了一堆在使用tf.function時可能遇到的問題,其實想明白計算圖的工作原理之后都不難理解。然而tf還是要做這么大篇幅的說明,說明這件事對于熟悉了eager模式的人來說的確不好懂,這也是為了向下兼容帶來的問題吧。
????用大廠做好的產(chǎn)品還有的好處就是配套工具齊全,tf提供了一套profiler,不僅各種統(tǒng)計數(shù)據(jù)齊全,而且可視化做的也蠻好看的??上臋n說,這套profiler是要聯(lián)網(wǎng)的,如果純本地跑會有一些圖表加載不出來,大概會影響美觀,但我理解數(shù)據(jù)還是齊全的。
????關(guān)于計算圖的優(yōu)化,文檔里列了一頁,之前提到過的有常數(shù)折疊,表達(dá)式優(yōu)化,剪枝,這里還有不少其他的,很多我都不大懂,能看懂的有:
????子圖優(yōu)化,應(yīng)該跟表達(dá)式優(yōu)化差不多,一些常用的連續(xù)操作它給寫了更好的實現(xiàn)方法大概是;
????內(nèi)存優(yōu)化,大概是排布了一下內(nèi)存使用的順序?并且讓計算圖使用的峰值內(nèi)存最小,還可以自動把一些暫時不需要的內(nèi)存挪到cpu;
????類似的還有把一些很輕的操作挪到cpu,把gpu上的操作改成16位浮點數(shù)。其他的分支和循環(huán)的簡化,我感覺可能類似編譯上的知識,這我就不大懂了。
????關(guān)于精度的優(yōu)化,這里并不是簡單的把float32換成float16,根據(jù)文檔的描述,打開mixed開關(guān)的話,keras會幫你選合適的精度設(shè)置,保證不會讓訓(xùn)練結(jié)果變差,目前來看,對于fullyconnected來說,大概就是dense的部分用了float16,loss用的float32,activation不好說,但是也不用了解的這么仔細(xì)。
????因為如果針對每個op里的每個步驟都要定義用16還是用32,應(yīng)該需要實驗或者證明來做恰當(dāng)?shù)倪x擇,同時代碼上也會有很多判斷的地方。目前為止,function、strategy、tape、policy,這些東西都是包在外面的設(shè)置,都會對計算圖結(jié)構(gòu)產(chǎn)生影響,keras里動輒上千行代碼,這種東西真是不想自己去搞。
????另外記錄一下,keras還幫用戶做了loss scale,先給loss乘個數(shù),這個數(shù)還是現(xiàn)場算的,最后再給gradient除,以防止中間結(jié)果出0,導(dǎo)致gradient是0。