2016-05-30 52 views
14

Trong một thời gian, tôi đã nhận thấy rằng TensorFlow (v0.8) dường như không sử dụng đầy đủ công suất tính toán của Titan X. Đối với một số CNN mà tôi đang chạy GPU sử dụng dường như không vượt quá ~ 30%. Thông thường việc sử dụng GPU thậm chí còn thấp hơn, giống như 15%. Một ví dụ cụ thể của CNN cho thấy hành vi này là CNN từ giấy Atari của DeepMind với Q-learning (xem liên kết bên dưới để biết mã).TensorFlow - Sử dụng GPU thấp trên Titan X

Khi tôi thấy những người khác trong phòng thí nghiệm đang chạy CNN được viết bằng Theano hoặc Torch, mức sử dụng GPU thường là 80% +. Điều này làm cho tôi tự hỏi, tại sao các CNN mà tôi viết trong TensorFlow lại 'chậm' và tôi có thể làm gì để sử dụng hiệu quả hơn sức mạnh xử lý GPU? Nói chung, tôi quan tâm đến các cách để cấu hình các hoạt động GPU và khám phá nơi các nút cổ chai đang ở đâu. Bất kỳ khuyến nghị nào để làm điều này đều được hoan nghênh vì điều này dường như không thực sự có thể xảy ra với TensorFlow vào lúc này.

Những điều tôi đã tìm hiểu thêm về nguyên nhân của vấn đề này:

  1. Phân tích TensorFlow của thiết bị vị trí, mọi thứ có vẻ là trên gpu:/0 để có vẻ OK.

  2. Sử dụng cProfile, tôi đã tối ưu hóa việc tạo hàng loạt và các bước tiền xử lý khác. Quá trình tiền xử lý được thực hiện trên một chuỗi đơn lẻ, nhưng tối ưu hóa thực tế được thực hiện bởi các bước TensorFlow mất nhiều thời gian hơn (xem các thời gian chạy trung bình dưới đây). Một ý tưởng rõ ràng để tăng tốc độ là sử dụng các trình xử lý hàng đợi TFs, nhưng vì việc chuẩn bị hàng loạt nhanh hơn 20 lần so với tối ưu hóa, tôi tự hỏi liệu điều này có tạo nên sự khác biệt lớn hay không.

    Avg. Time Batch Preparation: 0.001 seconds 
    Avg. Time Train Operation: 0.021 seconds 
    Avg. Time Total per Batch: 0.022 seconds (45.18 batches/second) 
    
  3. Chạy trên nhiều máy để loại trừ các vấn đề phần cứng.

  4. Được nâng cấp lên phiên bản mới nhất của CuDNN v5 (RC), Bộ công cụ CUDA 7.5 và TensorFlow được cài đặt lại từ các nguồn khoảng một tuần trước.

Một ví dụ về Q-học CNN mà 'vấn đề' này xảy ra có thể được tìm thấy ở đây: https://github.com/tomrunia/DeepReinforcementLearning-Atari/blob/master/qnetwork.py

Example của NVIDIA SMI hiển thị việc sử dụng GPU thấp: NVIDIA-SMI

+0

Thay đổi kích thước lô có thay đổi hành vi không? Hoặc làm cho mạng phức tạp hơn? – etarion

+0

+1 khi tăng kích thước lô hàng nhỏ. Số lượng Util GPU-Util có thể có nhiều do sử dụng bộ nhớ hơn bất kỳ thứ gì khác. Với 12GB trên Titan X bạn có rất nhiều phòng đầu ở đó. Nếu mô hình của bạn không chiếm nhiều bộ nhớ, bạn có thể lấp đầy nó với các lô lớn hơn. – j314erre

+1

Tôi đã thực hiện một thí nghiệm nhỏ để nghiên cứu ảnh hưởng của việc thay đổi kích thước lô. Dưới đây là kết quả cho ăn các lô kích cỡ N = 1..512 cho hoạt động đào tạo. Mỗi ví dụ huấn luyện là một loại tensor 84x84x4 'tf.float32'. Kết quả ở đây: http: // pastebin.com/xrku9AjW Như bạn thấy, việc sử dụng GPU dường như không thay đổi đáng kể hoặc thậm chí giảm khi tăng kích thước lô. Các phép đo thời gian là trung bình trên 100 lô và được ghi lại bằng cách sử dụng 'time.time()'. Bất kỳ manh mối về những gì là sai ở đây? –

Trả lời

0

Các bạn đã thử hạ cấp xuống Cuda 7.0? Như tôi đã đọc có thể có vấn đề với Tensorflow trên Titan X với Cuda 7.5.

1

Với các phiên bản mới hơn của Tensorflow (Tôi đang sử dụng Tensorflow 1.4), chúng tôi có thể lấy runtime statistics và hiển thị chúng trong Tensorboard.

Các thống kê này bao gồm thời gian tính toán và mức sử dụng bộ nhớ cho mỗi nút trong biểu đồ tính toán.

Các vấn đề liên quan