2016-03-24 26 views
6

Tôi có một vòng lặp trong TensorFlow trông như thế này:Làm cách nào để giảm mức tiêu thụ bộ nhớ trong một vòng lặp trong TensorFlow?

with tf.device("/gpu:1"): 
    losses = [] 

    for target, output in zip(targets, lstm_outputs): 
     logits = tf.matmul(W, output) + b 
     loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, target) 
     losses.append(loss) 

    total_loss = tf.add_n(losses) 

Tôi nhận được một lỗi oom khi phân bổ các gradient cho lớp này, vì mỗi nhân ma trận là một hoạt động khác nhau trong đồ thị dùng bộ nhớ. Có cách nào ngăn TensorFlow phân bổ tất cả các hoạt động này cùng một lúc không?

Trả lời

7

Đây là đồ thị đầy thử thách cho TensorFlow để tối ưu hóa, vì các kích hoạt từ mỗi lớp phải được giữ để tổng hợp một gradient đơn cho W. Một khả năng là chuyển đối số experimentalaggregation_method khi gọi optimizer.optimize().

Ví dụ, bạn có thể thử như sau:

optimizer = tf.train.AdagradOptimizer(...) # Or another optimization algorithm. 
train_op = optimizer.minimize(
    total_loss, 
    aggregation_method=tf.AggregationMethod.EXPERIMENTAL_ACCUMULATE_N) 

Tùy chọn này háo hức tập hợp các gradient cho các biến định kỳ được sử dụng tại chỗ, chứ không phải là giữ cho chúng tất cả trong bộ nhớ cho đến khi tất cả các gradient đã được tính toán. Nếu cách này không hiệu quả, thì tf.AggregationMethod.EXPERIMENTAL_TREE có thể hoạt động tốt hơn.

+1

Tôi đã thử hai EXPERIMENTAL_ACCUMULATE_N và EXPERIMENTAL_TREE này không có kết quả. Tôi sẽ thử sử dụng một vòng lặp while. – Maarten

+1

Tôi đã có thể giải quyết vấn đề này, bằng cách cập nhật từ bản phát hành ổn định thành bản chính kết hợp với việc sử dụng EXPERIMENTAL_ACCUMULATE_N. @ cám ơn vì những nỗ lực và sự đáp ứng của bạn. – Maarten

Các vấn đề liên quan