5 mẹo đào tạo đa GPU với Keras PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

5 mẹo để đào tạo đa GPU với Keras

Học sâu (từ thông dụng được yêu thích vào cuối những năm 2010 cùng với blockchain / bitcoin và Khoa học dữ liệu / Máy học) đã cho phép chúng tôi làm một số thứ thực sự thú vị trong vài năm qua. Ngoài những tiến bộ trong thuật toán (thừa nhận là dựa trên những ý tưởng đã được biết đến từ những năm 1990 hay còn gọi là “Kỷ nguyên khai thác dữ liệu”), lý do chính dẫn đến thành công của nó có thể là do sự sẵn có của các bộ dữ liệu miễn phí lớn, sự ra đời của các thư viện mã nguồn mở và việc sử dụng GPU. Trong bài đăng trên blog này, tôi sẽ tập trung vào hai điều cuối cùng và tôi sẽ chia sẻ với bạn một số mẹo mà tôi đã học được một cách khó khăn.

Tại sao TensorFlow & Keras?

TensorFlow là một thư viện Deep Learning rất phổ biến do Google phát triển, cho phép bạn tạo nguyên mẫu các mạng phức tạp một cách nhanh chóng. Nó đi kèm với rất nhiều tính năng thú vị như tự động phân biệt (giúp bạn tiết kiệm / ước tính / mã hóa độ dốc của các hàm chi phí) và hỗ trợ GPU (cho phép bạn dễ dàng cải thiện tốc độ 200 lần bằng cách sử dụng phần cứng tốt). Hơn nữa, nó cung cấp một giao diện Python có nghĩa là bạn có thể tạo mẫu nhanh chóng mà không yêu cầu viết mã C hoặc CUDA. Phải thừa nhận rằng có rất nhiều framework khác mà người ta có thể sử dụng thay vì TensorFlow, chẳng hạn như Torch, MXNet, Theano, Caffe, Deeplearning4j, CNTK, v.v. nhưng tất cả đều phụ thuộc vào trường hợp sử dụng và sở thích cá nhân của bạn.

Nhưng tại sao Máy ảnh? Đối với tôi, việc sử dụng trực tiếp TF giống như thực hiện Học máy với Numpy. Có, nó là khả thi và đôi khi bạn phải làm điều đó (đặc biệt là nếu bạn viết các lớp / mất-hàm tùy chỉnh) nhưng bạn có thực sự muốn viết mã mô tả các mạng phức tạp như một chuỗi các phép toán vectơ không (vâng, tôi biết Có những phương pháp cấp cao hơn trong TF nhưng chúng không hay bằng Keras)? Ngoài ra nếu bạn muốn chuyển đến một thư viện khác thì sao? Sau đó, bạn có thể sẽ cần phải viết lại mã, điều này thật tệ. Ta ta taaa, Keras đến giải cứu! Keras cho phép bạn mô tả mạng của mình bằng cách sử dụng các khái niệm cấp cao và viết mã bất khả tri phụ trợ, nghĩa là bạn có thể chạy các mạng qua các thư viện học sâu khác nhau. Một vài điều tôi thích ở Keras là nó được viết tốt, có kiến ​​trúc hướng đối tượng, dễ đóng góp và nó có một cộng đồng thân thiện. Nếu bạn thích nó, hãy nói cảm ơn François Chollet để phát triển nó và tìm nguồn mở cho nó.

Mẹo và Gotchas để đào tạo Multi-GPU

Nếu không có thêm bất kỳ điều gì, chúng ta hãy chuyển sang một số mẹo về cách tận dụng tối đa quá trình đào tạo GPU trên Keras và một vài điều bạn cần lưu ý:

1. Đào tạo đa GPU không tự động

Các mô hình đào tạo trên GPU sử dụng Keras & Tensorflow diễn ra liền mạch. Nếu bạn có thẻ NVIDIA và bạn đã cài đặt CUDA, các thư viện sẽ tự động phát hiện nó và sử dụng nó để đào tạo. Thật tuyệt! Nhưng nếu bạn là một đứa hư hỏng và bạn có nhiều GPU? Rất tiếc, bạn sẽ phải làm việc một chút để đạt được đào tạo đa GPU.
5 mẹo đào tạo đa GPU với Keras PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
Có nhiều cách để song song hóa một mạng tùy thuộc vào những gì bạn muốn đạt được nhưng hai cách tiếp cận chính là mô hình và song song hóa dữ liệu. Cách đầu tiên có thể giúp bạn nếu mô hình của bạn quá phức tạp để vừa với một GPU duy nhất trong khi cách sau giúp ích khi bạn muốn tăng tốc độ thực thi. Thông thường khi mọi người nói về đào tạo đa GPU, họ có nghĩa là sau này. Nó đã từng khó đạt được hơn nhưng may mắn thay, Keras gần đây đã đưa vào một phương pháp tiện ích có tên là mutli_gpu_model giúp đào tạo / dự đoán song song dễ dàng hơn (hiện chỉ khả dụng với chương trình phụ trợ TF). Ý tưởng chính là bạn chuyển mô hình của mình thông qua phương pháp và nó được sao chép qua các GPU khác nhau. Đầu vào ban đầu được chia thành các phần được cấp cho các GPU khác nhau và sau đó chúng được tổng hợp lại thành một đầu ra duy nhất. Phương pháp này có thể được sử dụng để đạt được các dự đoán và đào tạo song song, tuy nhiên, hãy nhớ rằng để đào tạo, nó không chia tỷ lệ tuyến tính với số lượng GPU do sự đồng bộ hóa cần thiết.

2. Chú ý đến kích thước lô

Khi bạn thực hiện đào tạo đa GPU, hãy chú ý đến kích thước lô vì nó có nhiều tác động đến tốc độ / bộ nhớ, sự hội tụ của mô hình của bạn và nếu bạn không cẩn thận, bạn có thể làm hỏng trọng lượng mô hình của mình!

Tốc độ / bộ nhớ: Rõ ràng là lô càng lớn thì đào tạo / dự đoán càng nhanh. Điều này là do việc đưa vào và lấy dữ liệu từ GPU phải tốn nhiều công sức, vì vậy các lô nhỏ có nhiều chi phí hơn. Mặt khác, lô càng lớn thì càng cần nhiều bộ nhớ trong GPU. Đặc biệt là trong quá trình đào tạo, đầu vào của mỗi lớp được lưu trong bộ nhớ vì chúng được yêu cầu ở bước truyền ngược, vì vậy việc tăng kích thước lô của bạn quá nhiều có thể dẫn đến lỗi hết bộ nhớ.

Sự hội tụ: Nếu bạn sử dụng Stochastic Gradient Decent (SGD) hoặc một số biến thể của nó để đào tạo mô hình của mình, bạn nên lưu ý rằng kích thước lô có thể ảnh hưởng đến khả năng hội tụ và tổng quát hóa của mạng. Kích thước lô điển hình trong nhiều vấn đề về thị giác máy tính là từ 32-512 ví dụ. Như Keskar và cộng sự đặt nó, “Thực tế đã quan sát thấy rằng khi sử dụng một lô lớn hơn (hơn 512), chất lượng của mô hình bị suy giảm, được đo bằng khả năng tổng quát hóa của nó.”. Lưu ý rằng các trình tối ưu hóa khác nhau có các thuộc tính khác nhau và các kỹ thuật tối ưu hóa phân tán chuyên biệt có thể giúp giải quyết vấn đề. Nếu bạn quan tâm đến các chi tiết toán học, tôi khuyên bạn nên đọc "Thesis" của Joeri HermansVề Học sâu có thể mở rộng và Song song chuyển đổi Gradient Descent".
5 mẹo đào tạo đa GPU với Keras PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
Làm hỏng trọng lượng: Đây là một chi tiết kỹ thuật khó chịu có thể gây ra kết quả tàn khốc. Khi bạn thực hiện đào tạo đa GPU, điều quan trọng là phải cung cấp dữ liệu cho tất cả các GPU. Có thể xảy ra rằng lô cuối cùng của kỷ nguyên của bạn có ít dữ liệu hơn được xác định (vì kích thước của tập dữ liệu của bạn không thể được chia chính xác cho kích thước của lô của bạn). Điều này có thể khiến một số GPU không nhận được bất kỳ dữ liệu nào trong bước cuối cùng. Thật không may, một số Lớp Keras, đáng chú ý nhất là Lớp Chuẩn hóa Hàng loạt, không thể đối phó với điều đó dẫn đến các giá trị nan xuất hiện trong các trọng số (giá trị trung bình đang chạy và phương sai trong lớp BN). Để làm cho mọi thứ trở nên tồi tệ hơn, người ta sẽ không quan sát thấy vấn đề trong quá trình đào tạo (trong khi giai đoạn học tập là 1) vì lớp cụ thể sử dụng phương sai / trung bình của lô trong các ước tính. Tuy nhiên, trong khi dự đoán (giai đoạn học tập được đặt thành 0), giá trị trung bình / phương sai đang chạy được sử dụng mà trong trường hợp của chúng ta có thể trở thành nan giải dẫn đến kết quả kém. Vì vậy, hãy tự giúp mình và luôn đảm bảo rằng kích thước lô của bạn được cố định khi bạn thực hiện đào tạo đa GPU. Hai cách đơn giản để đạt được điều này là từ chối các lô không phù hợp với kích thước được xác định trước hoặc lặp lại các bản ghi trong lô cho đến khi bạn đạt đến kích thước được xác định trước. Cuối cùng nhưng không kém phần quan trọng, hãy nhớ rằng trong thiết lập đa GPU, kích thước lô phải là bội số của số GPU có sẵn trên hệ thống của bạn.

3. Dữ liệu GPU Đói hay còn gọi là CPU không thể theo kịp GPU

Thông thường, phần tốn kém nhất trong khi đào tạo / dự đoán mạng Sâu là ước tính xảy ra trên GPU. Dữ liệu được xử lý trước trong các CPU chạy nền và chúng được cấp cho GPU theo định kỳ. Tuy nhiên, không nên đánh giá thấp tốc độ của GPU; nó có thể xảy ra nếu mạng của bạn quá nông hoặc bước tiền xử lý quá phức tạp khiến CPU của bạn không thể theo kịp GPU của bạn hoặc nói cách khác, chúng không cung cấp dữ liệu đủ nhanh cho chúng. Điều này có thể dẫn đến việc sử dụng GPU thấp, dẫn đến lãng phí tiền / tài nguyên.
5 mẹo đào tạo đa GPU với Keras PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
Keras thường thực hiện ước tính các lô song song do GIL (Khóa thông dịch viên toàn cầu) của Python, bạn không thể thực sự đạt được đa luồng thực sự trong Python. Có hai giải pháp cho điều đó: hoặc sử dụng nhiều quy trình (lưu ý rằng có rất nhiều lỗi trong quy trình này mà tôi sẽ không trình bày ở đây) hoặc giữ cho bước tiền xử lý của bạn đơn giản. Trước đây, tôi đã gửi Yêu cầu kéo trên Keras để giảm bớt một số căng thẳng không cần thiết mà chúng tôi đang đặt trên CPU trong quá trình tiền xử lý Hình ảnh, vì vậy hầu hết người dùng sẽ không bị ảnh hưởng nếu họ sử dụng trình tạo tiêu chuẩn. Nếu bạn có trình tạo tùy chỉnh, hãy cố gắng đẩy càng nhiều logic càng tốt vào thư viện C chẳng hạn như Numpy vì một số phương pháp này thực sự giải phóng GIL có nghĩa là bạn có thể tăng mức độ song song hóa. Một cách tốt để phát hiện xem bạn có đang đối mặt với tình trạng đói dữ liệu GPU hay không là theo dõi việc sử dụng GPU, tuy nhiên, hãy cảnh báo rằng đây không phải là lý do duy nhất để quan sát điều đó (đồng bộ hóa xảy ra trong quá trình đào tạo trên nhiều GPU cũng là nguyên nhân dẫn đến việc sử dụng thấp ). Thông thường, dữ liệu GPU bị đói có thể được phát hiện bằng cách quan sát các vụ nổ GPU, sau đó là các khoảng dừng dài mà không sử dụng. Trước đây, tôi đã tìm nguồn mở một tiện ích mở rộng cho Dstat có thể giúp bạn đo lường việc sử dụng GPU của mình, vì vậy hãy xem bài đăng blog gốc.

4. Lưu các mô hình song song của bạn

Giả sử bạn đã sử dụng phương pháp mutli_gpu_model để song song hóa mô hình của mình, quá trình đào tạo đã kết thúc và bây giờ bạn muốn duy trì trọng lượng của nó. Tin xấu là bạn không thể chỉ gọi save () trên đó. Hiện tại Keras có một giới hạn không cho phép bạn lưu một mô hình song song. Có 2 cách để giải quyết vấn đề này: hoặc gọi save () trên tham chiếu của mô hình gốc (trọng số sẽ được cập nhật tự động) hoặc bạn cần tuần tự hóa mô hình bằng cách cắt nhỏ phiên bản song song và xóa tất cả các kết nối không cần thiết. Tùy chọn đầu tiên dễ dàng hơn nhưng trong tương lai, tôi dự định mã nguồn mở một phương thức serialize () thực hiện phương thức thứ hai.

5. Đếm số GPU có sẵn có một tác dụng phụ khó chịu

Rất tiếc hiện tại, có một tác dụng phụ khó chịu trên phương thức tensorflow.python.client.device_lib.list_local_devices () khiến một Phiên TensorFlow mới được tạo và khởi chạy tất cả các GPU có sẵn trên hệ thống. Điều này có thể dẫn đến các kết quả không mong muốn như xem nhiều GPU hơn so với quy định hoặc khởi chạy sớm các phiên mới (bạn có thể đọc tất cả chi tiết về điều này yêu cầu kéo). Để tránh những bất ngờ tương tự, bạn nên sử dụng phương thức K.get_session (). List_devices () của Keras để thay thế, phương thức này sẽ trả về cho bạn tất cả các GPU hiện đã đăng ký trong phiên. Cuối cùng nhưng không kém phần quan trọng, hãy nhớ rằng việc gọi phương thức list_devices () bằng cách nào đó khá tốn kém, vì vậy nếu bạn chỉ quan tâm đến số lượng GPU có sẵn, hãy gọi phương thức một lần và lưu trữ số của chúng trên một biến cục bộ.

Đó là nó! Hy vọng bạn thấy danh sách này hữu ích. Nếu bạn tìm thấy các vấn đề/mẹo khác để đào tạo GPU trên Keras, hãy chia sẻ chúng bên dưới phần nhận xét. 🙂

Dấu thời gian:

Thêm từ Hộp dữ liệu