今天在使用tensorflow-gpu跑一個模型的時候遇到了下述的UnknownError:
經過在網上查詢解決方案之后,弄明白是tensorflow-gpu顯存分配的問題,參考的博客是
# https://blog.csdn.net/weixin_44545603/article/details/103322446 # https://blog.csdn.net/m0_49376111/article/details/115336420?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.vipsorttest&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.vipsorttestz
最終我的解決方法是:
# 錯誤代碼 from __future__ import print_function import tensorflow as tf import numpy as np import matplotlib import matplotlib.pyplot as plt import pandas as pd from tensorflow.keras import layers %matplotlib inline # 解決之后的代碼 from __future__ import print_function import tensorflow as tf physical_devices = tf.config.experimental.list_physical_devices("GPU") if len(physical_devices) > 0: tf.config.experimental.set_memory_growth(physical_devices[0], True) logical_devices = tf.config.list_logical_devices("GPU") import numpy as np import matplotlib import matplotlib.pyplot as plt import pandas as pd from tensorflow.keras import layers %matplotlib inline
解釋一下上述方法,tensorflow中用physical_devices 和 logical_devices分別表示 機器本身的gpu以及在使用過程中的gpu(這個使用過程中的gpu 解釋一下就是比如你兩塊顯卡 其中將一塊顯卡分成了兩部分 那么就是 2 physical_devices 3 logical_devices),通過 tf.config.experimental.list_physical_devices 返回一個列表 來顯示機器本身GPU的一些信息。tf.config.experimental.set_memory_growth() 這個函數為調用哪一塊GPU,在tensorflow中如果你的機器只有一塊顯卡,那么它會默認調用全部的顯存,這個是因為tensorflow本身為了防止顯存碎片的出現(顯存碎片 memory fragemnet就是指計算機不能利用的那部分內存),提高顯卡的利用率。同時tensorflow它也提供了 設置顯卡使用的顯存機制 以及多塊顯卡使用的API,這個之后再寫篇使用的blog。最后加上 logical_devices=tf.config.list_logical_devices("GPU") 就ok了。
需要注意的是哈,補充的那一部分代碼一定要放到 import tensorflow as tf 之后,因為 如果不這樣的話 會出現另外一個問題 就是initiallized 初始化的問題,猜測是因為我在一個base虛擬環境下運行的?(我的tensorflow安裝在base環境中)這個之后有時間可以在嘗試一下。另外,如果還遇到初始化的問題,這可以 重新運行代碼哈!~~
最后附一下我的配置:
系統 win10
顯卡 GTX1660
tensorflow 2.3.0
cudatoolkit == 10.1
cudnn == 7.6.5