ใช้ GPU

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดโน๊ตบุ๊ค

รหัส TensorFlow และ tf.keras รุ่นจะทำงานอย่างโปร่งใสบน GPU เดี่ยวที่มีการเปลี่ยนแปลงรหัสไม่จำเป็นต้องใช้

วิธีที่ง่ายที่สุดในการทำงานใน GPUs หลายในหนึ่งหรือหลายเครื่องจะใช้ กลยุทธ์การจัดจำหน่าย

คู่มือนี้มีไว้สำหรับผู้ใช้ที่ลองใช้แนวทางเหล่านี้แล้วและพบว่าพวกเขาต้องการการควบคุมที่ละเอียดถี่ถ้วนว่า TensorFlow ใช้ GPU อย่างไร ต้องการเรียนรู้วิธีที่จะแก้ปัญหาปัญหาประสิทธิภาพการทำงานสำหรับสถานการณ์เดียวและ multi-GPU ดูที่ เพิ่มประสิทธิภาพการปฏิบัติงาน TensorFlow GPU คู่มือ

ติดตั้ง

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง TensorFlow gpu รุ่นล่าสุด

import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))
2021-07-28 01:21:13.690704: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
Num GPUs Available:  1
2021-07-28 01:21:14.839090: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcuda.so.1
2021-07-28 01:21:15.456858: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-28 01:21:15.457781: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-28 01:21:15.457813: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-07-28 01:21:15.461458: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublas.so.11
2021-07-28 01:21:15.461551: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublasLt.so.11
2021-07-28 01:21:15.462602: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcufft.so.10
2021-07-28 01:21:15.462912: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcurand.so.10
2021-07-28 01:21:15.463978: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusolver.so.11
2021-07-28 01:21:15.464895: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusparse.so.11
2021-07-28 01:21:15.465062: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudnn.so.8
2021-07-28 01:21:15.465195: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-28 01:21:15.466136: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-28 01:21:15.467011: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0

ภาพรวม

TensorFlow รองรับการคำนวณที่กำลังรันบนอุปกรณ์หลายประเภท รวมถึง CPU และ GPU โดยจะแสดงด้วยตัวระบุสตริง เช่น

  • "/device:CPU:0" : ซีพียูของเครื่องของคุณ
  • "/GPU:0" : โน้ตสั้นมือสำหรับ GPU แรกของเครื่องของคุณที่จะมองเห็น 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)
2021-07-28 01:21:15.477558: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX512F FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-07-28 01:21:15.478028: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-28 01:21:15.478891: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-28 01:21:15.478976: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-28 01:21:15.479838: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-28 01:21:15.480744: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-28 01:21:15.480791: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-07-28 01:21:16.059272: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-28 01:21:16.059307: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-28 01:21:16.059314: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-28 01:21:16.059497: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-28 01:21:16.060447: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-28 01:21:16.061335: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-28 01:21:16.062148: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
2021-07-28 01:21:16.327119: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublas.so.11
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)
2021-07-28 01:21:16.695767: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublasLt.so.11

รหัสข้างต้นจะพิมพ์ตัวบ่งชี้ที่ MatMul สหกรณ์ได้รับการดำเนินการใน GPU:0 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 0 ตั้งแต่อุปกรณ์ที่ไม่ได้ระบุไว้อย่างชัดเจนสำหรับ MatMul การดำเนินงานรันไทม์ TensorFlow จะเลือกอย่างใดอย่างหนึ่งขึ้นอยู่กับการดำเนินงานและอุปกรณ์ที่มีอยู่ ( GPU:0 ในตัวอย่างนี้) และจะคัดลอก tensors ระหว่างอุปกรณ์ในกรณีที่จำเป็น

จำกัดการเติบโตของหน่วยความจำ GPU

โดยค่าเริ่มต้น TensorFlow แผนที่เกือบทั้งหมดของหน่วยความจำของ GPU GPUs ทั้งหมด (ขึ้นอยู่กับ CUDA_VISIBLE_DEVICES ) มองเห็นกระบวนการ สิ่งนี้ทำเพื่อใช้ทรัพยากรหน่วยความจำ GPU ที่มีค่าบนอุปกรณ์ได้อย่างมีประสิทธิภาพมากขึ้นโดยลดการกระจายตัวของหน่วยความจำ เพื่อ จำกัด การ TensorFlow เฉพาะชุดของ GPUs ใช้ tf.config.experimental.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 มี 2 วิธีในการควบคุมสิ่งนี้

ตัวเลือกแรกคือการเปิดต่อการเจริญเติบโตของหน่วยความจำโดยการเรียก 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.experimental.set_virtual_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 ตัวเดียวบนระบบ multi-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 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 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

เมื่อมี GPUs ตรรกะที่สามารถใช้ได้หลายรันไทม์คุณสามารถใช้ GPUs หลายกับ tf.distribute.Strategy หรือกับตำแหน่งคู่มือ

ด้วย tf.distribute.Strategy

วิธีที่ดีที่สุดสำหรับการใช้ GPUs หลายคือการใช้ 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))
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
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 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 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 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 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 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 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 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 MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)