Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

GPU kullanın

TensorFlow.org'da görüntüleyin Google Colab'de çalıştırın Kaynağı GitHub'da görüntüleyin Defteri indirin

TensorFlow kodu ve tf.keras modelleri, kod değişikliği gerekmeden şeffaf bir şekilde tek bir GPU üzerinde çalışır.

Birden çok GPU'da, bir veya daha fazla makinede çalıştırmanın en basit yolu Dağıtım Stratejileri kullanmaktır.

Bu kılavuz, bu yaklaşımları deneyen ve TensorFlow'un GPU'yu nasıl kullandığına ilişkin ayrıntılı kontrole ihtiyaç duyduklarını fark eden kullanıcılar içindir. Tekli ve çoklu GPU senaryolarında performans sorunlarının nasıl ayıklanacağını öğrenmek için TensorFlow GPU Performansını Optimize Etme kılavuzuna bakın.

Kurmak

En son TensorFlow gpu sürümünün kurulu olduğundan emin olun.

import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))
Num GPUs Available:  2

Genel Bakış

TensorFlow, CPU ve GPU dahil olmak üzere çeşitli cihaz türlerinde hesaplama çalıştırmayı destekler. Dize tanımlayıcılarla temsil edilirler, örneğin:

  • "/device:CPU:0" : Makinenizin CPU'su.
  • "/GPU:0" : Makinenizin TensorFlow tarafından görülebilen ilk GPU'su için kısa el notasyonu.
  • "/job:localhost/replica:0/task:0/device:GPU:1" : Makinenizin ikinci GPU'sunun TensorFlow tarafından görülebilen tam nitelikli adı.

Bir TensorFlow işleminde hem CPU hem de GPU uygulamaları varsa, işlem bir cihaza atandığında varsayılan olarak GPU cihazlarına öncelik verilir. Örneğin, tf.matmul hem CPU hem de GPU çekirdeğine sahiptir. CPU:0 ve GPU:0 cihazlarına sahip bir sistemde, başka bir cihazda çalıştırmayı açıkça tf.matmul sürece, tf.matmul çalıştırmak için GPU:0 cihazı seçilecektir.

Cihaz yerleşimini günlüğe kaydetme

İşlemlerinizin ve tensörlerin hangi cihazlara atandığını bulmak için, programınızın ilk ifadesi olarak tf.debugging.set_log_device_placement(True) koyun. Aygıt yerleştirme günlüğünün etkinleştirilmesi, tüm Tensor tahsislerinin veya işlemlerinin yazdırılmasına neden olur.

tf.debugging.set_log_device_placement(True)

# Create some tensors
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)

print(c)
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

Yukarıdaki kod, MatMul GPU:0 üzerinde yürütüldüğüne dair bir gösterge MatMul .

Manuel cihaz yerleştirme

Belirli bir işlemin sizin için otomatik olarak seçilenler yerine seçtiğiniz bir cihazda çalışmasını istiyorsanız, bir cihaz bağlamı oluşturmak için with tf.device kullanabilirsiniz ve bu bağlamdaki tüm işlemler aynı belirlenmiş cihazda çalışacaktır. .

tf.debugging.set_log_device_placement(True)

# Place tensors on the CPU
with tf.device('/CPU:0'):
  a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])

# Run on the GPU
c = tf.matmul(a, b)
print(c)
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

Şimdi a ve b CPU:0 atandığını göreceksiniz. Bir cihaz MatMul işlemi için açıkça belirtilmediğinden, TensorFlow çalışma zamanı, işleme ve mevcut cihazlara (bu örnekte GPU:0 ) bağlı olarak birini seçecek ve gerekirse tensörleri cihazlar arasında otomatik olarak kopyalayacaktır.

GPU bellek büyümesini sınırlama

Varsayılan olarak, TensorFlow işlem tarafından görülebilen tüm GPU'ların ( CUDA_VISIBLE_DEVICES tabi) neredeyse tüm GPU belleğini CUDA_VISIBLE_DEVICES . Bu, bellek parçalanmasını azaltarak cihazlar üzerindeki nispeten değerli GPU bellek kaynaklarını daha verimli kullanmak için yapılır. TensorFlow'u belirli bir GPU kümesiyle sınırlamak için tf.config.experimental.set_visible_devices yöntemini kullanırız.

gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only use the first GPU
  try:
    tf.config.experimental.set_visible_devices(gpus[0], 'GPU')
    logical_gpus = tf.config.experimental.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
  except RuntimeError as e:
    # Visible devices must be set before GPUs have been initialized
    print(e)
2 Physical GPUs, 1 Logical GPU

Bazı durumlarda, işlemin, kullanılabilir belleğin yalnızca bir alt kümesini tahsis etmesi veya bellek kullanımını yalnızca işlemin ihtiyaç duyduğu şekilde büyütmesi istenebilir. TensorFlow bunu kontrol etmek için iki yöntem sağlar.

İlk seçenek, yalnızca çalışma zamanı ayırmaları için gerektiği kadar GPU belleği ayırmaya çalışan tf.config.experimental.set_memory_growth çağırarak bellek büyümesini tf.config.experimental.set_memory_growth : çok az bellek ayırmaya başlar ve program çalıştırıldığında ve daha fazla GPU belleğine ihtiyaç duyulduğunda, TensorFlow işlemine ayrılan GPU bellek bölgesini genişletiyoruz. Belleğin parçalanmasına neden olabileceği için belleği serbest bırakmadığımızı unutmayın. Belirli bir GPU için bellek büyümesini açmak için herhangi bir tensör tahsis etmeden veya herhangi bir işlemi gerçekleştirmeden önce aşağıdaki kodu kullanın.

gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  try:
    # Currently, memory growth needs to be the same across GPUs
    for gpu in gpus:
      tf.config.experimental.set_memory_growth(gpu, True)
    logical_gpus = tf.config.experimental.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Memory growth must be set before GPUs have been initialized
    print(e)
2 Physical GPUs, 2 Logical GPUs

Bu seçeneği etkinleştirmenin başka bir yolu, TF_FORCE_GPU_ALLOW_GROWTH çevre değişkenini true olarak ayarlamaktır. Bu konfigürasyon platforma özeldir.

İkinci yöntem, tf.config.experimental.set_virtual_device_configuration ile sanal bir GPU cihazını yapılandırmak ve GPU'da tahsis edilecek toplam bellek için bir sabit sınır belirlemektir.

gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only allocate 1GB of memory on the first GPU
  try:
    tf.config.experimental.set_virtual_device_configuration(
        gpus[0],
        [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=1024)])
    logical_gpus = tf.config.experimental.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Virtual devices must be set before GPUs have been initialized
    print(e)
2 Physical GPUs, 2 Logical GPUs

TensorFlow işlemi için mevcut olan GPU belleği miktarını gerçekten bağlamak istiyorsanız bu kullanışlıdır. Bu, GPU bir iş istasyonu GUI gibi diğer uygulamalarla paylaşıldığında yerel geliştirme için yaygın bir uygulamadır.

Çoklu GPU sisteminde tek bir GPU kullanma

Sisteminizde birden fazla GPU varsa, en düşük kimliğe sahip GPU varsayılan olarak seçilecektir. Farklı bir GPU'da çalıştırmak istiyorsanız, tercihi açıkça belirtmeniz gerekir:

tf.debugging.set_log_device_placement(True)

try:
  # Specify an invalid GPU device
  with tf.device('/device:GPU:2'):
    a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
    b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
    c = tf.matmul(a, b)
except RuntimeError as e:
  print(e)
/job:localhost/replica:0/task:0/device:GPU:2 unknown device.

Belirttiğiniz cihaz mevcut değilse, bir RuntimeError : .../device:GPU:2 unknown device alırsınız.

TensorFlow'un, belirtilen aygıtın olmaması durumunda işlemleri çalıştırmak için mevcut ve desteklenen bir aygıtı otomatik olarak seçmesini isterseniz, tf.config.set_soft_device_placement(True) çağrısı yapabilirsiniz.

tf.config.set_soft_device_placement(True)
tf.debugging.set_log_device_placement(True)

# Creates some tensors
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)

print(c)
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

Birden çok GPU kullanma

Birden çok GPU için geliştirme, bir modelin ek kaynaklarla ölçeklenmesini sağlar. Tek GPU'lu bir sistem üzerinde geliştirme yapıyorsanız, sanal cihazlarla birden fazla GPU'yu simüle edebiliriz. Bu, ek kaynak gerektirmeden çoklu GPU kurulumlarının kolay test edilmesini sağlar.

gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
  # Create 2 virtual GPUs with 1GB memory each
  try:
    tf.config.experimental.set_virtual_device_configuration(
        gpus[0],
        [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=1024),
         tf.config.experimental.VirtualDeviceConfiguration(memory_limit=1024)])
    logical_gpus = tf.config.experimental.list_logical_devices('GPU')
    print(len(gpus), "Physical GPU,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Virtual devices must be set before GPUs have been initialized
    print(e)
2 Physical GPU, 3 Logical GPUs

Çalışma zamanında birden fazla mantıksal GPU'ya sahip olduğumuzda, birden fazla GPU'yu tf.distribute.Strategy veya manuel yerleştirme ile kullanabiliriz.

tf.distribute.Strategy

Birden çok GPU kullanmak için en iyi uygulama tf.distribute.Strategy kullanmaktır. İşte basit bir örnek:

tf.debugging.set_log_device_placement(True)

strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
  inputs = tf.keras.layers.Input(shape=(1,))
  predictions = tf.keras.layers.Dense(1)(inputs)
  model = tf.keras.models.Model(inputs=inputs, outputs=predictions)
  model.compile(loss='mse',
                optimizer=tf.keras.optimizers.SGD(learning_rate=0.2))
Executing op RandomUniform in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Sub in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Mul in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Add in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarIsInitializedOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op LogicalNot in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Assert in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op ReadVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Identity in device /job:localhost/replica:0/task:0/device:GPU:1
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:1
Executing op VarIsInitializedOp in device /job:localhost/replica:0/task:0/device:GPU:1
Executing op LogicalNot in device /job:localhost/replica:0/task:0/device:GPU:1
Executing op Assert in device /job:localhost/replica:0/task:0/device:GPU:1
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:1
Executing op Reshape in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:1

Bu program, " veri paralelliği " olarak da bilinen giriş verilerini aralarında bölerek, modelinizin bir kopyasını her GPU'da çalıştırır.

Dağıtım stratejileri hakkında daha fazla bilgi için buradaki kılavuza göz atın .

Manuel yerleştirme

tf.distribute.Strategy , hesaplamayı cihazlar arasında çoğaltarak tf.distribute.Strategy çalışır. Modelinizi her GPU üzerinde oluşturarak çoğaltmayı manuel olarak uygulayabilirsiniz. Örneğin:

tf.debugging.set_log_device_placement(True)

gpus = tf.config.experimental.list_logical_devices('GPU')
if gpus:
  # Replicate your computation on multiple GPUs
  c = []
  for gpu in gpus:
    with tf.device(gpu.name):
      a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
      b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
      c.append(tf.matmul(a, b))

  with tf.device('/CPU:0'):
    matmul_sum = tf.add_n(c)

  print(matmul_sum)
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:1
Executing op AddN in device /job:localhost/replica:0/task:0/device:CPU:0
tf.Tensor(
[[ 44.  56.]
 [ 98. 128.]], shape=(2, 2), dtype=float32)