Lựa chọn giữa CPU và GPU để đào tạo một mạng lưới thần kinh


29

Tôi đã thấy các cuộc thảo luận về 'chi phí chung' của GPU và đối với các mạng 'nhỏ', việc đào tạo trên CPU (hoặc mạng CPU) thực sự có thể nhanh hơn GPU.

'Nhỏ' có nghĩa là gì?

Ví dụ: MLP một lớp với 100 đơn vị ẩn có phải là 'nhỏ' không?

Định nghĩa của chúng tôi về "nhỏ" có thay đổi đối với các kiến ​​trúc định kỳ không?

Có bất kỳ tiêu chí nào khác cần được xem xét khi quyết định đào tạo CPU hay GPU không?

CHỈNH SỬA 1:

Tôi vừa tìm thấy một bài đăng trên blog (có thể đã lỗi thời? Đó là từ năm 2014):

"... Hầu hết các card mạng chỉ hoạt động với bộ nhớ đã được đăng ký với CPU và do đó, việc chuyển GPU sang GPU giữa hai nút sẽ như sau: GPU 1 sang CPU 1 sang Card mạng 1 sang Card mạng 2 cho CPU 2 đến GPU 2. Điều này có nghĩa là gì, nếu một người chọn card mạng chậm thì có thể không có sự tăng tốc nào trên một máy tính. Ngay cả với các card mạng nhanh, nếu cụm lớn, người ta thậm chí không nhận được tốc độ từ GPU khi so sánh đối với CPU vì GPU chỉ hoạt động quá nhanh để các card mạng theo kịp chúng.

Đây là lý do tại sao nhiều công ty lớn như Google và Microsoft đang sử dụng CPU thay vì cụm GPU để đào tạo mạng lưới thần kinh lớn của họ. "

Vì vậy, tại một số điểm, theo bài đăng này, nó có thể đã nhanh hơn để sử dụng CPU. đây vẫn là trường hợp?

EDIT 2: Có, bài đăng trên blog đó rất có thể bị lỗi thời vì:

Bây giờ, có vẻ như GPU trong một nút được kết nối qua bus PCIe, vì vậy giao tiếp có thể xảy ra với tốc độ khoảng 6GiB / s. (Ví dụ: https://www.youtube.com/watch?v=el1iSlP1uOs , khoảng 35 phút trong). Loa nói rằng điều này nhanh hơn việc chuyển từ GPU1 sang CPU sang GPU2. Nó có nghĩa là card mạng không còn là nút cổ chai.


Anh chàng đó với bài viết trên blog của mình mang đến những điểm tốt. Tôi không hiểu tất cả những lời biện minh của anh ấy. Tuy nhiên, việc Google, Facebook, Twitter và tất cả các nhóm học sâu hàng đầu trong giới học thuật chạy mã của họ chủ yếu trên GPU cho thấy đó là một ý tưởng tốt. Mặc dù thiên vị: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Câu trả lời:


28

Không giống như một số câu trả lời khác, tôi sẽ khuyên bạn không nên luôn luôn đào tạo về GPU mà không có bất kỳ suy nghĩ thứ hai nào. Điều này được thúc đẩy bởi việc sử dụng các phương pháp học sâu trên hình ảnh và văn bản, trong đó dữ liệu rất phong phú (ví dụ: rất nhiều pixel = rất nhiều biến) và mô hình tương tự có nhiều triệu thông số. Đối với các tên miền khác, điều này có thể không phải là trường hợp.

'Nhỏ' có nghĩa là gì? Ví dụ: MLP một lớp với 100 đơn vị ẩn có phải là 'nhỏ' không?

Vâng, đó là chắc chắn rất nhỏ theo tiêu chuẩn hiện đại. Trừ khi bạn có GPU phù hợp hoàn hảo cho việc đào tạo (ví dụ: NVIDIA 1080 hoặc NVIDIA Titan), tôi sẽ không ngạc nhiên khi thấy CPU của bạn nhanh hơn.

Lưu ý rằng độ phức tạp của mạng thần kinh của bạn cũng phụ thuộc vào số lượng tính năng đầu vào của bạn, không chỉ số lượng đơn vị trong lớp ẩn của bạn. Nếu lớp ẩn của bạn có 100 đơn vị và mỗi quan sát trong tập dữ liệu của bạn có 4 tính năng đầu vào, thì mạng của bạn rất nhỏ (~ 400 tham số). Nếu mỗi quan sát thay vào đó có các tính năng đầu vào 1M như trong một số bối cảnh y tế / công nghệ sinh học, thì mạng của bạn khá lớn về số lượng tham số. Trong phần còn lại của câu trả lời của tôi, tôi cho rằng bạn có khá ít tính năng nhập pr. quan sát.

Một ví dụ điển hình mà tôi đã tìm thấy khi so sánh hiệu năng của CPU và GPU là khi tôi huấn luyện một bot poker sử dụng phương pháp học tăng cường. Để học tăng cường, bạn thường không muốn có nhiều lớp trong mạng lưới thần kinh của mình và chúng tôi thấy rằng chúng tôi chỉ cần một vài lớp với một vài tham số. Hơn nữa, số lượng các tính năng đầu vào là khá thấp. Ban đầu tôi được đào tạo về GPU (NVIDIA Titan), nhưng phải mất một thời gian dài vì việc học tăng cường đòi hỏi rất nhiều lần lặp lại. May mắn thay, tôi thấy rằng việc đào tạo trên CPU của tôi thay vào đó đã khiến việc đào tạo của tôi tăng gấp 10 lần! Điều này chỉ để nói rằng CPU đôi khi có thể tốt hơn để đào tạo.

Có bất kỳ tiêu chí nào khác cần được xem xét khi quyết định đào tạo CPU hay GPU không?

Điều quan trọng cần lưu ý là trong khi trên GPU, bạn sẽ luôn muốn lấp đầy toàn bộ bộ nhớ GPU bằng cách tăng kích thước lô của bạn, đó không phải là trường hợp trên CPU. Trên CPU, việc tăng kích thước lô sẽ tăng thời gian pr. lô. Do đó, nếu điều quan trọng đối với bạn là có kích thước lô rất lớn (ví dụ do tín hiệu rất nhiễu), thì có thể có ích khi sử dụng GPU. Tôi chưa có kinh nghiệm này trong thực tế và thông thường kích thước lô nhỏ được ưa thích.


Cảm ơn bạn @pir! Bạn có bất kỳ tài liệu tham khảo cụ thể mà tôi có thể đọc thêm?
Số liệu thống kê

Bạn có thể dễ dàng tìm thấy số lượng tham số của VGG để so sánh và thấy rằng mạng của bạn rất nhỏ khi so sánh.
cướp biển

3
Tôi chưa thấy nhiều so sánh CPU / GPU trên các mạng nhỏ vì đó không phải là điều mà các công ty lớn và phòng thí nghiệm nghiên cứu quan tâm.
pir

@StatsSorceress Nếu bạn muốn tự mình kiểm tra nó, tại sao không chỉ thiết lập một Keras MLP đơn giản và kiểm tra hiệu năng trên GPU so với CPU? Ngoài ra, xem câu trả lời cập nhật của tôi wrt. kích thước của mạng của bạn.
cướp biển

5

CPU là người quản lý chi nhánh, anh ta có thể làm một chút mọi thứ, nhưng anh ta không giỏi lắm ngoại trừ giao nhiệm vụ. Tuy nhiên, GPU là một nhà toán học chuyên dụng ẩn trong máy của bạn. Nếu bạn đang thực hiện bất kỳ quy trình nặng toán học nào thì bạn nên sử dụng GPU của mình. Luôn luôn.

Nếu bạn đang sử dụng bất kỳ ngôn ngữ lập trình phổ biến nào cho việc học máy như python hoặc MATLAB thì đó là một đoạn mã để nói với máy tính của bạn rằng bạn muốn các hoạt động chạy trên GPU của mình.

Bạn cũng nên đảm bảo sử dụng tất cả các lõi của máy. Điều này có nghĩa là sử dụng điện toán song song. Đặc biệt đối với các mạng thần kinh nơi các hoạt động có thể được thực hiện độc lập, điều này sẽ tăng tốc độ của bạn vô cùng.


4
Tôi đã thấy rằng đôi khi chi phí truyền dữ liệu đến và từ GPU hoàn toàn xóa sạch sự gia tăng tốc độ từ sự song song. Không phải lúc nào cũng là một ý tưởng tốt để đi đến GPU.
Adrian Keister

1
Nó phụ thuộc vào sự phức tạp của mô hình của bạn. Nếu bạn đang đào tạo một K-NN đơn giản thì có lẽ nó không đáng. Tuy nhiên, nếu bạn đang đào tạo bất kỳ mô hình nào yêu cầu ma trận nghịch đảo hoặc mạng thần kinh cần nhiều hoạt động ma trận hệ quả, thì luôn luôn nên chọn GPU.
JahKnows

1
@AdrianKeister Tôi đồng ý. Đó là những gì tôi đã cố gắng để có được trong câu trả lời của tôi. Đối với mạng được đề cập bởi OP có thể sẽ là nút cổ chai.
cướp biển

1
100 đơn vị ẩn nhanh hơn trên GPU bằng máy của tôi. Tôi sẽ cần một số lượng rất nhỏ các đơn vị ẩn để CPU nhanh hơn. Hơn nữa, tôi luôn có xu hướng tập luyện theo đợt. Trong trường hợp này, tôi nghi ngờ CPU sẽ là nút cổ chai khi xem xét dữ liệu đủ dày đặc.
JahKnows

3

Trước tiên tôi sẽ tham khảo một số trích dẫn từ các câu hỏi tương tự:

Khi nói đến hoạt động ma trận, bạn không nghĩ hai lần, bạn luôn chọn GPU. nguồn

Kiến trúc song song trong GPU được điều chỉnh phù hợp cho các hoạt động của vectơ và ma trận. nguồn

Vì vậy, nếu bạn đọc qua những câu hỏi này, bạn sẽ thấy rằng họ khuyên nên sử dụng GPU bất kể trường hợp nào; nó sẽ luôn cung cấp một số cải tiến.

Lý do bạn có thể đã đọc rằng các mạng 'nhỏ' nên được đào tạo với CPU, là bởi vì việc thực hiện đào tạo GPU cho một mạng nhỏ có thể mất nhiều thời gian hơn là chỉ đơn giản là đào tạo với CPU - điều đó không có nghĩa là GPU sẽ chậm hơn.

Một mạng đơn vị ẩn 100 là loại nhỏ , tôi sẽ gọi nó là một mạng nhỏ so với các mạng sâu lớn ngoài kia. Các kiến ​​trúc định kỳ (phần lớn) có nhiều khớp đồng bộ hơn các mạng chuyển tiếp nguồn cấp dữ liệu, do đó, RNN 100 đơn vị ẩn là 'lớn hơn' so với FFN đơn vị 100 ẩn.


Không phải sự thật là nếu bạn có MLP với một lớp ẩn 100 đơn vị, có cùng số lượng tham số với RNN tiêu chuẩn với 100 đơn vị ẩn vì chia sẻ trọng số? Nó có nhiều 'khớp thần kinh' - nhiều 'kích hoạt' hơn - nhưng cùng số lượng tham số, phải không?
Số liệu thống kê

Tôi không quen với thuật ngữ chia sẻ 'trọng lượng'. Nó có cùng số lượng kích hoạt, nhưng nhiều kết nối hơn nên nhiều tham số hơn ...
Thomas W

Chia sẻ trọng số có nghĩa là ma trận trọng số từ một lớp ẩn trong RNN sang lớp ẩn tiếp theo là như nhau; đó là ma trận 'U' giống nhau, được nhân rộng theo thời gian. Ngoài ra, các trọng số từ đầu vào đến lớp ẩn giống nhau theo thời gian.
Số liệu thống kê

@StatsSorceress Tôi không quen làm việc với ma trận. Vâng, ma trận trọng số từ một lớp ẩn sang lớp kế tiếp là như nhau. Tuy nhiên, có tổng số kết nối nhiều hơn (vì một lớp cũng có thể được kết nối với lớp PREVIOUS). Tôi không chắc làm thế nào tôi có thể giải thích, nhưng một RNN sẽ luôn có nhiều tham số hơn vì có nhiều lớp được kết nối hơn ..
Thomas W

Có, tôi hiểu rằng có nhiều tham số vật lý hơn, nhưng nhiều tham số đó có cùng giá trị, có nghĩa là số tham số hiệu quả trong MLP và RNN có cùng số lượng kích thước đầu vào và cùng số lượng kích thước ẩn sẽ là tương tự.
Số liệu thống kê
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.