หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

การเพิ่มประสิทธิภาพกราฟ TensorFlow ด้วย Grappler

ดูใน TensorFlow.org เรียกใช้ใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก

ภาพรวม

TensorFlow ใช้ทั้งกราฟและการดำเนินการที่กระตือรือร้นเพื่อดำเนินการคำนวณ tf.Graph ประกอบด้วยชุดของ tf.Operation objects (ops) ซึ่งแสดงถึงหน่วยของการคำนวณและวัตถุ tf.Tensor ซึ่งแสดงถึงหน่วยของข้อมูลที่ไหลระหว่าง ops

Grappler เป็นระบบเพิ่มประสิทธิภาพกราฟเริ่มต้นในรันไทม์ TensorFlow Grappler ใช้การเพิ่มประสิทธิภาพในโหมดกราฟ (ภายใน tf.function ) เพื่อปรับปรุงประสิทธิภาพของการคำนวณ TensorFlow ของคุณผ่านการทำให้กราฟง่ายขึ้นและการเพิ่มประสิทธิภาพระดับสูงอื่น ๆ เช่นเนื้อความของฟังก์ชันการแทรกเพื่อเปิดใช้งานการเพิ่มประสิทธิภาพระหว่างขั้นตอน การเพิ่มประสิทธิภาพ tf.Graph ยังช่วยลดการใช้หน่วยความจำสูงสุดของอุปกรณ์และปรับปรุงการใช้ฮาร์ดแวร์โดยการปรับการแม็ปโหนดกราฟเพื่อคำนวณทรัพยากรให้เหมาะสม

ใช้ tf.config.optimizer.set_experimental_options() เพื่อการควบคุมที่ละเอียดยิ่งขึ้นสำหรับการเพิ่มประสิทธิภาพ tf.Graph ของคุณ

เครื่องมือเพิ่มประสิทธิภาพกราฟที่มี

Grappler ทำการปรับแต่งกราฟผ่านโปรแกรมควบคุมระดับบนสุดที่เรียกว่า MetaOptimizer เครื่องมือเพิ่มประสิทธิภาพกราฟต่อไปนี้สามารถใช้ได้กับ TensorFlow:

  • เครื่องมือเพิ่มประสิทธิภาพการพับแบบคงที่ - อนุมานค่าของเทนเซอร์แบบคงที่เมื่อเป็นไปได้โดยการพับโหนดคงที่ในกราฟและทำให้ผลลัพธ์เป็นจริงโดยใช้ค่าคงที่
  • เครื่องมือเพิ่มประสิทธิภาพทางคณิตศาสตร์ - ลดความซับซ้อนของการดำเนินการทางคณิตศาสตร์โดยการกำจัดนิพจน์ย่อยทั่วไปและลดความซับซ้อนของคำสั่งเลขคณิต
  • เครื่องมือเพิ่มประสิทธิภาพเลย์เอาต์ - เพิ่มประสิทธิภาพเลย์เอาต์เทนเซอร์เพื่อดำเนินการตามรูปแบบข้อมูลเช่นการแปลงสัญญาณได้อย่างมีประสิทธิภาพมากขึ้น
  • เครื่องมือเพิ่มประสิทธิภาพ Remapper - ทำการแมปกราฟย่อยไปยังการใช้งานที่มีประสิทธิภาพมากขึ้นโดยแทนที่กราฟย่อยที่เกิดขึ้นโดยทั่วไปด้วยเมล็ดเสาหินผสมที่ได้รับการปรับให้เหมาะสม
  • เครื่องมือเพิ่มประสิทธิภาพหน่วยความจำ - วิเคราะห์กราฟเพื่อตรวจสอบการใช้หน่วยความจำสูงสุดสำหรับแต่ละการดำเนินการและแทรกการดำเนินการคัดลอกหน่วยความจำ CPU-GPU สำหรับการสลับหน่วยความจำ GPU เป็น CPU เพื่อลดการใช้หน่วยความจำสูงสุด
  • เครื่องมือเพิ่มประสิทธิภาพการพึ่งพา - ลบหรือจัดเรียงการอ้างอิงการควบคุมใหม่เพื่อลดเส้นทางวิกฤตสำหรับขั้นตอนแบบจำลองหรือเปิดใช้งานการเพิ่มประสิทธิภาพอื่น ๆ ยังลบโหนดที่ไม่มีประสิทธิภาพเช่น Identity
  • เครื่องมือเพิ่มประสิทธิภาพการตัดแต่งกิ่ง - โหนดพรุนที่ไม่มีผลต่อผลลัพธ์จากกราฟ โดยปกติจะเรียกใช้ก่อนเพื่อลดขนาดของกราฟและเร่งการประมวลผลใน Grappler pass อื่น ๆ
  • เครื่องมือเพิ่มประสิทธิภาพฟังก์ชัน - ปรับไลบรารีฟังก์ชันของโปรแกรม TensorFlow และเนื้อหาฟังก์ชันแบบอินไลน์เพื่อเปิดใช้งานการเพิ่มประสิทธิภาพระหว่างขั้นตอนอื่น ๆ
  • เครื่องมือเพิ่มประสิทธิภาพรูปร่าง - ปรับกราฟย่อยที่ทำงานกับข้อมูลที่เกี่ยวข้องกับรูปร่างและรูปร่าง
  • Autoparallel Optimizer - ปรับ กราฟให้ขนานกันโดยอัตโนมัติโดยการแยกตามขนาดแบตช์ เครื่องมือเพิ่มประสิทธิภาพนี้ถูกปิดโดยค่าเริ่มต้น
  • เครื่องมือเพิ่มประสิทธิภาพลูป - เพิ่มประสิทธิภาพการควบคุมกราฟโดยยกกราฟย่อยที่ไม่แปรผันของลูปออกจากลูปและโดยการลบการดำเนินการสแต็กที่ซ้ำซ้อนในลูป ยังปรับลูปให้เหมาะสมด้วยจำนวนการเดินทางที่ทราบแบบคงที่และลบกิ่งไม้ที่ตายแล้วที่ทราบแบบคงที่ในเงื่อนไข
  • เครื่องมือเพิ่มประสิทธิภาพตัวจัดสรรตามขอบเขต - เปิดตัวตัวจัดสรรที่กำหนดขอบเขตเพื่อลดการเคลื่อนย้ายข้อมูลและเพื่อรวมการดำเนินการบางอย่าง
  • Pin to host optimizer - สลับการทำงานขนาดเล็กเข้ากับ CPU เครื่องมือเพิ่มประสิทธิภาพนี้ถูกปิดโดยค่าเริ่มต้น
  • เครื่องมือเพิ่มประสิทธิภาพความแม่นยำผสมอัตโนมัติ - แปลงชนิดข้อมูลเป็น float16 หากมีเพื่อปรับปรุงประสิทธิภาพ ปัจจุบันใช้กับ GPU เท่านั้น
  • Debug stripper - แถบโหนดที่เกี่ยวข้องกับการดำเนินการดีบักเช่น tf.debugging.Assert , tf.debugging.check_numerics และ tf.print จากกราฟ เครื่องมือเพิ่มประสิทธิภาพนี้ถูกปิดโดยค่าเริ่มต้น

ติดตั้ง

import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf

สร้างตัวจัดการบริบทเพื่อสลับสถานะของเครื่องมือเพิ่มประสิทธิภาพได้อย่างง่ายดาย

@contextlib.contextmanager
def options(options):
  old_opts = tf.config.optimizer.get_experimental_options()
  tf.config.optimizer.set_experimental_options(options)
  try:
    yield
  finally:
    tf.config.optimizer.set_experimental_options(old_opts)

เปรียบเทียบประสิทธิภาพการดำเนินการที่มีและไม่มี Grappler

TensorFlow 2 ขึ้นไปจะดำเนินการ อย่างกระตือรือร้น ตามค่าเริ่มต้น ใช้ tf.function เพื่อเปลี่ยนการดำเนินการเริ่มต้นเป็นโหมดกราฟ Grappler ทำงานโดยอัตโนมัติในพื้นหลังเพื่อใช้การเพิ่มประสิทธิภาพกราฟด้านบนและปรับปรุงประสิทธิภาพการดำเนินการ

เครื่องมือเพิ่มประสิทธิภาพการพับคงที่

ดังตัวอย่างเบื้องต้นให้พิจารณาฟังก์ชันที่ดำเนินการกับค่าคงที่และส่งกลับผลลัพธ์

def test_function_1():
  @tf.function
  def simple_function(input_arg):
    print('Tracing!')
    a = tf.constant(np.random.randn(2000,2000), dtype = tf.float32)
    c = a
    for n in range(50):
      c = c@a
    return tf.reduce_mean(c+input_arg)

  return simple_function

ปิดตัวเพิ่มประสิทธิภาพการพับแบบคงที่และเรียกใช้ฟังก์ชัน:

with options({'constant_folding': False}):
  print(tf.config.optimizer.get_experimental_options())
  simple_function = test_function_1()
  # Trace once
  x = tf.constant(2.2)
  simple_function(x)
  print("Vanilla execution:", timeit.timeit(lambda: simple_function(x), number = 1), "s")
{'constant_folding': False, 'disable_model_pruning': False, 'disable_meta_optimizer': False}
Tracing!
Vanilla execution: 0.0801323579999007 s

เปิดใช้งานเครื่องมือเพิ่มประสิทธิภาพการพับแบบคงที่และเรียกใช้ฟังก์ชันอีกครั้งเพื่อสังเกตการเร่งความเร็วในการเรียกใช้ฟังก์ชัน

with options({'constant_folding': True}):
  print(tf.config.optimizer.get_experimental_options())
  simple_function = test_function_1()
  # Trace once
  x = tf.constant(2.2)
  simple_function(x)
  print("Constant folded execution:", timeit.timeit(lambda: simple_function(x), number = 1), "s")
{'constant_folding': True, 'disable_model_pruning': False, 'disable_meta_optimizer': False}
Tracing!
Constant folded execution: 0.0006300529998952697 s

เครื่องมือเพิ่มประสิทธิภาพการแก้จุดบกพร่อง

พิจารณาฟังก์ชันง่ายๆที่ตรวจสอบค่าตัวเลขของอาร์กิวเมนต์อินพุตและส่งกลับ

def test_function_2():
  @tf.function
  def simple_func(input_arg):
    output = input_arg
    tf.debugging.check_numerics(output, "Bad!")
    return output
  return simple_func

ขั้นแรกให้เรียกใช้ฟังก์ชันโดยปิดตัวเพิ่มประสิทธิภาพตัวลอกการดีบัก

test_func = test_function_2()
p1 = tf.constant(float('inf'))
try:
  test_func(p1)
except tf.errors.InvalidArgumentError as e:
  traceback.print_exc(limit=2)
Traceback (most recent call last):
  File "<ipython-input-8-1ac473fdfbab>", line 4, in <module>
    test_func(p1)
  File "/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 780, in __call__
    result = self._call(*args, **kwds)
tensorflow.python.framework.errors_impl.InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at <ipython-input-7-cbee1561c83e>:5) ]]
  (1) Invalid argument:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at <ipython-input-7-cbee1561c83e>:5) ]]
     [[Identity/_4]]
0 successful operations.
0 derived errors ignored. [Op:__inference_simple_func_131]

Errors may have originated from an input operation.
Input Source operations connected to node CheckNumerics:
 input_arg (defined at <ipython-input-8-1ac473fdfbab>:4)

Input Source operations connected to node CheckNumerics:
 input_arg (defined at <ipython-input-8-1ac473fdfbab>:4)

Function call stack:
simple_func -> simple_func


tf.debugging.check_numerics ทำให้เกิดข้อผิดพลาดของอาร์กิวเมนต์ที่ไม่ถูกต้องเนื่องจากอาร์กิวเมนต์ Inf เป็น test_func

เปิดใช้งานเครื่องมือเพิ่มประสิทธิภาพตัวลอกการดีบักและเรียกใช้ฟังก์ชันอีกครั้ง

with options({'debug_stripper': True}):
  test_func2 = test_function_2()
  p1 = tf.constant(float('inf'))
  try:
    test_func2(p1)
  except tf.errors.InvalidArgumentError as e:
    traceback.print_exc(limit=2)

เครื่องมือเพิ่มประสิทธิภาพ debug stripper จะ tf.debug.check_numerics โหนด tf.debug.check_numerics ออกจากกราฟและเรียกใช้ฟังก์ชันโดยไม่เพิ่มข้อผิดพลาดใด ๆ

สรุป

รันไทม์ TensorFlow ใช้ Grappler เพื่อปรับกราฟให้เหมาะสมโดยอัตโนมัติก่อนดำเนินการ ใช้ tf.config.optimizer.set_experimental_options เพื่อเปิดหรือปิดใช้งานเครื่องมือเพิ่มประสิทธิภาพกราฟต่างๆ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Grappler โปรดดูการ ปรับแต่งกราฟ TensorFlow