Dapatkah Keras dengan backend Tensorflow dipaksa untuk menggunakan CPU atau GPU sesuka hati?

96

Saya telah menginstal Keras dengan backend Tensorflow dan CUDA. Saya terkadang ingin memaksa Keras untuk menggunakan CPU. Bisakah ini dilakukan tanpa mengatakan menginstal Tensorflow khusus CPU yang terpisah di lingkungan virtual? Jika ya, bagaimana caranya? Jika backend adalah Theano, benderanya dapat disetel, tetapi saya belum pernah mendengar tentang bendera Tensorflow yang dapat diakses melalui Keras.

mikal94305
sumber

Jawaban:

102

Jika Anda ingin memaksa Keras menggunakan CPU

Cara 1

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

sebelum Keras / Tensorflow diimpor.

Cara 2

Jalankan skrip Anda sebagai

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Lihat juga

  1. https://github.com/keras-team/keras/issues/152
  2. https://github.com/fchollet/keras/issues/4613
Martin Thoma
sumber
19
Tidak berfungsi untuk saya (Keras 2, Windows) - harus disetel os.environ['CUDA_VISIBLE_DEVICES'] = '-1'seperti pada jawaban di bawah ini
desertnaut
3
Masalah apa yang dimaksud # 152? Tautan akan bagus.
Martin R.
Saya tidak melihat referensi apa pun ke CUDA_DEVICE_ORDER=PCI_BUS_IDdalam edisi # 152
Kamis
Saya berada di terminal ipython3 dan saya telah mengatur import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , sekarang bagaimana cara "membatalkan" ini? Saya ingin Keras menggunakan GPU lagi.
Gabriel C
1
@Gabriel C: Anda membatalkannya dengan menghapus baris tersebut.
Martin Thoma
68

Cara yang agak terpisah untuk melakukan ini adalah dengan menggunakan

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)

Di sini, dengan booleans GPUdan CPU, kami menunjukkan apakah kami ingin menjalankan kode kami dengan GPU atau CPU dengan mendefinisikan secara kaku jumlah GPU dan CPU yang diizinkan untuk diakses sesi Tensorflow. Variabel num_GPUdan num_CPUtentukan nilai ini. num_coreslalu setel jumlah inti CPU yang tersedia untuk digunakan melalui intra_op_parallelism_threadsdan inter_op_parallelism_threads.

The intra_op_parallelism_threadsmendikte variabel jumlah benang operasi paralel dalam satu simpul pada grafik perhitungan diperbolehkan untuk digunakan (intra). Sedangkan inter_ops_parallelism_threadsvariabel menentukan jumlah utas yang dapat diakses untuk operasi paralel di seluruh node grafik komputasi (antar).

allow_soft_placement memungkinkan operasi dijalankan pada CPU jika salah satu kriteria berikut terpenuhi:

  1. tidak ada implementasi GPU untuk operasi tersebut

  2. tidak ada perangkat GPU yang dikenal atau terdaftar

  3. ada kebutuhan untuk bekerja sama dengan input lain dari CPU

Semua ini dijalankan di konstruktor kelas saya sebelum operasi lain, dan sepenuhnya terpisah dari model atau kode lain yang saya gunakan.

Catatan: Ini membutuhkan tensorflow-gpudan cuda/ cudnnharus diinstal karena opsi diberikan untuk menggunakan GPU.

Referensi:

RACKGNOME
sumber
1
Ini adalah solusi yang bagus karena hanya dengan mendefinisikan "CUDA_VISIBLE_DEVICES" menyebabkan CUDA_ERROR_NO_DEVICE diikuti oleh banyak diagnosa sebelum melanjutkan untuk mengeksekusi pada CPU. Padahal ... kedua metode itu berhasil!
jsfa11
1
Ini adalah satu-satunya solusi konsisten yang berhasil untuk saya. Terus kembali ke sana.
Authman Apatira
1
Bisakah Anda menjelaskan apa arti parameter lainnya? seperti allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN
apakah inter/ intra_op_parallelism_threadsmengacu pada operasi CPU atau GPU?
bluesummers
1
@bluesummers Mereka berkaitan dengan paralelisasi CPU
RACKGNOME
57

Ini bekerja untuk saya (win10), tempat sebelum Anda mengimpor keras:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Neuraleptik
sumber
apa fungsinya?
kRazzy R
4
Dengan Win, memaksa TF untuk menggunakan CPU dan mengabaikan GPU apa pun. Tidak beruntung dengan 0 atau kosong, tetapi -1 sepertinya berhasil.
Neuraleptik
1
Bekerja pada Win10 x64 untuk saya. Saya juga tidak beruntung menang 0 atau kosong dan hanya -1 yang bekerja.
Cypher
4
Bekerja untuk saya di Ubuntu
TripleS
Saya memiliki dua GPU di mesin saya, pengaturan 'CUDA_VISIBLE_DEVICES' = 0/1 mengacu pada ID fisik dari GPU yang tersedia. Menyetelnya ke -1 menggunakan CPU.
Prashanth Muthurajaiah
30

Impor saja tensortflow dan gunakan keras, semudah itu.

import tensorflow as tf
# your code here
with tf.device('/gpu:0'):
    model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)
harshlal028
sumber
2
Jawaban terbaik di sini
xssChauhan
5
Ketika saya mengatur tf.device('/cpu:0'), saya masih bisa melihat memori dialokasikan ke python nanti dengan nvidia-smi.
CMCDragonkai
@CMCDragonkai Selesaikan atau tidak ^ _ ^?
lhdgriver
4
Sepertinya tidak berhasil untuk saya juga, masih menggunakan gpu ketika saya mengaturnya untuk menggunakan cpu
liyuan
Haruskah juga definisi model dan kompilasi dijalankan di bawah yang sama with?
matt525252
22

Sesuai tutorial keras , Anda cukup menggunakan tf.devicecakupan yang sama seperti di tensorflow biasa:

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
sygi
sumber
2
Bagaimana ini bisa dilakukan dalam Keras dengan Tensorflow sebagai backend, daripada menggunakan Tensorflow untuk memanggil lapisan Keras?
mikal94305
Saya tidak mengerti pertanyaan Anda. Kode di dalamnya withbisa berupa kode Keras.
sygi
1
Bagaimana hal ini dapat dilakukan dengan model terlatih yang dimuat dari disk? Saat ini saya berlatih tentang GPU tetapi ingin memverifikasi setelahnya pada CPU
ghostbust555
Saya tidak berpikir model ini dapat dipertukarkan.
sygi
3
Saya dapat mengalihkan pelatihan dari gpu ke cpu di tengah-tengah pelatihan dengan menggunakan metode yang disebutkan di atas di mana saya menyimpan model di antara dengan model.save kemudian memuatnya kembali dengan tf.device yang berbeda menggunakan keras.models.load_model. Hal yang sama berlaku jika Anda ingin melatih kemudian memprediksi di perangkat yang berbeda.
TheLoneNut
3

Saya hanya menghabiskan waktu untuk mencari tahu. Jawaban Thoma tidak lengkap. Misalkan program Anda adalah test.py, Anda ingin menggunakan gpu0 untuk menjalankan program ini, dan membiarkan gpus lain tetap gratis.

Anda harus menulis CUDA_VISIBLE_DEVICES=0 python test.py

Perhatikan itu DEVICEStidakDEVICE

DDz
sumber
0

Untuk orang yang bekerja di PyCharm, dan untuk memaksa CPU, Anda dapat menambahkan baris berikut di konfigurasi Run / Debug, di bawah variabel lingkungan:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
pelajar
sumber