开发者
下载
[object Object]

[object Object][object Object]undefined
[object Object]
  • 接口功能:对序列执行因果一维卷积,沿序列维度使用缓存数据(长度为卷积核宽减1)对各序列头部进行padding,确保输出依赖当前及历史输入;卷积完成后,将当前序列部分数据更新到缓存;在因果一维卷积输出的基础上,将原始输入加到输出上以实现残差连接。支持APC(Automatic Prefix Caching)、MTP(投机解码)、残差连接、原地更新等特性。相较于标准causal_conv1d算子,本算子新增APC缓存复用、PD混部、残差连接可选等功能。[object Object]

  • 支持以下场景:

    • 场景一(prefill场景):

      [object Object]

      其中cu_seq_len为batch内所有变长序列拼接后的总长度。

    • 场景二(prefill和decode混合场景):

      [object Object]

      其中cu_seq_len为batch内所有变长序列拼接后的总长度。

    • 场景三(decode场景 - 变长序列):

      [object Object]

      其中state_len必须大于所有batch中最大的token个数加1。

    • 场景四(decode场景 - 固定batch):

      [object Object]
  • 计算公式:

    K是卷积核宽度(固定为3),L是原始序列长度,dim是特征维度。

    1. 缓存读取

      缓存行索引:

      readCacheLine={cacheIndices[batchId,  initialStateIdx[batchId]],APC模式cacheIndices[batchId],非APC且cacheIndices存在batchId,其他readCacheLine = \begin{cases} cacheIndices[batchId, \; initialStateIdx[batchId]], & \text{APC模式} \\ cacheIndices[batchId], & \text{非APC且cacheIndices存在} \\ batchId, & \text{其他} \end{cases}

      Case 1:首次计算(numComputedTokens[batchId] == 0)

      cachedState[i,dim]=0,0i<K1cachedState[i, dim] = 0, \quad 0 \leq i < K-1 offset=0offset = 0

      Case 2:投机解码模式(numAcceptedTokens存在)

      offset=numAcceptedTokens[batchId]1offset = numAcceptedTokens[batchId] - 1 cachedState[i,dim]=convStates[readCacheLine][i,dim],0i<offset+K1cachedState[i, dim] = convStates[readCacheLine][i, dim], \quad 0 \leq i < offset + K - 1

      Case 3:默认模式

      offset=C(K1)offset = C - (K - 1) cachedState[i,dim]=convStates[readCacheLine][i,dim],0i<offset+K1cachedState[i, dim] = convStates[readCacheLine][i, dim], \quad 0 \leq i < offset + K - 1
    2. 缓存拼接

      paddedInput[i,dim]={cachedState[i,dim],0i<offset+K1x[i(offset+K1),dim],offset+K1i<offset+K1+LpaddedInput[i, dim] = \begin{cases} cachedState[i, dim], & 0 \leq i < offset + K - 1 \\ x[i - (offset + K - 1), dim], & offset + K - 1 \leq i < offset + K - 1 + L \end{cases}
    3. 缓存更新

      Len=offset+K1+LLen = offset + K - 1 + L M=min(C,  Len)M = \min(C, \; Len) writeCacheLine={cacheIndices[batchId,  idxLast],APC模式cacheIndices[batchId],非APC且cacheIndices存在batchId,其他writeCacheLine = \begin{cases} cacheIndices[batchId, \; idxLast], & \text{APC模式} \\ cacheIndices[batchId], & \text{非APC且cacheIndices存在} \\ batchId, & \text{其他} \end{cases} convStates[writeCacheLine][CM+i,dim]=paddedInput[LenM+i,dim],i=0,1,,M1convStates[writeCacheLine][C - M + i, dim] = paddedInput[Len - M + i, dim], \quad i = 0, 1, \dots, M-1
    4. Offset裁剪

      x[i,dim]=paddedInput[i+offset,dim],0i<K1+Lx'[i, dim] = paddedInput[i + offset, dim], \quad 0 \leq i < K - 1 + L
    5. APC缓存填充(可选,APC模式下)

      seqCompletedOffsetToken=numComputedTokens[batchId]modBseqCompletedOffsetToken = numComputedTokens[batchId] \mod B seqCompletedOffset=BseqCompletedOffsetTokenseqCompletedOffset = B - seqCompletedOffsetToken seqEndOffset=(LseqCompletedOffset)modBseqEndOffset = (L - seqCompletedOffset) \mod B lastFullBlockTokenIndex={LseqEndOffsetB,seqEndOffset=0LseqEndOffset,otherwiselastFullBlockTokenIndex = \begin{cases} L - seqEndOffset - B, & seqEndOffset = 0 \\ L - seqEndOffset, & \text{otherwise} \end{cases} nBlockToFill=idxLastidxFirstnBlockToFill = idxLast - idxFirst

      对每个chunk = 0, 1, ..., nBlockToFill - 1:

      boundaryIdx=lastFullBlockTokenIndex(nBlockToFillchunk1)×BboundaryIdx = lastFullBlockTokenIndex - (nBlockToFill - chunk - 1) \times B convStates[cacheIndices[batchId,  idxFirst+chunk]][C(K1)+j,  dim]=x[boundaryIdx+j,  dim],j=0,,K2convStates[cacheIndices[batchId, \; idxFirst + chunk]][C-(K-1)+j, \; dim] = x'[boundaryIdx + j, \; dim], \quad j = 0, \dots, K-2
    6. 因果1维卷积

      y[i,dim]=k=0K1w[k,dim]x[i+k,dim],i=0,1,,L1y[i, dim] = \sum_{k=0}^{K-1} w[k, dim] \cdot x'[i + k, dim], \quad i = 0, 1, \dots, L-1
    7. 零填充重置(可选,当convMode == 1并且numComputedTokens不为空时)

      resetIdx=min ⁣(max ⁣(K1numComputedTokens[batchId],  0),  L)resetIdx = \min\!\Big(\max\!\big(K - 1 - numComputedTokens[batchId], \; 0\big), \; L\Big) y[i,dim]=0,0i<resetIdxy[i, dim] = 0, \quad 0 \leq i < resetIdx
    8. 残差连接(可选)

      y[i,dim]=x[i,dim]+y[i,dim]y[i, dim] = x[i, dim] + y[i, dim]
    9. 原地更新

      x[i,dim]=y[i,dim]x[i, dim] = y[i, dim]
[object Object]

每个算子分为,必须先调用[object Object]接口获取入参并计算所需workspace大小以及包含了算子计算流程的执行器,再调用[object Object]接口执行计算。

[object Object]
[object Object]
[object Object]
  • 参数说明

    [object Object]
  • 返回值

    aclnnStatus:返回状态码,具体参见

    第一段接口完成入参校验,出现以下场景时报错:

    [object Object]
[object Object]
  • 参数说明:

    [object Object]
  • 返回值:

    返回aclnnStatus状态码,具体参见

[object Object]
  • 确定性计算:

    • aclnnInplaceFusedCausalConv1d默认确定性实现。
  • 输入shape限制:

    • prefill场景:
      • x支持2维[cu_seq_len, dim]。
      • weight必须是2维[K, dim],其中K固定为3。
      • conv_states必须是3维[..., K-1, dim],第0维大小不固定且大于等于batch,同时大于等于cache_indices总维度大小。
      • query_start_loc必须存在。
      • cache_indices为1维[batch, ]或2维[batch, maxNumBlocks],其中1维表示未开启APC,2维表示开启APC。
      • cu_seq_len范围[batch, 1024 1024],dim范围[64, 16384]且是16的倍数,且两者乘积需满足[64 batch, 4G]。
      • batch范围[1, 256],maxNumBlocks范围[1, 1024]。
      • max_query_len > 8。
    • prefill和decode混合场景:
      • x支持2维[cu_seq_len, dim]。
      • weight必须是2维[K, dim],其中K固定为3。
      • conv_states必须是3维[..., K-1+m, dim],第0维大小不固定且大于等于batch,同时大于等于cache_indices总维度大小。
      • query_start_loc必须存在。
      • cache_indices为1维[batch, ]或2维[batch, maxNumBlocks],其中1维表示未开启APC,2维表示开启APC。
      • cu_seq_len范围[batch, 1024 1024],dim范围[64, 16384]且是16的倍数,且两者乘积需满足[64 batch, 4G]。
      • batch范围[1, 256],maxNumBlocks范围[1, 1024]。
      • max_query_len > 8。
    • decode场景(变长序列):
      • x支持2维[cu_seq_len, dim]。
      • weight必须是2维[K, dim],其中K固定为3。
      • conv_states必须是3维[..., k-1+m, dim],第0维大小不固定且大于等于batch,同时大于等于cache_indices总维度大小。
      • query_start_loc必须存在。
      • cache_indices为1维[batch, ]或2维[batch, maxNumBlocks],其中1维表示未开启APC,2维表示开启APC。
      • cu_seq_len范围[batch, batch*8],每个batch的seq_len范围为[1, 8]。dim范围[64, 16384]且是16的倍数,batch范围[1, 256],maxNumBlocks范围[1, 1024]。
      • max_query_len范围[1, 8]。
    • decode场景(固定batch):
      • x支持3维[batch, m+1, dim]。
      • weight必须是2维[K, dim],其中K固定为3。
      • conv_states必须是3维[..., K-1+m, dim],第0维大小不固定且大于等于batch,同时大于等于cache_indices总维度大小。
      • cache_indices为1维[batch, ]或2维[batch, maxNumBlocks],其中1维表示未开启APC,2维表示开启APC。
      • m范围[0, 7],dim范围[64, 16384]且是16的倍数,batch范围[1, 256],maxNumBlocks范围[1, 1024]。
      • max_query_len范围[1, 8],可为-1。
  • 输入值域限制:

    • query_start_loc是累计偏移量,取值范围[0, cu_seq_len],长度为batch+1,query_start_loc[i]表示第i个序列的起始偏移,query_start_loc[batch+1]表示最后一个序列的结束位置。
    • blockSize 必须大于等于 2。
    • blockIdxFirstScheduledToken、blockIdxLastScheduledToken、initialStateIdx、num_computed_tokens和cache_indices均存在时表示APC开启,且满足以下条件(i为batch的索引):
      • cache_indices为2维
      • initialStateIdx[i] <= blockIdxFirstScheduledToken[i]+1
      • initialStateIdx[i] <= blockIdxLastScheduledToken[i]
      • blockIdxFirstScheduledToken[i] <= blockIdxLastScheduledToken[i]
      • blockIdxLastScheduledToken[i] < maxNumBlocks
    • num_accepted_tokens分为None和非None,非None情况下长度为batch,每个元素取值不超过当前batch的seq_len-1且大于0。
    • num_computed_tokens中每个元素取值大于等于0。
    • cache_indices的取值范围为[0, conv_states.dim[0]-1],且元素均不能相等。
    • max_query_len = batch中的最大seq_len。
    • Pangu V2 模式(conv_mode = 1)下,num_computed_tokens不能为 None。
    • 算子入参与中间计算结果,在对应数据类型(float16/bfloat16)下,数值均不会超出该类型值域范围。
    • 算子输入不支持有±inf和nan的情况。
[object Object]

示例代码如下,仅供参考,具体编译和执行过程请参考

[object Object]