টেনসরফ্লো ব্যাকএন্ড সহ কেরাসকে ইচ্ছা করে সিপিইউ বা জিপিইউ ব্যবহার করতে বাধ্য করা যেতে পারে?


100

আমি কেনারগুলি টেনসরফ্লো ব্যাকএন্ড এবং সিউডিএ ইনস্টল করেছি। আমি কখনও কখনও কেরাসকে সিপিইউ ব্যবহার করার জন্য ডিমান্ড ফোর্স করতে চাই। ভার্চুয়াল পরিবেশে পৃথক সিপিইউ-কেবলমাত্র টেনসরফ্লো ইনস্টল না করে এটি করা যায়? যদি তাই হয়, কিভাবে? যদি ব্যাকএন্ড থিয়ানো হয়, পতাকাগুলি সেট করা যেতে পারে, তবে কেরাসের মাধ্যমে টেনসরফ্লো পতাকা অ্যাক্সেসযোগ্য আমি শুনিনি।

উত্তর:


105

আপনি চাইলে কেরাসকে সিপিইউ ব্যবহার করতে বাধ্য করুন

উপায় 1

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

কেরাস / টেনসরফ্লো আমদানি করার আগে।

উপায় 2

আপনার স্ক্রিপ্ট হিসাবে চালান

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

আরো দেখুন

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

22
আমার জন্য কাজ করেনি (কেরাস 2, উইন্ডোজ) - os.environ['CUDA_VISIBLE_DEVICES'] = '-1'নীচে একটি উত্তর হিসাবে সেট করতে হয়েছিল
মরুভূমি

4
# 152 কোন সমস্যাটি উল্লেখ করছে? একটি লিঙ্ক সুন্দর হবে।
মার্টিন আর।

আমি CUDA_DEVICE_ORDER=PCI_BUS_ID# 152 ইস্যুতে কোনও রেফারেন্স দেখতে পাচ্ছি না
রইল

আমি একটি আইপথন 3 টার্মিনালে আছি এবং আমি সেট করেছি import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , এখন আমি কীভাবে এটি "পূর্বাবস্থায়" রাখতে পারি? আমি চাই কেরাস আবার জিপিইউ ব্যবহার করুন।
গ্যাব্রিয়েল সি

@ মার্টিন থোমা বলতে চাইছি আইপথন না রেখেই আমার অনেক কিছু চালানো হয়েছিল তাই আমি "জিপিইউ সক্ষম" পরিবেশে ফিরে যেতে চাই। আমি অসার পরিবেশের অভিধানে কীগুলি মুছে ফেলার চেষ্টা করেছি।
গ্যাব্রিয়েল সি

70

এটি করার একটি পৃথক পৃথক উপায় হ'ল ব্যবহার করা

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আমরা জিপিইউ বা সিপিইউ দিয়ে জিপিইউ এবং সিপিইউগুলির সংখ্যা কঠোরভাবে সংজ্ঞায়িত করে টেনসরফ্লো সেশনটি অ্যাক্সেসের অনুমতিপ্রাপ্ত কিনা তা দিয়ে আমরা আমাদের কোডটি চালাতে চাই কিনা তা নির্দেশ করি। ভেরিয়েবলগুলি 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. অপারেশনের জন্য কোনও জিপিইউ বাস্তবায়ন নেই

  2. পরিচিত বা নিবন্ধিত কোনও জিপিইউ ডিভাইস নেই

  3. সিপিইউ থেকে অন্যান্য ইনপুটগুলির সাথে সহ-অবস্থানের প্রয়োজন রয়েছে

এই সমস্তগুলি অন্য কোনও ক্রিয়াকলাপের আগে আমার শ্রেণীর নির্মাতায় কার্যকর করা হয় এবং আমি যে কোনও মডেল বা অন্যান্য কোড ব্যবহার করি তা থেকে সম্পূর্ণ পৃথক হয়ে যায়।

দ্রষ্টব্য: এই প্রয়োজন tensorflow-gpuএবং cuda/ cudnnইনস্টল করার জন্য কারণ বিকল্প একটি জিপিইউ ব্যবহার করতে দেওয়া হয়।

রেফার্স:


4
এটি একটি দুর্দান্ত সমাধান যেমন কেবল "CUDA_VISIBLE_DEVICES" সংজ্ঞায়িত করা CUDA_ERROR_NO_DEVICE এর পরে সিপিইউতে চালিয়ে যাওয়ার আগে অনেকগুলি ডায়াগনস্টিকস দেয়। যদিও ... দুটি পদ্ধতিই কাজ করে!
jsfa11

4
এটি আমার পক্ষে একমাত্র ধারাবাহিক সমাধান works এটি ফিরে আসতে থাকুন।
অথম্যান অপটিরা

4
অন্যান্য পরামিতিগুলির অর্থ কী আপনি দয়া করে ব্যাখ্যা করতে পারেন? মত allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan এস এন

হয় inter/ intra_op_parallelism_threadsCPU- র বা জিপিইউ অপারেশন পড়ুন?
ব্লুসিউমার্স

4
@ ব্লুজামার্স তারা সিপিইউ সমান্তরালতার সাথে সম্পর্কিত
রাকগনোম

62

এটি আমার জন্য কাজ করেছে (উইন 10), আপনি কেরাস আমদানির আগে রাখুন:

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

এটা কি করে?
kRazzy আর

4
উইন দিয়ে টিএফকে সিপিইউ ব্যবহার করতে বাধ্য করে এবং কোনও জিপিইউ উপেক্ষা করে ignore 0 বা ফাঁকা দিয়ে ভাগ্য পাননি, তবে -1 দেখে মনে হচ্ছে কৌশলটি করা হয়েছে।
নিউউরলেপটিক

4
আমার জন্য Win10 x64 এ কাজ করেছেন। আমি 0 বা ফাঁকা এবং কেবল -1 কাজ করে কোন ভাগ্য জিতেনি।
সাইফার

4
আমার জন্য উবুন্টুতে কাজ করেছেন
ট্রিপলস

4
আমার মেশিনে আমার দুটি জিপিইউ রয়েছে, 'সিইউডিএ_ভিআইএসআইবিএলডিইডিইভিএস' = 0/1 সেট করে পাওয়া জিপিইউ উপলব্ধ শারীরিক আইডিকে নির্দেশ করে। এটি -1 এ সেট করা সিপিইউ ব্যবহার করে।
প্রশান্ত মুথুরাজাইয়া

31

কেবল টেনসোর্টফ্লো আমদানি করুন এবং কেরাস ব্যবহার করুন, এটি এত সহজ।

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

4
এখানে সেরা উত্তর
xssChauhan

4
যখন আমি সেট করেছিলাম tf.device('/cpu:0'), আমি এখনও দেখতে পেলাম যে পরে স্মৃতিটি অজগরকে বরাদ্দ করা হচ্ছে nvidia-smi
সিএমসিডিগ্রাগনকাই

@CMCDragonkai সমাধান করুন না or _ ^?
lhdgriver

4
আমার জন্যও কাজ করছে বলে মনে হচ্ছে না, আমি সিপিইউ ব্যবহারের জন্য সেট করার পরে এখনও জিপিইউ ব্যবহার করি
liyuan

মডেল সংজ্ঞা এবং একই অধীন সম্পাদিত সংকলন করা উচিত নয় with?
matt525252

24

কেরাস টিউটোরিয়াল অনুসারে , আপনি 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

4
টেনসরফ্লো দিয়ে কেরাস স্তরগুলিতে কল করার পরিবর্তে টেনসরফ্লো দিয়ে কেরাসের মধ্যে এটি কীভাবে করা যায়?
mikal94305

আমি আপনার প্রশ্ন বুঝতে পারি না। ভিতরে withকোডটি কোনও কেরাস কোড হতে পারে।
sygi

4
এটি ডিস্ক থেকে লোড হওয়া প্রশিক্ষিত মডেল দিয়ে কীভাবে করা যায়? আমি বর্তমানে জিপিইউ সম্পর্কে প্রশিক্ষণ দিচ্ছি তবে সিপিইউতে পরে যাচাই করতে চাই
ঘোস্টবস্ট 555

4
আমি উল্লিখিত পদ্ধতিটি ব্যবহার করে যেখানে আমি মডেলকে সংরক্ষণ করি তার মাঝে মাঝখানে জিপিইউ থেকে সিপিইউতে প্রশিক্ষণ স্যুইচ করতে সক্ষম হয়েছিলাম সেভ করে তারপরে কেরাস.মোডেলস.লোড_মোডেল ব্যবহার করে এটি একটি আলাদা tf.device দিয়ে পুনরায় লোড করুন। আপনি যদি প্রশিক্ষণ নিতে চান তবে একই প্রয়োগ করুন তবে কোনও আলাদা ডিভাইসে ভবিষ্যদ্বাণী করুন।
TheLoneNut

3

আমি কিছুটা সময় ব্যয় করেছি এটি বের করার জন্য। থোমার উত্তর সম্পূর্ণ নয়। আপনার প্রোগ্রামটি বলুন test.py, আপনি এই প্রোগ্রামটি চালানোর জন্য জিপিইউ 0 ব্যবহার করতে এবং অন্যান্য জিপাসকে মুক্ত রাখতে চান।

আপনার লেখা উচিত CUDA_VISIBLE_DEVICES=0 python test.py

খেয়াল করুন এটি DEVICESনাDEVICE


0

পাইচার্মে কাজ করা ব্যক্তিদের জন্য, এবং সিপিইউতে বাধ্য করার জন্য, আপনি পরিবেশের ভেরিয়েবলের আওতায় রান / ডিবাগ কনফিগারেশনে নিম্নলিখিত লাইনটি যুক্ত করতে পারেন:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.