The Graph Mining Library - ไลบรารีสำหรับอัลกอริทึมและการวิเคราะห์กราฟ
(github.com/google)- เป้าหมายของทีม Google Graph Mining คือการสร้างไลบรารีที่ขยายขนาดได้สูงสำหรับอัลกอริทึมและการวิเคราะห์กราฟ และนำไปใช้กับผลิตภัณฑ์ของ Google โดยขอบเขตที่มีให้ในปัจจุบันคือชุดของ อัลกอริทึมการทำคลัสเตอร์
- เครื่องมือที่พัฒนาครอบคลุมการสร้าง similarity graph, การทำคลัสเตอร์, การจัดประเภทโหนด, node embedding, การฝึก graph neural network, การแสดงภาพกราฟ, การสุ่มตัวอย่างหลายรูปแบบ, การจัดอันดับความคล้ายคลึง
- ส่วนของการทำคลัสเตอร์ประกอบด้วย อัลกอริทึมขนานแบบ shared-memory ที่ขยายได้ถึงกราฟที่มีขอบนับหมื่นล้านรายการ และอัลกอริทึมแบบลำดับหลายแบบ
- อัลกอริทึมแบบขนานเป็นการนำไปใช้งานตามงานวิจัยที่เกี่ยวกับ HAC, correlation clustering, affinity clustering และ parline
- เฟรมเวิร์ก Graph Neural Network มีให้ในโปรเจ็กต์แยกต่างหาก TF-GNN
- การรันอย่างรวดเร็วทำได้โดยติดตั้ง Bazel แล้วรัน
bazel run //examples:quickstart - นี่ไม่ใช่ผลิตภัณฑ์ที่ Google สนับสนุนอย่างเป็นทางการ โดยคำถามและข้อคิดเห็นจะถูกรับผ่านการสร้าง issue ในรีโพซิทอรีนี้
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
Graph mining เคยเป็นกระแสแรงมากเมื่อราว 10 ปีก่อน ทำให้นึกถึง GraphX (https://spark.apache.org/graphx/) กับ GraphLab (https://en.wikipedia.org/wiki/GraphLab) และฐานข้อมูลกราฟ
คงเป็นช่วงที่ทับซ้อนกับปรากฏการณ์โซเชียลเน็ตเวิร์ก และในช่วงหลัง ๆ geometric learning ซึ่งเป็นแมชชีนเลิร์นนิงบนกราฟและโครงสร้างอื่น ๆ ก็เริ่มได้รับความสนใจ ก่อนจะถูก LLM แย่งพื้นที่พูดถึงไป ถึงอย่างนั้นก็ยังคิดว่า geometric learning มีศักยภาพสูง และอยากให้ได้รับความนิยมมากขึ้น
กราฟแบบนี้มักมี ประเภทของเส้นเชื่อม ที่แตกต่างกันจำนวนมหาศาล เช่น “แต่งงานกับ” หรือ “มีอุณหภูมิเฉลี่ยรายปี” ในทางกลับกัน อัลกอริทึมกราฟอย่าง PageRank หรือ graph centrality มักมีประเภทของเส้นเชื่อมเพียงหนึ่งประเภทหรือไม่กี่ประเภทเท่านั้น แม้จะมีอัลกอริทึมทั่วไปที่ใช้กับกราฟซึ่งมีเส้นเชื่อมหลายประเภทได้ เช่น แพตเทิร์น SPARQL
?s1 ?p ?o . ?s2 ?p ?o .จะหา?s1,?s2ที่แชร์?oและความสัมพันธ์?pบางอย่างร่วมกัน ซึ่งกลายเป็นพื้นฐานของตัวชี้วัดความคล้ายคลึงระหว่างทั้งสอง กราฟโดยทั่วไปไม่มีรูปแบบตายตัว จึงมีโครงสร้างได้ทุกแบบ และในแง่ memory latency อาจกลายเป็นหายนะได้ ครั้งหนึ่งเคยใช้แพตเทิร์น SPARQL นี้แล้วสร้างโปรแกรมที่ต้องใช้เวลา 100 ปี แต่หลังจากแพ็กโครงสร้างข้อมูลใหม่และหาวิธีประมาณค่า ก็ทำให้คำนวณเสร็จได้ภายใน 20 นาที ดังนั้นคนทำงานจริงจึงมักค่อนข้างกังขากับไลบรารีประมวลผลกราฟแบบเอนกประสงค์ เพราะมีปัญหาจำนวนมากที่สามารถเขียนโค้ดเฉพาะทางให้เร็วขึ้น 1000 เท่าได้ โดยใช้เวลาน้อยกว่าการไปปล้ำกับระบบ buildถึงอย่างนั้น ถ้าอยากตามกระแส ช่วงนี้ใน arXiv มีบทความเรื่อง graph neural network เต็มไปหมด ซึ่งไม่ได้ถูกโฆษณาเกินจริงมากนักในที่อื่น YOShInOn ทำลิสต์บทความ GNN ยาว ๆ ให้ดู แต่ผมดูผ่าน ๆ ไปแค่ไม่กี่บทความ และแม้จะมีหลายบทความบอกว่านำไปใช้กับปัญหาการวิเคราะห์ข้อความที่ผมทำอยู่ได้ แต่ก็ไม่ได้ดูดีกว่าระบบที่ YOShInOn กับผมใช้อยู่เป็นพิเศษ เลยยังไม่รีบร้อน
ถ้าใครอยากลองเล่นกับกราฟและแมชชีนเลิร์นนิง ช่วงหลังผมดูเอกสารของ ArangoDB แล้วเห็นว่ามีการรวมเข้ากับ ไลบรารีกราฟ หลายตัวและเฟรมเวิร์กแมชชีนเลิร์นนิงด้วย https://docs.arangodb.com/3.11/data-science/adapters/
ยังเห็น Jupyter Notebook หลายตัวที่ว่าด้วยแมชชีนเลิร์นนิงบนกราฟด้วย https://github.com/arangodb/interactive_tutorials#machine-learning
สิ่งที่รองรับการเชื่อมรวมมี 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/](https://pytorch-geometric.readthedocs.io/en/latest/
ถ้ามีใครคุ้นกับ Bazel ช่วยแนะ วิธี build หน่อยได้ไหม?
bazel buildดูเหมือนจะทำอะไรบางอย่าง แต่ผลลัพธ์มีแค่bazel-buildกับbazel-buildเกิดขึ้น และไม่เห็น artifact จากการ build ที่เด่นชัดเลย//...คล้ายกับ targetallของ makeใช้ได้แบบ
bazel build //...,bazel test //...,bazel query //...คำสั่งสุดท้ายถ้าจำไม่ผิดจะแสดง target ทั้งหมดbazel build //in_memory/connected_components:asynchronous_union_findแต่ถ้าอยู่นอกบริบทของกฎ
cc_binaryอาจไม่ได้มีประโยชน์มากนัก วิธีนี้ช่วยให้ไม่ต้อง build ทั้ง repository แต่ build เฉพาะแพ็กเกจที่ต้องใช้ในโปรเจกต์อื่นได้ ตัวอย่างเช่น ถ้าต้องการใช้แค่ headerasynchronous_union_find.hก็เพิ่มไลบรารี graph-mining ด้วยกฎgit_repositoryไว้สักที่ในไฟล์WORKSPACEของโปรเจกต์ (ดูตัวอย่างWORKSPACE.bazel) แล้วเพิ่ม@graph-mining//in_memory/connected_components:asynchronous_union_findในกฎcc_libraryที่อยู่ในไฟล์BUILDภายในโปรเจกต์ จากนั้นก็ include header จากที่อื่นได้ และตอน build โปรเจกต์จะ build เฉพาะแพ็กเกจนั้นกับ dependency ของมัน โดยไม่ build ไลบรารี graph-mining ทั้งหมดbazelและวางไว้ใน path อย่าง/usr/local/bin/bazelแต่พอรัน
queryก็เจอคำเตือนของ JDK และพอรันbuildก็ล้มเหลวเพราะไม่มี Java พร้อมข้อความWARNING: Ignoring JAVA_HOME, because it must point to a JDK, not a JRE.ทั้งที่ไม่ได้ใช้ Java เลย หลังค้นอยู่ไม่กี่นาทีว่าควรใช้ JDK/JRE ตัวไหน ก็ไปต่อไม่ไหวแล้ว “สักวัน” ของวันนี้เลยต้องเลื่อนไปวันอื่นอีกครั้ง รู้สึกน่าอายพอสมควรว่าถูก cargo หรือ npm/yarn ตามใจจนเคยตัวเกินไปแก้ไข: รันได้แล้วเพราะ https://sdkman.io/ สุดท้ายก็ไม่ได้แย่ขนาดนั้น
ขอถามแบบมือใหม่ ไลบรารีนี้พอจะถือเป็นตัวเลือกสำหรับรวมเข้ากับ wrapper หรือไลบรารีส่วนขยาย เพื่อรวบรวม อัลกอริทึม clustering ที่อิงกราฟ ไว้ในที่เดียวได้ไหม? สมมติว่ายังไม่ได้เป็นแบบนั้นอยู่แล้ว
หรือมี framework ที่ให้ฟังก์ชันแบบเดียวกันได้ดีกว่าอยู่แล้ว เช่น NetworkX อะไรทำนองนั้น
อาจเป็นผมเองที่ตามยุคไม่ทันมาก ๆ แต่สิ่งนี้เกี่ยวข้องกับ Pregel ไหม?
ถ้ามีตัวอย่างจะช่วยได้มากจริง ๆ
ช่วยอธิบายได้ไหมว่าไลบรารีนี้มีประโยชน์ตรงไหน?
บน GitHub ระบุว่าเป็น C, C++, Starland Starland คืออะไร?
Bazel คือระบบ build ที่ใช้ในที่นี้
อัลกอริทึมกราฟต้องการ มาตรฐาน ในระดับหนึ่งอย่างมาก ลองนึกถึง BLAS กับ LAPACK
คาดหวังว่าจะเป็นเครื่องมือที่ขุด mining กราฟเชิงสถิติจริง ๆ เพื่อทำ anomaly detection
ตอนแรก ๆ น่าสนใจและดูง่ายกว่าที่เห็น