2016-01-11 20 views
6

Tôi đang thử nghiệm với các mô hình Theano khác nhau và sử dụng một chương trình giảng dạy có độ dài chuỗi ngày càng tăng. Làm thế nào tôi có thể dự đoán trước thời gian làm thế nào lớn để làm cho kích thước lô cho bất kỳ chiều dài chuỗi và mô hình nhất định để lấp đầy bộ nhớ của GPU? Để làm cho vấn đề tồi tệ hơn, nếu tôi vô tình sử dụng quá nhiều bộ nhớ, tôi nhận được một MemoryError và bộ nhớ trên GPU không được giải phóng, yêu cầu tôi phải khởi động lại quá trình để giải phóng bộ nhớ, và mất mạng của tôi, trước khi thử kích thước lô mới. Vì lỗi này không thể khôi phục được, rất khó để chỉ tăng kích thước lô cho đến khi ngoại lệ và sau đó quay trở lại.Cách tính toán mức sử dụng bộ nhớ GPU trong Theano?

Trả lời

7

Giả sử bạn biết số lượng phần tử được lưu trữ trên GPU, bạn có thể dễ dàng tính toán lượng bộ nhớ cần thiết để lưu trữ các phần tử đó.

Một ví dụ đơn giản:

import numpy as np 
import theano.tensor as T 
T.config.floatX = 'float32' 
dataPoints = np.random.random((5000, 256 * 256)).astype(T.config.floatX) 
#float32 data type requires 4 bytes 
sizeinGBs = 5000 * 256 * 256 * 4/1024./1024/1024 + (some small over-head constant) 
print "Data will need %2f GBs of free memory" % sizeInGB 

Giả sử hằng số trên đầu là 0 sẽ in:

>>> Data will need 1.22 GBs of free memory 

Nếu bạn đang sử dụng một card đồ họa NVIDIA và đã cài đặt CUDA trên máy tính của bạn sau đó bạn có thể dễ dàng nhận được tổng dung lượng bộ nhớ miễn phí trên GPU của bạn bằng cách sử dụng dòng mã sau:

import theano.sandbox.cuda.basic_ops as sbcuda 
import numpy as np 
import theano.tensor as T 
T.config.floatX = 'float32' 
GPUFreeMemoryInBytes = sbcuda.cuda_ndarray.cuda_ndarray.mem_info()[0] 
freeGPUMemInGBs = GPUFreeMemoryInBytes/1024./1024/1024 
print "Your GPU has %s GBs of free memory" % str(freeGPUMemInGBs) 
#An operation is to be executed below 
testData = shared(np.random.random((5000, 256 * 256)).astype(T.config.floatX), borrow = True) 
print "The tasks above used %s GBs of your GPU memory. The available memory is %s GBs" % (str(freeGPUMemInGBs - GPUFreeMemoryInBytes/1024./1024/1024), str(GPUFreeMemoryInBytes/1024./1024/1024)) 

Sau đó, đầu ra là trong các định dạng sau (đối với máy tính của tôi ở đây):

>>> Your GPU has 11.2557678223 GBs of free memory 
>>> The tasks above used 1.22077941895 GBs of your GPU memory. The available memory is 10.0349884033 GBs 

Bằng cách theo dõi dung lượng bộ nhớ miễn phí và tính toán kích thước của mô hình của bạn/dữ liệu bạn có thể sử dụng tốt hơn bộ nhớ GPU. Tuy nhiên, hãy lưu ý vấn đề memory fragmentation vì nó có thể gây ra bất ngờ MemoryError.

+1

Câu trả lời hay, cảm ơn! – Will

+0

Vì vậy, có vẻ như phương pháp đáng tin cậy nhất sẽ hợp nhất cả của bạn và các đề xuất của bạn. Trước khi chạy một mô hình mới, tôi sẽ đo mức sử dụng bộ nhớ cho các chuỗi độ dài khác nhau và sử dụng để dự đoán lượng bộ nhớ sẽ được sử dụng cho các độ dài chuỗi khác và xác định kích thước lô tối ưu. Cảm ơn –

2

Dường như Theano không có bất kỳ cách tích hợp nào để ước tính kích thước bộ nhớ của một mô hình. Đặt cược tốt nhất của bạn là tạo một tập hợp con nhỏ của mô hình với kích thước đã biết và sử dụng các kỹ thuật ước lượng bộ nhớ được mô tả here trong sách hướng dẫn của Theano. Chúng tôi cũng sẽ cần phải tính đến cách các đối tượng của chúng tôi được thể hiện bên trong GPU (ví dụ chúng tôi đang sử dụng float32 hoặc float64 và mỗi byte mất bao nhiêu byte bên trong GPU).

Khi bạn có thể ước tính kích thước của một mô hình nhỏ, sau đó bạn có thể chiếu các ước tính này lên kích thước của một mô hình lớn hơn nhiều với độ chính xác hợp lý. Bạn sẽ có thể viết chức năng ước lượng bộ nhớ của riêng mình có thể lấy một số tính năng và quan sát, hoặc tensors hoặc các nút đồ thị dưới dạng tham số và trả về số lượng sử dụng bộ nhớ.

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