क्या Tensorflow backend वाले Keras को CPU या GPU का उपयोग करने के लिए मजबूर किया जा सकता है?


96

मेरे पास केरस टेंसरफ्लो बैकएंड और सीयूडीएए के साथ स्थापित है। मैं कभी-कभी सीपीयू का उपयोग करने के लिए मांग बल केरस पर चाहता हूं। क्या वर्चुअल वातावरण में एक अलग CPU-केवल Tensorflow स्थापित किए बिना ऐसा किया जा सकता है? यदि हां, तो कैसे? यदि बैकएंड थीनो थे, तो झंडे लगाए जा सकते थे, लेकिन मैंने केरस के माध्यम से सुलभ तेनसफ़्लो के झंडे के बारे में नहीं सुना है।

जवाबों:


102

यदि आप Keras को CPU का उपयोग करने के लिए बाध्य करना चाहते हैं

रास्ता 1

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

Keras / Tensorflow से पहले आयात किया जाता है।

रास्ता २

के रूप में अपनी स्क्रिप्ट चलाएँ

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

यह सभी देखें

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

19
मेरे लिए काम नहीं किया (केरस 2, विंडोज) - os.environ['CUDA_VISIBLE_DEVICES'] = '-1'नीचे एक उत्तर में सेट करना था
सुनसान

3
किस मुद्दे पर # 152 का जिक्र है? एक लिंक अच्छा होगा।
मार्टिन आर।

मुझे CUDA_DEVICE_ORDER=PCI_BUS_IDसमस्या का कोई संदर्भ # 152
Thawn

मैं एक ipython3 टर्मिनल में हूं और मैंने सेट किया है import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , अब मैं इसे "पूर्ववत" कैसे करूं? मैं चाहूंगा कि केरस फिर से जीपीयू का उपयोग करें।
गेब्रियल सी

1
@ गैब्रिएल सी: आप उन पंक्तियों को हटाकर इसे पूर्ववत करें।
मार्टिन थोमा

68

ऐसा करने का एक अलग तरीका है उपयोग करने का

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)

यहां, इसके साथ booleans GPUऔर CPU, हम संकेत देते हैं कि क्या हम GPU या CPU के साथ हमारे कोड को चलाना चाहते हैं और GPUs और CPU की संख्या को निश्चित रूप से परिभाषित करके Tensorflow सेशन को एक्सेस करने की अनुमति है। चर num_GPUऔर num_CPUइस मूल्य को परिभाषित करते हैं। num_coresइसके बाद उपयोग के लिए उपलब्ध सीपीयू कोर की संख्या intra_op_parallelism_threadsऔर inter_op_parallelism_threads

intra_op_parallelism_threadsचर तय कर धागे गणना ग्राफ में एक भी नोड में एक समानांतर आपरेशन की संख्या का उपयोग करें (इंट्रा) करने के लिए अनुमति दी है। जबकि inter_ops_parallelism_threadsचर गणना ग्राफ (इंटर) के नोड्स के समानांतर संचालन के लिए सुलभ थ्रेड्स की संख्या को परिभाषित करता है।

allow_soft_placement सीपीयू पर संचालन के लिए अनुमति देता है यदि निम्न में से कोई भी कसौटी पूरी की जाती है:

  1. ऑपरेशन के लिए कोई GPU कार्यान्वयन नहीं है

  2. ज्ञात या पंजीकृत कोई GPU डिवाइस नहीं हैं

  3. सीपीयू से अन्य इनपुट के साथ सह-पता लगाने की आवश्यकता है

यह सब किसी अन्य ऑपरेशन से पहले मेरी कक्षा के कंस्ट्रक्टर में निष्पादित किया जाता है, और मेरे द्वारा उपयोग किए जाने वाले किसी भी मॉडल या अन्य कोड से पूरी तरह से अलग है।

नोट: इसके लिए tensorflow-gpuऔर cuda/ cudnnस्थापित करने की आवश्यकता है क्योंकि विकल्प GPU का उपयोग करने के लिए दिया गया है।

refs:


1
यह एक अच्छा समाधान है क्योंकि सिर्फ CUDA_ERROR_NO_DEVICE "CUDA_VISIBLE_DEVICES" को परिभाषित करता है, इसके बाद CPU पर क्रियान्वयन जारी रखने से पहले बहुत से निदान किए जाते हैं। हालांकि ... दोनों तरीके काम करते हैं!
jsfa11

1
यह एकमात्र सुसंगत समाधान है जो मेरे लिए काम करता है। इसमें वापस आते रहें।
लेखक अपातिरा

1
क्या आप कृपया समझा सकते हैं कि अन्य मापदंडों का क्या मतलब है? जैसे allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan एस.एन.

कर रहे हैं inter/ intra_op_parallelism_threadsCPU या GPU के संचालन का उल्लेख?
ब्लूसमर्स

1
@bluesummers वे CPU समानांतरन से संबंधित हैं
RACKGNOME

59

यह मेरे लिए काम किया (win10), जगह पहले आप आयात keras:

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

यह क्या करता है?
kRazzy R

4
Win के साथ, TF TF को CPU का उपयोग करने और किसी भी GPU को अनदेखा करने के लिए मजबूर करता है। 0 या रिक्त के साथ भाग्य नहीं था, लेकिन -1 चाल करना प्रतीत होता था।
न्यूराल्टिक

1
मेरे लिए Win10 x64 पर काम किया। मेरे पास 0 या रिक्त कोई भी भाग्य जीत नहीं है और केवल -1 ने काम किया है।
साइपर

4
मेरे लिए उबंटू में काम किया
ट्रिपलएस

मेरी मशीन में मेरे दो GPU हैं, 'CUDA_VISIBLE_DEVICES' = 0/1 की सेटिंग में उपलब्ध GPU की भौतिक आईडी का जिक्र है। इसे -1 पर सेट करना सीपीयू का उपयोग करता है।
प्रशान्त मुथुराजैया

30

बस टेंसरफ्लो को आयात करें और केर का उपयोग करें, यह इतना आसान है।

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
यहाँ सबसे अच्छा जवाब
xssachauhan

5
जब मैंने सेट किया tf.device('/cpu:0'), तब भी मुझे याद आ रहा था कि बाद में अजगर को आवंटित किया जा रहा है nvidia-smi
CMCDragonkai

@CMCDragonkai इसे हल करें या नहीं ^ _ ^?
lhdgriver

4
मेरे लिए काम करने के लिए प्रतीत नहीं होता है, अभी भी gpu का उपयोग करता है जब मैं इसे cpu का उपयोग करने के लिए सेट करता हूं
liyuan

मॉडल परिभाषा भी नहीं होनी चाहिए और उसी के तहत निष्पादित की जानी चाहिए with?
मैट 525252

22

करैस ट्यूटोरियल के अनुसार , आप tf.deviceनियमित स्कोपफ्लो में समान स्कोप का उपयोग कर सकते हैं :

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
यह केरस परतों को कॉल करने के लिए टेन्सरफ्लो का उपयोग करने के बजाय, एक बैकेंड के रूप में टेनेर्सफ्लो के साथ केरस के भीतर कैसे किया जा सकता है?
mikal94305

मैं आपके प्रश्न को नहीं समझता। कोड के अंदर withकोई भी Keras कोड हो सकता है।
सेगी

1
यह डिस्क से लोड एक प्रशिक्षित मॉडल के साथ कैसे किया जा सकता है? मैं वर्तमान में gpu पर प्रशिक्षण ले रहा हूं, लेकिन बाद में CPU
ghostbust555

3
मैं उपर्युक्त विधि का उपयोग करके प्रशिक्षण के बीच में जीपीयू से सीपीयू तक स्विच करने में सक्षम था, जहां मैं मॉडल को मॉडल के बीच में सहेजता हूं। फिर इसे अलग-अलग tf.device के साथ keras.models.load_odel का उपयोग करके पुनः लोड करें। वही लागू होता है यदि आप प्रशिक्षित करना चाहते हैं तो एक अलग डिवाइस पर भविष्यवाणी करें।
लोननॉट

3

मैंने अभी कुछ समय बिताया है। थोमा का उत्तर पूर्ण नहीं है। आपका कार्यक्रम है test.py, तो आप इस कार्यक्रम को चलाने के लिए gpu0 का उपयोग करना चाहते हैं, और अन्य gpus को मुक्त रखना चाहते हैं।

आपको लिखना चाहिए CUDA_VISIBLE_DEVICES=0 python test.py

ध्यान दें यह DEVICESनहीं हैDEVICE


0

PyCharm पर काम कर रहे लोगों के लिए, और सीपीयू को मजबूर करने के लिए, आप रनवे / डिबग कॉन्फ़िगरेशन में निम्नलिखित लाइन जोड़ सकते हैं:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.