keras深度訓練4:GPU設置

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章