當你們在用模型加載,tensorflow-gpu預測的時候,有沒有出現這樣的錯誤??
經過網上的資料查閱,更多的解釋是GPU的顯存不足造成的,於是乎,我查看了一下GPU顯存:nvidia-smi
不看不知道,一看確實是那么回事:tensorflow-gpu執行默認將GPU顯存占滿,官網也做了解釋說明:https://www.tensorflow.org/guide/using_gpu
剛開始沒有看到官網的解釋,思路是當程序執行完成之后,能不能自動的執行釋放顯存的程序,網上這方面的代碼不多,后來又看到上面官網的解釋,顯存不能釋放,可能會有更嚴重的內存碎片,因此程序釋放顯存的想法就打消了。
在仔細看官網的解釋,可能比較好的方法是指定GPU所占的比例,於是乎,我又多次的嘗試:一般來說,這些指定的過程都放在代碼的開始處,因為我用的框架是python的Flask框架,所以我的想法也是將這個指定GPU顯存的代碼放在Flask開始處,不執行不知道,一執行整個人都不好了,報了這個錯:
could not retrieve CUDA device count: CUDA_ERROR_NOT_INITIALIZED: initialization error
What??這是什么錯!在百度,Google,StackOverflow,Github等等網站查找相關問題解釋,大多數解釋是multiprocessing等等的解釋,說實話我確實不是很明白,但我總覺得這個問題沒有復雜到這個地步,因為幾行代碼應該是放在: 使用tensorflow之前!
因為Flask接口用到這個tensorflow之前,我需要初始化一個類實例,在初始化類的時候也用到tensorflow,於是乎,我想把這幾行代碼放在初始化類實例的地方,心態崩了,還是不行!還是報:
could not retrieve CUDA device count: CUDA_ERROR_NOT_INITIALIZED: initialization error
相同的錯誤!這可怎么辦,如果執行一次默認把顯存占滿,后面相同的操作就可能沒辦法執行了,所以必須分配GPU!
想了2天,今天上午,靈感來了,因為我是需要調用接口用到tensorflow,初始化類也是在這個接口里面,意思就是調用這個接口的時候,才會用到tensorflow,於是乎,我這個笨腦子也突然來了想法:直接在調用這個接口的時候,把這幾行代碼放進去,也就相當於初始化的時候執行了這幾行代碼,開始操作:
如圖,將這幾行代碼放在這個位置,在本地嘗試了一下沒有什么問題,於是乎,在服務器代碼執行了相同的操作,開啟服務,跑,跑,跑,沒有報錯!
查看nvidia-smi:GPU顯存占用率果然只占了40%!!!解決了我心頭大患!!
寫這篇隨筆沒有什么其他想法,只是記錄一下自己的坑!記錄一下自己的知識盲點,如果有朋友遇到這樣的問題,可以作為參考,不足的地方望指正批評!