Tensorflow arka uçlu Keras, isteğe bağlı olarak CPU veya GPU kullanmaya zorlanabilir mi?


100

Keras'ı Tensorflow arka ucu ve CUDA ile kurdum. Bazen talep üzerine Keras'ı CPU kullanmaya zorlamak istiyorum. Bu, sanal bir ortama yalnızca CPU için ayrı bir Tensorflow kurmadan yapılabilir mi? Öyleyse nasıl? Arka uç Theano olsaydı, bayraklar ayarlanabilirdi, ancak Keras aracılığıyla erişilebilen Tensorflow bayraklarını duymadım.

Yanıtlar:


105

Keras'ı CPU kullanmaya zorlamak istiyorsanız

Yol 1

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

Keras / Tensorflow içe aktarılmadan önce.

Yol 2

Komut dosyanızı şu şekilde çalıştırın

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Ayrıca bakınız

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

22
Benim için işe yaramadı (Keras 2, Windows) - os.environ['CUDA_VISIBLE_DEVICES'] = '-1'aşağıdaki cevapta olduğu gibi ayarlamak zorunda kaldı
desertnaut

3
152 numara hangi sorundan bahsediyor? Bir bağlantı güzel olurdu.
Martin

CUDA_DEVICE_ORDER=PCI_BUS_ID152. sayı
2018

Bir ipython3 terminalindeyim ve ayarladım import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , şimdi bunu nasıl "geri alabilirim"? Keras'ın GPU'yu tekrar kullanmasını istiyorum.
Gabriel C

@MartinThoma Demek istediğim, ipython'dan ayrılmak zorunda kalmadan, içinde birçok şey çalıştırdım, bu yüzden "GPU etkin" bir ortama geri dönmek istiyorum. Os.environ sözlüğündeki anahtarları boşuna silmeye çalıştım.
Gabriel C

70

Bunu yapmanın oldukça ayrılabilir bir yolu,

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)

Burada ile booleans GPUve CPUbiz katı erişime izin verilir GPU'lar ve CPU'lar Tensorflow oturumu sayısını tanımlayarak GPU veya CPU ile kod çalıştırmak istediğiniz belirtin. Değişkenler num_GPUve num_CPUbu değeri tanımlar. num_coresdaha sonra intra_op_parallelism_threadsve aracılığıyla kullanılabilen CPU çekirdeği sayısını ayarlar inter_op_parallelism_threads.

intra_op_parallelism_threadsDeğişken dikte parçacıkları hesaplama grafikte, tek bir düğümde bir paralel işlem sayısı kullanımı (intra) bırakılır. Birlikte inter_ops_parallelism_threadsdeğişken hesaplama grafik (arası) düğümlerinde boyunca paralel işlemler için erişilebilir parçacığı sayısını tanımlar.

allow_soft_placement Aşağıdaki kriterlerden herhangi biri karşılanırsa işlemlerin CPU üzerinde çalıştırılmasına izin verir:

  1. işlem için GPU uygulaması yok

  2. bilinen veya kayıtlı GPU cihazı yok

  3. CPU'dan gelen diğer girişlerle aynı yerde bulunmaya ihtiyaç vardır

Bunların tümü, diğer işlemlerden önce sınıfımın yapıcısında yürütülür ve kullandığım herhangi bir modelden veya diğer koddan tamamen ayrılabilir.

Not: Bu, GPU kullanma seçeneği verildiği için kurulmasını gerektirir tensorflow-gpuve cuda/ cudnnyüklenmelidir.

Referanslar:


1
Bu, sadece "CUDA_VISIBLE_DEVICES" 'ın tanımlanması, CUDA_ERROR_NO_DEVICE ve ardından CPU üzerinde çalışmaya devam etmeden önce birçok tanılamaya neden olduğu için güzel bir çözümdür. Yine de ... her iki yöntem de işe yarıyor!
jsfa11

1
Bu benim için çalışan tek tutarlı çözümdür. Ona geri dönmeye devam edin.
Authman Apatira

1
Diğer parametrelerin ne anlama geldiğini açıklar mısınız? gibi allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN

edilir inter/ intra_op_parallelism_threadsişlemci ve GPU işlemleri bakın?
bluesummers

1
@bluesummers CPU paralelleştirme ile ilgilidir
RACKGNOME

62

Bu benim için çalıştı (win10), keras'ı içe aktarmadan önce bir yer:

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

bu ne yapar?
kRazzy R

4
Win ile, TF'yi CPU kullanmaya ve herhangi bir GPU'yu yok saymaya zorlar. 0 veya boşlukla şansı yoktu, ancak -1 hile yapıyor gibi görünüyordu.
Neuraleptic

1
Benim için Win10 x64 üzerinde çalıştı. Ayrıca 0 veya boş kazanma şansım olmadı ve sadece -1 çalıştı.
Cypher

4
Ubuntu'da benim için çalıştı
TripleS

1
Makinemde iki GPU var, 'CUDA_VISIBLE_DEVICES' = 0/1 olarak ayarlamak, mevcut GPU'ların fiziksel kimliğine atıfta bulunuyor. -1 olarak ayarlamak CPU kullanır.
Prashanth Muthurajaiah

31

Sadece tensortflow'u içe aktarın ve keras'ı kullanın, bu kadar kolay.

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
Buradaki en iyi cevap
xssChauhan

5
Ayarladığımda, tf.device('/cpu:0')belleğin daha sonra python'a tahsis edildiğini görebiliyordum nvidia-smi.
CMCDragonkai

@CMCDragonkai Çözün ya da çözmeyin ^ _ ^?
lhdgriver

4
Benim için de işe yaramıyor gibi görünüyor, cpu kullanmaya ayarladığımda hala gpu kullanıyor
liyuan

Aynı zamanda model tanımı ve derlenmesi de aynı altında yürütülmemeli withmi?
matt525252

24

Keras öğreticisine göre , tf.devicenormal tensorflow'daki ile aynı kapsamı kullanabilirsiniz :

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
Bu, Keras katmanlarını çağırmak için Tensorflow kullanmak yerine arka uç olarak Tensorflow kullanılarak Keras içinde nasıl yapılabilir?
mikal94305

Sorunuzu anlamadım. İçindeki kod withherhangi bir Keras kodu olabilir.
sygi

1
Bu, diskten yüklenen eğitimli bir modelle nasıl yapılabilir? Şu anda gpu üzerinde eğitim alıyorum ancak daha sonra CPU üzerinde doğrulamak istiyorum
ghostbust555

3
Model.save ile aradaki modeli kaydettikten sonra keras.models.load_model kullanarak farklı bir tf.device ile yeniden yüklediğim yukarıda belirtilen yöntemi kullanarak eğitimin ortasında eğitimi gpu'dan cpu'ya geçirebildim. Aynı şey, antrenman yapmak ve sonra farklı bir cihazda tahmin etmek istiyorsanız da geçerlidir.
TheLoneNut

3

Bunu çözmek için biraz zaman harcadım. Thoma'nın cevabı tam değil. Diyelim ki programınız, test.pybu programı çalıştırmak için gpu0'ı kullanmak ve diğer gpus'ları serbest tutmak için.

Yazmalısın CUDA_VISIBLE_DEVICES=0 python test.py

Öyle Uyarı DEVICESdeğilDEVICE


0

PyCharm üzerinde çalışan kişiler ve CPU'yu zorlamak için, Ortam değişkenleri altında Çalıştır / Hata Ayıklama yapılandırmasına aşağıdaki satırı ekleyebilirsiniz:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.