2016-04-29 28 views
13

Tôi chạy bản demo MNIST trong TensorFlow với 2 lớp đối tượng và một lớp toàn conect, tôi nhận được một thông báo 'chạy ra khỏi memeory cố gắng phân bổ 2.59GiB' , nhưng nó cho thấy rằng tổng bộ nhớ là 4.69GiB, và bộ nhớ tự do là 3.22GiB, làm thế nào nó có thể dừng lại với 2.59GiB? Và với mạng lớn hơn, làm thế nào tôi có thể quản lý bộ nhớ gpu? Tôi chỉ quan tâm đến cách sử dụng tốt nhất bộ nhớ gpu và muốn biết nó xảy ra như thế nào, không phải cách phân bổ trước bộ nhớLàm thế nào tôi có thể giải quyết 'hết bộ nhớ gpu' trong TensorFlow

+0

có thể trùng lặp của [Làm thế nào để ngăn chặn tensorflow từ phân bổ tổng thể của một bộ nhớ GPU?] (Http: //stackoverflow.com/questions/34199233/how-to-prevent-tensorflow-from-allocating-the-totality-of-a-gpu-memory) –

+0

Tôi đã thấy nó trước đây, nhưng nó đề cập đến việc cấp phát bộ nhớ gpu, không thiếu bộ nhớ – Fangxin

Trả lời

7

Nó không phải là về điều đó. trước hết, bạn có thể thấy dung lượng bộ nhớ khi nó chạy bằng cách theo dõi gpu của bạn. ví dụ nếu bạn có một gpu nvidia u có thể kiểm tra với lệnh watch -n 1 nvidia-smi. Nhưng trong hầu hết các trường hợp nếu bạn không thiết lập phần bộ nhớ gpu tối đa, nó phân bổ gần như toàn bộ bộ nhớ miễn phí. vấn đề của bạn là thiếu bộ nhớ đủ cho gpu của bạn. mạng cnn hoàn toàn nặng. Khi bạn đang cố gắng để nuôi mạng của bạn KHÔNG làm điều đó với toàn bộ dữ liệu của bạn. Làm thủ tục cho ăn này với kích thước lô thấp.

+4

Tôi có một mạng khá lớn (CNN + LSTM). Dữ liệu đầu vào của tôi có kích thước, batch_size = 5, (5x396x396) - đó là khối lượng 3D. Vì vậy, một kích thước lô khá nhỏ. Tôi đang chạy trên một GTX 1070 với 8GB RAM, nhưng tôi vẫn còn hết bộ nhớ. Có cách nào bạn biết không? Bất kỳ hướng dẫn nào phác thảo cách giải quyết? –

+0

Nó có thể không chỉ vì kích thước lô. Bạn có đang sử dụng bất kỳ hàng đợi nào để tạo các lô nhập liệu (như 'tf.train.shuffle_batch') không? Nếu vậy hãy kiểm tra dung lượng của hàng đợi. – Nandeesh

8

Tôi đã gặp phải lỗi bộ nhớ khi đào tạo CNN nhỏ trên GTX 970. Thông qua phần nào đó, tôi phát hiện ra rằng hãy cho TensorFlow phân bổ bộ nhớ trên GPU khi cần (thay vì lên phía trước) đã giải quyết tất cả vấn đề của tôi . Điều này có thể được thực hiện bằng cách sử dụng mã Python sau:

config = tf.ConfigProto() 
    config.gpu_options.allow_growth = True 
    sess = tf.Session(config = config) 

Trước đây, TensorFlow sẽ phân bổ trước ~ 90% bộ nhớ GPU. Tuy nhiên, đối với một số lý do không rõ, điều này sau này sẽ dẫn đến lỗi bộ nhớ khi tôi tăng kích thước của mạng. Bằng cách sử dụng mã trên, tôi không còn lỗi OOM nữa.

+0

Tính năng này hoạt động trên tập lệnh của tôi mặc dù tôi đang sử dụng keras – Hong

2

Theo mặc định, TensorFlow ánh xạ gần như tất cả bộ nhớ GPU của tất cả các GPU (tùy thuộc vào CUDA_VISIBLE_DEVICES) hiển thị cho quá trình. Điều này được thực hiện để sử dụng hiệu quả hơn các tài nguyên bộ nhớ GPU tương đối quý giá trên các thiết bị bằng cách giảm phân mảnh bộ nhớ.

TensorFlow cung cấp hai tùy chọn Config trên Phiên để kiểm soát điều này.

Đầu tiên là tùy chọn allow_growth, mà cố gắng để phân bổ chỉ càng nhiều bộ nhớ GPU dựa trên phân bổ thời gian chạy:

config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config, ...)

Phương pháp thứ hai là lựa chọn per_process_gpu_memory_fraction, mà quyết định cho phần của mức lượng tổng thể bộ nhớ mà mỗi GPU hiển thị sẽ được phân bổ. Ví dụ, bạn có thể nói TensorFlow chỉ phân bổ 40% tổng số bộ nhớ của mỗi GPU bởi:

config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.4 session = tf.Session(config=config, ...)

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