错误代码:E3001

类别:CompileTime:SparseCore 无可行的逻辑副本数量

如果 XLA:SparseCore 编译器无法确定有效的逻辑副本数配置,导致工作负载无法放入 SparseCore 的本地暂存内存 (Tilespmem) 中,则会发生此错误。

示例错误消息

XLA:TPU compile permanent error. Compilation failure: No viable logical replica count for the embedding table with metadata: max_nz_per_row = 141352, max_unique_nz_per_row = 8, feature_width = 8, sample_count = 204800 (last tried split factor for vector splitting = 1, last tried split factor for sample dimension splitting = 1, fixed_size_allocation_bytes = 410880, row_dependent_size_allocation_bytes = 1696224, total_spmem_size_bytes = 524288) ...

XLA 后端:TPU

概览

此错误专门针对 SparseCore 用例,尤其是大型嵌入模型 (LEM)。

逻辑副本数是一个内部编译器参数,用于确定如何对输入批次进行分区,以管理暂存区分配压力。编译器会尝试将工作负载拆分为更小的块(副本),以便每个块所需的中间缓冲区都能放入 SparseCore 有限的暂存存储器中。一般来说,较高的逻辑副本数可通过一次处理较小的数据批次来降低分配压力。

此错误表明,即使尝试了各种拆分配置,编译器也无法找到一种设置,使所需的缓冲区能够放入 Tilespmem 内存中。分配大小由以下因素共同决定:

  • sample_count:分配给每个 SparseCore 的嵌入查找 ID 的数量(派生自批次大小)。
  • feature_width:嵌入维度的规模。
  • max_nz_per_row:所有 SparseCore 中非唯一嵌入查找 ID 的数量上限。
  • max_unique_nz_per_row:唯一嵌入查找 ID 的数量上限。

调试

如需解决此错误,您需要减少 SparseCore 工作区上的内存压力。

1. 改进元数据估计

编译器会根据 max_nz_per_rowmax_unique_nz_per_row 分配内存。如果这些值估计得过于保守(即设置得远高于实际数据所需的值),编译器将预留不必要的空间,从而导致此错误。确保这些参数能准确反映数据集的实际 ID 分布。

您可以考虑应用反馈导向优化 (FDO) 来确定这些参数的最佳值。

2. 减小批次大小

sample_count 直接从全局批次大小派生而来。减小批次大小会减少每个 SparseCore 在每个步骤中必须处理的数据量,从而减小所需的暂存缓冲区的大小。