• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 數據科學

    面向 NetworkX 用戶的加速生產就緒型圖形分析

    NetworkX 是一款熱門且易于使用的 Python 圖形分析庫。然而,其性能和可擴展性可能無法滿足中型到大型網絡的需求,這可能會嚴重影響用戶的工作效率。

    NVIDIA 和 ArangoDB 已經通過一項無需更改 NetworkX 代碼的解決方案共同解決了這些性能和擴展問題,該解決方案集成了三個主要組件:

    • NetworkX API
    • 使用的圖形加速 RAPIDS cuGraph
    • ArangoDB 中的大規模生產就緒型分析

    在本文中,我將討論如何讓 NetworkX 用戶的生活更輕松,向您展示一個實現示例,并解釋如何開始搶先體驗。

    借助 NetworkX 輕松進行圖形分析

    NetworkX 廣泛用于數據科學家、學生和許多其他人員的圖形分析。它是開源的、 WELL-DOCUMENTED 并通過簡單的 API 支持大量算法。

    也就是說,其一個已知的限制是它在中大型圖形方面的性能,這嚴重地影響了它在生產應用中的實用性。

    使用 cuGraph 加速圖形分析

    RAPIDS cuGraph 圖形分析加速庫彌合了 NetworkX 與基于 GPU 的圖形分析之間的差距:

    • 圖形創建和操作:使用 NetworkX 創建和操作圖形,將數據無縫傳遞至 cuGraph,以加速處理大型圖形。
    • 快速圖形算法:利用 NVIDIA GPUs 的強大功能進行實時分析。
    • 數據互操作性:支持 NetworkX 圖形對象和其他格式的數據,實現機器學習、ETL 任務和圖形分析之間的簡單數據交換。

    最棒的地方是,您無需更改代碼即可享受 NVIDIA GPU 加速的優勢。只需安裝 nx-cugraph 庫并指定 cuGraph 后端。有關安裝和性能基準測試的更多信息,請參閱在 NVIDIA GPU 上加速 NetworkX 以實現高性能圖形分析

    簡而言之,對于大小介于 10 到 1000 之間的 k,GPUs 可將單次 betweenness centrality 運行速度提高 11 到 600 倍。

    使用 ArangoDB 進行生產就緒型圖形分析

    NetworkX 用戶通常必須采用一套復雜的方法來持久化圖形數據:

    • 手動將數據導出到平面文件
    • 關系型數據庫
    • 臨時解決方案,例如使用內存存儲

    每種方法都有一系列獨特的挑戰,迫使您花費時間和精力來管理和操作圖形數據,而不是專注于分析和數據科學任務。

    ArangoDB 的數據持久性層可讓一個或多個用戶更輕松地在任何無法容納內存的大型網絡上執行圖形操作。通過將 ArangoDB 集成為持久性數據層,您將看到以下幾個潛在優點:

    • 可擴展性:圖形數據可以跨多個節點橫向擴展,而不僅僅是縱向擴展,從而處理大量數據集。
    • 性能:用于實時分析和操縱圖形數據的快速讀寫操作。
    • 靈活性:在一個完全集成的平臺上支持所有熱門數據模型:圖形、文檔、全文本搜索、鍵/值和地理空間模型;還支持多租戶。

    圖 1 展示了如何將 ArangoDB 集成到 NetworkX 用戶的工作流程中,從而改變圖形數據的存儲和訪問方式。通過提供這種新的持久性層,ArangoDB 使數據科學家能夠專注于他們擅長的工作,而不是數據操作和其他細節。

    Workflow diagram shows starting with a query into NetworkX that has been loaded with data using Python DataFrames and persisting data in ArangoDB.
    圖 1. ArangoDB 作為 NetworkX 持久性層

    數據持久性使用戶能夠利用其他團隊成員完成的工作。數據不必從源加載并編譯為每個用戶的圖形,而是可以從數據庫加載圖形。

    圖形算法的結果也可以存儲和檢索,而不是由每個用戶再次運行。最終,這節省了用戶的時間和資金。

    借助 cuGraph 和 ArangoDB 實現 GPU 加速分析

    在 NetworkX 中,分析大型數據集需要很長時間。這就是 ArangoDB 使用 RAPIDS cuGraph 分析圖形數據的原因,尤其是在數據增長到足以導致性能降低時。

    Workflow diagram shows starting with a query into NetworkX that has been loaded with data using Python DataFrames; using cuGraph in memory on a GPU for algorithms and processing; and persisting data in ArangoDB.
    圖 2. 使用 ArangoDB、NetworkX 和 cuGraph 分析大規模圖形。

    通過 NetworkX 接口使用 GPU 擴展 ArangoDB 有幾個好處。首先,與使用 CPU 相比,使用 GPU 從 ArangoDB 提取數據的速度要快得多。這是因為 ArangoDB 優化了其數據提取工具,以獨特地滿足 cuGraph 數據結構的需求,即坐標列表(COO)圖形格式。

    其次,您可以通過筆記本電腦或其他客戶端分析大型圖形數據。NetworkX充當客戶端API庫,用于處理圖形算法,這些算法所需的內存超過客戶端所能提供的內存。

    最后,無需更改代碼。cuGraph 支持 NetworkX 用戶零代碼更改,因此您可以使用自己熟悉的工具。

    實施示例

    得益于 NetworkX 后端到后端接口的功能,只要機器上有可用的 NVIDIA GPU,nx-arangodb 圖形即可使用 nx-cugraph 的 GPU 功能。換言之,當使用 nx-arangodb 時,仍可選擇通過 NetworkX 運行 CPU 或 GPU 算法。

    以下各節展示了如何使用 NetworkX 和 nx-arangodb 庫在 ArangoDB 中創建和持久化圖形:

    • 下載數據
    • 創建 NetworkX 圖形
    • 在不使用 ArangoDB 的情況下運行 cuGraph 算法
    • 將 NetworkX 圖形保留為 ArangoDB
    • 實例化 NetworkX-ArangoDB 圖形
    • 使用 ArangoDB 運行 cuGraph 算法

    測試環境

    在本文中,我使用了具有 13 GB 系統 RAM 的 Intel Xeon CPU,并將其與具有 84 GB 系統 RAM 和 40 GB GPU RAM 的 NVIDIA A100 GPU 進行了比較。我使用的是 CUDA 12.2。

    Stanford Network Analysis Platform (SNAP) 引用專利數據集是一張在 1975 年至 1999 年期間授予的專利引文圖,總計包含 370 萬個節點和 1650 萬個邊緣。代碼示例依賴于 Betweenness Centrality 圖形算法,可幫助您找到哪些專利比其他專利更重要,并了解它們的相對重要性。

    在本文中,我使用了通過 ArangoGraph 托管服務提供的 ArangoDB 實例,該實例使我能夠為未來會話保留任何已創建的圖形。它作為企業版 3.11.8,以六個節點(每個節點 32 GB 內存)的分片數據庫運行。

    下載數據

    首先,下載 Citation Patents 數據集,并將其寫入文本文件。

    # Median Time: 10 seconds 
     
    import gzip
    import shutil
    import requests
     
    name = 'cit-Patents.txt'
     
    # Download gz
    response = requests.get(url, stream=True)
    response.raise_for_status()
     
    # Stream gz data & write to text file
    with response.raw as r, gzip.open(r, 'rb') as f_in, open(name, 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)

    創建 NetworkX 圖形

    接下來,使用 pandas 邊緣列表對 NetworkX 圖形進行實例化。

    # Median Time: 90 seconds
     
    import pandas as pd
    import networkx as nx
     
    # Read into Pandas
    pandas_edgelist = pd.read_csv(
        "cit-Patents.txt",
        skiprows=4,
        delimiter="\t",
        names=["src", "dst"],
        dtype={"src": "int32", "dst": "int32"},
    )
     
    # Create NetworkX Graph from Edgelist
    G_nx = nx.from_pandas_edgelist(
        pandas_edgelist, source="src", target="dst", create_using=nx.DiGraph
    )

    在不使用 ArangoDB 的情況下運行 cuGraph 算法

    可以通過將 backend 設置為 cugraph 來調用 NetworkX 算法。這使用 nx-cugraph 的 GPU 加速算法實現,無需更改代碼。

    # Median Time: 5 seconds
     
    result = nx.betweenness_centrality(G_nx, k=10, backend="cugraph")

    或者,設置 NETWORKX_AUTOMATIC_BACKENDS 環境變量,將 cugraph 指定為選定的 NetworkX 后端,而不是指定 backend 參數。

    將 NetworkX 圖形保留為 ArangoDB

    此時,您可以選擇將本地 NetworkX 圖形保留到 ArangoDB 中。假設您有一個在提供的 DATABASE_HOST 上運行的 ArangoDB 實例,您可以通過實例化一個 NetworkX 對象,并使用參數 along with 一個特定名稱來加載圖形。

    # Median Time: 3 Minutes
     
    import os
    import nx_arangodb as nxadb
     
    os.environ["DATABASE_HOST"] = "https://123.arangodb.cloud:8529"
    os.environ["DATABASE_USERNAME"] = "root"
    os.environ["DATABASE_PASSWORD"] = "password"
    os.environ["DATABASE_NAME"] = "myDB"
     
    # Load the DiGraph into ArangoDB
    G_nxadb = nxadb.DiGraph(
        name="cit_patents",
        incoming_graph_data=G_nx,
        write_batch_size=50000
    )

    現在,假設已創建新的 Python 會話。你可以自行決定是在同一臺機器還是在其他機器上創建新會話。當你與團隊成員合作進行協作開發時,這可能會很有用。

    實例化 NetworkX-ArangoDB 圖形

    通過使用環境變量指定連接憑據并重新實例化 nxadb.DiGraph,可以重新連接到持久圖形。提供可選的 read_batch_sizeread_parallelism 參數,以優化數據讀取。

    圖形實例化不會將圖形拉入內存,而是建立與持久圖形的遠程連接。

    # Median Time: 0 seconds
     
    import nx_arangodb as nxadb
     
    os.environ["DATABASE_HOST"] = "https://123.arangodb.cloud:8529"
    os.environ["DATABASE_USERNAME"] = "root"
    os.environ["DATABASE_PASSWORD"] = "password"
    os.environ["DATABASE_NAME"] = "myDB"
     
    # Connect to the persisted Graph in ArangoDB
    # This doesn't pull the graph; You're just establishing a remote connection.
    G_nxadb }}{{= nxadb.DiGraph(
         name="cit_patents",
               read_parallelism=15,
               read_batch_size=3000000
    )

    使用 ArangoDB 運行 cuGraph 算法

    通過使用 GPU,您可以依靠相同的算法來獲取 ArangoDB 圖形的 GPU 表示,其內存占用明顯小于 CPU 表示。在提取 ArangoDB 圖形后,它被緩存為 NetworkX-cuGraph 圖形,這使您能夠運行更多算法,而無需再次拉取算法,除非用戶明確要求這樣做。

    # Option 1: Explicit Graph Creation
     
    from nx_arangodb.convert import nxadb_to_nxcg
     
    # Pull the graph from ArangoDB and cache it
    # Median Time: 30 seconds
    G_nxcg = nxadb_to_nxcg(G_nxadb)
     
    # Median Time: 5 seconds
    result = nx.betweenness_centrality(G_nxcg, k=10)
    # Option 2 (recommended): On-demand Graph Creation
    # This pulls the graph from ArangoDB on the first algorithm call & caches it 
     
    # Median Time: 35 seconds
    result = nx.betweenness_centrality(G_nxadb, k=10)


    ArangoDB 中的數據持久性

    鑒于在 ArangoDB 中保留 NetworkX 圖形的新功能,與不涉及數據庫相比,您可以將加載新會話的速度提高 3 倍。

    說明 步驟 時間 (秒)
    ArangoDB 中不保留數據 0-2 小時 105
    ArangoDB 中的數據持久性 5 35
    加速 ? 3 倍
    表 1. 使用和不使用 ArangoDB 的工作流比較。

    在數據上運行多個會話或要求多人在沒有ArangoDB的情況下分析相同的數據將給從頭開始帶來不便。擁有持久性層有助于此工作流程。這使得cuGraph和ArangoDB的組合成為在NetworkX中處理大型圖形的關鍵策略。

    將 CRUD 功能與 NetworkX-ArangoDB 結合使用

    如果您選擇將 NetworkX-ArangoDB 用于 CRUD 功能,則可以使用更多的功能。NetworkX-ArangoDB 十分重視零代碼更改,這意味著 NetworkX-ArangoDB 圖的 CRUD 接口與 NetworkX 圖形相同。

    堅持使用 ArangoDB 還可以利用 ArangoDB 的多模型查詢語言,Arango 查詢語言(AQL)。這是一種統一查詢語言,可在一個平臺上執行圖形遍歷、全文搜索、文檔檢索和鍵值查找。

    import nx_arangodb as nxadb
     
    G_nxadb = nxadb.DiGraph(name="cit_patents") # Connect to ArangoDB
     
    assert G_nxadb.number_of_nodes() == G_nx.number_of_nodes()
    assert G_nxadb.number_of_edges() == G_nx.number_of_edges()
    assert len(G_nxadb[5526234]) == len(G_nx[5526234])
     
    G_nxadb.nodes[1]["foo"] = "bar"
    del G_nxadb.nodes[1]["foo"]
     
    G_nxadb[5526234][4872081]["object"] = {"foo": "bar"}
    G_nxadb[5526234][4872081]["object"]["foo"] = "bar!"
    del G_nxadb[5526234][4872081]["object"]
     
    G_nxadb.add_edge("A", "B", bar="foo")
    G_nxadb["A"]["B"]["bar"] = "foo!"
    del G_nxadb.nodes["A"]
    del G_nxadb.nodes["B"]

    結束語

    將 NetworkX Graph API 與 ArangoDB 中的持久性以及 cuGraph 的快速處理相結合,為您提供了一個生產級工作臺,用于構建模型和流程。ArangoDB 與 NVIDIA 之間的這種技術集成代表著圖形數據庫分析的重大演進。

    通過在 ArangoDB 中保留持久圖形數據,您會發現可以避免手動導出數據或使用內存存儲時常見的復雜性和低效性。準確地說,內存存儲在某些情況下速度雖然很快,但對于大型圖形來說并不理想,因為內存限制,并且在系統崩潰和其他計劃外停機期間數據丟失的風險很高。

    對于 NetworkX 用戶,ArangoDB 提供了一個理想且易于實施的透明持久性層,改變了圖形數據的存儲和訪問方式。現在,您無需離開熟悉的 NetworkX,即可運行大規模圖形分析。現有的 ArangoDB 客戶還將看到高級圖形分析和由 cuGraph 支持的 NetworkX 加速性能的優勢。

    如需詳細了解此強大集成的全部潛力并搶先體驗,請參閱 Introducing the ArangoDB NetworkX Persistence 層簡介。

    ?

    0

    標簽

    人人超碰97caoporen国产