Keras ที่มีแบ็กเอนด์ Tensorflow สามารถบังคับให้ใช้ CPU หรือ GPU ได้หรือไม่


100

ฉันติดตั้ง Keras พร้อมกับแบ็กเอนด์ Tensorflow และ CUDA ฉันต้องการบังคับให้ Keras ใช้ CPU ในบางครั้งตามความต้องการ สามารถทำได้โดยไม่ต้องบอกว่าติดตั้ง Tensorflow เฉพาะ CPU แยกต่างหากในสภาพแวดล้อมเสมือนจริงหรือไม่? ถ้าเป็นอย่างไร หากแบ็กเอนด์เป็น Theano แฟล็กสามารถตั้งค่าได้ แต่ฉันไม่เคยได้ยินเกี่ยวกับแฟล็ก Tensorflow ที่เข้าถึงได้ผ่าน Keras

คำตอบ:


105

หากคุณต้องการบังคับ Keras ให้ใช้ CPU

วิธีที่ 1

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

ก่อนนำเข้า Keras / Tensorflow

วิธีที่ 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
ไม่ได้ผลสำหรับฉัน (Keras 2, Windows) - ต้องตั้งค่าos.environ['CUDA_VISIBLE_DEVICES'] = '-1'ตามคำตอบด้านล่าง
desertnaut

3
ปัญหา # 152 อ้างถึงอะไร ลิงค์จะดี
Martin R.

ฉันไม่เห็นการอ้างอิงถึงCUDA_DEVICE_ORDER=PCI_BUS_IDในฉบับที่ 152
เมื่อ

ฉันอยู่ในเทอร์มินัล ipython3 และฉันได้ตั้งค่า import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" แล้วฉันจะ "เลิกทำ" สิ่งนี้ได้อย่างไร ฉันต้องการให้ Keras ใช้ GPU อีกครั้ง
Gabriel C

@MartinThoma ฉันหมายถึงโดยไม่ต้องออกจาก ipython ฉันมีหลายสิ่งหลายอย่างทำงานอยู่ดังนั้นฉันจึงต้องการตั้งค่ากลับเป็นสภาพแวดล้อม "เปิดใช้งาน GPU" ฉันพยายามลบคีย์ในพจนานุกรม os.environ โดยเปล่าประโยชน์
Gabriel C

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เราระบุว่าเราต้องการรันโค้ดของเราด้วย GPU หรือ CPU หรือไม่โดยกำหนดจำนวน GPU และ CPU อย่างเข้มงวดเพื่อให้เซสชัน Tensorflow ได้รับอนุญาตให้เข้าถึง ตัวแปรnum_GPUและnum_CPUกำหนดค่านี้ num_coresแล้วกำหนดจำนวนของ CPU แกนใช้ได้สำหรับการใช้งานผ่านทางและintra_op_parallelism_threadsinter_op_parallelism_threads

intra_op_parallelism_threadsสั่งตัวแปรจำนวนเธรดการดำเนินการแบบคู่ขนานในโหนดเดียวในกราฟการคำนวณที่ได้รับอนุญาตให้ใช้งาน (ภายใน) ในขณะที่inter_ops_parallelism_threadsตัวแปรกำหนดจำนวนเธรดที่สามารถเข้าถึงได้สำหรับการดำเนินการแบบขนานระหว่างโหนดของกราฟการคำนวณ (ระหว่าง)

allow_soft_placement อนุญาตให้รันการดำเนินการบน CPU หากตรงตามเกณฑ์ใด ๆ ต่อไปนี้:

  1. ไม่มีการใช้ GPU สำหรับการทำงาน

  2. ไม่มีอุปกรณ์ GPU ที่รู้จักหรือลงทะเบียน

  3. จำเป็นต้องระบุตำแหน่งร่วมกับอินพุตอื่น ๆ จาก CPU

ทั้งหมดนี้ดำเนินการในคอนสตรัคเตอร์ของคลาสของฉันก่อนการดำเนินการอื่น ๆ และแยกออกจากโมเดลหรือโค้ดอื่น ๆ ที่ฉันใช้

หมายเหตุ: สิ่งนี้ต้องการ tensorflow-gpuและcuda/ cudnnต้องติดตั้งเนื่องจากมีการกำหนดตัวเลือกให้ใช้ GPU

อ้างถึง:


1
นี่เป็นทางออกที่ดีเนื่องจากการกำหนด "CUDA_VISIBLE_DEVICES" ทำให้เกิด CUDA_ERROR_NO_DEVICE ตามด้วยการวินิจฉัยจำนวนมากก่อนที่จะดำเนินการบน CPU ต่อไป แม้ว่า ... ทั้งสองวิธีจะได้ผล!
jsfa11

1
นี่เป็นทางออกเดียวที่เหมาะกับฉัน ให้กลับมา
Authman Apatira

1
คุณช่วยอธิบายได้ไหมว่าพารามิเตอร์อื่น ๆ หมายถึงอะไร เช่นallow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN

เป็นinter/ intra_op_parallelism_threadsหมายถึงการดำเนินงานของ CPU หรือ GPU?
bluesummers

1
@bluesummers พวกเขาเกี่ยวข้องกับการขนานซีพียู
RACKGNOME

62

สิ่งนี้ใช้ได้ผลสำหรับฉัน (win10) วางก่อนที่คุณจะนำเข้า keras:

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

มันทำอะไร?
kRazzy R

4
ด้วย Win บังคับให้ TF ใช้ CPU และละเว้น GPU ใด ๆ ไม่มีโชคกับ 0 หรือว่างเปล่า แต่ -1 ดูเหมือนจะทำเคล็ดลับ
Neuraleptic

1
ทำงานบน Win10 x64 สำหรับฉัน ฉันยังไม่มีโชคชนะ 0 หรือว่างเปล่าและทำงานได้เพียง -1 เท่านั้น
Cypher

4
ทำงานให้ฉันบน Ubuntu
TripleS

1
ฉันมี GPU สองตัวในเครื่องของฉันการตั้งค่า 'CUDA_VISIBLE_DEVICES' = 0/1 หมายถึง ID ทางกายภาพของ GPU ที่มีอยู่ การตั้งค่าเป็น -1 ใช้ CPU
Prashanth Muthurajaiah

31

เพียงแค่นำเข้า tensortflow และใช้ keras มันง่ายมาก

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
คำตอบที่ดีที่สุดที่นี่
xssChauhan

5
เมื่อฉันตั้งค่าtf.device('/cpu:0')ฉันยังคงเห็นหน่วยความจำที่ถูกจัดสรรให้กับ python ในภายหลังด้วยnvidia-smi.
CMCDragonkai

@CMCDragonkai แก้ได้หรือไม่ ^ _ ^?
lhdgriver

4
ดูเหมือนจะไม่ได้ผลสำหรับฉันเช่นกันยังคงใช้ gpu เมื่อฉันตั้งค่าให้ใช้ cpu
liyuan

ไม่ควรกำหนดแบบจำลองและคอมไพล์ที่ดำเนินการภายใต้เดียวกันwithหรือไม่?
matt525252

24

ตามแบบฝึกหัด Keras คุณสามารถใช้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
วิธีนี้สามารถทำได้ภายใน Keras โดยมี Tensorflow เป็นแบ็กเอนด์แทนที่จะใช้ Tensorflow เพื่อเรียกเลเยอร์ Keras
mikal94305

ฉันไม่เข้าใจคำถามของคุณ รหัสภายในwithสามารถเป็นรหัส Keras ใดก็ได้
sygi

1
จะทำได้อย่างไรกับโมเดลที่ได้รับการฝึกฝนที่โหลดจากดิสก์ ฉันกำลังฝึกอบรมเกี่ยวกับ gpu แต่ต้องการตรวจสอบในภายหลังบน CPU
ghostbust555

3
ฉันสามารถเปลี่ยนการฝึกอบรมจาก gpu เป็น cpu ได้ในระหว่างการฝึกโดยใช้วิธีการที่กล่าวถึงข้างต้นซึ่งฉันบันทึกโมเดลระหว่างกับโมเดลบันทึกจากนั้นโหลดใหม่ด้วยอุปกรณ์ tf.de อื่นโดยใช้ keras.models.load_model ใช้เช่นเดียวกันหากคุณต้องการฝึกแล้วทำนายบนอุปกรณ์อื่น
TheLoneNut

3

ฉันแค่ใช้เวลาคิดออก คำตอบของโธมะยังไม่สมบูรณ์ สมมติว่าโปรแกรมของคุณคือtest.pyคุณต้องการใช้ gpu0 เพื่อรันโปรแกรมนี้และให้ gpus อื่น ๆ ฟรี

คุณควรเขียน CUDA_VISIBLE_DEVICES=0 python test.py

สังเกตว่ามันDEVICESไม่ใช่DEVICE


0

สำหรับผู้ที่ทำงานกับ PyCharm และสำหรับการบังคับ CPU คุณสามารถเพิ่มบรรทัดต่อไปนี้ในการกำหนดค่า Run / Debug ภายใต้ตัวแปรสภาพแวดล้อม:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.