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 lập hồ sơ hiệu suất mô hình của mình trên Cloud TPU, hãy tham khảo hướng dẫn Cloud TPU .
Cài đặt các điều kiện tiên quyết về 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:
- Đáp ứng các yêu cầu về trình điều khiển GPU NVIDIA® và Bộ công cụ CUDA® được liệt kê trong các yêu cầu phần mềm hỗ trợ GPU TensorFlow .
Đảm bảo rằng Giao diện công cụ lập hồ sơ NVIDIA® CUDA® (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 đường dẫn, hãy thêm trước thư mục cài đặt của nó vào biến môi trường $LD_LIBRARY_PATH
bằng cách chạy:
export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
Sau đó, chạy lại lệnh ldconfig
ở trên để xác minh rằng 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 cấu hình với Bộ công cụ CUDA® trong 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 không đủ đặc quyền CUPTI ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES
). Truy cập Tài liệu dành cho nhà phát triển NVIDIA để tìm hiểu thêm về cách bạn có thể giải quyết những sự cố này 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 vào Hồ sơ từ tab Hồ sơ trong TensorBoard, 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:
Tóm tắt Hiệu suất : Hiển thị 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:
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.
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.
Biểu đồ thời gian theo bước : Hiển thị biểu đồ thời gian của bước thiết bị (tính bằng mili giây) qua tất cả các bước đượ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ủa bướ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.
10 hoạt động TensorFlow hàng đầu trên thiết bị (ví dụ: GPU) : Hiển thị các hoạt động trên thiết bị chạy lâu nhất.
Mỗi hàng hiển thị thời gian tự hoạt động (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.
Môi trường chạy : Hiển thị bản tóm tắt cấp cao của môi trường chạy mô hình 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ị.
Đề xuất cho Bước tiếp theo : Báo cáo khi mô hình bị ràng buộc đầu vào và đề xuất các công cụ bạn có thể sử dụng để xác định vị trí và giải quyết tắc nghẽn hiệu suất 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 đọc dữ liệu này được gọi là đường dẫn đầ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:
- Đọc tệp.
- Xử lý trước tệp (tùy chọn).
- 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. Một ứng dụng được coi là bị ràng buộc đầu vào khi nó dành một phần đáng kể thời gian trong đường dẫn đầ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ở trình phân tích đường ống đầu vào, hãy chọn Hồ sơ , sau đó chọn input_pipeline_analyzer từ menu thả xuống Công cụ .
Trang tổng quan có ba phần:
- Tóm tắt : Tóm tắt quy trình đầu vào tổng thể với thông tin về việc ứng dụng của bạn có bị ràng buộc đầu vào hay không và nếu có, thì bao nhiêu.
- Phân tích phía thiết bị : Hiển thị kết quả phân tích chi tiết phía thiết bị, bao gồm thời gian từng bước của thiết bị và phạm vi thời gian thiết bị dành để chờ dữ liệu đầu vào giữa các lõi ở mỗi bước.
- Phân tích phía máy chủ: Hiển thị phân tích chi tiết về phía máy chủ, bao gồm bảng phân tích thời gian xử lý đầu vào trên máy chủ.
Tóm tắt đường dẫn đầu vào
Báo cáo Tóm tắt nếu chương trình của bạn bị ràng buộc đầu vào bằng cách trình bày tỷ lệ phần trăm thời gian thiết bị dành cho việc chờ đầu vào 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ủ lưu trữ và thời gian thiết bị đã dành để đợi dữ liệu đầu vào từ máy chủ lưu trữ.
- Biểu đồ thời gian theo bước dựa trên số bước : Hiển thị biểu đồ thời gian của bước thiết bị (tính bằng mili giây) qua tất cả các bước đượ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ủa bướ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.
- Thống kê thời gian theo bước : Báo cáo trung bình, độ lệch chuẩn và phạm vi ([tối thiểu, tối đa]) của thời gian bước của thiết bị.
Phân tích phía máy chủ
Phân tích phía máy chủ báo cáo phân tích thời gian xử lý đầu vào (thời gian dành cho các hoạt động API tf.data
) trên máy chủ thành một số danh mục:
- Đọc dữ liệu từ tệp theo yêu cầu : Thời gian dành cho việc đọc dữ liệu từ tệp mà không cần lưu vào bộ nhớ đệm, tìm nạp trước và xen kẽ.
- Đọc trước dữ liệu từ các tệp : Thời gian dành để đọc các tệp, bao gồm bộ nhớ đệm, tìm nạp trước và xen kẽ.
- Tiền xử lý dữ liệu : Thời gian dành cho các hoạt động tiền xử lý, chẳng hạn như giải nén hình ảnh.
- Yêu cầu dữ liệu được chuyển tới thiết bị : Thời gian dành để đưa dữ liệu vào hàng đợi nạp trước khi chuyển dữ liệu đến thiết bị.
Mở rộng Thống kê Op Đầu vào để kiểm tra thống kê cho các hoạt động đầu vào riêng lẻ và danh mục của chúng được chia nhỏ theo thời gian thực hiện.
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:
- Op đầu vào : Hiển thị tên op TensorFlow của op đầu vào.
- Đếm : Hiển thị tổng số lần thực thi op trong suốt thời gian lập hồ sơ.
- Tổng thời gian (tính bằng mili giây) : Hiển thị tổng thời gian tích lũy dành cho mỗi trường hợp đó.
- Tổng thời gian% : Hiển thị tổng thời gian dành cho một hoạt động dưới dạng một phần của tổng thời gian dành cho xử lý đầu vào.
- Tổng thời gian của bản thân (tính bằng mili giây) : Hiển thị tổng thời gian tích lũy của bản thân đã dành cho mỗi 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.
- Tổng thời gian tự động% . 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.
- 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ơ.
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:
- Sự phân bố thời gian tự thực hiện của từng op trên máy chủ.
- Sự phân bố thời gian tự thực hiện của từng loại op trên máy chủ.
- Sự phân bố thời gian tự thực hiện của từng op trên thiết bị.
- 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 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 nút Xuất dưới dạng CSV ở phía bên phải của ngăn trên để xuất dữ liệu từ bảng này dưới dạng tệp 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ị phát sinh bởi 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ị:
- Phần trăm 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ủ cho đến 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ị một 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:
Màn hình này chứa các yếu tố chính sau:
- Ngăn dòng thời gian : Hiển thị các hoạt động mà thiết bị và máy chủ lưu trữ đã thực thi theo thời gian.
- Ngăn chi tiết : Hiển thị thông tin bổ sung cho các hoạt động được chọn trong ngăn Dòng thời gian.
Ngăn Dòng thời gian chứa các phần tử sau:
- Thanh trên cùng : Chứa các điều khiển phụ khác nhau.
- Trục thời gian : Hiển thị thời gian liên quan đến điểm bắt đầu của dấu vết.
- Nhãn phần và bản nhạc : Mỗi phần chứa nhiều bản nhạc và có một hình tam giác ở bên trái mà bạn có thể nhấp để mở rộng và thu gọn phần đó. Có một phần cho mọi phần tử xử lý trong hệ thống.
- Bộ chọn công cụ : Chứa các công cụ khác nhau để tương tác với trình xem dấu vết như Thu phóng, Xoay, Chọn và Định thời gian. Sử dụng công cụ Định thời gian để đánh dấu một khoảng thời gian.
- Sự kiện : Các sự kiện này hiển thị thời gian trong đó một op được thực hiện hoặc thời lượng của các sự kiện meta, chẳng hạn như các bước đào tạo.
Phần và bản nhạc
Trình xem theo dõi chứa các phần sau:
- Một phần cho mỗi nút thiết bị , được gắn nhãn bằng số chip thiết bị và nút thiết bị 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 lượng của các bước đào tạo đang chạy trên thiết bị
- TensorFlow Ops : Hiển thị các hoạt động được thực hiện trên thiết bị
- Hoạt động XLA : Hiển thị các hoạt động XLA (hoạt động) đã chạy trên thiết bị nếu XLA là trình biên dịch được sử dụng (mỗi hoạt động TensorFlow được dịch thành một hoặc một số hoạt động XLA. Trình biên dịch XLA chuyển hoạt động XLA thành mã chạy trên thiết bị).
- Một phần dành cho các luồng chạy trên CPU của máy chủ, có nhãn "Chủ đề Máy 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 API tf.profiler.experimental.start
, bạn có thể bật tính năng theo dõi Python bằng cách sử dụng ProfilerOptions
có têntuple khi bắt đầu lập hồ sơ. Ngoài ra, nếu bạn sử dụng chế độ lấy mẫu để lập hồ sơ, bạn có thể chọn mức độ theo dõi bằng cách sử dụng các tùy chọn thả xuống trong hộp thoại Chụp hồ sơ .
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.
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 được biểu thị dưới dạng
blockDim.x, blockDim.y, blockDim.z
. - Kích thước lưới được biểu thị dưới dạng
gridDim.x, gridDim.y, gridDim.z
. - Liệu op có đủ điều kiện để sử dụng Tensor Cores hay không.
- 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ông cụ Cấu hình Bộ nhớ giám sát việc sử dụng bộ nhớ của thiết bị của bạn trong khoảng thời gian định cấu hình. 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à cấp phát bộ nhớ tương ứng cho các hoạt động TensorFlow. Bạn cũng có thể gỡ lỗi các vấn đề OOM có thể phát sinh khi bạn chạy suy luận nhiều thời kỳ thuê nhà .
- 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:
- Tóm tắt cấu hình bộ nhớ
- Biểu đồ dòng thời gian bộ nhớ
- Bảng phân tích bộ nhớ
Tóm tắt hồ sơ bộ nhớ
Phần này hiển thị một 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:
- ID bộ nhớ : Danh sách thả xuống liệt kê tất cả các hệ thống bộ nhớ thiết bị có sẵn. Chọn hệ thống bộ nhớ bạn muốn xem từ menu thả xuống.
- #Allocation : Số lượng phân bổ bộ nhớ được thực hiện trong khoảng thời gian định cấu hình.
- #Deallocation : Số lượng vị trí xử lý bộ nhớ trong khoảng thời gian định cấu hình
- Dung lượng bộ nhớ : Tổng dung lượng (tính bằng GiB) của hệ thống bộ nhớ mà bạn chọn.
- Peak Heap Usage : Mức sử dụng bộ nhớ cao nhất (tính bằng GiB) kể từ khi mô hình bắt đầu chạy.
- Mức sử dụng bộ nhớ cao nhất: Mức sử dụng bộ nhớ cao nhất (tính bằng GiB) trong khoảng thời gian định cấu hình. Trường này chứa các trường con sau:
- Dấu thời gian: Dấu thời gian về thời điểm sử dụng bộ nhớ cao nhất trên Đồ thị dòng thời gian.
- Đặt trước ngăn xếp : Lượng bộ nhớ được dự trữ trên ngăn xếp (tính bằng GiB).
- Phân bổ đống: Lượng bộ nhớ được cấp phát trên heap (tính bằng GiB).
- Bộ nhớ trống: Dung lượng bộ nhớ trống (tính bằng GiB). 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.
- Phân mảnh : Tỷ lệ phân mảnh (càng thấp càng tốt). Nó được tính theo tỷ lệ phần trăm của
(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).
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:
Cửa sổ bật lên hiển thị thông tin sau:
- dấu thời gian (mili giây) : Vị trí của sự kiện đã chọn trên dòng thời gian.
- event : Loại sự kiện (phân bổ hoặc phân bổ).
- request_size (GiBs) : Dung 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ổ.
- Cấp phát_size (GiBs) : Số lượng bộ nhớ thực tế được cấp phát. Đây sẽ là một số âm cho các sự kiện phân bổ.
- tf_op : op TensorFlow yêu cầu phân bổ / phân bổ giao dịch.
- step_id : Bước đào tạo mà sự kiện này đã xảy ra.
- region_type : Kiểu thực thể dữ liệu mà bộ nhớ được cấp phát này dành cho. Các giá trị có thể là
temp
cho thời gian tạm thời,output
cho kích hoạt và độ dốc, vàpersist
/dynamic
cho trọng số và hằng số. - data_type : Kiểu phần tử tensor (ví dụ: uint8 cho số nguyên không dấu 8 bit).
- tensor_shape : Hình dạng của tensor được phân bổ / phân bổ.
- memory_in_use (GiBs) : Tổng bộ nhớ đượ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.
Có một hàng cho mỗi TensorFlow Op và mỗi hàng có các cột sau:
- Op Name : Tên của op TensorFlow.
- 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 được yêu cầu (GiB) : Tổng dung lượng bộ nhớ được yêu cầu cho tùy chọn này.
- Số lần xuất hiện : Số lượng phân bổ cho op này.
- Loại vùng : Loại thực thể dữ liệu mà bộ nhớ được cấp phát này dành cho. Các giá trị có thể là
temp
cho thời gian tạm thời,output
cho kích hoạt và độ dốc, vàpersist
/dynamic
cho trọng số và hằng số. - Kiểu dữ liệu : Kiểu phần tử tensor.
- Hình dạng : Hình dạng của các tenxơ được 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.
- 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 của 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 chi tiết về phân tích bước.
phân tích nút cổ chai tf.data
Công cụ phân tích nút cổ chai tf.data
tự động phát hiện nút thắt cổ chai trong các đường ống dẫn đầu vào tf.data
trong chương trình của bạn và cung cấp các đề xuất về cách khắc phục chúng. Nó hoạt động với bất kỳ chương trình nào sử dụng tf.data
bất kể nền tảng (CPU / GPU / TPU). Phân tích và khuyến nghị của nó dựa trên hướng dẫn này.
Nó phát hiện một nút cổ chai bằng cách làm theo các bước sau:
- Tìm máy chủ lưu trữ liên kết đầu vào nhất.
- Tìm quá trình thực thi chậm nhất của đường dẫn đầu vào
tf.data
. - 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.
- Tìm đường dẫn quan trọng trong đồ thị đường dẫn đầu vào.
- 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: Tóm tắt phân tích hiệu suất , Tóm tắt tất cả các đường ống đầu vào và Đồ thị đường ống đầu vào .
Tóm tắt phân tích hiệu suất
Phần này cung cấp tóm tắt của phân tích. Nó báo cáo về đường ống đầu vào tf.data
chậm được phát hiện trong hồ sơ. 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 là Iterator::<Dataset_1>::...::<Dataset_n>
. Trong tên dài, <Dataset_n>
khớp với loại trình lặp và các bộ dữ liệu khác trong tên dài đại diện cho các phép biến đổi xuôi dòng.
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 đồ |
Nói lại | Trình lặp lại :: Batch :: Lặp lại |
Lô hàng | Trình lặp lại :: Batch |
Tóm tắt tất cả các đường ống đầu vào
Phần này cung cấp bản tóm tắt của tất cả các đường ống đầ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 chiến lược phân phối, có một đường ống đầu vào máy chủ chạy mã tf.data
của chương trình và nhiều đường ống đầu vào thiết bị lấy dữ liệu từ đường ống đầu vào máy chủ và chuyển nó đến các 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.
Đồ thị đường ống đầu vào
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. Các lần thực thi của đường dẫn đầu vào được sắp xếp theo thời gian thực hiện theo thứ tự giảm dần mà bạn có thể chọn bằng cách sử dụng trình đơn thả xuống Xếp hạng .
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, Start Time cho biết thời gian bắt đầu thực hiện. Cùng một nút có thể được thực thi nhiều lần, ví dụ, nếu có op Batch
trong đường dẫn đầ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 hiện đầu tiên.
Tổng thời lượng là thời gian tường của quá trình 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.
Thời gian tự là Tổng thời gian không có thời gian bị chồng chéo với các nút con ngay lập tức của nó.
"# Cuộc gọi" là số lần thực thi đường dẫn đầu vào.
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ế độ lập trình sử dụng Gọi lại TensorBoard Keras (
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ế độ lập trình sử dụng API hàm
tf.profiler
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 lập hồ sơ theo yêu cầu bằng cách sử dụng
tf.profiler.experimental.server.start
để khởi động máy chủ gRPC khi chạy mô hình TensorFlow của bạn. Sau khi khởi động máy chủ gRPC và chạy mô hình của mình, bạn có thể chụp một cấu hình thông qua nút Capture Profile trong plugin cấu hình 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 người lao động:
# 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 Profile để chỉ định:
- Danh sách 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
Để lập hồ sơ các vòng đào tạo tùy chỉnh trong mã TensorFlow của bạn, hãy thiết lập vòng lặp đào tạo bằng API tf.profiler.experimental.Trace
để đánh dấu ranh giới các bước cho Hồ sơ.
Đối số name
được sử dụng làm tiền tố cho tên bước, đối số từ khóa step_num
được thêm vào tên bước và đối số từ khóa _r
làm cho sự kiện theo dõi này được Hồ sơ xử lý như một sự kiện bước.
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.
Đảm bảo rằng bạn bao gồm trình lặp tập dữ liệu trong ngữ cảnh tf.profiler.experimental.Trace
để phân tích chính xác đường dẫn đầ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)
Các trường hợp sử dụng hồ sơ
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à:
- Hồ sơ cục bộ so với hồ sơ từ xa : Đây là hai cách phổ biến để thiết lập môi trường hồ sơ 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, chẳng hạn như 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.
- Lập hồ sơ nhiều công nhân : Bạn có thể lập hồ sơ nhiều máy khi sử dụng khả năng đào tạo phân tán của TensorFlow.
- Nền tảng phần cứng : Cấu hình CPU, GPU và TPU.
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 |
API bắt đầu / dừng tf.profiler.experimental | Được hỗ trợ | Không được hỗ trợ | Không được hỗ trợ | CPU, GPU |
API tf.profiler.experimental client.trace | Đượ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 dẫn 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 phương pháp hay nhất được nêu chi tiết trong Hiệu suất tốt hơn với hướng dẫn API tf.data và bên dưới để làm cho đường dẫn đầ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 ống đầ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
để đà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 các TFRecords chứ không phải nội dung của các TFRecords.Song song một số hoạt động bằng cách đặt động giá trị của
num_parallel_calls
bằngtf.data.AUTOTUNE
.Cân nhắc hạn chế sử dụng
tf.data.Dataset.from_generator
vì nó chậm hơn so với hoạt động TensorFlow thuần túy.Cân nhắc việc hạn chế việc sử dụng
tf.py_function
vì nó không thể được tuần tự hóa 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 cho đường dẫn đầu vào.
Ngoài ra, hãy đọc hướng dẫn phân tích hiệu suất tf.data
để biết thêm hướng dẫn về cách tối ưu hóa đường dẫn đầu vào của 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, hãy làm cho việc tăng dữ liệu của bạn hiệu quả hơn bằng cách truyền sang các kiểu dữ liệu khác nhau sau khi áp dụng các phép biến đổi không gian, chẳng hạn như lật, cắt, xoay, v.v.
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 GPU NVIDIA® cho các ứng dụng học sâu về âm thanh và thị giác máy tính, hãy xem xét sử dụng Thư viện tải dữ liệu ( DALI ) để tăng tốc đường truyền dữ liệu.
Kiểm tra tài liệu NVIDIA® DALI: Hoạt động để biết danh sách các hoạt động DALI được hỗ trợ.
Sử dụng phân luồng và thực thi song song
Chạy các hoạt động trên nhiều luồng CPU với API tf.config.threading
để thực thi 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ốc độ tối đa song song cho một lần chọn 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ó các hoạt động không chặn độc lập (các hoạt động không có đường dẫn trực tiếp giữa chúng trên biểu đồ), hãy sử dụng tf.config.threading.set_inter_op_parallelism_threads
để chạy chúng đồng thời bằng cách sử dụng nhóm luồng 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 GPU NVIDIA®, bạn có thể đặt tf.compat.v1.ConfigProto.force_gpu_compatible=True
để buộc tất cả các bộ căng của CPU được phân bổ với bộ nhớ được ghim CUDA để tăng đáng kể hiệu suất của 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ị
Làm theo các phương pháp hay nhất được nêu 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).
Các định dạng dữ liệu cuối cùng của kênh cải thiện việc sử dụng Tensor Core và cung cấp các cải tiến hiệu suất đáng kể, đặc biệt là trong các mô hình tích hợp 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 bố cục dữ liệu để thích bố cục NHWC hơn bằng cách đặt 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
để đặt định dạng bố cục dữ liệu mặc định cho API phụ trợ 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
intf.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 thejit_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
- The TensorFlow Profiler: Profile model performance tutorial with Keras and TensorBoard where you can apply the advice in this guide.
- The Performance profiling in TensorFlow 2 talk from the TensorFlow Dev Summit 2020.
- The TensorFlow Profiler demo from the TensorFlow Dev Summit 2020.
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