2015-12-10 47 views
137

Tôi làm việc trong môi trường mà tài nguyên tính toán được chia sẻ, nghĩa là, chúng tôi có một vài máy chủ được trang bị một vài GPU Nvidia Titan X.Làm thế nào để ngăn chặn lưu lượng tensorflow phân bổ toàn bộ bộ nhớ GPU?

Đối với các mô hình kích thước nhỏ đến vừa, 12GB của Titan X thường đủ cho 2-3 người để chạy đồng thời trên cùng một GPU. Nếu các mô hình đủ nhỏ để một mô hình duy nhất không tận dụng được toàn bộ các đơn vị tính toán của Titan X, điều này thực sự có thể dẫn đến tăng tốc so với chạy một quy trình đào tạo sau khi tiến hành. Ngay cả trong trường hợp truy cập đồng thời vào GPU không làm chậm thời gian đào tạo cá nhân, vẫn còn tốt khi có sự linh hoạt của việc có nhiều người dùng chạy những thứ trên GPU cùng một lúc.

Vấn đề với TensorFlow là theo mặc định, nó phân bổ toàn bộ lượng bộ nhớ khả dụng trên GPU khi nó được khởi chạy. Ngay cả đối với một mạng Neural 2 lớp nhỏ, tôi thấy rằng 12 GB của Titan X được sử dụng hết.

Có cách nào để làm cho TensorFlow chỉ phân bổ, nói, 4GB bộ nhớ GPU, nếu ai biết rằng số tiền đó là đủ cho một mô hình nhất định?

Trả lời

157

Bạn có thể thiết lập các phần bộ nhớ GPU được phân bổ khi bạn xây dựng một tf.Session bằng cách thông qua một tf.GPUOptions như một phần của tùy chọn config luận:

# Assume that you have 12GB of GPU memory and want to allocate ~4GB: 
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333) 

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

Các per_process_gpu_memory_fraction hoạt động như một khó khăn trên ràng buộc về số tiền bộ nhớ GPU sẽ được sử dụng bởi quá trình trên mỗi GPU trên cùng một máy. Hiện tại, phần này được áp dụng thống nhất cho tất cả các GPU trên cùng một máy; không có cách nào để thiết lập điều này trên cơ sở mỗi GPU.

+0

Cảm ơn bạn rất nhiều. Thông tin này khá ẩn trong tài liệu hiện tại. Tôi sẽ không bao giờ tìm thấy nó một mình :-) Nếu bạn có thể trả lời, tôi muốn yêu cầu thêm hai infos: 1- Điều này có giới hạn số lượng bộ nhớ đã từng sử dụng hay chỉ bộ nhớ ban đầu được phân bổ? (ví dụ, nó sẽ vẫn phân bổ bộ nhớ nhiều hơn nếu có nhu cầu cho nó bằng đồ thị tính toán) 2- Có cách nào để thiết lập điều này trên cơ sở cho mỗi GPU không? –

+8

Lưu ý liên quan: đặt CUDA_VISIBLE_DEVICES để giới hạn TensorFlow thành một GPU duy nhất hoạt động cho tôi. Xem http://www.acceleware.com/blog/cudavisibledevices-masking-gpus – rd11

+0

có vẻ như việc cấp phát bộ nhớ đi một chút so với yêu cầu, e..g tôi đã yêu cầu per_process_gpu_memory_fraction = 0.0909 trên một CPU 24443MiB và nhận các quá trình lấy 2627MiB –

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

https://github.com/tensorflow/tensorflow/issues/1578

+4

Đây chính là điều tôi muốn vì trong môi trường đa người dùng, rất bất tiện khi chỉ định chính xác lượng bộ nhớ GPU để dự trữ trong chính mã . – xuancong84

2

Shameless plug: Nếu bạn cài đặt GPU hỗ trợ Tensorflow, đầu phiên giao dịch sẽ phân bổ tất cả các GPU cho dù bạn đặt nó là chỉ sử dụng CPU hay GPU. Tôi có thể thêm tip của tôi rằng ngay cả khi bạn thiết lập đồ thị để sử dụng CPU chỉ bạn nên thiết lập cấu hình tương tự (như đã trả lời ở trên :)) để ngăn chặn sự chiếm đóng GPU không mong muốn.

Và trong giao diện tương tác như IPython bạn cũng nên đặt cấu hình đó, nếu không nó sẽ phân bổ tất cả bộ nhớ và để lại gần như không cho người khác. Điều này đôi khi khó nhận thấy.

3

Dưới đây là một đoạn trích từ Sách Deep Learning with TensorFlow

Trong một số trường hợp đó là mong muốn cho quá trình này chỉ phân bổ một tập hợp con của các bộ nhớ có sẵn, hoặc chỉ phát triển sử dụng bộ nhớ vì nó là cần thiết bởi quá trình. TensorFlow cung cấp hai cấu hình các tùy chọn trên phiên để kiểm soát điều này. Đầu tiên là tùy chọn allow_growth, chỉ cố gắng phân bổ nhiều bộ nhớ GPU dựa trên phân bổ thời gian chạy, nó bắt đầu phân bổ rất ít bộ nhớ, và khi phiên chạy và bộ nhớ GPU càng cần thiết, chúng tôi mở rộng vùng bộ nhớ GPU cần thiết TensorFlow quá trình.

1) Cho phép tăng trưởng: (linh hoạt hơn)

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

Phương pháp thứ hai là per_process_gpu_memory_fraction tùy chọn, trong đó xác định cho phần của mức lượng tổng thể của bộ nhớ mà each GPU có thể nhìn thấy nên được phân bổ. Lưu ý: Không cần giải phóng bộ nhớ, thậm chí có thể làm hỏng bộ nhớ khi thực hiện.

2) Phân bổ bộ nhớ cố định:

Để chỉ phân bổ 40% tổng 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, ...) 

Lưu ý: Đó là chỉ hữu ích mặc dù nếu bạn thực sự muốn liên kết số lượng bộ nhớ GPU có sẵn trên quy trình TensorFlow.

1

Tất cả câu trả lời ở trên giả định thực hiện với lệnh gọi sess.run(), đang trở thành ngoại lệ thay vì quy tắc trong các phiên bản gần đây của TensorFlow.

Khi sử dụng tf.Estimator khuôn khổ (TensorFlow 1,4 trở lên) cách để vượt qua phần cùng với ngầm tạo MonitoredTrainingSession là,

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333) 
conf = tf.ConfigProto(gpu_options=opts) 
trainingConfig = tf.estimator.RunConfig(session_config=conf, ...) 
tf.estimator.Estimator(model_fn=..., 
         config=trainingConfig) 

Tương tự như vậy trong chế độ háo hức (TensorFlow 1,5 trở lên),

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333) 
conf = tf.ConfigProto(gpu_options=opts) 
tfe.enable_eager_execution(config=conf) 
Các vấn đề liên quan