SDE / AI方向 · Phone Screen / AI Enabling Code

Amazon AI Coding:模型图内存大小,先定义算的是哪一种

从张量形状和dtype字节数计算逻辑容量,说明共享对象去重、标量/零维与峰值运行内存的差别,并核验AI生成代码。

题目重点:从张量形状和dtype字节数计算逻辑容量,说明共享对象去重、标量/零维与峰值运行内存的差别,并核验AI生成代码。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练合同计算列出的不同张量存储对象的逻辑字节总量,不含allocator对齐、workspace、梯度、优化器状态与运行峰值。
  • 每record给id、shape、element_bytes;相同id代表共享存储,重复定义必须一致。shape为空表示标量,维度零表示零元素。
  • shape非负整数、element_bytes正整数;未知或符号维度应拒绝或返回表达式,不用猜测值。

解题路线

  1. 在prompt之前澄清memory口径和图输入:是参数、激活全量、还是推理/训练峰值?连接边并不自己占tensor容量,同一张量被多个operator引用也不应自动重复计。
  2. 每个张量元素数为shape各维乘积,乘element_bytes。注意dtype若给bits须除8且处理packing;训练输入直接给字节,避免把32-bit当32-byte。Python整数避免乘法溢出,其他语言要checked multiplication。
  3. 按storage identity去重,遇同id不同shape/width报冲突。若有view共享底层storage,不能只按tensor id计算,需storage id与偏移/范围合同;本文不把view去重冒充已支持。
  4. AI辅助给最小schema、边界与不变式,让生成代码附样例,再独立检查空shape、零维、共享id、未知dtype、溢出与cycle。模型图有环不应造成无终止DFS,但这个flat tensor清单实现不依赖遍历。
  5. 若追问peak,先给执行计划、张量live interval、释放/复用和算子workspace,再做生命周期模拟;训练还要加参数梯度与优化器状态。总张量逻辑字节既不是保证的峰值,也不是物理allocator精确用量。

手动走一遍

训练例A shape[2,3]、2字节元素=12字节,B标量shape[]、4字节=4,A被两个节点引用仍只计一次,共16。shape[0,100]贡献0。若A/B可不同时存活,运行峰值不应无条件等于16;workspace又可能让峰值更大。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

from math import prod


def logical_tensor_bytes(tensors):
    """Each record contains id, shape and element_bytes; repeated ids share storage."""
    definitions = {}
    for tensor in tensors:
        identity = tensor["id"]
        shape = tuple(tensor["shape"])
        width = tensor["element_bytes"]
        if any(not isinstance(d, int) or d < 0 for d in shape):
            raise ValueError("nonnegative integer dimensions required")
        if not isinstance(width, int) or width <= 0:
            raise ValueError("positive integer element width required")
        definition = (shape, width)
        if identity in definitions and definitions[identity] != definition:
            raise ValueError("conflicting shared tensor definitions")
        definitions[identity] = definition
    return sum(prod(shape) * width for shape, width in definitions.values())

复杂度

t个records、总r个维度,O(t+r)时间和O(t+r)去重定义空间;示例不解析任意图格式。1,364组形状/元素宽度用独立笛卡尔索引枚举验证元素数,包含标量、零维与重复id。

易错点与追问

容易失分的边界

  • bits与bytes混淆。
  • 空shape用0元素而非1标量。
  • 重复共享tensor每条边算一次。
  • 逻辑总容量当作运行峰值。
  • 照收AI代码,没有核对单位与失败格式。

继续深挖

  • 未知batch维度返回符号表达式还是拒绝?
  • 量化4-bit packed数据如何处理奇数元素?
  • view与slice共享storage如何计字节?
  • 如何依据执行计划算activation峰值?
✓已复制微信号!