[python] tensorflow가 GPU 메모리의 전체를 할당하지 못하게하는 방법은 무엇입니까?
나는 계산 리소스가 공유되는 환경에서 일합니다. 즉, 각각 몇 개의 Nvidia Titan X GPU가 장착 된 서버 시스템이 몇 대 있습니다.
중소형 모델의 경우 12GB의 Titan X는 일반적으로 2 ~ 3 명이 동일한 GPU에서 동시에 교육을 수행하기에 충분합니다. 단일 모델이 GPU의 모든 계산 단위를 충분히 활용할 수 없을 정도로 모델이 작 으면 실제로는 한 번의 교육 프로세스를 실행하는 것과 비교하여 실제로 속도가 향상 될 수 있습니다. GPU에 대한 동시 액세스가 개별 교육 시간을 느리게하는 경우에도 여러 사용자가 동시에 GPU를 교육 할 수있는 유연성을 갖는 것이 좋습니다.
TensorFlow의 문제점은 기본적으로 시작시 사용 가능한 전체 GPU 메모리를 할당한다는 것입니다. 작은 2 계층 신경망에서도 12GB의 GPU 메모리가 모두 사용 된 것을 알 수 있습니다.
주어진 모델에 충분하다는 것을 알고 있다면 TensorFlow가 4GB의 GPU 메모리 만 할당하도록하는 방법이 있습니까?
답변
선택적 인수의 일부로 a tf.Session
를 전달하여 a를 구성 할 때 할당되는 GPU 메모리의 일부를 설정할 수 있습니다 .tf.GPUOptions
config
# 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)
답변
다음은이 책에서 발췌 한 것입니다 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 메모리 양을 실제로 바인딩하려는 경우에만 유용합니다.
답변
TensorFlow 2.0 Alpha 이상 업데이트
2.0 Alpha 문서에서 TensorFlow로 작업을 수행하기 전에 한 줄만 대답하면됩니다.
import tensorflow as tf
tf.config.gpu.set_per_process_memory_growth(True)
답변
위의 모든 답변은 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 및 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)
답변
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
참고 문헌 :
- https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/config/experimental/set_memory_growth
- https://www.tensorflow.org/guide/gpu#limiting_gpu_memory_growth
참조 :
Tensorflow-GPU 사용 : https://www.tensorflow.org/guide/gpu
Tensorflow 2.0 Alpha의 경우이 답변을 참조하십시오