我正在尝试为回归问题编写张量流代码。我编写了代码,它在单个gpu上运行时效果很好。但是,我想测试一下2 gpus的速度有多快。我使用tf.device修改了2 gpus的代码。但我不知道如何编写cpu上的损失并根据它更新权重?我是否写得正确? 另一个问题是批量大小,如何修改2 gpus的批量大小?
import numpy as np
import tensorflow as tf
import threading
from sklearn import cross_validation
X_train0 = np.load('XTrain006.npy')
ncol = X_train0.shape[0]
Y_train00 = np.load('YTrain006.npy')
Y_train0 = Y_train00[:,:]
print Y_train0.shape[0]
X_train, X_test, Y_train, Y_test = cross_validation.train_test_split(X_train0, Y_train0, test_size=0.1, random_state=42)
XMEAN=np.max(X_train,axis=0)
XSTDD=np.min(X_train,axis=0)
X_train=(X_train-XSTDD)/(XMEAN-XSTDD)
X_test=(X_test-XSTDD)/(XMEAN-XSTDD)
#print X_train[0:10,189:219]
for j in range(3808):
if((XMEAN[j]-XSTDD[j])== 0):
X_train[:,j] = 0.0
X_test[:,j] = 0.0
print XMEAN[189:219]
print XSTDD[189:219]
np.savetxt('xdiff.dat',XMEAN-XSTDD)
np.savetxt('xmin.dat',XSTDD)
np.savetxt('xmax.dat',XMEAN)
YMEAN=np.max(Y_train,axis=0)
YSTDD=np.min(Y_train,axis=0)
Y_trainYY = Y_train
Y_train=(Y_train-YSTDD)/(YMEAN-YSTDD)
Y_test=(Y_test-YSTDD)/(YMEAN-YSTDD)
for j in range(1035):
if(YMEAN[j]-YSTDD[j]== 0):
Y_train[:,j] = Y_trainYY[:,j]
np.savetxt('ydiff.dat',YMEAN-YSTDD)
np.savetxt('ymin.dat',YSTDD)
np.savetxt('ymax.dat',YMEAN)
total_len = X_train.shape[0]
learning_rate = 0.001
training_epochs = 50
batch_size = 64
display_step = 1
# Network Parameters
n_hidden_1 = 64 # 1st layer number of features
n_hidden_2 = 64 # 2nd layer number of features
n_hidden_3 = 64
n_input = 3808
n_classes = 1035
for d in ['/device:GPU:0', '/device:GPU:1']:
with tf.device(d):
# tf Graph input
x = tf.placeholder("float64", [None, 3808])
y = tf.placeholder("float64", [None, 1035])
# Create model
def multilayer_perceptron(x, weights, biases):
# Hidden layer with RELU activation
layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])
layer_1 = tf.nn.sigmoid(layer_1)
# Hidden layer with RELU activation
layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])
layer_2 = tf.nn.sigmoid(layer_2)
# Hidden layer with RELU activation
layer_3 = tf.add(tf.matmul(layer_2, weights['h3']), biases['b3'])
layer_3 = tf.nn.sigmoid(layer_3)
# Output layer with linear activation
out_layer = tf.matmul(layer_3, weights['out']) + biases['out']
return out_layer
with tf.device('/cpu:0'):
# Store layers weight & bias
weights = {
'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1], 0, 1.0, seed = None, dtype=tf.float64)),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2], 0, 1.0, seed = None, dtype=tf.float64)),
'h3': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_3], 0, 1.0, seed = None, dtype=tf.float64)),
'out': tf.Variable(tf.random_normal([n_hidden_3, n_classes], 0, 1.0, seed = None, dtype=tf.float64))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1], 0, 1.0, seed = None, dtype=tf.float64)),
'b2': tf.Variable(tf.random_normal([n_hidden_2], 0, 1.0, seed = None, dtype=tf.float64)),
'b3': tf.Variable(tf.random_normal([n_hidden_3], 0, 1.0, seed = None, dtype=tf.float64)),
'out': tf.Variable(tf.random_normal([n_classes], 0, 1.0, seed = None, dtype=tf.float64))
}
for d in ['/device:GPU:0', '/device:GPU:1']:
with tf.device(d):
# Construct model
pred = multilayer_perceptron(x, weights, biases)
# Define loss and optimizer
cost = tf.reduce_mean(tf.square(pred-y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
# Training cycle
for epoch in range(training_epochs):
avg_cost = 0.
total_batch = int(total_len/batch_size)
# Loop over all batches
for i in range(total_batch-1):
batch_x = X_train[i*batch_size:(i+1)*batch_size]
batch_y = Y_train[i*batch_size:(i+1)*batch_size]
# Run optimization op (backprop) and cost op (to get loss value)
_, c, p = sess.run([optimizer, cost, pred], feed_dict={x: batch_x,
y: batch_y})
# Compute average loss
avg_cost += c / total_batch
# sample prediction
label_value = batch_y
estimate = p
err = label_value-estimate
print ("num batch:", total_batch)
# Display logs per epoch step
if epoch % display_step == 0:
print ("Epoch:", '%04d' % (epoch+1), "cost=", \
"{:.9f}".format(avg_cost))
print ("[*]----------------------------")
for i in xrange(3):
print ("label value:", label_value[i], \
"estimated value:", estimate[i])
print ("[*]============================")
print ("Optimization Finished!")
# Test model
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
# Calculate accuracy
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float64"))
print ("Accuracy:", accuracy.eval({x: X_test, y: Y_test}))
更新 谢谢回复。它仍然只使用一个gpu。如果有任何需要改变的话,你能指导我吗?我的意思是不是需要将所有gpus的成本发送到cpu以更新权重和偏差?
+-----------------------------------------------------------------------------
+
| NVIDIA-SMI 390.30 Driver Version: 390.30 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K40c Off | 00000000:03:00.0 Off | 0 |
| 23% 42C P0 63W / 235W | 10875MiB / 11441MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla K40c Off | 00000000:04:00.0 Off | 0 |
| 23% 44C P0 72W / 235W | 10915MiB / 11441MiB | 42% Default |
+-------------------------------+----------------------+----------------------+
| 2 Quadro K620 Off | 00000000:84:00.0 On | N/A |
| 44% 56C P0 4W / 30W | 997MiB / 1999MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+ ---------------------------------------------- -------------------------------
+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 117392 C python 10861MiB |
| 1 117392 C python 10901MiB |
| 2 117392 C python 17MiB |
| 2 135765 G /usr/lib/xorg/Xorg 623MiB |
| 2 136476 G compiz 341MiB |
+-----------------------------------------------------------------------------+
答案 0 :(得分:0)
您需要会话才能获得正确的启用GPU的配置。
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess: