روز جامعه ML 9 نوامبر است! برای به روز رسانی از TensorFlow، JAX به ما بپیوندید، و بیشتر بیشتر بدانید

از GPU استفاده کنید

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

کد TensorFlow و tf.keras مدل شفاف روی پردازنده گرافیکی تک با تغییر کد مورد نیاز اجرا خواهد شد.

ساده ترین راه برای اجرا بر روی GPU های متعدد، در یک یا بسیاری از ماشین آلات، با استفاده از استراتژی های توزیع .

این راهنما برای کاربرانی است که این رویکردها را امتحان کرده اند و دریافتند که آنها نیاز به کنترل دقیق نحوه استفاده TensorFlow از GPU دارند. برای آشنایی با نحوه اشکال زدایی مسائل مربوط به عملکرد برای حالات تک و چند GPU، را ببینید بهینه سازی TensorFlow GPU عملکرد راهنمای.

برپایی

اطمینان حاصل کنید که آخرین نسخه gpu TensorFlow را نصب کرده اید.

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

بررسی اجمالی

TensorFlow از اجرای محاسبات بر روی انواع دستگاه ها از جمله CPU و GPU پشتیبانی می کند. آنها با شناسه های رشته نشان داده می شوند ، به عنوان مثال:

  • "/device:CPU:0" : پردازنده دستگاه شما.
  • "/GPU:0" : نماد کوتاه دست برای اولین پردازنده گرافیکی دستگاه شما این است که به TensorFlow قابل مشاهده است.
  • "/job:localhost/replica:0/task:0/device:GPU:1" : نام کامل از GPU دوم دستگاه شما این است که به TensorFlow قابل مشاهده است.

اگر یک عملیات TensorFlow دارای پیاده سازی CPU و GPU باشد ، به طور پیش فرض هنگام اختصاص عملیات ، دستگاه GPU اولویت بندی می شود. به عنوان مثال، tf.matmul هر دو CPU و GPU دانه و بر روی یک سیستم با دستگاه های CPU:0 و GPU:0 از GPU:0 دستگاه انتخاب شده است به اجرا tf.matmul مگر اینکه صریحا درخواست اجرا بر روی دستگاه دیگر.

اگر یک عملیات TensorFlow پیاده سازی GPU مربوطه را نداشته باشد ، این عملیات به دستگاه CPU باز می گردد. برای مثال، از tf.cast تنها دارای یک هسته پردازنده، بر روی یک سیستم با دستگاه های CPU:0 و GPU:0 از CPU:0 دستگاه به اجرا انتخاب tf.cast ، حتی در صورت درخواست به اجرا در GPU:0 دستگاه به

ثبت موقعیت مکانی دستگاه

برای پیدا کردن که دستگاه های عملیات و تانسورها خود را به، قرار داده اختصاص داده tf.debugging.set_log_device_placement(True) به عنوان بیانیه اول برنامه خود را. فعال کردن ورود به سیستم دستگاه باعث می شود هرگونه تخصیص یا عملیات Tensor چاپ شود.

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)

کد بالا نشانه چاپ MatMul عملیات در اعدام شد GPU:0 .

قرارگیری دستی دستگاه

اگر می خواهید یک عملیات خاص به اجرا در یک دستگاه از انتخاب خود را به جای آنچه را به طور خودکار برای شما انتخاب دارید، شما می توانید استفاده کنید with tf.device جهت ایجاد زمینه دستگاه، و تمام عملیات که در بافت بر روی دستگاه تعیین شده همان را اجرا خواهد کرد به

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)

شما خواهید دید که در حال حاضر و a b را به اختصاص داده CPU:0 . از آنجا که یک دستگاه به صراحت برای مشخص نشده MatMul عمل، زمان اجرا TensorFlow خواهد یکی را بر اساس عمل و دستگاه های موجود (را انتخاب کنید GPU:0 در این مثال) و به طور خودکار بین دستگاه های تانسورها کپی در صورت لزوم.

محدود کردن رشد حافظه GPU

به طور پیش فرض، TensorFlow نقشه تقریبا تمام حافظه GPU از همه پردازنده های گرافیکی (به CUDA_VISIBLE_DEVICES ) به روند قابل مشاهده است. این کار برای استفاده م moreثرتر از منابع حافظه نسبتاً گران قیمت GPU در دستگاهها با کاهش تکه تکه شدن حافظه انجام می شود. به منظور محدود کردن TensorFlow به یک مجموعه خاص از GPU ها، استفاده از tf.config.set_visible_devices روش.

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

در برخی موارد مطلوب است که فرایند فقط زیرمجموعه ای از حافظه موجود را به خود اختصاص دهد یا فقط میزان استفاده از حافظه را به میزان مورد نیاز فرآیند افزایش دهد. TensorFlow دو روش برای کنترل این امر ارائه می دهد.

اولین گزینه این است به نوبه خود در رشد حافظه با تماس tf.config.experimental.set_memory_growth ، که تلاش برای اختصاص تنها به عنوان حافظه GPU اندازه که برای تخصیص زمان اجرا مورد نیاز: آن شروع می شود تخصیص حافظه بسیار کمی، و به عنوان برنامه اجرا می شود و حافظه GPU بیشتری مورد نیاز است ، منطقه حافظه GPU برای فرآیند TensorFlow گسترش می یابد. حافظه آزاد نمی شود زیرا می تواند منجر به تکه تکه شدن حافظه شود. برای روشن کردن رشد حافظه برای GPU خاص ، قبل از تخصیص هرگونه تنسور یا اجرای هرگونه گزینه ، از کد زیر استفاده کنید.

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

راه دیگر برای فعال کردن این گزینه این است که مجموعه متغیر محیطی TF_FORCE_GPU_ALLOW_GROWTH به true . این پیکربندی مخصوص پلتفرم است.

روش دوم این است برای پیکربندی یک دستگاه GPU مجازی با tf.config.set_logical_device_configuration و تنظیم محدودیت سخت در کل حافظه را به خود اختصاص در GPU.

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

اگر واقعاً می خواهید مقدار حافظه GPU موجود را به فرایند TensorFlow محدود کنید ، مفید است. هنگامی که GPU با برنامه های دیگر مانند GUI ایستگاه کاری به اشتراک گذاشته می شود ، این روش رایج برای توسعه محلی است.

استفاده از GPU واحد در سیستم چند GPU

اگر بیش از یک GPU در سیستم خود دارید ، GPU با کمترین ID به طور پیش فرض انتخاب می شود. اگر می خواهید روی GPU متفاوتی اجرا شود ، باید اولویت را به صراحت مشخص کنید:

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

اگر دستگاه شما مشخص کرده اید وجود ندارد، شما یک از RuntimeError : .../device:GPU:2 unknown device .

اگر شما می خواهم TensorFlow به صورت خودکار دستگاه های موجود و حمایت برای اجرای عملیات در مورد نوع مشخص شده وجود ندارد را انتخاب کنید، شما می توانید پاسخ 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)

استفاده از چندین GPU

توسعه چندین GPU به یک مدل اجازه می دهد تا با منابع اضافی مقیاس داشته باشد. در صورت توسعه بر روی یک سیستم با یک GPU واحد ، می توانید چندین GPU را با دستگاه های مجازی شبیه سازی کنید. این آزمایش آسان تنظیمات چند GPU را بدون نیاز به منابع اضافی امکان پذیر می کند.

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

هنگامی که می GPU ها منطقی چندگانه در دسترس را به زمان اجرا وجود دارد، شما می توانید GPU های متعدد با استفاده از tf.distribute.Strategy و یا با قرار دادن کتابچه راهنمای کاربر.

با tf.distribute.Strategy

بهترین روش برای استفاده از GPU های متعدد است که استفاده از tf.distribute.Strategy . در اینجا یک مثال ساده است:

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

این برنامه یک کپی از مدل خود را در هر GPU، تقسیم داده های ورودی بین آنها، همچنین به عنوان شناخته شده "را اجرا خواهد کرد موازی داده ".

برای کسب اطلاعات بیشتر در مورد استراتژی توزیع، بررسی از راهنمای در اینجا .

جایگذاری دستی

tf.distribute.Strategy در زیر سرپوش با تکرار محاسبات در سراسر دستگاه. می توانید با ساختن مدل خود بر روی هر GPU ، تکرار را به صورت دستی پیاده سازی کنید. مثلا:

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)