ML Topluluk Günü 9 Kasım! TensorFlow, JAX güncellemeler için bize katılın ve daha fazla bilgi edinin

GPU kullanın

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

TensorFlow kodu ve tf.keras modelleri şeffaf herhangi bir kod değişiklikleri ile tek GPU yayınlanmayacaktır.

En basit yolu kullanıyor, bir veya birçok makinelerde, çoklu GPU'larda çalışmasına Dağıtım Stratejileri .

Bu kılavuz, bu yaklaşımları deneyen ve TensorFlow'un GPU'yu nasıl kullandığı konusunda ayrıntılı kontrole ihtiyaçları olduğunu bulan kullanıcılar içindir. Tek ve çoklu GPU senaryoları için performans sorunları hata ayıklamak öğrenmek için, bkz Optimize TensorFlow GPU Performansı kılavuzu.

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.list_physical_devices('GPU')))
Num GPUs Available:  1

genel bakış

TensorFlow, CPU ve GPU dahil olmak üzere çeşitli cihaz türlerinde çalışan hesaplamaları destekler. Örneğin, dize tanımlayıcılarıyla temsil edilirler:

  • "/device:CPU:0" : makinenizin CPU.
  • "/GPU:0" : TensorFlow görülen ismini Makinenin ilk GPU Kısa el notasyonu.
  • "/job:localhost/replica:0/task:0/device:GPU:1" : TensorFlow tarafından görülebilir makinenizin ikinci GPU Tamamen nitelikli ismi.

Bir TensorFlow işleminde hem CPU hem de GPU uygulamaları varsa, işlem atandığında varsayılan olarak GPU aygıtına öncelik verilir. Örneğin, tf.matmul hem CPU'ya ve GPU çekirdekleri ve cihazlar ile sistemde CPU:0 ve GPU:0 , GPU:0 cihaz çalıştırmak için seçilir tf.matmul açıkça başka bir cihazda çalıştırmak istemedikleri takdirde.

Bir TensorFlow işleminin karşılık gelen GPU uygulaması yoksa işlem CPU cihazına geri döner. Çünkü Örneğin, tf.cast sadece işlemci aygıtlar ile ilgili çekirdek vardır CPU:0 ve GPU:0 , CPU:0 cihazı çalıştırmak seçilir tf.cast çalıştırmak için talep olsa bile, GPU:0 cihazı .

Kayıt cihazı yerleşimi

Operasyon ve tansörler, koymak atanan hangi cihazların öğrenmek için tf.debugging.set_log_device_placement(True) programınızın ilk ifadesi olarak. Aygıt yerleştirme günlüğünün etkinleştirilmesi, herhangi bir Tensör tahsisinin veya işleminin 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 _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
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 bir gösterge yazdırır MatMul op idam edildi GPU:0 .

Manuel cihaz yerleştirme

Bunun yerine sizin için otomatik olarak seçilen neler olup seçeceğiniz bir cihazda çalıştırmak için özel bir operasyon istiyorsanız, kullanabileceğiniz with tf.device bir aygıt içeriğini oluşturmak için ve bu bağlamda tüm işlemler aynı belirlenen cihazda çalışacak .

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)

Artık olduğunu göreceksiniz a ve b atanan CPU:0 . Bir cihaz açıkça için belirtilmedi yana MatMul operasyonu TensorFlow çalışma zamanı çalışma ve kullanılabilir cihazların (dayanan birini seçecektir GPU:0 bu örnekte) ve gerekirse otomatik cihazlar arasında tensörleri kopyalayın.

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

Varsayılan olarak, TensorFlow neredeyse tüm GPU'ları (tabi GPU bellek eşleyen CUDA_VISIBLE_DEVICES sürecine görünür). Bu, bellek parçalanmasını azaltarak cihazlardaki nispeten değerli GPU bellek kaynaklarını daha verimli kullanmak için yapılır. Kullanın GPU'lardan belirli bir grup için TensorFlow sınırlamak için tf.config.set_visible_devices yöntemi.

gpus = tf.config.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only use the first GPU
  try:
    tf.config.set_visible_devices(gpus[0], 'GPU')
    logical_gpus = tf.config.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)
1 Physical GPUs, 1 Logical GPU

Bazı durumlarda, işlemin yalnızca kullanılabilir belleğin bir alt kümesini ayırması veya bellek kullanımını yalnızca işlemin gerektirdiği şekilde büyütmesi istenir. TensorFlow, bunu kontrol etmek için iki yöntem sunar.

İlk seçenek arayarak bellek büyüme açmaktır tf.config.experimental.set_memory_growth sadece çalışma zamanı ayırmaları için gerekli olduğu kadar GPU belleğine olarak ayırmaya girişimleri,: çok az bellek ayrılırken başlar ve program koþulur olarak ve daha fazla GPU belleği gerekiyorsa, TensorFlow işlemi için GPU bellek bölgesi genişletilir. Bellek parçalanmasına yol açabileceğinden bellek serbest bırakılmaz. Belirli bir GPU için bellek büyümesini etkinleştirmek için, herhangi bir tensör ayırmadan veya herhangi bir işlemi yürütmeden önce aşağıdaki kodu kullanın.

gpus = tf.config.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.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)
Physical devices cannot be modified after being initialized

Bu seçeneği etkinleştirmek için başka bir yol, çevre değişken ayarlamaktır TF_FORCE_GPU_ALLOW_GROWTH için true . Bu yapılandırma platforma özeldir.

İkinci yöntem ile sanal grafik işlemcisi cihazı yapılandırmaktır tf.config.set_logical_device_configuration ve grafik işlemcisi üzerinde tahsis toplam bellek sabit bir sınır ayarlayın.

gpus = tf.config.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only allocate 1GB of memory on the first GPU
  try:
    tf.config.set_logical_device_configuration(
        gpus[0],
        [tf.config.LogicalDeviceConfiguration(memory_limit=1024)])
    logical_gpus = tf.config.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)
Virtual devices cannot be modified after being initialized

Bu, TensorFlow işlemi için kullanılabilen GPU belleği miktarını gerçekten sınırlamak istiyorsanız kullanışlıdır. Bu, GPU 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, varsayılan olarak en düşük kimliğe sahip GPU seçilecektir. Farklı bir GPU'da çalıştırmak isterseniz, 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)
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0

Belirlediğiniz aygıt yoksa, bir alacak RuntimeError : .../device:GPU:2 unknown device .

Eğer TensorFlow otomatik olarak bir önceden yoksa durumunda işlemleri çalıştırmak için varolan ve desteklenen cihazı seçmek istiyorsanız, Arayabileceğin tf.config.set_soft_device_placement(True) .

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 _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
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çeklenmesine olanak tanır. Tek GPU'lu bir sistem üzerinde geliştirme yapıyorsanız, sanal cihazlarla birden fazla GPU'yu simüle edebilirsiniz. Bu, ek kaynaklar gerektirmeden çoklu GPU kurulumlarının kolay test edilmesini sağlar.

gpus = tf.config.list_physical_devices('GPU')
if gpus:
  # Create 2 virtual GPUs with 1GB memory each
  try:
    tf.config.set_logical_device_configuration(
        gpus[0],
        [tf.config.LogicalDeviceConfiguration(memory_limit=1024),
         tf.config.LogicalDeviceConfiguration(memory_limit=1024)])
    logical_gpus = tf.config.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)
Virtual devices cannot be modified after being initialized

Çalışma zamanında mevcut çoklu mantıksal GPU'lar olmaması koşuluyla, sen ile birden GPU'ları yararlanabilirler tf.distribute.Strategy veya manuel yerleştirme ile.

ile tf.distribute.Strategy

Birden GPU'ları kullanarak en iyi uygulama kullanmaktır tf.distribute.Strategy . İşte basit bir örnek:

tf.debugging.set_log_device_placement(True)
gpus = tf.config.list_logical_devices('GPU')
strategy = tf.distribute.MirroredStrategy(gpus)
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 _EagerConst 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 AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
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 AddV2 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 AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp 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: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:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Fill 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 AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp 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: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:0
Executing op _EagerConst 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 AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp 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 AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp 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 AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Fill 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 AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU: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:CPU:0
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU: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:CPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Fill 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 AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU: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:CPU:0
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU: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:CPU:0
Executing op _EagerConst 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 AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0

Bu program her GPU, bölme ayrıca "olarak bilinen aralarındaki veri girişi, üzerinde modelin bir kopyasını çalışacaktır veri paralelliği ".

Dağıtım stratejileri hakkında daha fazla bilgi için, rehber kontrol buraya .

Manuel yerleştirme

tf.distribute.Strategy cihazlar arasında hesaplama çoğaltarak başlık altında çalışır. Modelinizi her bir GPU'da oluşturarak çoğaltmayı manuel olarak uygulayabilirsiniz. Örneğin:

tf.debugging.set_log_device_placement(True)

gpus = tf.config.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 _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
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)