The Graph Mining Library - thư viện thuật toán và phân tích đồ thị
(github.com/google)- Mục tiêu của nhóm Google Graph Mining là xây dựng một thư viện có khả năng mở rộng cao cho các thuật toán và phân tích đồ thị, đồng thời áp dụng vào các sản phẩm của Google; phạm vi hiện tại được cung cấp là bộ sưu tập thuật toán phân cụm
- Các công cụ được phát triển hướng đến xây dựng đồ thị tương đồng, phân cụm, phân loại nút, nhúng nút, huấn luyện mạng nơ-ron đồ thị, trực quan hóa đồ thị, nhiều phương pháp lấy mẫu khác nhau và xếp hạng độ tương đồng
- Mảng phân cụm gồm các thuật toán song song dùng bộ nhớ chia sẻ có thể mở rộng tới các đồ thị với hàng chục tỷ cạnh, cùng với nhiều thuật toán tuần tự
- Các thuật toán song song là các triển khai dựa trên các bài báo nghiên cứu liên quan đến HAC, correlation clustering, affinity clustering và parline
- Framework Graph Neural Network được cung cấp trong dự án riêng TF-GNN
- Cách chạy nhanh là sau khi cài Bazel, chạy
bazel run //examples:quickstart - Đây không phải là sản phẩm được Google hỗ trợ chính thức; câu hỏi và ý kiến được tiếp nhận bằng cách tạo issue trong kho lưu trữ này
1 bình luận
Các ý kiến trên Hacker News
Khai phá đồ thị từng thực sự là một trào lưu khoảng 10 năm trước. Nó khiến tôi nhớ đến GraphX (https://spark.apache.org/graphx/) và GraphLab (https://en.wikipedia.org/wiki/GraphLab), cùng các cơ sở dữ liệu đồ thị
Có lẽ nó trùng thời điểm với hiện tượng mạng xã hội, và gần đây hơn thì học hình học — tức machine learning trên đồ thị và các cấu trúc khác — đã được chú ý, rồi bị LLM lấy mất sự quan tâm. Dù vậy tôi vẫn cho rằng học hình học còn rất nhiều tiềm năng và mong nó trở nên phổ biến hơn
Những đồ thị như vậy thường có vô số kiểu cạnh khác nhau, chẳng hạn “kết hôn với” hay “có nhiệt độ trung bình năm”. Ngược lại, các thuật toán đồ thị như PageRank hay độ trung tâm của đồ thị thường chỉ có một hoặc rất ít kiểu cạnh. Vẫn có các thuật toán tổng quát có thể áp dụng cho đồ thị có nhiều kiểu cạnh; ví dụ, mẫu SPARQL
?s1 ?p ?o . ?s2 ?p ?o .tìm các?s1,?s2cùng chia sẻ một?onào đó và quan hệ?p, từ đó làm cơ sở cho một thước đo độ tương đồng giữa chúng. Đồ thị nói chung không có hình dạng cố định, có thể mang bất kỳ cấu trúc nào, và xét từ góc độ độ trễ bộ nhớ thì có thể là thảm họa. Trước đây tôi từng dùng mẫu SPARQL này và tạo ra một chương trình phải chạy 100 năm; sau đó tôi đóng gói lại cấu trúc dữ liệu và tìm phép xấp xỉ để tính xong trong vòng 20 phút. Vì vậy, những người làm thực tế thường hoài nghi với các thư viện xử lý đồ thị đa dụng. Lý do là có rất nhiều bài toán mà ta có thể viết mã chuyên dụng trong thời gian còn ngắn hơn thời gian vật lộn với hệ thống build, nhưng lại chạy nhanh hơn 1000 lầnDù vậy, nếu muốn chạy theo xu hướng, hiện nay arXiv tràn ngập các bài về mạng nơ-ron đồ thị mà ở nơi khác không bị thổi phồng quá mức. YOShInOn đã lập cho tôi một danh sách dài các bài GNN để xem, nhưng tôi mới chỉ lướt qua vài bài; có nhiều bài nói rằng có thể áp dụng cho bài toán phân tích văn bản tôi đang làm, nhưng chúng không có vẻ tốt hơn rõ rệt so với hệ thống mà YOShInOn và tôi đang dùng, nên tôi chưa vội
Nếu bạn muốn thử động đến đồ thị và machine learning, gần đây khi xem tài liệu ArangoDB tôi thấy họ có tích hợp nhiều thư viện đồ thị và framework machine learning https://docs.arangodb.com/3.11/data-science/adapters/
Tôi cũng thấy vài notebook Jupyter về machine learning trên đồ thị https://github.com/arangodb/interactive_tutorials#machine-learning
Các tích hợp gồm NetworkX -- https://networkx.org/, DeepGraphLibrary -- https://www.dgl.ai/, cuGraph (Rapids.ai Graph) -- https://docs.rapids.ai/api/cugraph/stable/, PyG (PyTorch Geometric) -- https://pytorch-geometric.readthedocs.io/en/latest/.
Nếu có ai quen với Bazel, có thể gợi ý cách build không?
bazel buildcó vẻ có làm gì đó, nhưng kết quả chỉ tạo rabazel-buildvàbazel-build, còn không thấy artifact build nào đáng chú ý//...tương tự targetallcủa makeCó thể dùng như
bazel build //...,bazel test //...,bazel query //.... Lệnh cuối, theo trí nhớ của tôi, sẽ liệt kê tất cả các targetbazel build //in_memory/connected_components:asynchronous_union_findTuy nhiên ngoài ngữ cảnh rule
cc_binarythì có thể không hữu ích lắm. Cách này cho phép không cần build toàn bộ repository, mà chỉ build và dùng các package cần thiết từ dự án khác. Ví dụ nếu chỉ muốn dùng headerasynchronous_union_find.h, hãy thêm thư viện graph-mining vào đâu đó trong fileWORKSPACEcủa dự án bằng rulegit_repository(tham khảo ví dụWORKSPACE.bazel), rồi thêm@graph-mining//in_memory/connected_components:asynchronous_union_findvào rulecc_librarytrong fileBUILDcủa dự án. Khi đó có thể include header ở nơi khác, và khi build dự án thì chỉ package đó cùng các dependency của nó được build, chứ không build toàn bộ thư viện graph-miningbazelvà đặt vào một đường dẫn như/usr/local/bin/bazelNhưng chạy
querythì xuất hiện cảnh báo JDK, chạybuildthì thất bại vì không có Java, kèmWARNING: Ignoring JAVA_HOME, because it must point to a JDK, not a JRE.. Tôi cũng đâu dùng Java, vậy mà phải tìm xem nên dùng JDK/JRE nào trong vài phút, rồi không tiếp tục nổi nữa, thế là “một ngày nào đó” của hôm nay lại dời sang ngày khác. Thật đáng buồn là tôi đã quá quen với cargo hay npm/yarnSửa: Nhờ https://sdkman.io/ mà chạy được. Cuối cùng thì cũng không tệ đến thế
Câu hỏi của người mới: có thể xem thư viện này là ứng viên để tích hợp với wrapper hoặc thư viện mở rộng nhằm gom các thuật toán phân cụm dựa trên đồ thị vào một chỗ không? Giả sử là hiện chưa làm như vậy
Hay đã có framework nào cung cấp cùng chức năng tốt hơn rồi? Kiểu như NetworkX chẳng hạn
Có thể tôi đã tụt hậu khá xa, nhưng cái này có liên quan đến Pregel không?
Nếu có ví dụ thì sẽ thật sự hữu ích
Có thể giải thích thư viện này hữu ích ở đâu không?
Trên GitHub ghi là C, C++, Starland. Starland là gì vậy?
Bazel là hệ thống build được dùng ở đây
Các thuật toán đồ thị rất cần một mức độ chuẩn hóa nào đó. Cứ nghĩ đến BLAS và LAPACK là được
Tôi đã kỳ vọng đúng theo nghĩa đen là một công cụ khai phá đồ thị thống kê để phát hiện bất thường
Lúc đầu khá thú vị và trông đơn giản hơn vẻ ngoài