25

Tôi đã làm việc với convnetjs trong 1 năm và bây giờ tôi muốn chuyển sang các thư viện mạnh mẽ và nhanh hơn. Tôi nghĩ Tensorflow sẽ là đơn đặt hàng của cường độ nhanh hơn so với một thư viện JS, vì vậy tôi đã viết một mạng lưới thần kinh đơn giản cho cả hai thư viện và đã làm một số xét nghiệm. Nó là một mạng nơ-ron 3-5-5-1, được huấn luyện trên một ví dụ duy nhất cho một số kỷ nguyên nhất định với các lớp SGD và RELU.Tại sao tốc độ chậm hơn Tensorflow 100x so với convnetj trong ví dụ NN đơn giản này?

đang Tensorflow:

import tensorflow as tf 
import numpy 
import time 

NUM_CORES = 1 # Choose how many cores to use. 
sess = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=NUM_CORES, intra_op_parallelism_threads=NUM_CORES)) 

# Parameters 
learning_rate = 0.001 
training_epochs = 1000 
batch_size = 1 

# Network Parameters 
n_input = 3 # Data input 
n_hidden_1 = 5 # 1st layer num features 
n_hidden_2 = 5 # 2nd layer num features 
n_output = 1 # Data output 

# tf Graph input 
x = tf.placeholder("float", [None, n_input], "a") 
y = tf.placeholder("float", [None, n_output], "b") 

# Create model 
def multilayer_perceptron(_X, _weights, _biases): 
    layer_1 = tf.nn.relu(tf.add(tf.matmul(_X, _weights['h1']), _biases['b1'])) #Hidden layer with RELU activation 
    layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2'])) #Hidden layer with RELU activation 
    return tf.matmul(layer_2, _weights['out']) + _biases['out'] 

# Store layers weight & bias 
weights = { 
    'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])), 
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_hidden_2, n_output])) 
} 
biases = { 
    'b1': tf.Variable(tf.random_normal([n_hidden_1])), 
    'b2': tf.Variable(tf.random_normal([n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_output])) 
} 

# Construct model 
pred = multilayer_perceptron(x, weights, biases) 

# Define loss and optimizer 
cost = tf.reduce_sum(tf.nn.l2_loss(pred-y))/batch_size # L2 loss 
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost) # Adam Optimizer 

# Initializing the variables 
init = tf.initialize_all_variables() 

# Launch the graph 
sess.run(init) 

# Training Data 
train_X = numpy.asarray([[0.1,0.2,0.3]]) 
train_Y = numpy.asarray([[0.5]]) 

# Training cycle 
start = time.clock() 
for epoch in range(training_epochs): 
    # Fit training using batch data 
    sess.run(optimizer, feed_dict={x: train_X, y: train_Y}) 
end = time.clock() 

print end - start #2.5 seconds -> 400 epochs per second 
print "Optimization Finished!" 

mã JS:

<!DOCTYPE html> 

<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>Regression example convnetjs</title> 
    <script src="http://cs.stanford.edu/people/karpathy/convnetjs/build/convnet.js"></script> 
    <script src="http://cs.stanford.edu/people/karpathy/convnetjs/build/util.js"></script> 
    <script> 
     var layer_defs, net, trainer; 
     function start() { 
      layer_defs = []; 
      layer_defs.push({ type: 'input', out_sx: 1, out_sy: 1, out_depth: 3 }); 
      layer_defs.push({ type: 'fc', num_neurons: 5, activation: 'relu' }); 
      layer_defs.push({ type: 'fc', num_neurons: 5, activation: 'relu' }); 
      layer_defs.push({ type: 'regression', num_neurons: 1 }); 
      net = new convnetjs.Net(); 
      net.makeLayers(layer_defs); 
      trainer = new convnetjs.SGDTrainer(net, { learning_rate: 0.001, method: 'sgd', batch_size: 1, l2_decay: 0.001, l1_decay: 0.001 }); 

     var start = performance.now(); 
      for(var i = 0; i < 100000; i++) { 
       var x = new convnetjs.Vol([0.1, 0.2, 0.3]); 
       trainer.train(x, [0.5]); 
      } 
     var end = performance.now(); 
     console.log(end-start); //3 seconds -> 33333 epochs per second 
     var predicted_values = net.forward(x); 
      console.log(predicted_values.w[0]); 
     } 

    </script> 
</head> 
<body> 
    <button onclick="start()">Start</button> 
</body> 
</html> 

Kết quả là rằng convnetjs xe lửa cho 100.000 kỷ nguyên trong 3 giây, trong khi Tensorflow huấn luyện cho 1000 kỷ nguyên trong 2,5 giây. Đây có phải là dự kiến ​​không?

Trả lời

15

Có thể có nhiều lý do tại sao:

  • Các dữ liệu đầu vào là quá nhỏ mà phần lớn thời gian là chi tiêu trong chỉ chuyển đổi giữa trăn và cáC++ lõi C, trong khi JS chỉ là một ngôn ngữ.

  • Bạn đang sử dụng chỉ có một cốt lõi trong Tensorflow trong khi JS khả năng có thể tận dụng nhiều hơn một

  • thư viện JS có thể tạo ra một phiên bản JIT tối ưu hóa cao của chương trình.

Lợi ích thực sự của Tensorflow sẽ đến khi phiên bản được phân phối sẽ được công khai. Sau đó, khả năng chạy các mạng lớn trên nhiều nút sẽ quan trọng hơn tốc độ của một nút duy nhất.

+1

Tôi cũng nghĩ rằng để tận dụng tối đa Tensorflow, bạn nên sử dụng nhiều nút và có thể là GPU; thật không may, tôi chạy hầu hết mã của tôi trên một CPU duy nhất. Nhưng dù sao, tôi nên chỉ ra rằng 1) convnetjs chạy trên một lõi đơn, nó đã không có bất kỳ tối ưu hóa để chạy song song (ít nhất là bởi chính nó) 2) Tôi đã thử sử dụng 4 lõi trong Tensorflow trên một máy quad-core, nhưng nó chậm hơn so với sử dụng 1 lõi (nhưng điều này đã được mong đợi). – okh

+0

những câu trả lời này là đập theo ý kiến ​​của tôi. mạng của bạn là siêu nhỏ và một lõi là đủ để chạy nó nhanh như nó sẽ bao giờ chạy. thêm chi phí của TF và bạn sẽ mất. làm cho 10 lớp với 100 đơn vị mỗi và sau đó bạn sẽ thấy nơi nó tỏa sáng. (sử dụng gpu!) – user1269942

12

Còn bây giờ (phiên bản 0.6), việc bạn sử dụng CPU hoặc GPU cho tensorflow là không quan trọng, lưu lượng cũng sẽ chậm trên GPU.

Here are corresponding benchmarks

Tensorflow có thể chậm hơn so với ngọn đuốc, convnetjs, vv trên CPU do:

  1. Bạn có thể sử dụng biểu đồ tính toán không được tối ưu hóa.
  2. TF không quá trưởng thành như ngọn đuốc, convnetj, v.v. Nó đơn giản là không được tối ưu hóa. Tôi hy vọng chưa.
  3. Theo tin nhắn Google không quan tâm đến tối ưu hóa cho một máy. Trần trong tâm trí, mà

    3a) chúng ta đang sống trong cụm tuổi

    3b), bạn can buy 57-core processor for 195$ (tuy nhiên tôi đã không kiểm tra nếu TF làm việc với phần cứng này

    3c) Dưới đây là what google says about their quantum computer. Nhanh hơn 100 triệu lần so với hệ thống thông thường.

TensorFlow là chậm hơn so với caffe, đèn pin, vv trên GPU vì:

  1. TF (như đối với 0.6) không đầy đủ hỗ trợ CUDA 7.5.
  2. TF (cho 0,6) không hỗ trợ cudnn v3 và cudnn v4.

    và điều này làm cho TF 0.6 nhiều đơn đặt hàng chậm hơn so với đối thủ cạnh tranh trên 'máy tính để bàn học/nghiệp dư'.

    Tuy nhiên, có an issue để giải quyết cuda 7.5 và cudnn v3. Tuy nhiên, nó được đóng như trùng lặp với another issue, which is much less concrete (IMHO). Vấn đề thứ hai, vẫn còn mở, không bắt buộc phải hỗ trợ cuda 7.5 và cudnn v3/v4 (vâng, tôi là người bi quan).

Vì vậy, chúng tôi chỉ có thể hoặc là

  1. Hope và chờ cho google để giải quyết những vấn đề này (thêm CUDA 7.5 và cudnn v3/v4 hỗ trợ và giữ TF lên đến hẹn hò với tất cả các cách)
  2. Đóng góp. Vì TF là nguồn mở. Hoặc chờ ai đó đóng góp :)

Tôi đã nhầm lẫn giống như tác giả của câu hỏi này. Tôi hy vọng câu trả lời của tôi đã giúp.

+2

xin lưu ý rằng câu trả lời này là lỗi thời nghiêm trọng, vì chúng tôi đang ở tensorflow 0.10 và phân phối tensorflow đã được phát hành – Julius

+1

tất nhiên! như bây giờ (phiên bản chi nhánh chính trên oct, 6, 2016) tensorflow đã hỗ trợ nvidia cuda 8 và cudnn v8! Giờ đây, lưu lượng có thể thậm chí còn nhanh hơn! –

5

Có, đối với các mô hình nhỏ này dự kiến.

Dòng chảy không được tối ưu hóa cho các mạng thần kinh nhỏ với các lô hàng đơn lẻ vì làm cho chế độ đó nhanh hơn là lãng phí thời gian. Những mô hình này không đắt tiền nên không có điểm. Nếu bạn đã thực hiện kích thước minibatch lớn hơn (64 trường hợp có thể) và mô hình hơi lớn hơn (hàng trăm đơn vị ẩn) tôi mong đợi lưu lượng sẽ nhanh hơn nhiều khi so sánh với thư viện khác.

Hãy tưởng tượng triển khai mạng neural một cách ngây thơ trong python bằng cách sử dụng numpy. Việc triển khai gọn gàng ngây thơ cũng sẽ chậm đối với mô hình này.

0

Sự cố có thể xảy ra với chức năng mất của bạn. Tại sao không thử thay vào đó?

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) 
Các vấn đề liên quan