IT story

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

hot-time 2020. 4. 9. 08:08
반응형

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


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

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

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

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


선택적 인수의 일부로 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별로이를 설정할 수있는 방법이 없습니다.


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

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


다음은이 책에서 발췌 한 것입니다 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 메모리 양을 실제로 바인딩하려는 경우에만 유용합니다.


위의 모든 답변은 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)

TensorFlow 2.0 Alpha 이상 업데이트

2.0 Alpha 문서에서 이제 TensorFlow로 작업을 수행하기 전에 한 줄만 대답하면됩니다.

import tensorflow as tf
tf.config.gpu.set_per_process_memory_growth(True)

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
  • tf.config.experimental.set_memory_growth

https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/config/experimental/set_memory_growth https://www.tensorflow.org/beta/guide/using_gpu#limiting_gpu_memory_growth


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

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


당신이 사용할 수있는

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();
}

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

pip install tensorflow-gpu == 1.8.0


글쎄, 나는 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 획기를 달성 할 수 있었으면 도움이되기를 바랍니다.


# 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))

들어 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)

참고 : https://stackoverflow.com/questions/34199233/how-to-prevent-tensorflow-from-allocating-the-totality-of-a-gpu-memory

반응형