Khoa học dữ liệu có thể mở rộng vượt ra ngoài máy cục bộ
Khoa học dữ liệu là một thuật ngữ đại diện cho giao điểm của nhiều yếu tố quan trọng.
Tôi cho rằng có những trụ cột của chuyên môn khoa học dữ liệu, cụ thể là:
- Lĩnh vực kinh doanh
- Xác suất và thống kê
- Khoa học máy tính và lập trình phần mềm
- Giao tiếp bằng văn bản và lời nói
Trụ cột thứ ba là về việc nắm vững khoa học máy tính và lập trình phần mềm.
Mặc dù điều này có thể không hiển nhiên ngay với các nhà khoa học dữ liệu mới vào nghề, lĩnh vực này cũng thường bao gồm các khía cạnh như devops, điện toán đám mây, pipeline dữ liệu, kỹ thuật dữ liệu, chuyên môn truy vấn các loại cơ sở dữ liệu khác nhau, xây dựng và triển khai giải pháp phần mềm sản xuất, v.v.
Ngoài ra, các nhà khoa học dữ liệu cần phát triển kỹ năng lập trình vững, nhưng họ có thể không được đào tạo bài bản hoặc dày dạn kinh nghiệm về khoa học máy tính, các khái niệm lập trình, hay kiến trúc và hạ tầng phần mềm sản xuất như các kỹ sư phần mềm được đào tạo/kinh nghiệm bài bản. Khi bắt đầu với khoa học dữ liệu, hầu hết sẽ cài đặt Python và/hoặc R trên máy tính cá nhân, rồi viết và chạy mã trong Môi trường Phát triển Tích hợp (IDE) cục bộ như Ứng dụng Jupyter Notebook hoặc RStudio.
Bên cạnh đó, khi phân tích nâng cao trở nên phổ biến và các nhóm khoa học dữ liệu phát triển, nhu cầu về giải pháp cộng tác để cung cấp insight, phân tích dự báo, hệ thống gợi ý, v.v. cũng tăng lên. Nghiên cứu có thể tái lập và các công cụ notebook kết hợp với kiểm soát phiên bản mã là một phần của lời giải cho cộng tác, trong khi tận dụng các công cụ và nền tảng trực tuyến trên đám mây là một phần khác.
Nhu cầu cộng tác cũng mở rộng đến những người ngoài nhóm khoa học dữ liệu, đặc biệt vì khoa học dữ liệu chủ yếu được triển khai để đạt mục tiêu kinh doanh. Do đó, các bên liên quan của một dự án khoa học dữ liệu có thể bao gồm lãnh đạo cấp cao, trưởng bộ phận, và những thành viên đội dữ liệu khác như kiến trúc sư, kỹ sư dữ liệu, nhà phân tích, v.v.
Bài viết này nhằm giúp các nhà khoa học dữ liệu hiểu những gì nằm ngoài chiếc laptop hay máy để bàn cục bộ, đặc biệt trong bối cảnh đưa giải pháp khoa học dữ liệu vào sản xuất, hoặc mở rộng sức mạnh và năng lực tính toán của bạn. Tùy theo kinh nghiệm của bạn với các chủ đề này, nội dung sẽ phù hợp với các cấp độ kỹ năng khác nhau.
Bắt đầu nhé!
Chính xác thì đám mây là gì?
Vâng, đám mây nổi tiếng nhưng vẫn thường bị hiểu chưa đúng. Dù nghe có vẻ trừu tượng, đám mây thực ra rất cụ thể theo ý nghĩa ban đầu. Hãy định nghĩa vài khái niệm then chốt trước khi đi vào khái niệm đám mây.
Các máy tính kết nối với nhau và chia sẻ tài nguyên được gọi là một mạng, trong đó chính Internet là ví dụ lớn nhất và nổi tiếng nhất. Mạng gia đình như Mạng Cục bộ (LAN) hoặc WiFi Service Set Identifier (SSID), nơi nhiều máy tính được kết nối, là một ví dụ khác, dù nhỏ hơn rất nhiều. Các tài nguyên được nói đến có thể gồm trang web, phương tiện, lưu trữ dữ liệu, máy chủ ứng dụng, máy in, v.v.
Các máy tính trong một mạng thường được gọi là nút, và chúng giao tiếp với nhau bằng các giao thức được tiêu chuẩn hóa như HyperText Transfer Protocol (HTTP), Transmission Control Protocol (TCP)/ Internet Protocol (IP), v.v. Các trao đổi này có thể để cập nhật trạng thái, giám sát, yêu cầu/đáp ứng, và nhiều mục đích khác.
Hơn nữa, máy tính thường không đặt tại chỗ (on-premise), nghĩa là ứng dụng và dữ liệu thường được lưu trữ trên các máy tính đặt trong trung tâm dữ liệu. Những nơi này cung cấp toàn bộ hạ tầng cần thiết, như điện, làm mát, an ninh, bảo vệ thảm họa, v.v., để vận hành và duy trì số lượng lớn máy tính có thể truy cập bởi doanh nghiệp hoặc công chúng.
Vì máy tính và lưu trữ đã trở nên tương đối rẻ theo thời gian, nhiều giải pháp hiện dùng nhiều máy tính làm việc cùng nhau, chi phí mở rộng không quá cao, thay vì mở rộng bằng cách mua một cỗ máy tính siêu mạnh và rất đắt. Một phần của việc “làm việc cùng nhau” là đảm bảo giải pháp tiếp tục chạy tự động dù có máy nào đó gặp sự cố, và hệ thống có thể tự động mở rộng để xử lý tải đặt lên hệ thống.
Twitter, Facebook, Instagram, Snapchat, Netflix và YouTube là ví dụ hoàn hảo về các ứng dụng dựa trên đám mây cần mở rộng theo cả hai cách này. Rất hiếm khi thấy ứng dụng của họ “sập” hoàn toàn, và họ cũng có thể xử lý thực sự hàng triệu người dùng mỗi ngày tương tác với nền tảng.
Khi một nhóm máy tính được kết nối cùng một mạng và làm việc cùng nhau để hoàn thành một nhiệm vụ hoặc tập nhiệm vụ, đó được gọi là một cụm. Có thể hình dung cụm như một máy tính duy nhất, nhưng đem lại cải thiện lớn về hiệu năng, tính sẵn sàng và khả năng mở rộng so với một máy đơn lẻ. Những lợi ích này sẽ được bàn thêm ở phần sau.
Thuật ngữ tính toán phân tán hoặc hệ thống phân tán đề cập đến phần mềm và hệ thống được viết để tận dụng cụm nhằm thực hiện các tác vụ cụ thể, như Hadoop, Spark và MapReduce.
Cuối cùng là định nghĩa về đám mây. Bên cạnh các tài nguyên chia sẻ đã nêu, những tài nguyên giải pháp quan trọng khác có thể gồm máy chủ, dịch vụ, vi dịch vụ, mạng, v.v. Đám mây mô tả tình huống trong đó một bên duy nhất sở hữu, quản trị và quản lý một nhóm máy tính kết nối mạng và tài nguyên chia sẻ, thường để lưu trữ và cung cấp các giải pháp dưới dạng phần mềm. Theo định nghĩa này, dù Internet chắc chắn là một mạng, nó không phải là đám mây vì không thuộc sở hữu của một bên duy nhất.
Để tìm hiểu sâu hơn về điện toán đám mây và các khái niệm then chốt khi tạo phần mềm có thể mở rộng và kiến trúc dữ liệu lớn, hãy xem bộ ba bài chuyên sâu của tôi về chủ đề này.
Khoa học dữ liệu trên đám mây
Đến đây, bài viết đã bàn đủ sâu về điện toán đám mây và các khái niệm liên quan để minh họa các ý chính. Nếu trải nghiệm của bạn với kiến trúc và kỹ thuật phần mềm đến lúc này còn giới hạn ở phát triển cục bộ, bạn có thể tự hỏi vì sao điều này lại liên quan đến nhà khoa học dữ liệu. Phần tiếp theo sẽ đề cập điều đó.
Nếu bạn quen thuộc với quy trình khoa học dữ liệu, bạn biết rằng phần lớn quy trình thường được thực hiện trên máy tính cục bộ của nhà khoa học dữ liệu. Máy đó cài các ngôn ngữ ưa dùng như Python và R, cùng IDE ưa thích. Thiết lập môi trường phát triển chủ đạo khác là cài các gói liên quan thông qua trình quản lý gói như Anaconda, hoặc cài từng gói thủ công.
Khi môi trường phát triển đã sẵn sàng, quy trình khoa học dữ liệu điển hình bắt đầu, với dữ liệu là thứ còn lại chủ yếu cần có. Các bước lặp đi lặp lại thường gồm:
- Thu thập dữ liệu
- Phân tích cú pháp, làm sạch, xử lý và chuyển đổi dữ liệu
- Phân tích và khai thác dữ liệu, như Phân tích Khám phá Dữ liệu (EDA), thống kê tóm tắt, ...
- Xây dựng, xác thực và kiểm thử mô hình, như dự báo, gợi ý, ...
- Lưu ý: Nếu không xây dựng mô hình, thì xác định mẫu hoặc xu hướng, tạo insight có thể hành động, trích xuất thông tin hữu ích, tạo báo cáo, v.v. Ở đây, hướng dẫn này sẽ coi cả hai trường hợp là "tạo sản phẩm bàn giao".
- Tinh chỉnh và tối ưu mô hình hoặc sản phẩm bàn giao
Tuy nhiên, đôi khi việc thực hiện mọi tác vụ liên quan đến khoa học dữ liệu hoặc dữ liệu lớn trên môi trường phát triển cục bộ là không khả thi hoặc không mong muốn. Dưới đây là một số lý do chính:
- Bộ dữ liệu quá lớn, không vừa bộ nhớ hệ thống (RAM) của môi trường phát triển để huấn luyện mô hình hoặc phân tích khác
- Sức mạnh xử lý (CPU) của môi trường phát triển không thể thực hiện tác vụ trong khoảng thời gian hợp lý hoặc đủ dùng, thậm chí không thể thực hiện
- Sản phẩm bàn giao cần được triển khai lên môi trường sản xuất, và có thể được tích hợp như một thành phần vào ứng dụng lớn hơn (ví dụ: ứng dụng web, nền tảng SaaS, ...)
- Đơn giản là ưu tiên dùng máy nhanh và mạnh hơn (CPU, RAM, ...) và không muốn đặt tải cần thiết lên máy phát triển cục bộ
Khi các tình huống này xảy ra, có nhiều lựa chọn. Thay vì dùng máy phát triển cục bộ của nhà khoa học dữ liệu, thường người ta chuyển tải công việc tính toán sang máy tại chỗ (on-premise) hoặc máy ảo trên đám mây (ví dụ: AWS EC2, AWS Elastic Beanstalk). Lợi ích của việc dùng máy ảo và cụm tự động mở rộng là có thể khởi tạo và hủy khi cần, và điều chỉnh để đáp ứng yêu cầu tính toán và lưu trữ dữ liệu.
Trong trường hợp triển khai sản phẩm bàn giao lên môi trường sản xuất để dùng như một phần của ứng dụng lớn hơn hoặc pipeline dữ liệu, có rất nhiều lựa chọn và thách thức cần cân nhắc. Phần thảo luận sâu hơn nằm ngoài phạm vi bài viết này.
Ngoài các giải pháp và công cụ khoa học dữ liệu tự phát triển trên đám mây hoặc sản xuất, còn có nhiều dịch vụ và sản phẩm dựa trên đám mây từ các nhà cung cấp uy tín, thường hoạt động tốt với công cụ notebook như Jupyter. Chúng chủ yếu ở dạng API dữ liệu lớn, máy học và trí tuệ nhân tạo, gồm các lựa chọn như nền tảng Trí tuệ Nhân tạo của AWS, Databricks, Google Cloud Platform Datalab và Machine Learning, và nhiều hơn nữa.
Để có phần thảo luận chi tiết và chuyên sâu hơn về khoa học dữ liệu và phân tích nâng cao trong sản xuất so với phát triển, gồm khuyến nghị về ngôn ngữ, gói, framework và nền tảng, vui lòng xem bộ ba bài của tôi về chủ đề này. Bộ bài về kiến trúc phần mềm có thể mở rộng và dữ liệu lớn cũng là phần bổ trợ tuyệt vời cho điện toán đám mây.
Kiến trúc phần mềm và các thuộc tính chất lượng
Kiến trúc phần mềm liên quan đến việc thiết kế một hệ thống phần mềm, thường dựa trên đám mây, đại diện cho một sản phẩm, dịch vụ hoặc hệ thống tính toán theo nhiệm vụ. Bạn cũng có thể nghe các thuật ngữ kiến trúc hệ thống hoặc kiến trúc phần mềm, cả hai về cơ bản mang nghĩa tương tự.
Một phần của thiết kế kiến trúc phần mềm là lựa chọn ngôn ngữ lập trình và công nghệ phù hợp (còn gọi là stack), các thành phần, gói, framework, nền tảng, v.v. Điều này đòi hỏi cân nhắc kỹ, đặc biệt xoay quanh mục đích dự kiến của hệ thống và các đánh đổi quan trọng khác. Khía cạnh này cần kỹ năng, kiến thức và kinh nghiệm tích lũy theo thời gian bởi một người như kiến trúc sư phần mềm.
Một khía cạnh quan trọng khác của kiến trúc và kỹ thuật hệ thống/phần mềm là các thuộc tính chất lượng hay yêu cầu phi chức năng. Điều này đặc biệt đúng với các giải pháp sản xuất trong thế giới thực.
Yêu cầu phi chức năng thường bao gồm:
- Tính sẵn sàng
- Hiệu năng
- Độ tin cậy
- Khả năng mở rộng (dọc và ngang)
- Khả năng mở rộng tính năng
- Tính dễ sử dụng
- Tính mô-đun
- Tái sử dụng
Trong bài viết này, bạn sẽ có cái nhìn tổng quan ngắn về bốn thuộc tính quan trọng nhất: tính sẵn sàng, hiệu năng, độ tin cậy và khả năng mở rộng. Lưu ý phần thảo luận ở mức cao, không đi vào định nghĩa hay yêu cầu dựa trên chỉ số cho các thuộc tính này.
Tính sẵn sàng đúng như tên gọi, là hệ thống sẵn sàng, hay nói cách khác là đang hoạt động đúng. Điều này có thể mang nhiều ý nghĩa và phụ thuộc nhiều vào độ tin cậy và khả năng mở rộng. "Hoạt động đúng" nghĩa là hệ thống chạy như dự định và bất cứ khi nào cần. Có thể là người dùng cuối cố gắng sử dụng hệ thống, ví dụ Facebook hoặc Netflix, hoặc là một tập dịch vụ trên đám mây dùng để xử lý dữ liệu.
Độ tin cậy là khả năng hệ thống vận hành và hoạt động đúng mà không gặp lỗi hay trục trặc. Hệ thống càng chạy được như vậy, hệ thống càng được coi là chịu lỗi tốt. Vì khó có thể nghĩ hết và kiểm thử trước mọi trường hợp sử dụng và biên, đạt 100% độ tin cậy là rất khó. Ngoài ra, lỗi có thể xảy ra vì nhiều lý do, như lỗi mã, vấn đề môi trường, và hạn chế tài nguyên (CPU, RAM, đĩa, ...), là vài nguyên nhân chủ yếu.
Hiệu năng mô tả tốc độ hệ thống thực hiện các tác vụ, hay cách khác là thời gian cần để hệ thống hoàn tất một tác vụ cụ thể. Lấy YouTube làm ví dụ. Bạn kỳ vọng khi xem video, video sẽ tải và phát trong thời gian hợp lý. YouTube càng được Google tối ưu, video tải và phát càng nhanh, người dùng càng hài lòng và ít có khả năng bỏ ứng dụng. Ngược lại, nếu YouTube chậm đến mức không đáng công, mọi người sẽ ngừng sử dụng. May mắn là phần lớn thời gian xảy ra trường hợp đầu tiên chứ không phải trường hợp sau.
Cuối cùng, khả năng mở rộng rất quan trọng với một số ứng dụng, là thuật ngữ chỉ khả năng hệ thống duy trì một mức hiệu năng nhất định (định nghĩa ở trên, ở mức cao) bất chấp tải tăng lên. Tải là thuật ngữ chỉ số lượng yêu cầu đồng thời gửi tới hệ thống.
Một ví dụ điển hình cần khả năng mở rộng là khi vé của một đội thể thao nổi tiếng hoặc nghệ sĩ biểu diễn bắt đầu mở bán. Tùy độ nổi tiếng, số yêu cầu đồng thời mua vé trên ứng dụng web như Ticketmaster có thể lên đến hàng trăm nghìn khi vừa mở bán. Tùy khả năng mở rộng của hệ thống, điều này có thể làm giảm mạnh hiệu năng hoặc khiến hệ thống sập hoàn toàn. Cả hai kịch bản đều không tốt.
Để đáp ứng yêu cầu này, người ta dùng kỹ thuật mở rộng dọc hoặc mở rộng ngang. Mở rộng dọc là thay thế thiết bị tính toán trong hệ thống bằng máy mạnh hơn (CPU, nhiều lõi, ...) và tin cậy hơn, với tài nguyên lớn hơn như bộ nhớ hệ thống hoặc RAM. Những máy như vậy có thể đắt đỏ.
Mở rộng ngang thì sử dụng các máy phổ thông chi phí thấp, từng máy không quá mạnh, nhưng khi dùng theo nhóm thì thừa sức xử lý tải của hệ thống. Vì các giải pháp này cần nhiều máy, cần thiết lập hệ thống để tự động xử lý tình huống một hoặc nhiều máy (nút) gặp sự cố hoặc sập (failover), v.v.
Kết luận
Hy vọng bài viết đã giúp làm sáng tỏ nhiều khía cạnh quan trọng của khoa học dữ liệu vượt ra ngoài phát triển cục bộ, trong bối cảnh các giải pháp sản xuất thực tế. Khái niệm về điện toán và kiến trúc dựa trên đám mây rất quan trọng khi làm việc với các giải pháp dữ liệu trong sản xuất, hoặc khi cần thêm sức mạnh và tài nguyên tính toán.
Hãy chia sẻ suy nghĩ của bạn trong phần bình luận bên dưới. Nếu muốn tìm hiểu thêm, bạn có thể theo dõi @innoarchitech trên Twitter, đăng ký bản tin của InnoArchiTech, và xem blog của InnoArchiTech. Bạn cũng có thể xem lớp học về Trí tuệ nhân tạo và Máy học định hướng mục tiêu của tôi.