tek4

Tăng Tốc Quá Trình Huấn Luyện Mạng Neural

by - September. 21, 2021
Kiến thức
Machine Learning
Python
<p style="text-align: justify;"><em>Ch&agrave;o mừng c&aacute;c bạn quay trở lại với loạt b&agrave;i về&nbsp;<a href="https://tek4.vn/lap-trinh-neural-network-voi-pytorch-deep-learning-voi-pytorch/"><strong>Lập Tr&igrave;nh Neural Network Với Pytorch</strong></a>.&nbsp;Trong b&agrave;i n&agrave;y, ch&uacute;ng ta sẽ xem c&aacute;ch m&agrave; ch&uacute;ng ta c&oacute; thể tăng tốc qu&aacute; tr&igrave;nh huấn luyện mạng neural bằng c&aacute;ch sử dụng nhiều khả năng xử l&yacute; của lớp PyTorch DataLoader. Bắt đầu th&ocirc;i!</em></p> <p style="text-align: justify;"><img style="width: 100%;" src="http://tek4vn.2soft.top/public_files/tang-toc-qua-trinh-huan-luyen-mang-neural-png-2" alt="Tăng Tốc Qu&aacute; Tr&igrave;nh Huấn Luyện mạng Neural" /></p> <p style="text-align: center;"><a href="https://tek4.vn/tai-cau-truc-vong-lap-huan-luyen-lap-trinh-neural-network-voi-pytorch/" target="_blank" rel="noopener">Xem th&ecirc;m b&agrave;i viết trước:&nbsp;T&aacute;i Cấu Tr&uacute;c V&ograve;ng Lặp Huấn Luyện&nbsp;</a></p> <h3 class="section-heading" style="text-align: justify;">Tăng tốc qu&aacute; tr&igrave;nh huấn luyện</h3> <p style="text-align: justify;">Để tăng tốc qu&aacute; tr&igrave;nh huấn luyện, ch&uacute;ng ta sẽ sử dụng thuộc t&iacute;nh t&ugrave;y chọn <em>num_worker</em>s của lớp <em>DataLoader.</em></p> <p style="text-align: justify;">Thuộc t&iacute;nh <em>num_workers</em> cho instance data loader biết c&oacute; bao nhi&ecirc;u quy tr&igrave;nh con cần sử dụng để tải dữ liệu.&nbsp;Theo mặc định, gi&aacute; trị <em>num_workers</em> được đặt bằng 0 v&agrave; gi&aacute; trị bằng 0 cũng được đặt cho data loader b&ecirc;n trong tiến tr&igrave;nh ch&iacute;nh.</p> <p style="text-align: justify;">Điều n&agrave;y c&oacute; nghĩa l&agrave; qu&aacute; tr&igrave;nh huấn luyện sẽ hoạt động tuần tự b&ecirc;n trong tiến tr&igrave;nh ch&iacute;nh.&nbsp;Sau đ&oacute;, một batch được d&ugrave;ng trong qu&aacute; tr&igrave;nh huấn luyện v&agrave; sẽ cần th&ecirc;m một batch nữa, do đ&oacute; ta sẽ lấy dữ liệu batch từ ổ đĩa</p> <p style="text-align: justify;">B&acirc;y giờ, nếu ch&uacute;ng ta c&oacute; tiến tr&igrave;nh worker, ch&uacute;ng ta c&oacute; thể tận dụng thực tế l&agrave; m&aacute;y của ch&uacute;ng ta c&oacute; nhiều l&otilde;i (cores).&nbsp;Điều n&agrave;y c&oacute; nghĩa l&agrave; batch tiếp theo đ&atilde; c&oacute; thể được load v&agrave; sẵn s&agrave;ng hoạt động v&agrave;o thời điểm tiến tr&igrave;nh ch&iacute;nh sẵn s&agrave;ng cho một batch kh&aacute;c.&nbsp;Đ&acirc;y ch&iacute;nh l&agrave; nơi bắt nguồn cho việc tăng tốc độ.&nbsp;C&aacute;c batch được load bằng c&aacute;c tiến tr&igrave;nh worker bổ sung v&agrave; được xếp h&agrave;ng đợi trong bộ nhớ.</p> <h4 class="sub-section-heading" style="text-align: justify;">Gi&aacute; trị tối ưu cho thuộc t&iacute;nh <em>num_workers</em></h4> <p style="text-align: justify;">C&acirc;u hỏi đặt ra l&agrave;, ch&uacute;ng ta n&ecirc;n th&ecirc;m bao nhi&ecirc;u tiến tr&igrave;nh worker để tối ưu?&nbsp;C&oacute; rất nhiều yếu tố c&oacute; thể ảnh hưởng đến con số tối ưu ở đ&acirc;y, v&igrave; vậy c&aacute;ch tốt nhất để t&igrave;m ra l&agrave; thử.</p> <h3 class="section-heading" style="text-align: justify;">Thử c&aacute;c gi&aacute; trị cho thuộc t&iacute;nh <em>num_workers</em></h3> <p style="text-align: justify;">Để thiết lập thử nghiệm n&agrave;y, ch&uacute;ng ta sẽ tạo một danh s&aacute;ch c&aacute;c gi&aacute; trị <em>num_workers</em> để thử.&nbsp;Ch&uacute;ng ta sẽ thử c&aacute;c gi&aacute; trị sau:</p> <ul style="text-align: justify;"> <li>0 (default)</li> <li>1</li> <li>2</li> <li>4</li> <li>8</li> <li>16</li> </ul> <p style="text-align: justify;">Đối với mỗi gi&aacute; trị n&agrave;y, ch&uacute;ng ta sẽ thay đổi k&iacute;ch thước batch bằng c&aacute;ch thử c&aacute;c gi&aacute; trị sau:</p> <ul style="text-align: justify;"> <li>100</li> <li>1000</li> <li>10000</li> </ul> <p style="text-align: justify;">Đối với learning rate, ch&uacute;ng t&ocirc;i sẽ giữ n&oacute; ở gi&aacute; trị kh&ocirc;ng đổi l&agrave; 0,01 cho tất cả c&aacute;c lần chạy.</p> <p style="text-align: justify;">Điều cuối c&ugrave;ng cần đề cập về thiết lập ở đ&acirc;y l&agrave; thực tế ch&uacute;ng ta chỉ thực hiện một epoch duy nhất cho mỗi lần chạy.</p> <p style="text-align: justify;">H&atilde;y xem những g&igrave; ch&uacute;ng t&ocirc;i nhận được.</p> <h3 class="section-heading" style="text-align: justify;">C&aacute;c gi&aacute; trị <em>num_workers</em>&nbsp;kh&aacute;c nhau: Kết quả</h3> <p style="text-align: justify;">Ch&uacute;ng ta đ&atilde; ho&agrave;n th&agrave;nh tổng cộng mười t&aacute;m lần chạy.&nbsp;C&oacute; ba nh&oacute;m batch kh&aacute;c nhau v&agrave; b&ecirc;n trong mỗi nh&oacute;m n&agrave;y, ch&uacute;ng ta thay đổi số lượng tiến tr&igrave;nh của worker.</p> <p><img style="width: 616px; display: block; margin-left: auto; margin-right: auto;" src="http://tek4vn.2soft.top/public_files/capture-83-png" alt="Capture-83" height="595" /></p> <p style="text-align: justify;">Điểm ch&iacute;nh&nbsp;r&uacute;t ra từ những kết quả n&agrave;y l&agrave;, tr&ecirc;n cả ba batch, c&oacute; một tiến tr&igrave;nh worker duy nhất ngo&agrave;i quy tr&igrave;nh ch&iacute;nh dẫn đến tốc độ tăng khoảng 20%.</p> <p style="text-align: justify;">Ngo&agrave;i ra, việc th&ecirc;m c&aacute;c tiến tr&igrave;nh worker bổ sung sau tiến tr&igrave;nh đầu ti&ecirc;n kh&ocirc;ng thực sự cho thấy bất kỳ cải tiến n&agrave;o nữa.</p> <h3 class="section-heading" style="text-align: justify;">Diễn giải kết quả</h3> <p style="text-align: justify;">Tốc độ 20% m&agrave; ch&uacute;ng ta thấy sau khi th&ecirc;m một tiến tr&igrave;nh worker l&agrave; rất hợp l&yacute; v&igrave; tiến tr&igrave;nh ch&iacute;nh c&oacute; &iacute;t việc phải l&agrave;m hơn.</p> <p style="text-align: justify;">Trong khi tiến tr&igrave;nh ch&iacute;nh đang bận thực hiện&nbsp;forward (chuyển tiếp) v&agrave; backward (truyền ngược) th&igrave; tiến tr&igrave;nh worker đang load batch tiếp theo.&nbsp;V&agrave;o thời điểm tiến tr&igrave;nh ch&iacute;nh đ&atilde; sẵn s&agrave;ng cho một batch kh&aacute;c, tiến tr&igrave;nh worker đ&atilde; xếp n&oacute; v&agrave;o h&agrave;ng đợi trong bộ nhớ.</p> <p style="text-align: justify;">Do đ&oacute;, qu&aacute; tr&igrave;nh ch&iacute;nh kh&ocirc;ng phải đọc dữ liệu từ ổ đĩa.&nbsp;Thay v&agrave;o đ&oacute;, dữ liệu đ&atilde; c&oacute; trong bộ nhớ v&agrave; điều n&agrave;y gi&uacute;p ch&uacute;ng ta tăng tốc độ 20%.</p> <p style="text-align: justify;">Nhưng, tại sao ch&uacute;ng ta kh&ocirc;ng thấy tốc độ tăng th&ecirc;m sau khi th&ecirc;m nhiều worker hơn?</p> <h4 style="text-align: justify;"><strong>Tại sao kh&ocirc;ng thấy tốc độ tăng th&ecirc;m sau khi th&ecirc;m nhiều worker hơn?</strong></h4> <p style="text-align: justify;">Nếu một worker đủ để giữ h&agrave;ng đợi đầy dữ liệu cho tiến tr&igrave;nh ch&iacute;nh, th&igrave; việc th&ecirc;m nhiều batch dữ liệu hơn v&agrave;o h&agrave;ng đợi sẽ kh&ocirc;ng l&agrave;m được g&igrave;.&nbsp;Đ&oacute; l&agrave; những g&igrave; m&agrave; ch&uacute;ng ta đang thấy ở đ&acirc;y.</p> <p style="text-align: justify;">Chỉ v&igrave; ch&uacute;ng ta đang th&ecirc;m nhiều batch hơn v&agrave;o h&agrave;ng đợi kh&ocirc;ng c&oacute; nghĩa l&agrave; c&aacute;c batch đang được xử l&yacute; nhanh hơn.&nbsp;Do đ&oacute;, ch&uacute;ng ta bị giới hạn bởi thời gian cần để chuyển tiếp v&agrave; truyền ngược một batch nhất định.</p> <p style="text-align: right;"><a href="https://tek4.vn/pytorch-tren-gpu-lap-trinh-neural-network-voi-pytorch/" target="_blank" rel="noopener">B&agrave;i viết tiếp theo: PyTorch Tr&ecirc;n GPU</a></p> <hr /> <p style="text-align: center;"><em><strong>Fanpage Facebook:</strong>&nbsp;<a href="https://www.facebook.com/tek4.vn/">TEK4.VN</a></em>&nbsp;</p> <p style="text-align: center;"><em><strong>Tham gia cộng đồng để chia sẻ, trao đổi v&agrave; thảo luận:</strong>&nbsp;<a href="https://www.facebook.com/groups/tek4.vn/">TEK4.VN - Học Lập Tr&igrave;nh Miễn Ph&iacute;</a></em></p>