存儲和操作n維數據的難題,谷歌用一個開源軟件庫解決了
計算機科學和機器學習 (ML) 的許多應用都需要處理跨坐標系的多維數據集,并且單個數據集可能也需要存儲 TB 或 PB 的數據。另一方面,使用此類數據集也具有挑戰性,因為用戶可能會以不規則的間隔和不同的規模讀取和寫入數據,通常還會執行大量的并行工作。
為了解決上述問題,谷歌開發了一個開源的 C++ 和 Python 軟件庫 TensorStore,專為存儲和操作 n 維數據而設計。谷歌 AI 負責人 Jeff Dean 也在推特上發文表示 TensorStore 現已正式開源。
TensorStore 的主要功能包括:
- 提供統一的 API 用于讀寫多種數組格式,包括 zarr 和 N5;
- 原生支持多種存儲系統,包括谷歌云存儲、本地和網絡文件系統、HTTP 服務器和內存存儲;
- 支持讀 / 寫緩存和事務,具有很強的原子性、隔離性、一致性和持久性(ACID)特性;
- 支持從多個進程和機器進行安全、高效的并發訪問;
- 提供異步 API 以實現對高延遲遠程存儲的高吞吐量訪問;
- 提供高級、完全可組合的索引操作和虛擬視圖。
TensorStore 已被用于解決科學計算中的工程挑戰,還被用于創建大型機器學習模型,例如用來管理 PaLM 在分布式訓練期間的模型參數(檢查點)。
GitHub 地址:https://github.com/google/tensorstore
用于數據訪問和操作的 API
TensorStore 提供了一個簡單的 Python API 用于加載和操作大型數組數據。例如,下面的代碼創建了一個 TensorStore 對象,該對象代表一個 56 萬億體素的蒼蠅大腦 3D 圖像,并允許訪問 NumPy 數組中 100x100 的圖像 patch 數據:
值得注意的是,該程序在訪問特定的 100x100 patch 之前,不會訪問內存中的實際數據,因此可以加載和操作任意大的基礎數據集,而無需將整個數據集存儲在內存中。TensorStore 使用與標準 NumPy 基本相同的索引和操作語法。
此外,TensorStore 還為高級索引功能提供廣泛支持,包括對齊、虛擬視圖等。
下面的代碼演示了如何使用 TensorStore 創建一個 zarr 數組,以及 TensorStore 的異步 API 如何實現更高的吞吐量:
安全和性能擴展
眾所周知,分析和處理大型數據集需要大量的計算資源,通常需要分布在多個機器上的 CPU 或加速器內核的并行化來實現。因此,TensorStore 的一個基本目標是實現并行處理,達到既安全又高性能的目的。事實上,在谷歌數據中心內的測試中,他們發現隨著 CPU 數量的增加,TensorStore 讀寫性能幾乎呈線性增長:
在谷歌云存儲 (GCS) 上對 zarr 格式數據集的讀寫性能,讀和寫性能與計算任務的數量幾乎成線性增長。
TensorStore 還提供了可配置的內存緩存和異步 API,以允許讀寫操作在程序完成其他工作時在后臺繼續執行。為了使 TensorStore 的分布式計算與數據處理工作流兼容,谷歌還將 TensorStore 與 Apache Beam 等并行計算庫集成。
示例展示
示例 1 語言模型:最近一段時間,機器學習領域出現了一些 PaLM 等高級語言模型。這些模型包含數千億個參數,在自然語言理解和生成方面表現出驚人的能力。不過這些模型對計算設施提出了挑戰,特別是,訓練一個像 PaLM 這樣的語言模型需要數千個 TPU 并行工作。
其中有效地讀取和寫入模型參數是訓練過程面臨的一個問題:例如訓練分布在不同的機器上,但參數又必須定時的保存到 checkpoint 中;又比如單個訓練必須僅讀取特定參數集,以避免加載整個模型參數集(可能是數百 GB)所需的開銷。
TensorStore 可以解決上述問題。它已被用于管理大型(multipod)模型相關的 checkpoint,并已與 T5X 和 Pathways 等框架集成。TensorStore 將 Checkpoint 轉換為 zarr 格式存儲,并選擇塊結構以允許每個 TPU 的分區并行獨立地讀取和寫入。
當保存 checkpoint 時,參數以 zarr 格式寫入,塊網格進一步被劃分,以用于在 TPU 上劃分參數網格。主機為分配給該主機的 TPU 的每個分區并行寫入 zarr 塊。使用 TensorStore 的異步 API,即使數據仍被寫入持久存儲,訓練也會繼續進行。當從 checkpoint 恢復時,每個主機只讀取分配給該主機的分區塊。
示例 2 大腦 3D 映射:突觸分辨連接組學的目標是在單個突觸連接水平上繪制動物和人腦的連線。完成這一目標需要在毫米或更大的視野范圍內以極高的分辨率 (納米級) 對大腦進行成像,由此產生的數據大小達到 PB 級。然而,即使是現在,數據集也面臨著存儲、處理等方面的問題,即使是單個大腦樣本也可能需要數百萬 GB 的空間。
谷歌已經使用 TensorStore 來解決與大規模連接組學數據集相關的計算挑戰。具體而言,TensorStore 已經開始管理一些連接組學數據集,并將谷歌云存儲作為底層對象存儲系統。
目前,TensorStore 已被用于人類大腦皮層數據集 H01,原始成像數據為 1.4 PB(約為 500000 * 350000 * 5000 像素)。之后原始數據被細分為 128x128x16 像素的獨立塊,以「Neuroglancer precomputed」格式存儲,TensorStore 可以很容易的對其進行操作。
利用 TensorStore 可以輕松訪問和操作底層數據(蒼蠅大腦重建)
想要上手一試的小伙伴,可以使用以下方法安裝 TensorStore PyPI 包:
pip install tensorstore