跳转至

张量与缓冲区

模型的张量描述了数据是什么;TFBuffer 是读写实际数据的接口。二者必须匹配。

元素类型与读写

模型元素类型 Kotlin 写入 Kotlin 读取
FLOAT writeFloat(FloatArray) readFloat(): FloatArray
INT writeInt(IntArray) readInt(): IntArray
INT8 writeInt8(ByteArray) readInt8(): ByteArray
BOOLEAN writeBoolean(BooleanArray) readBoolean(): BooleanArray
INT64 writeLong(LongArray) readLong(): LongArray

LiteRTElementType 还包含其他可描述的类型,但 TFBuffer 没有为所有枚举值提供专门的读写方法。平台对模型数据类型的支持也可能不同;不要仅凭枚举成员判断推理可用。

对于多个输入输出,按模型定义的顺序使用从对应签名获取的缓冲区。写入长度和元素类型必须匹配模型;对于量化模型,还要依据模型的量化参数处理数据。

形状与布局

LiteRTTensorType.elementType 描述元素类型,layout 可能为 null。LiteRTLayout.dimensions 是各维长度;rank 是维度数。strides 为空时表示没有显式步长;非空时长度必须与维度数一致。

LiteRTLayout.calculateDefaultStrides(listOf(1, 2, 3)) 返回按行主序计算的元素步长 [6, 3, 1]。它不是自动乘以元素字节数的字节偏移。

缓冲区需求

通过输入或输出名称查询 LiteRTBufferRequirements:

  • supportedTypes:运行时报告的缓冲区类型,例如主机内存或 GPU 缓冲区类型。
  • bufferSize:所需大小,单位为字节。
  • strides:运行时或平台实现返回的步长。

步长单位

公共类型的注释将 requirements 步长描述为字节,而部分实现会回填上述按元素计算的默认步长。跨平台字节偏移的语义尚需进一步核实;不要未经验证直接把它用于手动计算字节地址。

读取时机

先写入输入,再运行模型,最后读取输出。Web 实现的输入张量在 write*() 时创建,输出在 run() 后填充;提前读取尚未初始化的缓冲区会报错。