Giúp bảo vệ Great Barrier Reef với TensorFlow trên Kaggle Tham Challenge

Tối ưu hóa hiệu suất TensorFlow bằng cách sử dụng Hồ sơ

Hướng dẫn này trình bày cách sử dụng các công cụ có sẵn với TensorFlow Profiler để theo dõi hiệu suất của các mô hình TensorFlow của bạn. Bạn sẽ học cách hiểu mô hình của mình hoạt động như thế nào trên máy chủ (CPU), thiết bị (GPU) hoặc trên sự kết hợp của cả máy chủ và (các) thiết bị.

Việc lập hồ sơ giúp hiểu mức tiêu thụ tài nguyên phần cứng (thời gian và bộ nhớ) của các hoạt động TensorFlow (hoạt động) khác nhau trong mô hình của bạn và giải quyết các tắc nghẽn về hiệu suất và cuối cùng, làm cho mô hình thực thi nhanh hơn.

Hướng dẫn này sẽ hướng dẫn bạn cách cài đặt Profiler, các công cụ khác nhau có sẵn, các chế độ khác nhau về cách Profiler thu thập dữ liệu hiệu suất và một số phương pháp hay nhất được đề xuất để tối ưu hóa hiệu suất mô hình.

Nếu bạn muốn hồ sơ thực hiện mô hình của bạn trên đám mây TPUs, hãy tham khảo hướng dẫn của Cloud TPU .

Cài đặt các điều kiện tiên quyết của Hồ sơ và GPU

Cài đặt plugin Profiler cho TensorBoard bằng pip. Lưu ý rằng Hồ sơ yêu cầu phiên bản mới nhất của TensorFlow và TensorBoard (> = 2.2).

pip install -U tensorboard_plugin_profile

Để cấu hình trên GPU, bạn phải:

  1. Gặp gỡ các trình điều khiển NVIDIA GPU và yêu cầu CUDA® Toolkit niêm yết trên TensorFlow GPU yêu cầu phần mềm hỗ trợ .
  2. Hãy chắc chắn rằng Công cụ NVIDIA® CUDA® Profiling Interface (CUPTI) tồn tại trên đường dẫn:

    /sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \
    grep libcupti
    

Nếu bạn không có CUPTI trên con đường, thêm vào trước thư mục cài đặt của nó đến $LD_LIBRARY_PATH biến môi trường bằng cách chạy:

export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH

Sau đó, chạy ldconfig lệnh trên một lần nữa để xác minh rằng các thư viện CUPTI được tìm thấy.

Giải quyết các vấn đề về đặc quyền

Khi bạn chạy profiling với CUDA® Toolkit trong một môi trường Docker hoặc trên Linux, bạn có thể gặp phải các vấn đề liên quan đến đủ đặc quyền CUPTI ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ). Tới Documents Developer NVIDIA để tìm hiểu thêm về cách bạn có thể giải quyết những vấn đề trên Linux.

Để giải quyết các vấn đề về đặc quyền CUPTI trong môi trường Docker, hãy chạy

docker run option '--privileged=true'

Công cụ lập hồ sơ

Truy cập Profiler từ Hồ sơ tab trong TensorBoard, mà chỉ xuất hiện sau khi bạn đã nắm bắt một số dữ liệu mô hình.

Profiler có một loạt các công cụ để giúp phân tích hiệu suất:

  • Trang tổng quan
  • Trình phân tích đường ống đầu vào
  • Số liệu thống kê về TensorFlow
  • Trình xem theo dõi
  • Số liệu thống kê về nhân GPU
  • Công cụ cấu hình bộ nhớ
  • Pod Viewer

Trang tổng quan

Trang tổng quan cung cấp chế độ xem cấp cao nhất về cách mô hình của bạn hoạt động trong quá trình chạy hồ sơ. Trang này hiển thị cho bạn trang tổng quan tổng hợp cho máy chủ lưu trữ và tất cả các thiết bị của bạn và một số đề xuất để cải thiện hiệu suất đào tạo mô hình của bạn. Bạn cũng có thể chọn từng máy chủ trong trình đơn Máy chủ thả xuống.

Trang tổng quan hiển thị dữ liệu như sau:

hình ảnh

  • Hiệu suất Tóm tắt: Hiển thị một bản tóm tắt cấp cao về hiệu suất mô hình của bạn. Bản tóm tắt hiệu suất có hai phần:

    1. Phân tích thời gian theo từng bước: Chia nhỏ thời gian trung bình của từng bước thành nhiều danh mục về nơi thời gian được sử dụng:

      • Biên dịch: Thời gian dành cho việc biên dịch hạt nhân.
      • Đầu vào: Thời gian dành để đọc dữ liệu đầu vào.
      • Đầu ra: Thời gian dành để đọc dữ liệu đầu ra.
      • Khởi chạy nhân: Thời gian máy chủ dành để khởi chạy nhân
      • Máy chủ lưu trữ thời gian ..
      • Thời gian giao tiếp giữa thiết bị với thiết bị.
      • Thời gian tính toán trên thiết bị.
      • Tất cả những thứ khác, bao gồm cả chi phí Python.
    2. Các lựa chọn tính toán của thiết bị - Báo cáo tỷ lệ phần trăm thời gian tính toán của thiết bị sử dụng tính toán 16 và 32 bit.

  • Bước thời gian Graph: Hiển thị một biểu đồ thời gian bước thiết bị (trong mili giây) so với tất cả các bước lấy mẫu. Mỗi bước được chia thành nhiều danh mục (với các màu khác nhau) về nơi thời gian được sử dụng. Vùng màu đỏ tương ứng với phần thời gian các thiết bị ở chế độ chờ đợi dữ liệu đầu vào từ máy chủ. Vùng màu xanh lá cây cho biết thời gian thiết bị đã thực sự hoạt động.

  • Top 10 hoạt động TensorFlow trên thiết bị (ví dụ GPU): Hiển thị các ops trên thiết bị chạy dài nhất.

    Mỗi hàng hiển thị thời gian tự thực hiện (theo phần trăm thời gian được thực hiện bởi tất cả các hoạt động), thời gian tích lũy, danh mục và tên.

  • Run Môi trường: Hiển thị một bản tóm tắt cấp cao của môi trường mô hình chạy bao gồm:

    • Số lượng máy chủ được sử dụng.
    • Loại thiết bị (GPU / TPU).
    • Số lõi thiết bị.
  • Khuyến nghị cho Tiếp Bước: Báo cáo khi một mô hình là đầu vào ràng buộc và khuyến cáo các công cụ bạn có thể sử dụng để xác định vị trí và tắc nghẽn hiệu suất quyết tâm mô hình.

Máy phân tích đường ống đầu vào

Khi một chương trình TensorFlow đọc dữ liệu từ một tệp, chương trình đó sẽ bắt đầu ở trên cùng của biểu đồ TensorFlow theo cách xoay vòng. Quá trình đọc được chia thành nhiều giai đoạn xử lý dữ liệu nối tiếp nhau, trong đó đầu ra của một giai đoạn là đầu vào cho giai đoạn tiếp theo. Hệ thống này của dữ liệu đọc được gọi là đường ống đầu vào.

Một đường dẫn điển hình để đọc bản ghi từ tệp có các giai đoạn sau:

  1. Đọc tệp.
  2. Xử lý trước tệp (tùy chọn).
  3. Truyền tệp từ máy chủ sang thiết bị.

Một đường dẫn đầu vào không hiệu quả có thể làm chậm nghiêm trọng ứng dụng của bạn. Đơn được coi là đầu vào ràng buộc khi nó dành một phần đáng kể thời gian trong các đường ống đầu vào. Sử dụng thông tin chi tiết thu được từ bộ phân tích đường ống đầu vào để hiểu nơi đường ống đầu vào không hiệu quả.

Bộ phân tích đường dẫn đầu vào cho bạn biết ngay lập tức liệu chương trình của bạn có bị ràng buộc đầu vào hay không và hướng dẫn bạn qua phân tích phía thiết bị và máy chủ để gỡ lỗi tắc nghẽn hiệu suất ở bất kỳ giai đoạn nào trong đường dẫn đầu vào.

Kiểm tra hướng dẫn về hiệu suất đường ống đầu vào để biết các phương pháp hay nhất được đề xuất nhằm tối ưu hóa đường ống đầu vào dữ liệu của bạn.

Bảng điều khiển đường ống đầu vào

Để mở máy phân tích đường ống đầu vào, chọn hồ sơ, sau đó chọn input_pipeline_analyzer từ các công cụ thả xuống.

hình ảnh

Trang tổng quan có ba phần:

  1. Tóm tắt: Tóm tắt đường ống đầu vào chung với thông tin về việc ứng dụng của bạn được đầu vào ràng buộc, và nếu như vậy, bởi bao nhiêu.
  2. Phân tích thiết bị-side: Hiển thị chi tiết, kết quả phân tích thiết bị-phụ, bao gồm các thiết bị bước thời gian và phạm vi thời gian thiết bị dành chờ đợi dữ liệu đầu vào trên lõi ở mỗi bước.
  3. Phân tích chủ-side: cho thấy một phân tích chi tiết về phía chủ nhà, trong đó có một phân tích về thời gian xử lý đầu vào trên máy chủ.

Tóm tắt đường dẫn đầu vào

Tóm tắt báo cáo nếu chương trình của bạn là đầu vào ràng buộc bằng cách trình bày tỷ lệ phần trăm thời gian thiết bị dành cho chờ đợi thông tin từ máy chủ. Nếu bạn đang sử dụng đường dẫn đầu vào tiêu chuẩn đã được thiết kế sẵn, công cụ sẽ báo cáo nơi phần lớn thời gian xử lý đầu vào được sử dụng.

Phân tích phía thiết bị

Phân tích phía thiết bị cung cấp thông tin chi tiết về thời gian sử dụng thiết bị so với máy chủ và thời gian thiết bị đã dành để đợi dữ liệu đầu vào từ máy chủ.

  1. Thời gian Bước âm mưu chống lại số bước: Hiển thị một biểu đồ thời gian bước thiết bị (trong mili giây) so với tất cả các bước lấy mẫu. Mỗi bước được chia thành nhiều danh mục (với các màu khác nhau) về nơi thời gian được sử dụng. Vùng màu đỏ tương ứng với phần thời gian các thiết bị ở chế độ chờ đợi dữ liệu đầu vào từ máy chủ. Vùng màu xanh lá cây cho biết thời gian thiết bị thực sự hoạt động.
  2. Thống kê thời gian bước: Báo cáo này, độ lệch chuẩn trung bình, và phạm vi ([tối thiểu, tối đa]) của bước thời gian thiết bị.

Phân tích phía máy chủ

Phân tích chủ-side báo cáo một phân tích về thời gian xử lý đầu vào (thời gian dành cho tf.data ops API) trên máy chủ thành nhiều loại:

  • Đọc dữ liệu từ file theo yêu cầu: Thời gian dành cho đọc dữ liệu từ các tập tin mà không cần bộ nhớ đệm, tìm nạp trước, và đan xen.
  • Đọc dữ liệu từ các tập tin trước: Thời gian dành cho việc đọc tác phẩm, bao gồm cả bộ nhớ đệm, tìm nạp trước, và đan xen.
  • Dữ liệu tiền xử lý: Thời gian trên ops tiền xử lý, chẳng hạn như giải nén hình ảnh.
  • Dữ liệu enqueuing được chuyển vào điện thoại: Thời gian dành cho việc đưa dữ liệu vào một hàng đợi infeed trước khi chuyển dữ liệu đến thiết bị.

Mở rộng đầu vào Op kê để kiểm tra số liệu thống kê cho ops đầu vào riêng và danh mục của họ bị phá vỡ bởi thời gian thực hiện.

hình ảnh

Một bảng dữ liệu nguồn sẽ xuất hiện với mỗi mục nhập chứa thông tin sau:

  1. Op Input: hiển thị tên op TensorFlow của op đầu vào.
  2. Đếm: Hiển thị tổng số các trường hợp thực hiện op trong thời gian hồ sơ.
  3. Tổng thời gian (tính bằng ms): Hiển thị tổng tích lũy của thời gian dành cho mỗi người trong số những trường hợp.
  4. Tổng thời gian%: hiển thị tổng thời gian dành cho một op như một phần nhỏ của tổng thời gian dành cho chế biến đầu vào.
  5. Tổng số tự thời gian (tính bằng ms): Hiển thị tổng tích lũy thời gian tự chi cho mỗi người trong số những trường hợp. Thời gian tự ở đây đo thời gian dành cho bên trong cơ thể hàm, không bao gồm thời gian dành cho hàm mà nó gọi.
  6. Tổng số Tự Time%. Hiển thị tổng thời gian của bản thân dưới dạng một phần của tổng thời gian dành cho xử lý đầu vào.
  7. Thể loại. Hiển thị loại xử lý của op đầu vào.

Số liệu thống kê về TensorFlow

Công cụ TensorFlow Stats hiển thị hiệu suất của mọi op (op) TensorFlow được thực thi trên máy chủ hoặc thiết bị trong phiên lập hồ sơ.

hình ảnh

Công cụ hiển thị thông tin hiệu suất trong hai ngăn:

  • Ngăn phía trên hiển thị tối đa bốn biểu đồ hình tròn:

    1. Sự phân bố thời gian tự thực hiện của từng op trên máy chủ.
    2. Sự phân bố thời gian tự thực hiện của từng loại op trên máy chủ.
    3. Sự phân bố thời gian tự thực hiện của từng op trên thiết bị.
    4. Sự phân bố thời gian tự thực hiện của từng loại op trên thiết bị.
  • Ngăn bên dưới hiển thị bảng báo cáo dữ liệu về hoạt động TensorFlow với một hàng cho mỗi hoạt động và một cột cho mỗi loại dữ liệu (sắp xếp các cột bằng cách nhấp vào tiêu đề của cột). Nhấp vào Xuất dưới dạng CSV nút ở phía bên phải của cửa sổ phía trên để xuất dữ liệu từ bảng này như một tập tin CSV.

    Lưu ý rằng:

    • Nếu bất kỳ hoạt động nào có hoạt động con:

      • Tổng thời gian "tích lũy" của một op bao gồm cả thời gian ở bên trong op con.
      • Tổng thời gian "tự" của một hoạt động không bao gồm thời gian dành cho các hoạt động con.
    • Nếu một op thực thi trên máy chủ:

      • Tỷ lệ phần trăm của tổng thời gian tự trên thiết bị mà tùy chọn bật sẽ là 0.
      • Phần trăm tích lũy của tổng thời gian tự động trên thiết bị cho đến và bao gồm tùy chọn này sẽ là 0.
    • Nếu một op thực thi trên thiết bị:

      • Tỷ lệ phần trăm của tổng thời gian tự động trên máy chủ mà tùy chọn này phải chịu sẽ là 0.
      • Phần trăm tích lũy của tổng thời gian tự động trên máy chủ tối đa và bao gồm tùy chọn này sẽ là 0.

Bạn có thể chọn bao gồm hoặc loại trừ thời gian không hoạt động trong biểu đồ hình tròn và bảng.

Trình xem theo dõi

Trình xem theo dõi hiển thị dòng thời gian cho thấy:

  • Thời lượng cho các hoạt động được thực thi bởi mô hình TensorFlow của bạn
  • Phần nào của hệ thống (máy chủ hoặc thiết bị) đã thực hiện một op. Thông thường, máy chủ thực hiện các hoạt động đầu vào, xử lý trước dữ liệu đào tạo và chuyển nó đến thiết bị, trong khi thiết bị thực hiện đào tạo mô hình thực tế

Trình xem theo dõi cho phép bạn xác định các vấn đề về hiệu suất trong mô hình của mình, sau đó thực hiện các bước để giải quyết chúng. Ví dụ: ở cấp độ cao, bạn có thể xác định liệu đầu vào hoặc đào tạo mô hình đang chiếm phần lớn thời gian. Đi sâu vào, bạn có thể xác định hoạt động nào mất nhiều thời gian nhất để thực hiện. Lưu ý rằng trình xem theo dõi được giới hạn ở 1 triệu sự kiện trên mỗi thiết bị.

Giao diện trình xem theo dõi

Khi bạn mở trình xem theo dõi, nó sẽ hiển thị lần chạy gần đây nhất của bạn:

hình ảnh

Màn hình này chứa các yếu tố chính sau:

  1. Timeline pane Trước | ops rằng thiết bị và các máy chủ thực hiện theo thời gian.
  2. Panel chi tiết: sẽ hiển thị các thông tin cho ops lựa chọn ở khung Timeline.

Ngăn Dòng thời gian chứa các phần tử sau:

  1. Lên trên thanh: Chứa điều khiển phụ trợ khác nhau.
  2. Trục thời gian: hiển thị thời gian tương đối so với đầu của các dấu vết.
  3. Phần và theo dõi nhãn: Mỗi phần có chứa nhiều bài hát và có một hình tam giác bên trái mà bạn có thể bấm vào để mở rộng hoặc thu phần này. Có một phần cho mọi phần tử xử lý trong hệ thống.
  4. Công cụ chọn: Chứa các công cụ khác nhau để tương tác với người xem dấu vết như Zoom, Pan, Select, và Thời gian. Sử dụng công cụ Định thời gian để đánh dấu một khoảng thời gian.
  5. Sự kiện: Những hiển thị thời gian mà một op được thực hiện hoặc thời gian của meta-sự kiện, chẳng hạn như các bước đào tạo.
Phần và bản nhạc

Trình xem dấu vết bao gồm các phần sau:

  • Một phần cho mỗi nút thiết bị, dán nhãn với số lượng chip thiết bị và nút thiết bị bên trong chip (ví dụ, /device:GPU:0 (pid 0) ). Mỗi phần nút thiết bị chứa các bản nhạc sau:
    • Bước: Hiển thị thời gian các bước đào tạo đã được chạy trên thiết bị
    • TensorFlow Ops: Hiển thị ops thực hiện trên thiết bị
    • XLA Ops Trước | XLA hoạt động (ops) mà ran trên thiết bị nếu XLA là trình biên dịch sử dụng (mỗi TensorFlow op được dịch sang một hoặc một số ops XLA Các XLA trình biên dịch các ops XLA vào mã mà chạy trên thiết bị.).
  • Một phần dành cho đề chạy trên CPU của máy chủ, có nhãn "chủ đề". Phần này chứa một rãnh cho mỗi luồng CPU. Lưu ý rằng bạn có thể bỏ qua thông tin được hiển thị cùng với các nhãn phần.
Sự kiện

Các sự kiện trong dòng thời gian được hiển thị bằng các màu khác nhau; bản thân màu sắc không có ý nghĩa cụ thể.

Trình xem theo dõi cũng có thể hiển thị dấu vết của các lệnh gọi hàm Python trong chương trình TensorFlow của bạn. Nếu bạn sử dụng tf.profiler.experimental.start API, bạn có thể bật Python truy tìm bằng ProfilerOptions namedtuple khi bắt đầu profiling. Ngoài ra, nếu bạn sử dụng chế độ lấy mẫu cho profiling, bạn có thể chọn mức độ truy tìm bằng cách sử dụng các tùy chọn thả xuống trong hộp thoại Capture hồ sơ.

hình ảnh

Số liệu thống kê về nhân GPU

Công cụ này hiển thị thống kê hiệu suất và lựa chọn ban đầu cho mọi hạt nhân được tăng tốc GPU.

hình ảnh

Công cụ hiển thị thông tin trong hai ngăn:

  • Khung phía trên hiển thị biểu đồ hình tròn hiển thị các nhân CUDA có tổng thời gian đã trôi qua cao nhất.

  • Ngăn dưới hiển thị một bảng với dữ liệu sau cho từng cặp kernel-op duy nhất:

    • Xếp hạng theo thứ tự giảm dần của tổng thời lượng GPU đã trôi qua được nhóm theo cặp kernel-op.
    • Tên của hạt nhân đã khởi chạy.
    • Số lượng thanh ghi GPU được sử dụng bởi hạt nhân.
    • Tổng kích thước của bộ nhớ được chia sẻ (chia sẻ tĩnh + động) được sử dụng tính bằng byte.
    • Kích thước khối thể hiện dưới dạng blockDim.x, blockDim.y, blockDim.z .
    • Các kích thước lưới thể hiện dưới dạng gridDim.x, gridDim.y, gridDim.z .
    • Cho dù op là đủ điều kiện để sử dụng tensor lõi .
    • Liệu hạt nhân có chứa các lệnh Tensor Core hay không.
    • Tên của op đã khởi chạy hạt nhân này.
    • Số lần xuất hiện của cặp kernel-op này.
    • Tổng thời gian GPU đã trôi qua tính bằng micro giây.
    • Thời gian GPU trôi qua trung bình tính bằng micro giây.
    • Thời gian GPU đã trôi qua tối thiểu tính bằng micro giây.
    • Thời gian GPU tối đa đã trôi qua tính bằng micro giây.

Công cụ hồ sơ bộ nhớ

Các Memory hồ sơ theo dõi công cụ sử dụng bộ nhớ của điện thoại trong khoảng thời gian hồ sơ. Bạn có thể sử dụng công cụ này để:

  • Gỡ lỗi sự cố hết bộ nhớ (OOM) bằng cách xác định mức sử dụng bộ nhớ tối đa và phân bổ bộ nhớ tương ứng cho các hoạt động TensorFlow. Bạn cũng có thể gỡ rối các vấn đề oom có thể phát sinh khi bạn chạy multi-tenancy suy luận.
  • Gỡ lỗi sự cố phân mảnh bộ nhớ.

Công cụ cấu hình bộ nhớ hiển thị dữ liệu trong ba phần:

  1. Tóm tắt cấu hình bộ nhớ
  2. Biểu đồ dòng thời gian bộ nhớ
  3. Bảng phân tích bộ nhớ

Tóm tắt hồ sơ bộ nhớ

Phần này hiển thị bản tóm tắt cấp cao về cấu hình bộ nhớ của chương trình TensorFlow của bạn như được hiển thị bên dưới:

Tóm tắt hồ sơ bộ nhớ có sáu trường:

  1. ID Memory: Thả xuống trong đó liệt kê tất cả các hệ thống bộ nhớ điện thoại có sẵn. Chọn hệ thống bộ nhớ bạn muốn xem từ menu thả xuống.
  2. #Allocation: Số phân bổ bộ nhớ được thực hiện trong khoảng thời gian hồ sơ.
  3. #Deallocation: Số deallocations bộ nhớ trong khoảng profiling
  4. Nâng cao năng lực bộ nhớ: Tổng công suất (trong gibs) của hệ thống bộ nhớ mà bạn chọn.
  5. Đỉnh Heap Cách sử dụng: Việc sử dụng bộ nhớ cao điểm (trong gibs) kể từ khi mô hình bắt đầu chạy.
  6. Đỉnh Memory Usage: Việc sử dụng bộ nhớ cao điểm (trong gibs) ở khoảng profiling. Trường này chứa các trường con sau:
    1. Timestamp: Dấu thời gian khi sử dụng bộ nhớ đỉnh xảy ra trên Sơ đồ Timeline.
    2. Ngăn xếp Reservation: Lượng bộ nhớ dành riêng trên stack (trong gibs).
    3. Phân bổ Heap: Số lượng bộ nhớ cấp phát trên heap (trong gibs).
    4. Memory miễn phí: Số lượng bộ nhớ miễn phí (trong gibs). Dung lượng bộ nhớ là tổng cộng của Đặt trước ngăn xếp, Phân bổ đống và Bộ nhớ trống.
    5. Phân mảnh: Tỷ lệ phân mảnh (thấp hơn là tốt hơn). Nó được tính bằng tỷ lệ phần trăm (1 - Size of the largest chunk of free memory / Total free memory) .

Biểu đồ dòng thời gian bộ nhớ

Phần này hiển thị biểu đồ sử dụng bộ nhớ (tính bằng GiB) và tỷ lệ phần trăm phân mảnh so với thời gian (tính bằng mili giây).

hình ảnh

Trục X đại diện cho dòng thời gian (tính bằng mili giây) của khoảng thời gian lập hồ sơ. Trục Y ở bên trái biểu thị mức sử dụng bộ nhớ (trong GiB) và trục Y ở bên phải biểu thị phần trăm phân mảnh. Tại mỗi thời điểm trên trục X, tổng bộ nhớ được chia thành ba loại: ngăn xếp (màu đỏ), heap (màu cam) và trống (màu xanh lục). Di chuột qua một dấu thời gian cụ thể để xem chi tiết về các sự kiện phân bổ / phân bổ bộ nhớ tại thời điểm đó như bên dưới:

hình ảnh

Cửa sổ bật lên hiển thị thông tin sau:

  • dấu thời gian (ms): Vị trí của sự kiện được lựa chọn trên timeline.
  • sự kiện: Các loại sự kiện (phân bổ hoặc deallocation).
  • requested_size (gibs): Số lượng bộ nhớ được yêu cầu. Đây sẽ là một số âm cho các sự kiện phân bổ.
  • allocation_size (gibs): Số tiền thực tế của bộ nhớ được phân bổ. Đây sẽ là một số âm cho các sự kiện phân bổ.
  • tf_op: Các op TensorFlow rằng yêu cầu phân bổ / deallocation.
  • step_id: Bước đào tạo, trong đó sự kiện này xảy ra.
  • REGION_TYPE: Loại thực thể dữ liệu mà bộ nhớ phân bổ này là dành cho. Giá trị có thể là temp cho là tạm thời, output cho kích hoạt và gradient, và persist / dynamic cho trọng lượng và hằng số.
  • data_type: Kiểu yếu tố tensor (ví dụ, uint8 cho số nguyên unsigned 8-bit).
  • tensor_shape: Hình dạng của tensor được phân bổ / deallocated.
  • memory_in_use (gibs): Tổng bộ nhớ đang được sử dụng tại thời điểm này.

Bảng phân tích bộ nhớ

Bảng này hiển thị phân bổ bộ nhớ hoạt động tại thời điểm sử dụng bộ nhớ cao nhất trong khoảng thời gian định cấu hình.

hình ảnh

Có một hàng cho mỗi TensorFlow Op và mỗi hàng có các cột sau:

  • Tên Op: Tên của TensorFlow op.
  • Kích thước phân bổ (gibs): Tổng dung lượng bộ nhớ được phân bổ cho op này.
  • Kích thước yêu cầu (gibs): Tổng dung lượng bộ nhớ được yêu cầu cho op này.
  • Những lần xuất hiện: Số lượng phân bổ cho op này.
  • Loại khu vực: Các loại thực thể dữ liệu mà bộ nhớ phân bổ này là dành cho. Giá trị có thể là temp cho là tạm thời, output cho kích hoạt và gradient, và persist / dynamic cho trọng lượng và hằng số.
  • Kiểu dữ liệu: Các loại nguyên tố tensor.
  • Shape: Hình dạng của tensors phân bổ.

Trình xem pod

Công cụ Pod Viewer hiển thị bảng phân tích của một bước đào tạo trên tất cả nhân viên.

hình ảnh

  • Ngăn phía trên có một thanh trượt để chọn số bước.
  • Ngăn dưới hiển thị biểu đồ cột xếp chồng lên nhau. Đây là chế độ xem cấp cao về các danh mục thời gian theo từng bước được chia nhỏ được đặt trên đỉnh nhau. Mỗi cột xếp chồng lên nhau đại diện cho một công nhân duy nhất.
  • Khi bạn di chuột qua một cột xếp chồng lên nhau, thẻ ở phía bên trái sẽ hiển thị thêm thông tin chi tiết về phân tích bước.

phân tích nút cổ chai tf.data

Các tf.data công cụ phân tích nút cổ chai tự động phát hiện tắc nghẽn trong tf.data đường ống đầu vào trong chương trình của bạn và cung cấp các khuyến nghị về cách khắc phục chúng. Nó hoạt động với bất kỳ chương trình sử dụng tf.data không phụ thuộc vào nền tảng (CPU / GPU / TPU). Phân tích và khuyến nghị của mình dựa trên này hướng dẫn .

Nó phát hiện một nút cổ chai bằng cách làm theo các bước sau:

  1. Tìm máy chủ lưu trữ ràng buộc đầu vào nhất.
  2. Tìm việc thực hiện chậm nhất của một tf.data đường ống đầu vào.
  3. Xây dựng lại đồ thị đường ống đầu vào từ dấu vết của trình biên dịch.
  4. Tìm đường dẫn quan trọng trong đồ thị đường dẫn đầu vào.
  5. Xác định sự chuyển biến chậm nhất trên con đường quan trọng là điểm nghẽn.

Giao diện người dùng được chia thành ba phần: Phân tích Hiệu suất Tóm tắt thông tin, tóm tắt tất cả Input Đường ốngđường ống Input Graph.

Tóm tắt phân tích hiệu suất

hình ảnh

Phần này cung cấp tóm tắt của phân tích. Nó báo cáo về chậm tf.data đường ống đầu vào phát hiện trong hồ sơ cá nhân. Phần này cũng hiển thị máy chủ bị ràng buộc đầu vào nhất và đường dẫn đầu vào chậm nhất của nó với độ trễ tối đa. Quan trọng nhất, nó xác định phần nào của đường ống đầu vào là nút cổ chai và cách khắc phục. Thông tin về nút cổ chai được cung cấp với loại trình lặp và tên dài của nó.

Cách đọc tên dài của trình lặp tf.data

Một tên dài được định dạng như Iterator::<Dataset_1>::...::<Dataset_n> . Trong tên dài, <Dataset_n> phù hợp với loại iterator và bộ dữ liệu khác trong tên dài đại diện cho biến đổi hạ lưu.

Ví dụ: hãy xem xét tập dữ liệu đường ống đầu vào sau:

dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5)

Tên dài cho các trình vòng lặp từ tập dữ liệu trên sẽ là:

Loại trình lặp lại Tên dài
Phạm vi Trình lặp lại :: Batch :: Lặp lại :: Bản đồ :: Phạm vi
Bản đồ Trình lặp lại :: Batch :: Lặp lại :: Bản đồ
Lặp lại Trình lặp lại :: Batch :: Lặp lại
Lô hàng Trình lặp lại :: Hàng loạt

Tóm tắt tất cả các đường ống đầu vào

hình ảnh

Phần này cung cấp bản tóm tắt của tất cả các đường dẫn đầu vào trên tất cả các máy chủ. Thông thường có một đường ống đầu vào. Khi sử dụng các chiến lược phân phối, có một đường ống đầu vào máy chủ chạy của chương trình tf.data mã và nhiều đường ống đầu vào thiết bị lấy dữ liệu từ các đường ống dẫn đầu vào máy chủ và chuyển nó vào thiết bị.

Đối với mỗi đường dẫn đầu vào, nó hiển thị số liệu thống kê về thời gian thực hiện của nó. Một cuộc gọi được tính là chậm nếu nó kéo dài hơn 50 μs.

Biểu đồ đường ống đầu vào

hình ảnh

Phần này hiển thị đồ thị đường ống đầu vào với thông tin thời gian thực hiện. Bạn có thể sử dụng "Máy chủ lưu trữ" và "Đường ống đầu vào" để chọn máy chủ lưu trữ và đường ống đầu vào để xem. Hành của đường ống đầu vào được sắp xếp theo thời gian thực hiện theo thứ tự mà bạn có thể chọn bằng menu Rank giảm dần.

hình ảnh

Các nút trên đường quan trọng có đường viền đậm. Nút thắt cổ chai, là nút có thời gian tự kéo dài nhất trên đường tới hạn, có đường viền màu đỏ. Các nút không quan trọng khác có đường viền gạch ngang màu xám.

Trong mỗi nút, Thời gian bắt đầu hiển thị thời gian bắt đầu thực hiện. Các nút tương tự có thể được thực hiện nhiều lần, ví dụ, nếu có một Batch op trong các đường ống đầu vào. Nếu nó được thực hiện nhiều lần thì đó là thời điểm bắt đầu của lần thực thi đầu tiên.

Tổng thời là thời điểm bức tường của việc thực hiện. Nếu nó được thực hiện nhiều lần, nó là tổng thời gian tường của tất cả các lần thực thi.

Tự Thời gianTổng thời gian mà không có thời gian chồng chéo với các nút con trực tiếp của nó.

"# Cuộc gọi" là số lần đường ống đầu vào được thực thi.

Thu thập dữ liệu hiệu suất

TensorFlow Profiler thu thập các hoạt động máy chủ lưu trữ và dấu vết GPU của mô hình TensorFlow của bạn. Bạn có thể cấu hình Hồ sơ để thu thập dữ liệu hiệu suất thông qua chế độ lập trình hoặc chế độ lấy mẫu.

API hồ sơ

Bạn có thể sử dụng các API sau để thực hiện việc lập hồ sơ.

  • Chế độ theo chương trình bằng cách sử dụng TensorBoard Keras Callback ( tf.keras.callbacks.TensorBoard )

    # Profile from batches 10 to 15
    tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir,
                                                 profile_batch='10, 15')
    
    # Train the model and use the TensorBoard Keras callback to collect
    # performance profiling data
    model.fit(train_data,
              steps_per_epoch=20,
              epochs=5,
              callbacks=[tb_callback])
    
  • Chế độ theo chương trình bằng cách sử dụng tf.profiler API Chức năng

    tf.profiler.experimental.start('logdir')
    # Train the model here
    tf.profiler.experimental.stop()
    
  • Chế độ có lập trình sử dụng trình quản lý ngữ cảnh

    with tf.profiler.experimental.Profile('logdir'):
        # Train the model here
        pass
    

  • Chế độ lấy mẫu: Thực hiện theo yêu cầu bằng cách sử dụng profiling tf.profiler.experimental.server.start để bắt đầu một máy chủ với mô hình TensorFlow của bạn chạy gRPC. Sau khi khởi động máy chủ gRPC và chạy mô hình của bạn, bạn có thể chụp một hồ sơ thông qua Cấu nút Capture trong plugin hồ sơ TensorBoard. Sử dụng tập lệnh trong phần Cài đặt cấu hình ở trên để khởi chạy phiên bản TensorBoard nếu nó chưa chạy.

    Ví dụ,

    # Start a profiler server before your model runs.
    tf.profiler.experimental.server.start(6009)
    # (Model code goes here).
    #  Send a request to the profiler server to collect a trace of your model.
    tf.profiler.experimental.client.trace('grpc://localhost:6009',
                                          'gs://your_tb_logdir', 2000)
    

    Một ví dụ để lập hồ sơ nhiều nhân viên:

    # E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you
    # would like to profile for a duration of 2 seconds.
    tf.profiler.experimental.client.trace(
        'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466',
        'gs://your_tb_logdir',
        2000)
    

Sử dụng hộp thoại Capture hồ sơ để xác định:

  • Danh sách các URL dịch vụ hồ sơ hoặc tên TPU được phân tách bằng dấu phẩy.
  • Thời hạn lập hồ sơ.
  • Mức độ theo dõi cuộc gọi chức năng của thiết bị, máy chủ và Python.
  • Bao nhiêu lần bạn muốn Hồ sơ thử chụp lại các hồ sơ nếu lúc đầu không thành công.

Lập hồ sơ các vòng đào tạo tùy chỉnh

Để hồ sơ vòng đào tạo tùy chỉnh trong mã TensorFlow của bạn, công cụ vòng lặp đào tạo với tf.profiler.experimental.Trace API để đánh dấu ranh giới bước cho Profiler.

Các name lập luận được sử dụng như một tiền tố cho tên bước, step_num tranh cãi từ khóa được gắn trong tên bước, và _r tranh cãi từ khóa làm này sự kiện dấu vết được xử lý như một sự kiện từng Profiler.

Ví dụ,

for step in range(NUM_STEPS):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_data = next(dataset)
        train_step(train_data)

Điều này sẽ cho phép phân tích hiệu suất dựa trên bước của Hồ sơ và làm cho các sự kiện bước hiển thị trong trình xem theo dõi.

Hãy chắc chắn rằng bạn bao gồm các iterator bộ dữ liệu trong tf.profiler.experimental.Trace bối cảnh để phân tích chính xác của đường ống đầu vào.

Đoạn mã dưới đây là một mẫu chống:

for step, train_data in enumerate(dataset):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_step(train_data)

Hồ sơ các trường hợp sử dụng

Hồ sơ bao gồm một số trường hợp sử dụng dọc theo bốn trục khác nhau. Một số kết hợp hiện đang được hỗ trợ và những kết hợp khác sẽ được thêm vào trong tương lai. Một số trường hợp sử dụng là:

  • So với địa phương từ xa profiling: Đây là hai cách phổ biến của thiết lập môi trường profiling của bạn. Trong cấu hình cục bộ, API cấu hình được gọi trên cùng một máy mà mô hình của bạn đang thực thi, ví dụ: một máy trạm cục bộ có GPU. Trong cấu hình từ xa, API cấu hình được gọi trên một máy khác với nơi mà mô hình của bạn đang thực thi, chẳng hạn như trên Cloud TPU.
  • Profiling nhiều người lao động: Bạn có thể cấu hình nhiều máy tính khi sử dụng các khả năng đào tạo phân phối của TensorFlow.
  • Nền tảng phần cứng: CPU hồ sơ, GPU, và TPUs.

Bảng dưới đây cung cấp tổng quan nhanh về các trường hợp sử dụng được TensorFlow hỗ trợ được đề cập ở trên:

API hồ sơ Địa phương Xa Nhiều công nhân Nền tảng phần cứng
Gọi lại TensorBoard Keras Được hỗ trợ Không được hỗ trợ Không được hỗ trợ CPU, GPU
tf.profiler.experimental start / stop API Được hỗ trợ Không được hỗ trợ Không được hỗ trợ CPU, GPU
tf.profiler.experimental client.trace API Được hỗ trợ Được hỗ trợ Được hỗ trợ CPU, GPU, TPU
API trình quản lý ngữ cảnh Được hỗ trợ Không được hỗ trợ Không được hỗ trợ CPU, GPU

Các phương pháp hay nhất để có hiệu suất mô hình tối ưu

Sử dụng các đề xuất sau nếu có thể áp dụng cho các mô hình TensorFlow của bạn để đạt được hiệu suất tối ưu.

Nói chung, hãy thực hiện tất cả các chuyển đổi trên thiết bị và đảm bảo rằng bạn sử dụng phiên bản thư viện tương thích mới nhất như cuDNN và Intel MKL cho nền tảng của mình.

Tối ưu hóa đường ống dữ liệu đầu vào

Sử dụng dữ liệu từ [#input_pipeline_analyzer] để tối ưu hóa quy trình nhập dữ liệu của bạn. Một đường dẫn đầu vào dữ liệu hiệu quả có thể cải thiện đáng kể tốc độ thực thi mô hình của bạn bằng cách giảm thời gian nhàn rỗi của thiết bị. Cố gắng kết hợp các thực hành tốt nhất chi tiết trong Hiệu suất tốt hơn với các API tf.data dẫn và dưới đây để làm cho đường ống đầu vào dữ liệu của bạn hiệu quả hơn.

  • Nói chung, việc song song hóa bất kỳ hoạt động nào không cần thực hiện tuần tự có thể tối ưu hóa đáng kể đường dẫn đầu vào dữ liệu.

  • Trong nhiều trường hợp, nó sẽ giúp thay đổi thứ tự của một số lệnh gọi hoặc điều chỉnh các đối số để nó hoạt động tốt nhất cho mô hình của bạn. Trong khi tối ưu hóa đường ống dữ liệu đầu vào, chỉ chuẩn bộ tải dữ liệu mà không có các bước đào tạo và nhân giống ngược để lượng hóa tác động của các tối ưu hóa một cách độc lập.

  • Hãy thử chạy mô hình của bạn với dữ liệu tổng hợp để kiểm tra xem đường dẫn đầu vào có phải là nút cổ chai về hiệu suất hay không.

  • Sử dụng tf.data.Dataset.shard cho đào tạo đa GPU. Đảm bảo bạn phân đoạn rất sớm trong vòng lặp đầu vào để tránh giảm thông lượng. Khi làm việc với TFRecords, hãy đảm bảo bạn chia nhỏ danh sách TFRecords chứ không phải nội dung của TFRecords.

  • Parallelize nhiều ops bởi động thiết lập các giá trị của num_parallel_calls sử dụng tf.data.AUTOTUNE .

  • Xem xét hạn chế việc sử dụng tf.data.Dataset.from_generator vì nó chậm hơn được so sánh với ops TensorFlow tinh khiết.

  • Xem xét hạn chế việc sử dụng tf.py_function vì nó không thể được đăng và không được hỗ trợ để chạy trong TensorFlow phân phối.

  • Sử dụng tf.data.Options để kiểm soát tối ưu hóa tĩnh để đường ống đầu vào.

Cũng đọc tf.data phân tích hiệu suất dẫn để được hướng dẫn thêm về việc tối ưu hóa đường ống đầu vào bạn.

Tối ưu hóa việc tăng dữ liệu

Khi làm việc với dữ liệu hình ảnh, làm cho bạn dữ liệu tăng thêm hiệu quả hơn bằng cách đúc các loại dữ liệu khác nhau sau khi áp dụng biến đổi không gian, chẳng hạn như lật, cắt xén, xoay, vv

Sử dụng NVIDIA® DALI

Trong một số trường hợp, chẳng hạn như khi bạn có hệ thống có tỷ lệ GPU trên CPU cao, tất cả các tối ưu hóa ở trên có thể không đủ để loại bỏ tắc nghẽn trong bộ tải dữ liệu do giới hạn của chu kỳ CPU.

Nếu bạn đang sử dụng NVIDIA GPU cho computer vision và các ứng dụng học tập sâu âm thanh, xem xét việc sử dụng Đang tải dữ liệu Thư viện ( DALI ) để đẩy nhanh tiến độ đường ống dữ liệu.

Kiểm tra NVIDIA® DALI: Vận hành tài liệu cho một danh sách các ops DALI được hỗ trợ.

Sử dụng phân luồng và thực thi song song

Chạy ops trên nhiều chủ đề CPU với tf.config.threading API để thực hiện chúng nhanh hơn.

TensorFlow tự động đặt số lượng luồng song song theo mặc định. Nhóm luồng có sẵn để chạy các hoạt động TensorFlow phụ thuộc vào số luồng CPU có sẵn.

Kiểm soát tăng tốc song song tối đa cho một op duy nhất bằng cách sử dụng tf.config.threading.set_intra_op_parallelism_threads . Lưu ý rằng nếu bạn chạy nhiều hoạt động song song, tất cả chúng sẽ chia sẻ nhóm luồng có sẵn.

Nếu bạn có ops non-blocking độc lập (ops không có con đường đạo giữa chúng trên biểu đồ), sử dụng tf.config.threading.set_inter_op_parallelism_threads để chạy chúng đồng thời sử dụng hồ bơi thread có sẵn.

Điều khoản khác

Khi làm việc với các mô hình nhỏ hơn trên NVIDIA® GPU, bạn có thể đặt tf.compat.v1.ConfigProto.force_gpu_compatible=True để buộc tất cả tensors CPU được phân bổ với CUDA bộ nhớ gắn để đưa ra một cải thiện đáng kể hiệu suất mô hình. Tuy nhiên, hãy thận trọng khi sử dụng tùy chọn này cho các kiểu máy không xác định / rất lớn vì điều này có thể ảnh hưởng tiêu cực đến hiệu suất máy chủ (CPU).

Cải thiện hiệu suất thiết bị

Thực hiện theo các thông lệ tốt nhất chi tiết tại đây và trong hướng dẫn tối ưu hóa hiệu suất GPU để tối ưu hóa hiệu suất mô hình TensorFlow trên thiết bị.

Nếu bạn đang sử dụng GPU NVIDIA, hãy ghi việc sử dụng GPU và bộ nhớ vào tệp CSV bằng cách chạy:

nvidia-smi
--query-gpu=utilization.gpu,utilization.memory,memory.total,
memory.free,memory.used --format=csv

Định cấu hình bố cục dữ liệu

Khi làm việc với dữ liệu có chứa thông tin kênh (như hình ảnh), hãy tối ưu hóa định dạng bố cục dữ liệu để ưu tiên các kênh cuối cùng (NHWC hơn NCHW).

Định dạng dữ liệu kênh cuối cùng cải thiện tensor Lõi sử dụng và cung cấp những cải tiến hiệu suất đáng kể đặc biệt là trong các mô hình xoắn khi kết hợp với AMP. Bố cục dữ liệu NCHW vẫn có thể được vận hành bởi Tensor Cores, nhưng có thêm chi phí do các hoạt động chuyển đổi tự động.

Bạn có thể tối ưu hóa việc bố trí dữ liệu để thích bố trí NHWC bằng cách thiết lập data_format="channels_last" cho các lớp như tf.keras.layers.Conv2D , tf.keras.layers.Conv3D , và tf.keras.layers.RandomRotation .

Sử dụng tf.keras.backend.set_image_data_format để thiết lập các định dạng bố trí dữ liệu mặc định cho backend API Keras.

Sử dụng tối đa bộ nhớ đệm L2

When working with NVIDIA® GPUs, execute the code snippet below before the training loop to max out the L2 fetch granularity to 128 bytes.

import ctypes

_libcudart = ctypes.CDLL('libcudart.so')
# Set device limit on the current device
# cudaLimitMaxL2FetchGranularity = 0x05
pValue = ctypes.cast((ctypes.c_int*1)(), ctypes.POINTER(ctypes.c_int))
_libcudart.cudaDeviceSetLimit(ctypes.c_int(0x05), ctypes.c_int(128))
_libcudart.cudaDeviceGetLimit(pValue, ctypes.c_int(0x05))
assert pValue.contents.value == 128

Configure GPU thread usage

The GPU thread mode decides how GPU threads are used.

Set the thread mode to gpu_private to make sure that preprocessing does not steal all the GPU threads. This will reduce the kernel launch delay during training. You can also set the number of threads per GPU. Set these values using environment variables.

import os

os.environ['TF_GPU_THREAD_MODE']='gpu_private'
os.environ['TF_GPU_THREAD_COUNT']='1'

Configure GPU memory options

In general, increase the batch size and scale the model to better utilize GPUs and get higher throughput. Note that increasing the batch size will change the model's accuracy so the model needs to be scaled by tuning hyperparameters like the learning rate to meet the target accuracy.

Also, use tf.config.experimental.set_memory_growth to allow GPU memory to grow to prevent all the available memory from being fully allocated to ops that require only a fraction of the memory. This allows other processes which consume GPU memory to run on the same device.

To learn more, check out the Limiting GPU memory growth guidance in the GPU guide to learn more.

Miscellaneous

  • Increase the training mini-batch size (number of training samples used per device in one iteration of the training loop) to the maximum amount that fits without an out of memory (OOM) error on the GPU. Increasing the batch size impacts the model's accuracy—so make sure you scale the model by tuning hyperparameters to meet the target accuracy.

  • Disable reporting OOM errors during tensor allocation in production code. Set report_tensor_allocations_upon_oom=False in tf.compat.v1.RunOptions .

  • For models with convolution layers, remove bias addition if using batch normalization. Batch normalization shifts values by their mean and this removes the need to have a constant bias term.

  • Use TF Stats to find out how efficiently on-device ops run.

  • Use tf.function to perform computations and optionally, enable the jit_compile=True flag ( tf.function(jit_compile=True ). To learn more, go to Use XLA tf.function .

  • Minimize host Python operations between steps and reduce callbacks. Calculate metrics every few steps instead of at every step.

  • Keep the device compute units busy.

  • Send data to multiple devices in parallel.

  • Consider using 16-bit numerical representations , such as fp16 —the half-precision floating point format specified by IEEE—or the Brain floating-point bfloat16 format.

Additional resources

Known limitations

Profiling multiple GPUs on TensorFlow 2.2 and TensorFlow 2.3

TensorFlow 2.2 and 2.3 support multiple GPU profiling for single host systems only; multiple GPU profiling for multi-host systems is not supported. To profile multi-worker GPU configurations, each worker has to be profiled independently. From TensorFlow 2.4 multiple workers can be profiled using the tf.profiler.experimental.client.trace API.

CUDA® Toolkit 10.2 or later is required to profile multiple GPUs. As TensorFlow 2.2 and 2.3 support CUDA® Toolkit versions only up to 10.1, you need to create symbolic links to libcudart.so.10.1 and libcupti.so.10.1 :

sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1