錯誤代碼:E3000

類別:編譯時間:SparseCore 分配失敗

如果 XLA:SparseCore 編譯器無法在目前 SparseCore 程式所需的指定記憶體空間中,分配連續的記憶體區塊,就會發生這項錯誤。

錯誤訊息範例:

INTERNAL:Failed to run pass pipeline. Hlo-Op: result.1:279:1: error: 'memref.alloca' op current allocation offset upper bound (140704 words) exceeds the legitimate user allocatable offset upper bound (131071 words) in memory space 201 when allocating 23440 words. result.1:279:1: note: see current operation: %232 = "memref.alloca"() <{operandSegmentSizes = array<i32: 0, 0>}> : () -> memref<23440xf32, 201>

XLA 後端:TPU

總覽

SparseCore (SC) 是專為稀疏工作負載設計的處理器,這項技術依賴特定記憶體階層,有效管理資料移動。XLA 編譯器會嘗試根據硬體限制和使用者定義的形狀,靜態調整緩衝區大小並分配緩衝區。這個錯誤表示在分配階段發生記憶體不足 (OOM) 狀況。

錯誤訊息通常會指定記憶體空間 ID。以下是常見的記憶體空間及其整數編碼:

記憶體空間 ID 名稱 說明
0 Smem 本機純量記憶體。用於純量暫存器和控制流程。
201 TileSpmem 專屬的暫存記憶體。特定 SC 磁磚可用的快速本機 SRAM。
202 Spmem 共用暫存記憶體。用於暫存資料 (輸入、輸出、中介) 以隱藏 HBM 延遲。
203 HBM 高頻寬記憶體。用於嵌入資料表、堆積和堆疊的大型共用記憶體。
204 同步處理標記 用於協調的同步基本類型。

如要深入探索 SC 及其記憶體階層,請參閱 SparseCore 說明文件

偵錯

解決方式取決於哪個記憶體空間的分配作業失敗。

情境 1:HBM 分配失敗 (記憶體空間 ID:203)

如果 SparseCore 程式要求的單一暫時分配空間過大,無法容納在可用的 HBM 中,就會發生這個錯誤。在標準嵌入工作負載和 SC 卸載集合中,極大的單一核心分割區或不正確的分片規格,可能會迫使編譯器要求大量緩衝區。

建議採取的行動:

  • 檢查分片:確認嵌入資料表和 SC 輸入/輸出張量已正確分割/分片。如果單一核心負責的資料量過多,分配作業可能會失敗。
  • 調整限制:查看 max_ids_per_partitionmax_unique_ids_per_partition。如果這些值設定得過高,編譯器會保留超出需求的記憶體。請參閱「限制如何轉換為表格」。

情境 2:內部記憶體故障 (記憶體空間 ID:0、201、202、204)

SmemTileSpmemSpmemSync Flags 中的分配失敗通常是由於編譯器錯誤或分配策略的限制,編譯器無法考量所有記憶體需求。

建議採取的行動:

  1. 找出導致失敗的 XLA 作業:如要找出導致失敗的特定 SC HLO 或 Mosaic 核心,請產生中繼編譯器表示法:
    • 傾印 SparseCore MLIR:設定 --xla_sc_dump_mlir_to=/path/to/dump 旗標。這會產生 SparseCore 程式的 MLIR,方便您查看哪個分配大小與錯誤訊息相符。
    • 傾印 Mosaic LLO:如果是自訂核心,請使用 --xla_mosaic_dump_to=/path/to/dump 檢查 Mosaic 發出的所有低階最佳化工具 (LLO) 程式。
  2. 縮減暫存大小 (Pallas 使用者):如果失敗發生在 Mosaic 核心內,請檢查 scratch_shapes 設定。請確保pltpu.SMEM要求符合特定 TPU 世代的硬體規格。
  3. 停用集體卸載:如果錯誤是由 SC 卸載的集體作業所引起,請嘗試停用 SC 卸載功能:
    • --xla_tpu_enable_sparse_core_collective_offload_all_gather=false
    • --xla_tpu_enable_sparse_core_collective_offload_all_reduce=false
  4. 回報錯誤:如果上述步驟無法解決問題,可能是編譯器錯誤。請提交錯誤報告