Keras với phần phụ trợ Tensorflow có thể buộc phải sử dụng CPU hoặc GPU theo ý muốn không?


96

Tôi đã cài đặt Keras với phần phụ trợ Tensorflow và CUDA. Đôi khi tôi muốn buộc Keras sử dụng CPU theo yêu cầu. Điều này có thể được thực hiện mà không cần cài đặt Tensorflow riêng biệt chỉ dành cho CPU trong môi trường ảo không? Nếu vậy thì làm thế nào? Nếu phụ trợ là Theano, các cờ có thể được thiết lập, nhưng tôi chưa nghe nói về cờ Tensorflow có thể truy cập thông qua Keras.

Câu trả lời:


102

Nếu bạn muốn buộc Keras sử dụng CPU

Cách 1

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"   # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""

trước khi Keras / Tensorflow được nhập.

Cách 2

Chạy tập lệnh của bạn với tư cách

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Xem thêm

  1. https://github.com/keras-team/keras/issues/152
  2. https://github.com/fchollet/keras/issues/4613

19
Không hoạt động với tôi (Keras 2, Windows) - phải đặt os.environ['CUDA_VISIBLE_DEVICES'] = '-1'như trong một câu trả lời bên dưới
sa mạc

3
# 152 đề cập đến vấn đề gì? Một liên kết sẽ tốt.
Martin R.

Tôi không thấy bất kỳ tham chiếu nào đến CUDA_DEVICE_ORDER=PCI_BUS_IDtrong số 152
Thawn

Tôi đang ở trong thiết bị đầu cuối ipython3 và tôi đã thiết lập import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , bây giờ làm cách nào để "hoàn tác" điều này? Tôi muốn Keras sử dụng lại GPU.
Gabriel C

1
@Gabriel C: bạn hoàn tác bằng cách xóa những dòng đó.
Martin Thoma

68

Một cách khá tách biệt để làm điều này là sử dụng

import tensorflow as tf
from keras import backend as K

num_cores = 4

if GPU:
    num_GPU = 1
    num_CPU = 1
if CPU:
    num_CPU = 1
    num_GPU = 0

config = tf.ConfigProto(intra_op_parallelism_threads=num_cores,
                        inter_op_parallelism_threads=num_cores, 
                        allow_soft_placement=True,
                        device_count = {'CPU' : num_CPU,
                                        'GPU' : num_GPU}
                       )

session = tf.Session(config=config)
K.set_session(session)

Ở đây, với booleans GPUCPU, chúng tôi cho biết liệu chúng tôi muốn chạy mã của mình với GPU hay CPU bằng cách xác định chặt chẽ số lượng GPU và CPU mà phiên Tensorflow được phép truy cập. Các biến num_GPUnum_CPUxác định giá trị này. num_coressau đó đặt số lõi CPU có sẵn để sử dụng thông qua intra_op_parallelism_threadsinter_op_parallelism_threads.

Các intra_op_parallelism_threadsmệnh lệnh biến số lượng đề một hoạt động song song trong một nút duy nhất trong đồ thị tính toán được phép sử dụng (nội). Trong khi inter_ops_parallelism_threadsbiến xác định số luồng có thể truy cập cho các hoạt động song song trên các nút của đồ thị tính toán (inter).

allow_soft_placement cho phép các hoạt động được chạy trên CPU nếu đáp ứng bất kỳ tiêu chí nào sau đây:

  1. không có triển khai GPU cho hoạt động

  2. không có thiết bị GPU nào được biết đến hoặc đã đăng ký

  3. cần phải đồng định vị trí với các đầu vào khác từ CPU

Tất cả điều này được thực thi trong phương thức khởi tạo của lớp tôi trước bất kỳ hoạt động nào khác và hoàn toàn có thể tách biệt khỏi bất kỳ mô hình hoặc mã nào khác mà tôi sử dụng.

Lưu ý: Điều này yêu cầu tensorflow-gpucuda/ cudnnphải được cài đặt vì tùy chọn được cung cấp để sử dụng GPU.

Refs:


1
Đây là một giải pháp hay vì chỉ cần xác định "CUDA_VISIBLE_DEVICES" gây ra CUDA_ERROR_NO_DEVICE theo sau là rất nhiều chẩn đoán trước khi tiếp tục thực thi trên CPU. Mặc dù ... cả hai phương pháp đều hoạt động!
jsfa11

1
Đây là giải pháp nhất quán duy nhất phù hợp với tôi. Tiếp tục trở lại với nó.
Authman Apatira

1
Bạn có thể vui lòng giải thích những gì các thông số khác có nghĩa là gì? như allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN

inter/ intra_op_parallelism_threadsđề cập đến hoạt động của CPU hoặc GPU?
bluesummers

1
@bluesummers Họ liên quan đến song song hóa CPU
RACKGNOME

57

Điều này phù hợp với tôi (win10), hãy đặt trước khi bạn nhập keras:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

cái này làm gì
kRazzy R

4
Với Win, buộc TF sử dụng CPU và bỏ qua bất kỳ GPU nào. Không gặp may với số 0 hoặc số trống, nhưng -1 dường như có tác dụng.
Neuraleptic

1
Đã làm việc trên Win10 x64 cho tôi. Tôi cũng không có may mắn giành chiến thắng 0 hoặc trống và chỉ có -1 hoạt động.
Cypher

4
Làm việc cho tôi trên Ubuntu
TripleS

Tôi có hai GPU trong máy của mình, cài đặt 'CUDA_VISIBLE_DEVICES' = 0/1 là đề cập đến ID vật lý của GPU có sẵn. Đặt nó thành -1 sẽ sử dụng CPU.
Prashanth Muthurajaiah

30

Chỉ cần nhập tensortflow và sử dụng keras, thật dễ dàng.

import tensorflow as tf
# your code here
with tf.device('/gpu:0'):
    model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)

2
Câu trả lời hay nhất ở đây
xssChauhan 17/02/18

5
Khi tôi đặt tf.device('/cpu:0'), tôi vẫn có thể thấy bộ nhớ được cấp phát cho python sau này với nvidia-smi.
CMCDragonkai

@CMCDragonkai Giải được hay không ^ _ ^?
lhdgriver

4
Không có vẻ làm việc cho tôi, hoặc, vẫn sử dụng gpu khi tôi đặt nó để sử dụng cpu
Liyuan

Cũng không nên định nghĩa mô hình và thực thi biên dịch theo cùng with?
matt525252

22

Theo hướng dẫn keras , bạn có thể chỉ cần sử dụng tf.devicephạm vi tương tự như trong tensorflow thông thường:

with tf.device('/gpu:0'):
    x = tf.placeholder(tf.float32, shape=(None, 20, 64))
    y = LSTM(32)(x)  # all ops in the LSTM layer will live on GPU:0

with tf.device('/cpu:0'):
    x = tf.placeholder(tf.float32, shape=(None, 20, 64))
    y = LSTM(32)(x)  # all ops in the LSTM layer will live on CPU:0

2
Làm thế nào điều này có thể được thực hiện trong Keras với Tensorflow làm phụ trợ, thay vì sử dụng Tensorflow để gọi các lớp Keras?
mikal94305

Tôi không hiểu câu hỏi của bạn. Mã bên trong withcó thể là bất kỳ mã Keras nào.
sygi

1
Làm thế nào điều này có thể được thực hiện với một mô hình được đào tạo được tải từ đĩa? Tôi hiện đang đào tạo trên gpu nhưng muốn xác minh sau đó trên CPU
ghostbust555

Tôi không nghĩ rằng những mô hình này có thể thay thế cho nhau.
sygi

3
Tôi đã có thể chuyển đào tạo từ gpu sang cpu trong quá trình đào tạo bằng cách sử dụng phương pháp đã đề cập ở trên, trong đó tôi lưu mô hình ở giữa với model.save, sau đó tải lại bằng một tf.device khác bằng keras.models.load_model. Áp dụng tương tự nếu bạn muốn đào tạo sau đó dự đoán trên một thiết bị khác.
TheLoneNut

3

Tôi chỉ dành một chút thời gian để tìm ra nó. Câu trả lời của Thoma là không đầy đủ. Giả sử chương trình của bạn là test.py, bạn muốn sử dụng gpu0 để chạy chương trình này và giữ cho gpus khác miễn phí.

Bạn nên viết CUDA_VISIBLE_DEVICES=0 python test.py

Chú ý nó DEVICESkhông phảiDEVICE


0

Đối với những người làm việc trên PyCharm và buộc CPU, bạn có thể thêm dòng sau trong cấu hình Run / Debug, bên dưới các biến Môi trường:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.