tensorflow가 GPU 메모리의 전체를 할당하지 못하게하는 방법은 무엇입니까?


282

나는 계산 리소스가 공유되는 환경에서 일합니다. 즉, 각각 몇 개의 Nvidia Titan X GPU가 장착 된 서버 시스템이 몇 대 있습니다.

중소형 모델의 경우 12GB의 Titan X는 일반적으로 2 ~ 3 명이 동일한 GPU에서 동시에 교육을 수행하기에 충분합니다. 단일 모델이 GPU의 모든 계산 단위를 충분히 활용할 수 없을 정도로 모델이 작 으면 실제로는 한 번의 교육 프로세스를 실행하는 것과 비교하여 실제로 속도가 향상 될 수 있습니다. GPU에 대한 동시 액세스가 개별 교육 시간을 느리게하는 경우에도 여러 사용자가 동시에 GPU를 교육 할 수있는 유연성을 갖는 것이 좋습니다.

TensorFlow의 문제점은 기본적으로 시작시 사용 가능한 전체 GPU 메모리를 할당한다는 것입니다. 작은 2 계층 신경망에서도 12GB의 GPU 메모리가 모두 사용 된 것을 알 수 있습니다.

주어진 모델에 충분하다는 것을 알고 있다면 TensorFlow가 4GB의 GPU 메모리 만 할당하도록하는 방법이 있습니까?

답변:


292

선택적 인수의 일부로 a tf.Session를 전달하여 a를 구성 할 때 할당되는 GPU 메모리의 일부를 설정할 수 있습니다 .tf.GPUOptionsconfig

# Assume that you have 12GB of GPU memory and want to allocate ~4GB:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

per_process_gpu_memory_fraction하드 역할은 상부 같은 기계 각 GPU에 프로세스에 의해 사용되는 GPU 메모리의 양에 결합. 현재이 비율은 동일한 머신의 모든 GPU에 균일하게 적용됩니다. GPU별로이를 설정할 수있는 방법이 없습니다.


3
대단히 감사합니다. 이 정보는 현재 문서에 숨겨져 있습니다. 나는 스스로 그것을 찾지 못했습니다 :-) 대답 할 수 있다면 두 가지 추가 정보를 요청하고 싶습니다. (즉, 계산 그래프에 의해 필요한 경우 여전히 더 많은 메모리를 할당 할 것인가) 2-GPU 단위로이를 설정하는 방법이 있습니까?
Fabien C.

15
관련 참고 : CUDA_VISIBLE_DEVICES를 설정하여 TensorFlow를 단일 GPU로 제한하면 효과적입니다. 참조 acceleware.com/blog/cudavisibledevices-masking-gpus
rd11

2
이는 메모리 할당이 e..g 나는 24443MiB의 GPU에 per_process_gpu_memory_fraction = 0.0909을 요구하고있어 프로세스가 2627MiB 복용 요청을 통해 조금가는 것 같다
jeremy_rutman

2
나는 이것을 작동시킬 수 없다MonitoredTrainingSession
Anjum Sayed

2
@jeremy_rutman 이것이 cudnn 및 cublas 컨텍스트 초기화 때문이라고 생각합니다. 그래도 해당 lib를 사용하는 커널을 실행하는 경우에만 관련이 있습니다.
다니엘

187
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)

https://github.com/tensorflow/tensorflow/issues/1578


13
다중 사용자 환경에서는 코드 자체에 예약 할 GPU 메모리의 정확한 양을 지정하는 것이 매우 불편하기 때문에 이것은 내가 원하는 것입니다.
xuancong84

4
또한 TF 백엔드와 함께 Keras를 사용하는 경우이를 사용하여 실행 from keras import backend as K하고 K.set_session(sess)메모리 제한을 피할 수 있습니다.
Oliver

50

다음은이 책에서 발췌 한 것입니다 Deep Learning with TensorFlow

어떤 경우에는 프로세스가 사용 가능한 메모리의 서브 세트 만 할당하거나 프로세스에 필요한 메모리 사용량 만 늘리는 것이 바람직합니다. TensorFlow는 이를 제어하기 위해 세션에서 두 가지 구성 옵션을 제공합니다 . 첫 번째 allow_growth옵션은 런타임 할당에 따라 많은 양의 GPU 메모리 만 할당하려고 시도하며 매우 적은 메모리 할당을 시작하며 세션이 실행되고 더 많은 GPU 메모리가 필요함에 따라 TensorFlow에 필요한 GPU 메모리 영역을 확장합니다 방법.

1) 성장 허용 : (보다 유연)

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)

두 번째 방법은 per_process_gpu_memory_fraction옵션으로, each가시 GPU가 할당해야하는 전체 메모리 양의 일부를 결정합니다 . 참고 : 메모리를 해제 할 필요가 없으며 완료되면 메모리 조각화가 더 심해질 수 있습니다.

2) 고정 메모리 할당 :

다음을 통해 40%각 GPU의 총 메모리 만 할당하려면 :

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config, ...)

참고 : TensorFlow 프로세스에서 사용 가능한 GPU 메모리 양을 실제로 바인딩하려는 경우에만 유용합니다.


질문과 관련하여 옵션 2가 유용 할 수 있습니다. 일반적으로 GPU 및 동적 네트워크에서 여러 응용 프로그램을 실행하지 않는 경우 '성장 허용'옵션을 사용하는 것이 좋습니다.
aniket


19

위의 모든 답변은 sess.run()호출로 실행되는 것으로 가정 합니다. 이는 최신 버전의 TensorFlow의 규칙이 아니라 예외가됩니다.

사용시 tf.Estimator내재적 생성가 함께 분획을 통과하는 워크 (TensorFlow 1.4 이상) 방식 MonitoredTrainingSession이며

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
conf = tf.ConfigProto(gpu_options=opts)
trainingConfig = tf.estimator.RunConfig(session_config=conf, ...)
tf.estimator.Estimator(model_fn=..., 
                       config=trainingConfig)

마찬가지로 열성 모드 (TensorFlow 1.5 이상)에서

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
conf = tf.ConfigProto(gpu_options=opts)
tfe.enable_eager_execution(config=conf)

편집 : 11-04-2018 예를 들어을 사용하는 tf.contrib.gan.train경우 다음과 비슷한 것을 사용할 수 있습니다.

tf.contrib.gan.gan_train(........, config=conf)

16

Tensorflow 버전 2.0 및 2.1의 경우 다음 스 니펫을 사용하십시오 .

 import tensorflow as tf
 gpu_devices = tf.config.experimental.list_physical_devices('GPU')
 tf.config.experimental.set_memory_growth(gpu_devices[0], True)

이전 버전의 경우 다음 코드 조각이 저에게 효과적이었습니다.

import tensorflow as tf
tf_config=tf.ConfigProto()
tf_config.gpu_options.allow_growth=True
sess = tf.Session(config=tf_config)

10

Tensorflow 2.0 베타 및 (아마도) 그 너머

API가 다시 변경되었습니다. 이제 다음에서 찾을 수 있습니다.

tf.config.experimental.set_memory_growth(
    device,
    enable
)

별칭 :

  • tf.compat.v1.config.experimental.set_memory_growth
  • tf.compat.v2.config.experimental.set_memory_growth

참고 문헌 :

참조 : Tensorflow-GPU 사용 : https://www.tensorflow.org/guide/gpu

Tensorflow 2.0 Alpha의 경우이 답변을 참조하십시오


9

당신이 사용할 수있는

TF_FORCE_GPU_ALLOW_GROWTH=true

환경 변수에서.

에서 tensorflow 코드 :

bool GPUBFCAllocator::GetAllowGrowthValue(const GPUOptions& gpu_options) {
  const char* force_allow_growth_string =
      std::getenv("TF_FORCE_GPU_ALLOW_GROWTH");
  if (force_allow_growth_string == nullptr) {
    return gpu_options.allow_growth();
}

5

뻔뻔한 플러그 : GPU 지원 Tensorflow를 설치하면 세션은 CPU 또는 GPU 만 사용하도록 설정했는지 여부에 관계없이 먼저 모든 GPU를 할당합니다. 그래프를 CPU 만 사용하도록 설정하더라도 원치 않는 GPU 점령을 방지하기 위해 동일한 구성을 설정해야합니다 (위의 답변 :)).

그리고 IPython과 같은 대화 형 인터페이스에서 구성을 설정해야합니다. 그렇지 않으면 모든 메모리가 할당되고 다른 메모리는 거의 남기지 않습니다. 때때로 눈치 채기가 어렵습니다.


3

들어 Tensorflow 2.0이 솔루션은 날 위해 일했습니다. (TF-GPU 2.0, Windows 10, GeForce RTX 2070)

physical_devices = tf.config.experimental.list_physical_devices('GPU')
assert len(physical_devices) > 0, "Not enough GPU hardware devices available"
tf.config.experimental.set_memory_growth(physical_devices[0], True)

1
TF-GPU 2.0, Ubuntu 16.04.6, Tesla K80을 사용하고 있습니다.
azar

@azar-공유해 주셔서 감사합니다. 우분투와 Windows에서 같은 문제가 흥미 롭습니다. 어떻게 든 하드웨어에 가까워지면 항상 문제가 다르다고 생각합니다. 아마도 시간이 지남에 따라 점점 줄어들고 있습니다.
Sunsetquest

3

Tensorflow 2를 사용하는 경우 다음을 시도하십시오.

config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.compat.v1.Session(config=config)


1

나는 voc 데이터 세트에서 unet을 훈련하려고 시도했지만 거대한 이미지 크기 때문에 메모리가 완성되었습니다. 위의 모든 팁을 시도했지만 배치 크기 = = 1로 시도했지만 아직 개선되지 않았습니다. 때때로 TensorFlow 버전은 메모리 문제를 유발합니다. 사용하여 시도

pip install tensorflow-gpu == 1.8.0


1

글쎄, 나는 tensorflow를 처음 사용하고, Geforce 740m 또는 2GB 램이있는 GPU를 가지고 있으며 38700 이미지와 4300 테스트 이미지가 포함 된 훈련 데이터로 모국어에 대한 mnist 필기 종류의 예제를 실행 중이며 정밀도를 얻으려고했습니다. sklearn으로 다음 코드를 사용하는 F1은 정확한 결과를 얻지 못했습니다. 기존 코드에 이것을 추가하면 GPU 오류가 발생하기 시작했습니다.

TP = tf.count_nonzero(predicted * actual)
TN = tf.count_nonzero((predicted - 1) * (actual - 1))
FP = tf.count_nonzero(predicted * (actual - 1))
FN = tf.count_nonzero((predicted - 1) * actual)

prec = TP / (TP + FP)
recall = TP / (TP + FN)
f1 = 2 * prec * recall / (prec + recall)

플러스 내 모델은 무거웠습니다 .147, 148 epochs 후에 메모리 오류가 발생했습니다. 왜 작업에 대한 함수를 작성하지 않는지 생각했기 때문에 tensrorflow 에서이 방식으로 작동하는지 모르겠지만 로컬 변수가 범위를 벗어나면 메모리를 해제 할 수 있으며 모듈에서 교육 및 테스트를 위해 위의 요소를 정의하면 아무런 문제없이 10000 획기를 달성 할 수 있었으면 도움이되기를 바랍니다.


나는 TF의 유틸리티뿐만 아니라 메모리 사용에 놀랐습니다. CPU python에서 30GB 정도를 할당하면 TF 예제에 사용 된 꽃 데이터 세트에 대한 훈련 작업이 수행됩니다. 미친 것 같은.
Eric M

1
# allocate 60% of GPU memory 
from keras.backend.tensorflow_backend import set_session
import tensorflow as tf 
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.6
set_session(tf.Session(config=config))

제공된 답변은 검토를 위해 저품질 게시물로 표시되었습니다. 다음은 좋은 답변을 작성하는 방법에 대한 몇 가지 지침입니다 . . 이 답변은 정확할 수도 있지만 설명을 통해 도움이 될 수 있습니다. 코드 전용 답변은 "좋은"답변으로 간주되지 않습니다. 에서 검토 .
Trenton McKinney
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.