zalo
Chat ngay

Cơ sở hạ tầng cho việc học sâu

Học sâu là một khoa học thực nghiệm và chất lượng cơ sở hạ tầng của một nhóm là hệ số nhân của tiến trình. May mắn thay, hệ sinh thái nguồn mở ngày nay giúp bất kỳ ai cũng có thể xây dựng cơ sở hạ tầng học sâu tuyệt vời.

Bản tóm tắt

Trong bài đăng này, chúng tôi sẽ chia sẻ cách nghiên cứu học sâu thường diễn ra, mô tả các lựa chọn cơ sở hạ tầng mà chúng tôi đã thực hiện để hỗ trợ nó và mã nguồn mở  kubernetes-ec2-autoscaler, một trình quản lý mở rộng được tối ưu hóa theo lô cho Kubernetes. Chúng tôi hy vọng bạn thấy bài đăng này hữu ích trong việc xây dựng cơ sở hạ tầng học sâu của riêng bạn.

Trường hợp sử dụng

Một tiến bộ học sâu điển hình bắt đầu như một ý tưởng, mà bạn thử nghiệm trên một vấn đề nhỏ. Ở giai đoạn này, bạn muốn chạy nhiều thử nghiệm ad-hoc một cách nhanh chóng. Lý tưởng nhất là bạn có thể chỉ cần SSH vào một máy, chạy một tập lệnh trên màn hình và nhận được kết quả trong vòng chưa đầy một giờ.

Để mô hình thực sự hoạt động, thông thường bạn phải chứng kiến ​​mô hình thất bại theo mọi cách có thể và tìm cách khắc phục những hạn chế đó. (Điều này tương tự như việc xây dựng bất kỳ hệ thống phần mềm mới nào, trong đó bạn sẽ chạy mã của mình nhiều lần để xây dựng trực giác về cách thức hoạt động của nó.)

Xem thêm: mua tài khoản ChatGPT Plus chính hãng giá rẻ!

Vì vậy, cơ sở hạ tầng học sâu phải cho phép người dùng linh hoạt tự xem xét các mô hình và chỉ đưa ra số liệu thống kê tóm tắt là không đủ.

Khi mô hình cho thấy đủ hứa hẹn, bạn sẽ mở rộng nó lên các tập dữ liệu lớn hơn và nhiều GPU hơn. Điều này đòi hỏi các công việc dài, tiêu tốn nhiều chu kỳ và kéo dài trong nhiều ngày. Bạn sẽ cần quản lý thử nghiệm cẩn thận và cực kỳ chu đáo về phạm vi siêu tham số đã chọn.

Quá trình nghiên cứu ban đầu không có cấu trúc và diễn ra nhanh chóng; quá trình sau thì có phương pháp và hơi đau đớn, nhưng tất cả đều hoàn toàn cần thiết để có được kết quả tuyệt vời.

Một ví dụ

Bài báo  Kỹ thuật cải tiến để đào tạo GAN bắt đầu với  Tim Salimans đưa ra một số ý tưởng để cải thiện  việc đào tạo Mạng đối nghịch tạo sinh. Chúng tôi sẽ mô tả ý tưởng đơn giản nhất trong số những ý tưởng này (ý tưởng này tình cờ tạo ra các mẫu đẹp nhất, mặc dù không phải là học bán giám sát tốt nhất).

GAN bao gồm một máy phát điện và một mạng phân biệt. Máy phát điện cố gắng đánh lừa máy phân biệt, và máy phân biệt cố gắng phân biệt giữa dữ liệu được tạo ra và dữ liệu thực. Theo trực giác, một máy phát điện có thể đánh lừa mọi máy phân biệt là khá tốt. Nhưng có một chế độ lỗi khó sửa: máy phát điện có thể "sụp đổ" bằng cách luôn đưa ra cùng một mẫu chính xác (có thể trông giống thật!).

Tim đã có ý tưởng cung cấp cho discriminator toàn bộ một  lô nhỏ của các mẫu làm đầu vào, thay vì chỉ một mẫu. Do đó, bộ phân biệt có thể cho biết liệu máy phát có liên tục tạo ra một hình ảnh duy nhất hay không. Khi phát hiện ra sự sụp đổ, các gradient sẽ được gửi đến máy phát để khắc phục sự cố.

Bước tiếp theo là tạo nguyên mẫu ý tưởng trên  MNIST và CIFAR-10ư. Điều này đòi hỏi phải tạo mẫu một mô hình nhỏ càng nhanh càng tốt, chạy nó trên dữ liệu thực và kiểm tra kết quả. Sau một số lần lặp lại nhanh chóng, Tim đã có được  các mẫu CIFAR-10 rất đáng khích lệ =—đây thực sự là những mẫu tốt nhất mà chúng tôi từng thấy trong tập dữ liệu này.

Tuy nhiên, học sâu (và các thuật toán AI nói chung) phải được mở rộng để thực sự gây ấn tượng—một mạng nơ-ron nhỏ là bằng chứng về khái niệm, nhưng một mạng nơ-ron lớn thực sự giải quyết được vấn đề và hữu ích. Vì vậy,  Ian Goodfellow đào sâu vào việc mở rộng mô hình để làm việc trên  ImageNet.

Với mô hình và tập dữ liệu lớn hơn, Ian cần song song hóa mô hình trên nhiều GPU. Mỗi công việc sẽ đẩy nhiều máy lên mức sử dụng CPU và GPU là 90%, nhưng ngay cả khi đó, mô hình vẫn mất nhiều ngày để đào tạo. Trong chế độ này, mọi thử nghiệm đều trở nên quý giá và anh ấy sẽ ghi lại kết quả của từng thử nghiệm một cách tỉ mỉ.

Cuối cùng, mặc dù kết quả tốt, nhưng chúng không tốt như chúng tôi hy vọng. Chúng tôi đã thử nghiệm nhiều giả thuyết về lý do tại sao, nhưng vẫn chưa giải quyết được. Đó là bản chất của khoa học.

Cơ sở hạ tầng

Phần mềm

Phần lớn mã nghiên cứu của chúng tôi được viết bằng Python, như được phản ánh  trong mở- nguồn = dự án. Chúng tôi chủ yếu sử dụng  TensorFlow(mở trong cửa sổ mới) (hoặc Theano trong những trường hợp đặc biệt) cho tính toán GPU; đối với CPU, chúng tôi sử dụng những thứ đó hoặc  Numpyi. Các nhà nghiên cứu đôi khi cũng sử dụng các khuôn khổ cấp cao hơn như  Keras trên TensorFlow.

Giống như nhiều cộng đồng học sâu, chúng tôi sử dụng Python 2.7. Chúng tôi thường sử dụng  Anaconda, có bao bì thuận tiện cho các gói khó khác như OpenCV và  tối ưu hóa hiệu suất cho một số thư viện khoa học.

Phần cứng

Đối với một tác vụ hàng loạt lý tưởng, việc tăng gấp đôi số lượng nút trong cụm của bạn sẽ giảm một nửa thời gian chạy của tác vụ. Thật không may, trong học sâu, mọi người thường thấy rất  tuyến tính tăng tốc từ nhiều GPU. Hiệu suất cao nhất do đó đòi hỏi GPU hàng đầu. Chúng tôi cũng sử dụng khá nhiều CPU cho  trình mô phỏng,  môi trường học tăng cường hoặc các mô hình quy mô nhỏ (không chạy nhanh hơn trên GPU).

Chúng tôi sử dụng  Terraform để thiết lập tài nguyên đám mây AWS của chúng tôi (các phiên bản, tuyến mạng, bản ghi DNS, v.v.). Đám mây và các nút vật lý của chúng tôi chạy  Ubuntu và được cấu hình với  Chef . Để có thời gian quay nhanh hơn, chúng tôi nướng trước AMI cụm của mình bằng  Packer. Tất cả các cụm của chúng tôi đều sử dụng các dải IP không chồng lấn và được kết nối với nhau qua Internet công cộng bằng  OpenVPN  trên máy tính xách tay của người dùng và  strongSwan trên các nút vật lý (hoạt động như AWS  Customer Gateways).

Chúng tôi lưu trữ thư mục nhà, tập dữ liệu và kết quả của mọi người trên  NFS (trên phần cứng vật lý) và  EFS/ S3 (trên AWS).

Sự phối hợp

Cơ sở hạ tầng có thể mở rộng thường khiến các trường hợp đơn giản trở nên khó khăn hơn. Chúng tôi nỗ lực như nhau vào cơ sở hạ tầng của mình cho các công việc quy mô nhỏ và lớn, và chúng tôi đang tích cực củng cố bộ công cụ của mình để làm cho các trường hợp sử dụng phân tán dễ tiếp cận như các trường hợp cục bộ.

Chúng tôi cung cấp một cụm các nút SSH (có và không có GPU) để thử nghiệm tùy ý và chạy  Kubernetes là trình lập lịch cụm của chúng tôi cho các nút vật lý và AWS. Cụm của chúng tôi trải dài trên 3 vùng AWS—công việc của chúng tôi đủ đột biến đến mức đôi khi chúng tôi sẽ đạt đến công suất trên từng vùng riêng lẻ.

Kubernetes yêu cầu mỗi công việc phải là một Docker container, giúp chúng tôi cô lập phụ thuộc và chụp nhanh mã. Tuy nhiên, việc xây dựng một Docker container mới có thể thêm nhiều giây quý giá vào chu kỳ lặp lại của nhà nghiên cứu, vì vậy chúng tôi cũng cung cấp công cụ để chuyển mã từ máy tính xách tay của nhà nghiên cứu vào một hình ảnh chuẩn một cách minh bạch.

Chúng tôi phơi bày lớp vải nỉ của Kubernetes mạng trực tiếp đến máy tính xách tay của các nhà nghiên cứu, cho phép người dùng truy cập mạng liền mạch vào các công việc đang chạy của họ. Điều này đặc biệt hữu ích để truy cập các dịch vụ giám sát như TensorBoard. (Cách tiếp cận ban đầu của chúng tôi—sạch hơn theo quan điểm cô lập nghiêm ngặt—yêu cầu mọi người tạo  Dịch vụ Kubernetes cho mỗi cổng mà họ muốn phơi bày, nhưng chúng tôi thấy rằng điều đó gây ra quá nhiều trở ngại.)

kubernetes-ec2-tự động mở rộng

Khối lượng công việc của chúng tôi là đột biến và không thể đoán trước: một dòng nghiên cứu có thể nhanh chóng chuyển từ thử nghiệm máy đơn sang cần 1.000 lõi. Ví dụ, trong vài tuần, một thử nghiệm đã chuyển từ giai đoạn tương tác trên một Titan X duy nhất, sang giai đoạn thử nghiệm trên 60 Titan X, rồi cần gần 1.600 GPU AWS. Do đó, cơ sở hạ tầng đám mây của chúng tôi cần cung cấp động các nút Kubernetes.

Thật dễ dàng để chạy các nút Kubernetes trong  Auto Scaling nhóm, nhưng khó quản lý chính xác kích thước của các nhóm đó hơn. Sau khi một tác vụ hàng loạt được gửi, cụm biết chính xác những tài nguyên nào cần và nên phân bổ trực tiếp những tài nguyên đó. (Ngược lại,  Chính sách mở rộng quy mô của AWS sẽ tạo ra các nút mới từng phần cho đến khi tài nguyên không còn cạn kiệt, có thể mất nhiều lần lặp lại.) Ngoài ra, cụm cần phải thoát các nút trước khi chấm dứt chúng để tránh mất các công việc đang thực hiện.

Thật hấp dẫn khi chỉ sử dụng EC2 thô cho các tác vụ hàng loạt lớn và thực sự đó là nơi chúng tôi bắt đầu. Tuy nhiên, hệ sinh thái Kubernetes bổ sung khá nhiều giá trị: công cụ ma sát thấp, ghi nhật ký, giám sát, khả năng quản lý các nút vật lý riêng biệt với các phiên bản đang chạy, v.v. Việc tự động mở rộng Kubernetes chính xác dễ hơn là xây dựng lại hệ sinh thái này trên EC2 thô.

Chúng tôi đang phát hành  kubernetes-ec2-autoscaler, một trình quản lý mở rộng được tối ưu hóa theo lô cho Kubernetes. Nó chạy như một  Pod bình thường trên Kubernetes và chỉ yêu cầu các nút công nhân của bạn nằm trong nhóm Tự động mở rộng quy mô.

Bộ tự động mở rộng hoạt động bằng cách thăm dò trạng thái của Kubernetes master, chứa mọi thứ cần thiết để tính toán yêu cầu tài nguyên cụm và dung lượng. Nếu có dung lượng dư thừa, nó sẽ làm cạn kiệt các nút có liên quan và cuối cùng là chấm dứt chúng. Nếu cần nhiều tài nguyên hơn, nó sẽ tính toán những máy chủ nào cần được tạo và tăng kích thước nhóm Tự động mở rộng của bạn một cách thích hợp (hoặc chỉ cần  uncordons các nút đã cạn kiệt, giúp tránh thời gian tạo nút mới).

kubernetes-ec2-autoscaler xử lý nhiều nhóm Auto Scaling, tài nguyên vượt quá CPU (bộ nhớ và GPU) và các ràng buộc chi tiết đối với các tác vụ của bạn như vùng AWS và kích thước phiên bản. Ngoài ra, khối lượng công việc bùng nổ có thể dẫn đến thời gian chờ Auto Scaling Group và lỗi, vì (thật đáng ngạc nhiên!) ngay cả AWS cũng không có khả năng vô hạn. Trong những trường hợp này, kubernetes-ec2-autoscaler phát hiện lỗi và tràn sang vùng AWS thứ cấp.

Cơ sở hạ tầng của chúng tôi hướng đến mục tiêu tối đa hóa năng suất của các nhà nghiên cứu học sâu, cho phép họ tập trung vào khoa học. Chúng tôi đang xây dựng các công cụ để cải thiện hơn nữa cơ sở hạ tầng và quy trình làm việc của mình và sẽ chia sẻ những công cụ này trong những tuần và tháng tới. Chúng tôi  hoan nghênh sự giúp đỡ để làm cho việc này diễn ra nhanh hơn nữa!

Hot Deal

Họ tên (*)

Số điện thoại (*)

Email (*)

Dịch vụ

Đăng ký để nhận bản tin mới nhất !