tác giả:
(1) Sasun Hambardzumyan, Activeloop, Mountain View, CA, USA;
(2) Abhinav Tuli, Activeloop, Mountain View, CA, USA;
(3) Levon Ghukasyan, Activeloop, Mountain View, CA, USA;
(4) Fariz Rahman, Activeloop, Mountain View, CA, USA;.
(5) Hrant Topchyan, Activeloop, Mountain View, CA, USA;
(6) David Isayan, Activeloop, Mountain View, CA, USA;
(7) Mark McQuade, Activeloop, Mountain View, CA, USA;
(8) Mikayel Harutyunyan, Activeloop, Mountain View, CA, USA;
(9) Tatevik Hakobyan, Activeloop, Mountain View, CA, USA;
(10) Ivo Stranic, Activeloop, Mountain View, CA, USA;
(11) Davit Buniatyan, Activeloop, Mountain View, CA, USA.
Như được hiển thị trong Hình 1, Deep Lake lưu trữ dữ liệu thô và chế độ xem trong bộ lưu trữ đối tượng như S3 và hiện thực hóa các tập dữ liệu với dòng đầy đủ. Truyền trực tuyến, truy vấn Ngôn ngữ truy vấn Tensor và công cụ Trực quan hóa thực thi cùng với điện toán deep learning hoặc trên trình duyệt mà không yêu cầu dịch vụ tập trung hoặc được quản lý bên ngoài.
4.1.1 Trích xuất. Đôi khi siêu dữ liệu có thể đã tồn tại trong cơ sở dữ liệu quan hệ. Chúng tôi cũng đã xây dựng thêm trình kết nối đích ETL bằng Airbyte[3] [22]. Khung này cho phép cắm vào bất kỳ nguồn dữ liệu được hỗ trợ nào, bao gồm cơ sở dữ liệu SQL/NoSQL, hồ dữ liệu hoặc kho dữ liệu và đồng bộ hóa dữ liệu vào Deep Lake. Giao thức kết nối chuyển đổi dữ liệu thành định dạng cột.
4.1.2 Biến đổi. Để tăng tốc đáng kể quy trình xử lý dữ liệu và giúp người dùng không phải lo lắng về bố cục khối, Deep Lake cung cấp tùy chọn để thực hiện song song các phép biến đổi python. Quá trình chuyển đổi lấy một tập dữ liệu, lặp lại theo mẫu trên chiều thứ nhất và xuất ra một tập dữ liệu mới. Hàm python do người dùng xác định cần có hai đối số bắt buộc 𝑠𝑎𝑚𝑝𝑙𝑒_𝑖𝑛, 𝑠𝑎𝑚𝑝𝑙𝑒_𝑜𝑢𝑡 và được trang trí bằng @𝑑𝑒𝑒𝑝𝑙𝑎𝑘𝑒. 𝑐𝑜𝑚𝑝𝑢𝑡𝑒. Một 𝑠𝑎𝑚𝑝𝑙𝑒_𝑖𝑛 có thể tự động tạo nhiều 𝑠𝑎𝑚𝑝𝑙𝑒_𝑜𝑢𝑡𝑠. Nó cho phép chuyển đổi cả một-một và một-nhiều. Việc chuyển đổi cũng có thể được áp dụng tại chỗ mà không cần tạo tập dữ liệu mới.
Phía sau, bộ lập lịch sẽ sắp xếp các phép biến đổi theo mẫu hoạt động trên các phần lân cận và lên lịch cho chúng trên một nhóm quy trình. Theo tùy chọn, việc tính toán có thể được ủy quyền cho cụm Ray [53]. Thay vì xác định tập dữ liệu đầu vào, người dùng có thể cung cấp một trình vòng lặp tùy ý với các đối tượng tùy chỉnh để tạo quy trình nhập. Người dùng cũng có thể xếp chồng nhiều phép biến đổi lại với nhau và xác định các đường dẫn phức tạp.
Deep Lake cũng giải quyết nhu cầu về khả năng tái tạo các thử nghiệm và tuân thủ dòng dữ liệu hoàn chỉnh. Các phiên bản khác nhau của tập dữ liệu tồn tại trong cùng một bộ lưu trữ, được phân tách bằng các thư mục con. Mỗi thư mục con hoạt động như một tập dữ liệu độc lập với các tệp siêu dữ liệu của nó. Không giống như tập dữ liệu không có phiên bản, các thư mục con này chỉ chứa các đoạn được sửa đổi trong phiên bản cụ thể, cùng với chunk_set tương ứng trên mỗi tensor chứa tên của tất cả các đoạn được sửa đổi. Tệp thông tin kiểm soát phiên bản có ở thư mục gốc sẽ theo dõi mối quan hệ giữa các phiên bản này dưới dạng cây kiểm soát phiên bản phân nhánh. Trong khi truy cập bất kỳ đoạn nào của tensor ở một phiên bản cụ thể, cây điều khiển phiên bản sẽ được duyệt bắt đầu từ lần xác nhận hiện tại, hướng tới lần xác nhận đầu tiên. Trong quá trình truyền tải, tập đoạn của mỗi phiên bản được kiểm tra sự tồn tại của đoạn được yêu cầu. Nếu đoạn được tìm thấy, quá trình truyền tải sẽ dừng lại và dữ liệu sẽ được lấy ra. Để theo dõi sự khác biệt giữa các phiên bản, đối với mỗi phiên bản, một tệp khác biệt cam kết cũng được lưu trữ trên mỗi tensor. Điều này giúp so sánh giữa các phiên bản và chi nhánh nhanh hơn. Hơn nữa, id của các mẫu được tạo và lưu trữ trong quá trình tổng hợp dữ liệu. Điều này rất quan trọng để theo dõi các mẫu giống nhau trong quá trình hợp nhất. Giao diện kiểm soát phiên bản của Deep Lake là API Python, cho phép các kỹ sư máy học tạo phiên bản cho tập dữ liệu của họ trong tập lệnh xử lý dữ liệu mà không cần chuyển đổi qua lại từ CLI. Nó hỗ trợ các lệnh sau:
• Cam kết : tạo một ảnh chụp nhanh bất biến về trạng thái hiện tại của tập dữ liệu.
• Thanh toán : kiểm tra một nhánh/cam kết hiện có hoặc tạo một nhánh mới nếu nhánh này không tồn tại.
• Diff : so sánh sự khác biệt giữa 2 phiên bản của tập dữ liệu.
• Hợp nhất : hợp nhất hai phiên bản khác nhau của tập dữ liệu, giải quyết xung đột theo chính sách do người dùng xác định.
Trực quan hóa dữ liệu là một phần quan trọng trong quy trình làm việc ML, đặc biệt khi dữ liệu khó phân tích cú pháp. Trực quan hóa nhanh chóng và liền mạch cho phép thu thập dữ liệu, chú thích, kiểm tra chất lượng và lặp lại đào tạo nhanh hơn. Công cụ hiển thị Deep Lake cung cấp giao diện web để trực quan hóa dữ liệu quy mô lớn trực tiếp từ nguồn. Nó xem xét htype của tensor để xác định cách bố trí tốt nhất cho việc hiển thị. Các tenxơ chính, chẳng hạn như hình ảnh, video và âm thanh được hiển thị đầu tiên, trong khi dữ liệu thứ cấp và chú thích, chẳng hạn như văn bản, nhãn_lớp, bbox và mặt nạ nhị phân được phủ lên. Trình trực quan hóa cũng xem xét thông tin loại meta, chẳng hạn như trình tự để cung cấp chế độ xem tuần tự của dữ liệu, trong đó các trình tự có thể được phát và chuyển đến vị trí cụ thể của trình tự mà không cần tìm nạp toàn bộ dữ liệu, điều này phù hợp với các trường hợp sử dụng video hoặc âm thanh . Trình hiển thị trực quan giải quyết các nhu cầu quan trọng trong quy trình công việc ML, cho phép người dùng hiểu và khắc phục sự cố dữ liệu, mô tả quá trình phát triển của dữ liệu, so sánh các dự đoán với thực tế cơ bản hoặc hiển thị nhiều chuỗi hình ảnh (ví dụ: hình ảnh camera và bản đồ chênh lệch) cạnh nhau.
Truy vấn và cân bằng các tập dữ liệu là một bước phổ biến trong việc đào tạo quy trình học sâu. Thông thường, điều này đạt được bên trong trình tải dữ liệu bằng cách sử dụng các chiến lược lấy mẫu hoặc các bước xử lý trước riêng biệt để chọn tập dữ liệu. Mặt khác, các hồ dữ liệu truyền thống kết nối với các công cụ truy vấn phân tích bên ngoài [66] và truyền các Dataframe đến quy trình làm việc của khoa học dữ liệu. Để giải quyết khoảng cách giữa định dạng và khả năng truy cập nhanh vào dữ liệu cụ thể, chúng tôi cung cấp một công cụ truy vấn giống như SQL nhúng được triển khai trong C++ có tên là Ngôn ngữ truy vấn Tensor (TQL). Một truy vấn ví dụ được hiển thị trong Hình 5. Trong khi trình phân tích cú pháp SQL đã được mở rộng từ Hyrise [37] để thiết kế Ngôn ngữ truy vấn Tensor, chúng tôi đã triển khai công cụ lập kế hoạch và thực thi để có thể tùy ý ủy quyền tính toán cho các khung tính toán tensor bên ngoài. Kế hoạch truy vấn tạo ra một biểu đồ tính toán của các hoạt động tensor. Sau đó, bộ lập lịch thực hiện biểu đồ truy vấn.
Việc thực thi truy vấn có thể được ủy quyền cho các khung tính toán tensor bên ngoài như PyTorch [58] hoặc XLA [64] và sử dụng hiệu quả phần cứng được tăng tốc cơ bản. Ngoài các tính năng SQL tiêu chuẩn, TQL còn thực hiện tính toán số. Có hai lý do chính để triển khai một ngôn ngữ truy vấn mới. Đầu tiên, SQL truyền thống không hỗ trợ các hoạt động mảng đa chiều như tính toán giá trị trung bình của các pixel hình ảnh hoặc chiếu mảng trên một chiều cụ thể. TQL giải quyết vấn đề này bằng cách thêm tính năng lập chỉ mục kiểu Python/NumPy, cắt mảng và cung cấp một tập hợp lớn các hàm tiện lợi để làm việc với mảng, nhiều hàm trong số đó là các thao tác phổ biến được hỗ trợ trong NumPy. Thứ hai, TQL cho phép tích hợp truy vấn sâu hơn với các tính năng khác của Deep Lake, chẳng hạn như kiểm soát phiên bản, công cụ phát trực tuyến và trực quan hóa. Ví dụ: TQL cho phép truy vấn dữ liệu trên các phiên bản cụ thể hoặc có thể trên nhiều phiên bản của tập dữ liệu. TQL cũng hỗ trợ các hướng dẫn cụ thể để tùy chỉnh trực quan hóa kết quả truy vấn hoặc tích hợp liền mạch với trình tải dữ liệu để truyền phát được lọc. Công cụ truy vấn nhúng chạy cùng với máy khách trong khi đào tạo mô hình trên phiên bản điện toán từ xa hoặc trong trình duyệt được biên dịch qua WebAssembly. TQL mở rộng SQL bằng các phép tính số trên đầu các cột đa chiều. Nó xây dựng các khung nhìn của các tập dữ liệu, có thể được trực quan hóa hoặc truyền trực tiếp đến các khung học sâu. Tuy nhiên, chế độ xem truy vấn có thể thưa thớt, điều này có thể ảnh hưởng đến hiệu suất phát trực tuyến.
Hầu hết dữ liệu thô được sử dụng cho deep learning được lưu trữ dưới dạng tệp thô (được nén ở các định dạng như JPEG), cục bộ hoặc trên đám mây. Một cách phổ biến để xây dựng tập dữ liệu là bảo toàn các con trỏ tới các tệp thô này trong cơ sở dữ liệu, truy vấn tệp này để lấy tập hợp con dữ liệu cần thiết, tìm nạp các tệp đã lọc vào máy, sau đó huấn luyện một mô hình lặp qua các tệp. Ngoài ra, dòng dữ liệu cần được duy trì thủ công bằng tệp xuất xứ. Định dạng lưu trữ Tensor đơn giản hóa các bước này bằng cách sử dụng các tensor được liên kết - lưu trữ các con trỏ (liên kết/url tới một hoặc nhiều nhà cung cấp đám mây) vào dữ liệu gốc. Các con trỏ trong một tensor có thể được kết nối với nhiều nhà cung cấp dịch vụ lưu trữ, do đó cho phép người dùng có được cái nhìn tổng hợp về dữ liệu của họ có trong nhiều nguồn. Tất cả các tính năng của Deep Lake bao gồm truy vấn, kiểm soát phiên bản và truyền trực tuyến tới các khung học sâu đều có thể được sử dụng với các tensor được liên kết. Tuy nhiên, hiệu suất truyền dữ liệu sẽ không tối ưu như tensor mặc định. Một vấn đề tương tự tồn tại với các chế độ xem thưa thớt được tạo do truy vấn, các chế độ xem này sẽ được truyền trực tuyến không hiệu quả do bố cục khối. Hơn nữa, việc cụ thể hóa sẽ biến chế độ xem tập dữ liệu thành một bố cục tối ưu để truyền vào các khung học sâu nhằm lặp lại nhanh hơn. Việc cụ thể hóa bao gồm việc tìm nạp dữ liệu thực tế từ các liên kết hoặc chế độ xem và sắp xếp nó thành các khối một cách hiệu quả. Việc thực hiện bước này ở cuối quy trình học máy sẽ giúp giảm thiểu tình trạng trùng lặp dữ liệu trong khi vẫn đảm bảo hiệu suất phát trực tuyến tối ưu và giảm thiểu trùng lặp dữ liệu với dòng dữ liệu đầy đủ.
Khi các tập dữ liệu trở nên lớn hơn, việc lưu trữ và truyền qua mạng từ bộ lưu trữ phân tán từ xa trở nên không thể tránh khỏi. Truyền dữ liệu cho phép đào tạo các mô hình mà không cần đợi tất cả dữ liệu được sao chép vào máy cục bộ. Trình tải dữ liệu phát trực tuyến đảm bảo tìm nạp, giải nén dữ liệu, áp dụng các phép biến đổi, đối chiếu và chuyển giao dữ liệu cho mô hình đào tạo. Trình tải dữ liệu học sâu thường ủy quyền việc tìm nạp và chuyển đổi cho các quy trình chạy song song để tránh tính toán đồng bộ. Sau đó, dữ liệu được chuyển đến nhân viên chính thông qua giao tiếp giữa các quá trình (IPC), đưa ra chi phí sao chép bộ nhớ hoặc sử dụng bộ nhớ dùng chung với một số vấn đề về độ tin cậy. Ngược lại, trình tải dữ liệu Deep Lake ủy quyền tìm nạp song song cao và giải nén tại chỗ trong C++ cho mỗi quy trình để tránh khóa trình thông dịch chung. Sau đó, nó chuyển con trỏ trong bộ nhớ đến hàm chuyển đổi do người dùng xác định và đối chiếu trước khi đưa chúng vào vòng huấn luyện trong bố cục bộ nhớ gốc của deep learning. Quá trình chuyển đổi được thực hiện song song khi nó chỉ sử dụng các lệnh gọi thông thường của thư viện gốc và giải phóng khóa trình thông dịch toàn cầu python (GIL) tương ứng. Kết quả là, chúng tôi nhận được:
• Hiệu suất : Cung cấp dữ liệu đến mô hình deep learning đủ nhanh để GPU được tận dụng tối đa hoặc bị tắc nghẽn bởi máy tính.
• Trình lập lịch thông minh : Tự động phân biệt giữa mức độ ưu tiên của các công việc sử dụng nhiều CPU so với công việc ít sử dụng nhiều CPU.
• Phân bổ tài nguyên hiệu quả : Dự đoán mức tiêu thụ bộ nhớ để tránh làm gián đoạn quá trình đào tạo do tràn bộ nhớ.
Bài viết này có sẵn trên arxiv theo giấy phép CC 4.0.
[3] Mã nguồn có sẵn: https://github.com/activeloopai/airbyte trên nhánh @feature/connector/deeplake