Hình ảnh chính cho bài viết này được tạo bởiTrình tạo hình ảnh AI của HackerNoon thông qua lời nhắc "rô-bốt nhìn vào máy tính"
Khối lượng công việc học máy (ML) yêu cầu cơ sở hạ tầng hiệu quả để mang lại kết quả nhanh chóng. Đào tạo mô hình phụ thuộc rất nhiều vào các tập dữ liệu lớn. Chuyển dữ liệu này từ bộ lưu trữ sang cụm đào tạo là bước đầu tiên của bất kỳ quy trình ML nào, điều này ảnh hưởng đáng kể đến hiệu quả của việc đào tạo mô hình.
Bài viết này sẽ thảo luận về một giải pháp mới để sắp xếp dữ liệu cho các quy trình máy học từ đầu đến cuối nhằm giải quyết các câu hỏi trên. Tôi sẽ phác thảo những thách thức và cạm bẫy phổ biến, sau đó đề xuất một kỹ thuật mới, điều phối dữ liệu, để tối ưu hóa đường dẫn dữ liệu cho máy học.
Quy trình học máy từ đầu đến cuối là một chuỗi các bước từ tiền xử lý và làm sạch dữ liệu đến đào tạo mô hình đến suy luận. Đào tạo là phần quan trọng và sử dụng nhiều tài nguyên nhất trong toàn bộ quy trình làm việc.
Sơ đồ sau đây cho thấy một đường dẫn ML điển hình. Nó bắt đầu với việc thu thập dữ liệu, sau đó là chuẩn bị dữ liệu và cuối cùng là đào tạo mô hình. Trong giai đoạn thu thập dữ liệu, các kỹ sư nền tảng dữ liệu thường mất một lượng thời gian đáng kể để giúp các kỹ sư dữ liệu có thể truy cập dữ liệu, những người chuẩn bị dữ liệu cho các nhà khoa học dữ liệu để xây dựng và lặp lại các mô hình.
Trong giai đoạn đào tạo, khối lượng dữ liệu chưa từng có được xử lý để đảm bảo cung cấp dữ liệu liên tục cho các GPU tạo mô hình. Điều bắt buộc là dữ liệu phải được quản lý để hỗ trợ tính phức tạp của ML và kiến trúc thực thi của nó. Trong quy trình cung cấp dữ liệu, mỗi bước đưa ra những thách thức kỹ thuật riêng.
Đào tạo được hưởng lợi từ các bộ dữ liệu lớn, vì vậy điều quan trọng là phải thu thập dữ liệu từ tất cả các nguồn có liên quan. Việc kết hợp tất cả dữ liệu thành một nguồn nguyên khối không còn khả thi khi dữ liệu nằm trong hồ dữ liệu, kho dữ liệu và kho lưu trữ đối tượng, cho dù tại chỗ, trên đám mây hay được phân phối trên nhiều vị trí địa lý. Với các silo dữ liệu, việc truy cập từ xa qua mạng chắc chắn sẽ gây ra độ trễ. Làm thế nào để dữ liệu có thể truy cập được trong khi vẫn duy trì hiệu suất mong muốn là một thách thức đáng kể.
Quá trình chuẩn bị dữ liệu bắt đầu bằng việc nhập dữ liệu từ giai đoạn thu thập và bao gồm làm sạch, ETL và chuyển đổi trước khi cung cấp dữ liệu để huấn luyện mô hình. Nếu giai đoạn này được xem xét tách biệt, đường truyền dữ liệu sẽ được tuần tự hóa và sẽ lãng phí thêm thời gian trong khi chờ đợi dữ liệu được chuẩn bị cho cụm đào tạo. Do đó, các kỹ sư nền tảng phải tìm ra cách tạo đường dẫn dữ liệu song song và cho phép chia sẻ dữ liệu hiệu quả cũng như lưu trữ hiệu quả các kết quả trung gian.
Đào tạo mô hình yêu cầu xử lý hàng trăm terabyte dữ liệu, thường là số lượng lớn các tệp nhỏ như hình ảnh và tệp âm thanh. Quá trình đào tạo bao gồm các bước lặp yêu cầu các kỷ nguyên chạy nhiều lần, giúp truy cập dữ liệu thường xuyên. Cần phải giữ cho GPU bận rộn bằng cách liên tục cung cấp dữ liệu cho nó. Không dễ để tối ưu hóa I/O và duy trì thông lượng mà GPU yêu cầu.
Trước khi tôi nói về các giải pháp khác nhau, hãy thiết lập một kịch bản đơn giản hóa, như được minh họa trong sơ đồ bên dưới. Ở đây, chúng tôi đang đào tạo trên đám mây bằng cách sử dụng cụm GPU có nhiều nút chạy TensorFlow dưới dạng khung ML. Dữ liệu được xử lý trước được lưu trữ trong Amazon S3. Nói chung, có hai cách tiếp cận để đưa dữ liệu này vào cụm huấn luyện. Chúng ta sẽ thảo luận về những điều tiếp theo.
Cách tiếp cận 1: Sao chép dữ liệu trong bộ nhớ cục bộ
Trong cách tiếp cận đầu tiên, toàn bộ tập dữ liệu được sao chép từ bộ nhớ từ xa sang bộ nhớ cục bộ của từng máy chủ để đào tạo, như minh họa bên dưới. Do đó, vị trí dữ liệu được đảm bảo và các công việc đào tạo đọc đầu vào từ cục bộ thay vì truy xuất từ bộ lưu trữ từ xa.
Từ phối cảnh đường dẫn dữ liệu và I/O, cách tiếp cận này cung cấp thông lượng I/O cao nhất vì tất cả dữ liệu là cục bộ. Các GPU sẽ luôn bận ngoại trừ lúc bắt đầu vì quá trình đào tạo phải đợi dữ liệu được sao chép hoàn toàn từ bộ lưu trữ đối tượng sang cụm đào tạo.
Tuy nhiên, cách tiếp cận này không phù hợp với mọi tình huống.
Đầu tiên, tập dữ liệu phải vừa với bộ nhớ cục bộ tổng hợp. Khi kích thước của tập dữ liệu đầu vào tăng lên, quá trình sao chép dữ liệu trở nên lâu hơn và dễ xảy ra lỗi hơn, mất nhiều thời gian hơn và lãng phí tài nguyên GPU.
Thứ hai, việc sao chép một lượng lớn dữ liệu vào mỗi máy đào tạo tạo áp lực đáng kể lên hệ thống lưu trữ và mạng. Trong trường hợp dữ liệu đầu vào thay đổi thường xuyên, việc đồng bộ hóa dữ liệu có thể rất phức tạp.
Cuối cùng, việc tạo các bản sao dữ liệu theo cách thủ công rất tốn thời gian và dễ xảy ra lỗi vì rất khó để giữ dữ liệu trên bộ lưu trữ đám mây được đồng bộ hóa với dữ liệu đào tạo.
Cách tiếp cận 2: Truy cập trực tiếp vào bộ nhớ đám mây
Một cách tiếp cận phổ biến khác là kết nối trực tiếp quá trình đào tạo với tập dữ liệu đích trên bộ nhớ từ xa, như minh họa bên dưới. Với cách tiếp cận này, kích thước của tập dữ liệu không phải là vấn đề, như với giải pháp trước đó. Nhưng nó phải đối mặt với một số thách thức mới.
Đầu tiên, từ phối cảnh I/O và đường ống, dữ liệu được xử lý tuần tự. Tất cả các hoạt động truy cập dữ liệu phải đi qua mạng giữa bộ lưu trữ đối tượng và cụm đào tạo, khiến I/O trở thành nút cổ chai. Kết quả là, GPU trải qua các chu kỳ chờ đợi vì thông lượng I/O bị giới hạn bởi mạng.
Thứ hai, khi quy mô đào tạo lớn, tất cả các nút đào tạo truy cập đồng thời cùng một tập dữ liệu từ cùng một bộ lưu trữ từ xa, tạo thêm áp lực rất lớn cho hệ thống lưu trữ. Bộ nhớ có thể sẽ bị tắc nghẽn do truy cập đồng thời cao, dẫn đến mức sử dụng GPU thấp.
Thứ ba, nếu tập dữ liệu bao gồm một số lượng lớn các tệp nhỏ, thì yêu cầu truy cập siêu dữ liệu sẽ chiếm một phần lớn yêu cầu dữ liệu. Do đó, việc truy xuất trực tiếp siêu dữ liệu của số lượng lớn tệp hoặc thư mục từ kho lưu trữ đối tượng sẽ trở thành nút cổ chai về hiệu suất cũng như làm tăng chi phí vận hành siêu dữ liệu.
Để giải quyết những thách thức và cạm bẫy này, chúng ta cần suy nghĩ lại về kiến trúc nền tảng dữ liệu khi xử lý I/O trong hệ thống máy học. Ở đây, tôi đề xuất một cách tiếp cận mới, điều phối dữ liệu, để tăng tốc quy trình ML từ đầu đến cuối. Các công nghệ điều phối dữ liệu truy cập dữ liệu trừu tượng trên các hệ thống lưu trữ, ảo hóa tất cả dữ liệu và trình bày dữ liệu qua các API được tiêu chuẩn hóa và một không gian tên chung cho các ứng dụng dựa trên dữ liệu.
Thay vì sao chép và di chuyển dữ liệu xung quanh, hãy để nguyên tại chỗ, cho dù đó là tại chỗ hay trên đám mây. Phối hợp dữ liệu có thể giúp trừu tượng hóa dữ liệu để tạo ra một chế độ xem thống nhất. Điều này sẽ làm giảm đáng kể sự phức tạp trong giai đoạn thu thập dữ liệu.
Vì hệ thống điều phối dữ liệu đã có thể tích hợp với các hệ thống lưu trữ nên các khung máy học chỉ cần tương tác với một nền tảng điều phối dữ liệu duy nhất để truy cập dữ liệu từ bất kỳ kho lưu trữ được kết nối nào. Do đó, việc đào tạo có thể được thực hiện trên tất cả dữ liệu từ bất kỳ nguồn nào, dẫn đến chất lượng mô hình được cải thiện. Không cần phải di chuyển dữ liệu theo cách thủ công đến nguồn trung tâm. Tất cả các khung tính toán, bao gồm Spark, Presto, PyTorch và TensorFlow , đều có thể truy cập dữ liệu mà không cần quan tâm đến vị trí của dữ liệu.
Thay vì sao chép toàn bộ tập dữ liệu vào từng máy, tôi khuyên bạn nên triển khai bộ nhớ đệm phân tán, nơi dữ liệu có thể được phân bổ đồng đều trên cụm. Bộ nhớ đệm phân tán đặc biệt thuận lợi khi tập dữ liệu huấn luyện lớn hơn nhiều so với dung lượng lưu trữ của một nút. Nó cũng hữu ích khi dữ liệu ở xa vì dữ liệu được lưu trữ cục bộ. Đào tạo ML trở nên nhanh hơn và tiết kiệm chi phí hơn vì không có mạng I/O khi truy cập dữ liệu.
Hình trên cho thấy một kho lưu trữ đối tượng nơi lưu trữ tất cả dữ liệu đào tạo và hai tệp đại diện cho tập dữ liệu (/path1/file1 và /path2/file2). Thay vì lưu trữ tất cả các khối tệp trên mỗi máy đào tạo, các khối sẽ được phân phối trên một số máy. Để tránh mất dữ liệu và cải thiện khả năng đọc đồng thời, mỗi khối có thể được lưu trữ đồng thời trên nhiều máy chủ.
Có mức độ chồng chéo cao giữa các lần đọc và ghi dữ liệu được thực hiện bởi một công việc đào tạo ML, cả trong và giữa các công việc. Chia sẻ dữ liệu có thể đảm bảo rằng tất cả các khung tính toán đều có quyền truy cập vào dữ liệu đã lưu trong bộ nhớ đệm trước đó cho cả khối lượng công việc đọc và ghi cho bước tiếp theo. Ví dụ: nếu bạn sử dụng Spark cho ETL trong bước chuẩn bị dữ liệu, thì việc chia sẻ dữ liệu có thể đảm bảo rằng dữ liệu đầu ra được lưu vào bộ đệm ẩn và có sẵn cho các giai đoạn sau. Thông qua chia sẻ dữ liệu, toàn bộ đường dẫn dữ liệu đạt được hiệu suất từ đầu đến cuối tốt hơn.
Chúng tôi điều phối đường dẫn dữ liệu bằng cách triển khai tính năng tải trước và lưu vào bộ nhớ đệm theo yêu cầu. Hình dưới đây cho thấy việc tải dữ liệu từ nguồn bằng bộ nhớ đệm dữ liệu có thể được thực hiện song song với tác vụ đào tạo thực tế. Kết quả là, việc đào tạo được hưởng lợi từ thông lượng dữ liệu cao khi truy cập dữ liệu mà không cần phải đợi để lưu toàn bộ dữ liệu vào bộ đệm trước khi đào tạo.
Mặc dù lúc đầu sẽ có một số độ trễ I/O, nhưng thời gian chờ sẽ giảm do dữ liệu đã được tải vào bộ đệm. Thông qua phương pháp này, bạn có thể chồng chéo các bước. Việc tải dữ liệu từ bộ lưu trữ đối tượng vào cụm đào tạo, lưu vào bộ nhớ đệm, tải dữ liệu theo yêu cầu vào quá trình đào tạo và đào tạo đều có thể được thực hiện song song, giúp tăng tốc đáng kể toàn bộ quá trình.
Hãy so sánh cách tiếp cận mới được đề xuất với hai cách tiếp cận truyền thống. Bằng cách sắp xếp dữ liệu qua các bước của quy trình máy học, chúng tôi loại bỏ việc thực thi nối tiếp và sự kém hiệu quả liên quan khi dữ liệu chuyển từ giai đoạn này sang giai đoạn tiếp theo. Điều này đến lượt nó sẽ mang lại tỷ lệ sử dụng GPU cao.
| Sao chép dữ liệu trong bộ nhớ cục bộ | Truy cập trực tiếp vào bộ nhớ đám mây | điều phối dữ liệu |
---|---|---|---|
Vị trí dữ liệu | ✓ | | ✓ |
Không giới hạn kích thước của tập dữ liệu | | ✓ | ✓ |
Không cần sao chép toàn bộ dữ liệu theo cách thủ công trước khi đào tạo | ✓ | ✓ | ✓ |
Tính nhất quán của dữ liệu được đảm bảo | | ✓ | ✓ |
Mức sử dụng GPU cao | ✓ | | ✓ |
Hãy sử dụng Alluxio làm ví dụ ở đây để chỉ cho bạn cách sử dụng phối hợp dữ liệu. Một lần nữa, chúng ta sẽ sử dụng kịch bản đơn giản hóa tương tự. Để lên lịch cho các công việc của TensorFlow, bạn có thể sử dụng Kubernetes hoặc sử dụng các dịch vụ đám mây công cộng.
Sử dụng Alluxio để phối hợp đào tạo máy học và học sâu thường bao gồm ba bước:
Dữ liệu trong các hệ thống lưu trữ khác nhau có thể được truy cập thông qua Alluxio ngay sau khi cài đặt và chúng có thể được truy cập một cách minh bạch thông qua tập lệnh điểm chuẩn mà không cần sửa đổi TensorFlow. Điều này đơn giản hóa đáng kể việc phát triển ứng dụng, nếu không sẽ cần tích hợp từng hệ thống lưu trữ cụ thể cũng như cấu hình của thông tin xác thực.
Bạn có thể làm theo hướng dẫn tại đây để chạy nhận dạng hình ảnh bằng Alluxio với TensorFlow.
Khi các kỹ thuật máy học tiếp tục phát triển và các khung thực hiện các tác vụ phức tạp hơn, các phương pháp quản lý đường dẫn dữ liệu của chúng tôi cũng sẽ được cải thiện. Bằng cách mở rộng khả năng phối hợp dữ liệu cho đường ống dữ liệu, bạn có thể đạt được hiệu quả và sử dụng tài nguyên tốt hơn cho đường ống đào tạo từ đầu đến cuối của mình.
In lại với sự cho phép. © IDG Communications, Inc., 2022. Bảo lưu mọi quyền. https://www.infoworld.com/article/3651453/orchestrating-data-for-machine-learning-pipelines.html .