Tensorflow 백엔드가있는 Keras가 CPU 또는 GPU를 마음대로 사용하도록 강요받을 수 있습니까?


96

Tensorflow 백엔드 및 CUDA와 함께 Keras를 설치했습니다. 때때로 요청시 Keras가 CPU를 사용하도록하고 싶습니다. 가상 환경에 별도의 CPU 전용 Tensorflow를 설치하지 않고도 수행 할 수 있습니까? 그렇다면 어떻게? 백엔드가 Theano이면 플래그를 설정할 수 있지만 Keras를 통해 액세스 할 수있는 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를 가져 오기 전에.

방법 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

19
나 (Keras 2, 윈도우)에 대한 작동하지 않았다 - 세트로했다 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

1
@Gabriel C : 해당 라인을 삭제하여 실행 취소합니다.
Martin Thoma

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 GPUCPU, 우리는 우리가 엄격하게 액세스 할 수있는 GPU를하고 CPU를 Tensorflow 세션의 수를 정의하여 GPU 또는 CPU와 우리의 코드를 실행할지 여부를 나타냅니다. 변수 num_GPU및는 num_CPU이 값을 정의한다. num_cores다음을 통해 사용을 위해 사용 가능한 CPU 코어의 수를 설정 intra_op_parallelism_threads하고를 inter_op_parallelism_threads.

intra_op_parallelism_threads변수가 지시 스레드 연산 그래프는 단일 노드의 병렬 연산의 수는 사용 (인트라)시킨다. 그동안 inter_ops_parallelism_threads변수 계산 그래프 (간)의 노드에서 병렬 연산에 대한 액세스 스레드의 수를 정의한다.

allow_soft_placement 다음 기준 중 하나라도 충족되면 CPU에서 작업을 실행할 수 있습니다.

  1. 작업에 대한 GPU 구현이 없습니다.

  2. 알려 지거나 등록 된 GPU 장치가 없습니다.

  3. CPU의 다른 입력과 같은 위치에 있어야합니다.

이 모든 것은 다른 작업 전에 내 클래스의 생성자에서 실행되며 내가 사용하는 모델이나 다른 코드와 완전히 분리 될 수 있습니다.

참고 : GPU를 사용하기위한 옵션이 제공되기 때문에 설치 tensorflow-gpucuda/ cudnn설치 가 필요합니다 .

참조 :


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_threadsCPU 또는 GPU 조작을 지시?
bluesummers

1
@bluesummers 그들은 CPU 병렬화와 관련이 있습니다
RACKGNOME

57

이것은 나를 위해 일했습니다 (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

내 컴퓨터에 두 개의 GPU가 있으며 'CUDA_VISIBLE_DEVICES'= 0/1 설정은 사용 가능한 GPU의 물리적 ID를 참조합니다. -1로 설정하면 CPU를 사용합니다.
Prashanth Muthurajaiah

30

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')나중에 nvidia-smi.
CMCDragonkai

@CMCDragonkai 풀거나 말거나 ^ _ ^?
lhdgriver

4
나는 CPU를 사용하도록 설정하면 여전히 GPU를 사용하거나 나를 위해 작동하지 않는 것
여원

모델 정의 및 컴파일이 동일한 하에서 실행되지 않아야 with합니까?
matt525252

22

keras tutorial에 따라 tf.device일반 tensorflow에서 와 동일한 범위를 간단히 사용할 수 있습니다 .

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
Tensorflow를 사용하여 Keras 레이어를 호출하는 대신 Tensorflow를 백엔드로 사용하여 Keras 내에서 어떻게 수행 할 수 있습니까?
mikal94305

나는 당신의 질문을 이해하지 못합니다. 내부 코드 with는 모든 Keras 코드 일 수 있습니다.
sygi

1
디스크에서로드 된 훈련 된 모델로 어떻게이 작업을 수행 할 수 있습니까? 나는 현재 GPU에서 훈련하지만, CPU에 나중에 확인하려는거야
ghostbust555

이 모델은 서로 바꿔서 사용할 수 없다고 생각합니다.
sygi dec

3
위에서 언급 한 방법을 사용하여 훈련 도중에 훈련을 gpu에서 cpu로 전환 할 수있었습니다. 여기서 model.save를 사용하여 모델을 저장 한 다음 keras.models.load_model을 사용하여 다른 tf.device로 다시로드했습니다. 훈련하고 다른 장치에서 예측하려는 경우에도 동일하게 적용됩니다.
TheLoneNut 2017-10-05

3

나는 그것을 알아내는 데 시간을 보냈다. 토마의 대답은 완전하지 않습니다. 프로그램이 test.py이고 gpu0을 사용하여이 프로그램을 실행하고 다른 gpus를 무료로 유지하려고합니다.

당신은 작성해야 CUDA_VISIBLE_DEVICES=0 python test.py

그건 알 수 DEVICES없습니다DEVICE


0

PyCharm에서 작업하고 CPU를 강제하기 위해 환경 변수 아래의 실행 / 디버그 구성에 다음 줄을 추가 할 수 있습니다.

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.