静态Shape运行时约束文档

核心设计思想: 静态shape模块是GE运行时的高频执行路径,对性能要求极高。所有设计决策都必须以性能为核心考量,确保在保证正确性的前提下,最小化执行开销。

一、性能优化规则

  1. 执行流程性能约束

    • 新需求涉及DavinciModel::NnExecute流程要评估新增流程对执行性能的影响,不允许有性能劣化
    • 执行热路径中禁止分配内存、禁止增加非必要日志、禁止有获取时间戳操作
  2. 内存申请优化

    • 执行时应尽量避免动态申请内存,这可能导致随机性能劣化
    • 如果必须申请内存,应该使用预分配的内存池或栈上内存
  3. 同步异步执行一致性

    • 执行流程新增下发拷贝类的类型需和模型的同异步执行方式保持一致
    • 根据is_async_mode_的值做同步异步的判断
    • 异步H2D拷贝必须配合HOST_TO_DEVICE_EX选项,否则可能导致host内存提前销毁,引发问题

二、模块职责解耦规则

  1. TaskInfo职责边界

    • taskinfo仅负责本node(task)相关的下发任务处理,不感知其它node、model级处理
    • TaskInfo的职责限定在单个节点的任务构建和分发,不涉及模型级别的资源管理和状态维护
  2. 模块间解耦

    • ModelArgsManager负责模型参数的整体规划和分配
    • DavinciModel负责模型的生命周期管理和协调
    • TaskInfo负责具体任务的构建和执行
    • 各模块通过明确的接口交互,避免跨模块的直接访问

三、ArgsFormat统一处理规则

  1. ArgsFormat全场景覆盖
    • 涉及算子args的处理,无argsformat场景都要增加相关处理逻辑
    • 无args format的场景补充默认的公共处理流程,按照归一的args format处理(重构)
    • ArgsFormatInfo提供统一的args描述和处理能力

四、地址刷新策略规则

  1. 更新策略设计

    • 支持多种更新策略:kNoNeedUpdate, KUpdateHostInput, kUpdateModelIo, kUpdateFmAndModelIo, kInitOneTime
    • 根据内存地址变化情况自动选择最优更新策略
    • 支持算子化刷新(UpdateModelParam_static_bin)和传统H2D拷贝两种方式
    • 支持PCIE BAR拷贝优化(小数据量场景)
  2. 地址刷新性能优化

    • 对于频繁刷新的场景,优先使用算子化刷新方式
    • 通过UpdateModelParam_static_bin算子在Device侧批量刷新地址,减少H2D拷贝次数
    • 仅刷新变化的地址段,避免全量刷新
    • 维护last_bases_缓存,快进检测地址变化

五、内存管理规则

  1. 内存类型处理

    • 支持多种内存类型:HBM, TS, HostSVM
    • 使用GetRtsMemoryType获取正确的内存类型
    • TS内存根据大小自动选择最优的TS内存类型
  2. 内存对齐要求

    • 所有内存分配都要满足对齐要求(通常32字节或64字节对齐)
    • host_input_size需要32字节对齐
    • args table需要按对齐大小分配,确保访问效率
  3. 零拷贝场景处理

    • 对于可零拷贝的输入输出,使用零拷贝减少数据搬运
    • 不可零拷贝的场景,需要显式拷贝
    • 通过ATTR_IS_ZERO_COPY_BLOCK标识是否支持零拷贝

六、编译期约束规则

  1. 图编译阶段禁止改图

    • 图编译模块内存复用处理阶段禁止改图
    • 多种复用算法会多线程并发处理,改图会导致异常
  2. ArgsFormat验证

    • ArgsFormat需要在编译期生成,包含完整的tensor描述信息
    • 运行时严格按照ArgsFormat描述进行args组装
    • ArgsFormat的任何变化都需要经过充分验证

七、调试和可维护性规则

  1. 关键日志定位

    • 功能边界需要有关键日志用于定界问题
    • 调用adump接口等关键位置打日志
    • 日志内容简洁明了,包含必要的上下文信息
  2. DFX信息统计

    • 维护详细的执行阶段时间统计
    • 记录地址刷新的次数和耗时
    • 支持性能分析和问题定位

八、兼容性和稳定性规则

  1. 老版本兼容

    • 虚拟内存使用场景(rtReserveMemAddress),需要做兼容性设计
    • 老版本的DRV不支持该接口,要确保业务流程正常,无ERROR日志
  2. 流和资源管理

    • 资源释放时先流同步,再释放内存,最后再销毁device
    • 确保资源的正确生命周期管理

九、特殊场景处理

  1. 多流和流拆分

    • 物理流承载的task数量有限,需要按阈值拆分
    • 流拆分后需要更新流激活关系
  2. HCCL算子特殊处理

    • HCCL算子有特殊的连续内存要求
    • 纯静态图中,HCOM算子的虚拟地址和物理地址都不支持刷新(无featureBaseRefreshable)
    • HCCL算子物理地址不支持刷新

十、并发和安全规则

  1. 线程安全

    • 涉及资源处理时,需要考虑资源规格和限制
    • shared resource需要做好保护
    • ScalableAllocator不支持多线程并发(无锁设计),禁止被多线程调用
  2. 溢出检测和异常处理

    • 所有数值计算都要检查溢出
    • 使用AddOverflow, MulOverflow等安全函数
    • 防止整数溢出导致的安全问题