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.