Trang này được dịch bởi Cloud Translation API.
Switch to English

Tối ưu hóa đồ thị TensorFlow với Grappler

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải vở

Tổng quat

TensorFlow sử dụng cả đồ thị và thực thi háo hức để thực hiện tính toán. Một tf.Graph chứa một tập hợp các đối tượng tf.Operation (ops) đại diện cho các đơn vị tính toán và các đối tượng tf.Tensor đại diện cho các đơn vị dữ liệu chảy giữa các op.

Grappler là hệ thống tối ưu hóa đồ thị mặc định trong thời gian chạy TensorFlow. Grappler áp dụng tối ưu hóa trong chế độ biểu đồ (trong tf.function ) để cải thiện hiệu suất của các tính toán TensorFlow của bạn thông qua đơn giản hóa biểu đồ và tối ưu hóa mức cao khác như cơ quan chức năng nội tuyến để cho phép tối ưu hóa liên thủ tục. Tối ưu hóa tf.Graph cũng làm giảm mức sử dụng bộ nhớ tối đa của thiết bị và cải thiện việc sử dụng phần cứng bằng cách tối ưu hóa ánh xạ của các nút biểu đồ để tính toán tài nguyên.

Sử dụng tf.config.optimizer.set_experimental_options() để kiểm soát tốt hơn các tối ưu hóa tf.Graph của bạn.

Tối ưu hóa đồ thị có sẵn

Grappler thực hiện tối ưu hóa đồ thị thông qua trình điều khiển cấp cao nhất được gọi là MetaOptimizer . Các trình tối ưu hóa biểu đồ sau đây có sẵn với TensorFlow:

  • Trình tối ưu hóa gập liên tục - Tĩnh tĩnh giá trị của các tenxơ khi có thể bằng cách gấp các nút không đổi trong biểu đồ và cụ thể hóa kết quả bằng cách sử dụng các hằng số.
  • Trình tối ưu hóa số học - Đơn giản hóa các hoạt động số học bằng cách loại bỏ các biểu thức con phổ biến và đơn giản hóa các câu lệnh số học.
  • Trình tối ưu hóa bố cục - Tối ưu hóa bố trí tenxơ để thực hiện các hoạt động phụ thuộc định dạng dữ liệu như kết cấu hiệu quả hơn.
  • Trình tối ưu hóa Remapper - Remaps các sơ đồ con vào các triển khai hiệu quả hơn bằng cách thay thế các sơ đồ con thường xảy ra bằng các hạt nguyên khối được hợp nhất tối ưu hóa.
  • Trình tối ưu hóa bộ nhớ - Phân tích biểu đồ để kiểm tra mức sử dụng bộ nhớ tối đa cho từng hoạt động và chèn các hoạt động sao chép bộ nhớ CPU-GPU để hoán đổi bộ nhớ GPU sang CPU để giảm mức sử dụng bộ nhớ tối đa.
  • Trình tối ưu hóa phụ thuộc - Loại bỏ hoặc sắp xếp lại các phụ thuộc điều khiển để rút ngắn đường dẫn quan trọng cho bước mô hình hoặc cho phép tối ưu hóa khác. Đồng thời loại bỏ các nút không có hiệu quả như Nhận dạng.
  • Trình tối ưu hóa cắt tỉa - Cắt các nút không ảnh hưởng đến đầu ra từ biểu đồ. Nó thường được chạy trước để giảm kích thước của biểu đồ và tăng tốc độ xử lý trong các lần vượt qua Grappler khác.
  • Trình tối ưu hóa chức năng - Tối ưu hóa thư viện chức năng của chương trình TensorFlow và nội tuyến các cơ quan chức năng để cho phép tối ưu hóa liên thủ tục khác.
  • Trình tối ưu hóa hình dạng - Tối ưu hóa các sơ đồ con hoạt động dựa trên thông tin liên quan đến hình dạng và hình dạng.
  • Trình tối ưu hóa tự động song song - Tự động song song hóa các biểu đồ bằng cách chia dọc theo kích thước lô. Trình tối ưu hóa này được TẮT theo mặc định.
  • Trình tối ưu hóa vòng lặp - Tối ưu hóa luồng điều khiển đồ thị bằng cách nâng các sơ đồ con bất biến vòng lặp ra khỏi các vòng lặp và bằng cách loại bỏ các hoạt động ngăn xếp dự phòng trong các vòng lặp. Cũng tối ưu hóa các vòng lặp với số lượng chuyến đi được biết đến tĩnh và loại bỏ các nhánh chết được biết đến tĩnh trong các điều kiện.
  • Trình tối ưu hóa phân bổ phạm vi - Giới thiệu các phân bổ phạm vi để giảm chuyển động dữ liệu và hợp nhất một số hoạt động.
  • Ghim vào trình tối ưu hóa máy chủ - Hoán đổi các hoạt động nhỏ trên CPU. Trình tối ưu hóa này được TẮT theo mặc định.
  • Trình tối ưu hóa độ chính xác hỗn hợp tự động - Chuyển đổi các loại dữ liệu thành float16 khi áp dụng để cải thiện hiệu suất. Hiện tại chỉ áp dụng cho GPU.
  • Trình gỡ lỗi gỡ lỗi - Tách các nút liên quan đến các hoạt động gỡ lỗi, chẳng hạn như tf.debugging.Assert , tf.debugging.check_numericstf.print từ biểu đồ. Trình tối ưu hóa này được TẮT theo mặc định.

Thiết lập

 import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf
 

Tạo một trình quản lý bối cảnh để dễ dàng chuyển trạng thái tối ưu hóa.

 @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)
 

So sánh hiệu suất thực thi có và không có Grappler

Theo mặc định, TensorFlow 2 và hơn thế nữa thực thi một cách háo hức . Sử dụng tf.function để chuyển thực thi mặc định sang chế độ Biểu đồ. Grappler chạy tự động trong nền để áp dụng tối ưu hóa biểu đồ ở trên và cải thiện hiệu suất thực thi.

Tối ưu hóa gấp liên tục

Như một ví dụ sơ bộ, hãy xem xét một hàm thực hiện các hoạt động trên các hằng số và trả về một đầu ra.

 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
 

Tắt trình tối ưu hóa gấp liên tục và thực hiện chức năng:

 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.004905937999865273 s

Cho phép tối ưu hóa gập liên tục và thực hiện lại chức năng để quan sát tăng tốc trong thực thi chức năng.

 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.0005699149999145448 s

Trình gỡ lỗi gỡ lỗi

Hãy xem xét một hàm đơn giản kiểm tra giá trị số của đối số đầu vào của nó và trả về nó.

 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
 

Đầu tiên, thực hiện chức năng với trình tối ưu hóa gỡ lỗi gỡ lỗi đã tắt.

 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 580, 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) ]]
     [[Identity/_4]]
  (1) Invalid argument:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at <ipython-input-7-cbee1561c83e>:5) ]]
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 làm tăng lỗi đối số không hợp lệ do đối số Inf thành test_func .

Kích hoạt trình tối ưu hóa gỡ lỗi gỡ lỗi và thực hiện lại chức năng.

 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)
 

Trình tối ưu hóa trình gỡ lỗi gỡ bỏ nút tf.debug.check_numerics khỏi biểu đồ và thực thi hàm mà không đưa ra bất kỳ lỗi nào.

Tóm lược

Thời gian chạy TensorFlow sử dụng Grappler để tự động tối ưu hóa đồ thị trước khi thực hiện. Sử dụng tf.config.optimizer.set_experimental_options để bật hoặc tắt các trình tối ưu hóa biểu đồ khác nhau.

Để biết thêm thông tin về Grappler, hãy xem Tối ưu hóa đồ thị của TensorFlow .