4.1 keras指定運行時顯卡及限制GPU用量
https://blog.csdn.net/A632189007/article/details/77978058
#!/usr/bin/env python
# encoding: utf-8
"""
@version: python3.6
@author: Xiangguo Sun
@contact: [email protected]
@site: http://blog.csdn.net/github_36326955
@software: PyCharm
@file: 2CLSTM.py
@time: 17-7-27 5:15pm
"""
import os
import tensorflow as tf
import keras.backend.tensorflow_backend as KTF
#進行配置,每個GPU使用60%上限現存
os.environ["CUDA_VISIBLE_DEVICES"]="1,2" # 使用編號爲1,2號的GPU
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.6 # 每個GPU現存上屆控制在60%以內
session = tf.Session(config=config)
# 設置session
KTF.set_session(session )
4.2 利用fit_generator最小化顯存佔用比率/數據Batch化
#!/usr/bin/env python
# encoding: utf-8
"""
@version: python3.6
@author: Xiangguo Sun
@contact: [email protected]
@site: http://blog.csdn.net/github_36326955
@software: PyCharm
@file: 2CLSTM.py
@time: 17-7-27 5:15pm
"""
#將內存中的數據分批(batch_size)送到顯存中進行運算
def generate_arrays_from_memory(data_train, labels_cat_train, batch_size):
x = data_train
y=labels_cat_train
ylen=len(y)
loopcount=ylen//batch_size
while True:
i = np.random.randint(0,loopcount)
yield x[i*batch_size:(i+1)*batch_size],y[i*batch_size:(i+1)*batch_size]
# 下面的load不會佔用顯示存,而是load到了內存中。
data_train=np.loadtxt("./data_compress/data_train.txt")
labels_cat_train=np.loadtxt('./data_compress/labels_cat_train.txt')
data_val=np.loadtxt('./data_compress/data_val.txt')
labels_cat_val=np.loadtxt('./data_compress/labels_cat_val.txt')
hist=model.fit_generator(
generate_arrays_from_memory(data_train,
labels_cat_train,
bs),
steps_per_epoch=int(train_size/bs),
epochs=ne,
validation_data=(data_val,labels_cat_val),
callbacks=callbacks )
如果你的內存也不夠,你也可以選擇從文件中分批導入:
#!/usr/bin/env python
# encoding: utf-8
"""
@version: python3.6
@author: Xiangguo Sun
@contact: [email protected]
@site: http://blog.csdn.net/github_36326955
@software: PyCharm
@file: 2CLSTM.py
@time: 17-7-27 5:15pm
"""
def process_line(line):
tmp = [int(val) for val in line.strip().split(',')]
x = np.array(tmp[:-1])
y = np.array(tmp[-1:])
return x,y
def generate_arrays_from_file(path,batch_size):
while 1:
f = open(path)
cnt = 0
X =[]
Y =[]
for line in f:
# create Numpy arrays of input data
# and labels, from each line in the file
x, y = process_line(line)
X.append(x)
Y.append(y)
cnt += 1
if cnt==batch_size:
cnt = 0
yield (np.array(X), np.array(Y))
X = []
Y = []
f.close()
更多參考
https://blog.csdn.net/sinat_26917383/article/details/74922230
https://blog.csdn.net/lujiandong1/article/details/54869170
4.3 nvidia-smi 命令查看GPU狀態
nvidia-smi -l
上面的命令可以實現實時跟蹤
一下命令解讀內容來自博客:https://blog.csdn.net/sallyxyl1993/article/details/62220424
這是服務器上特斯拉K80的信息。
上面的表格中:
第一欄的Fan:N/A是風扇轉速,從0到100%之間變動,這個速度是計算機期望的風扇轉速,實際情況下如果風扇堵轉,可能打不到顯示的轉速。有的設備不會返回轉速,因爲它不依賴風扇冷卻而是通過其他外設保持低溫(比如我們實驗室的服務器是常年放在空調房間裏的)。
第二欄的Temp:是溫度,單位攝氏度。
第三欄的Perf:是性能狀態,從P0到P12,P0表示最大性能,P12表示狀態最小性能。
第四欄下方的Pwr:是能耗,上方的Persistence-M:是持續模式的狀態,持續模式雖然耗能大,但是在新的GPU應用啓動時,花費的時間更少,這裏顯示的是off的狀態。
第五欄的Bus-Id是涉及GPU總線的東西,domain:bus:device.function
第六欄的Disp.A是Display Active,表示GPU的顯示是否初始化。
第五第六欄下方的Memory Usage是顯存使用率。
第七欄是浮動的GPU利用率。
第八欄上方是關於ECC的東西。
第八欄下方Compute M是計算模式。
下面一張表示每個進程佔用的顯存使用率。
顯存佔用和GPU佔用是兩個不一樣的東西,顯卡是由GPU和顯存等組成的,顯存和GPU的關係有點類似於內存和CPU的關係。我跑caffe代碼的時候顯存佔得少,GPU佔得多,師弟跑TensorFlow代碼的時候,顯存佔得多,GPU佔得少。
4.4 如何在多張GPU卡上使用Keras?(尚未解決)
這個問題目前還沒有解決。
雖然能夠實現數據分佈在多個GPU上,但是似乎這歌分佈僅僅是把數據複製了一份而已,在訓練過程中,仍然是一個GPU在運算,另一個GPU的Volatile GPU-Util幾乎爲0.
比較有用的鏈接
https://keras-cn.readthedocs.io/en/latest/for_beginners/FAQ/#gpukeras
https://www.zhihu.com/question/67239897/answer/269003621
使用如下代碼會報錯,暫時不知道原因:
#!/usr/bin/env python
# encoding: utf-8
"""
@version: python3.6
@author: Xiangguo Sun
@contact: [email protected]
@site: http://blog.csdn.net/github_36326955
@software: PyCharm
@file: 2CLSTM.py
@time: 17-7-27 5:15pm
"""
import os
from keras.utils import multi_gpu_model
import tensorflow as tf
import keras.backend.tensorflow_backend as KTF
#進行配置,使用60%的GPU
os.environ["CUDA_VISIBLE_DEVICES"]="1,2"
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.6
session = tf.Session(config=config)
# 設置session
KTF.set_session(session )
……
model=multi_gpu_model(model,gpus=2)
#compile the model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
……
報錯爲:cannot merge devices with incompatible ids
4.5 ubuntu如何殺死進程
ps -ef
kill -9 PID