昇腾社区首页
中文
注册

TopkToppSamplingOperation

功能

依据给定的词表概率以及top-k、top-p,从词表概率中选取前k个作为候选,然后选取概率高于top-p的词表按照TopkToppSamplingType的值采取不同的后处理策略,最后选择最合适的词序号以及对应的概率作为输出。

Top-k取样:从tokens里选取k个作为候选,然后根据它们的"likelihood scores"来采样模型从最有可能的k个选项中随机选择一个。

Top-p取样:从tokens里选取累计概率大于或等于概率p的最小集合作为候选,然后随机选择一个。

定义

struct TopkToppSamplingParam {
    enum TopkToppSamplingType {
        SAMPLING_UNDEFINED = -1,
        SINGLE_TOPK_SAMPLING, 
        BATCH_TOPK_MULTINOMIAL_SAMPLING,
        BATCH_TOPK_EXPONENTIAL_SAMPLING, 
        SAMPLING_MAX, 
    };
    TopkToppSamplingType topkToppSamplingType = SINGLE_TOPK_SAMPLING;
    uint32_t randSeed = 0;
    uint32_t topk = 100;
    std::vector<uint32_t> randSeeds;
};

参数列表

成员名称

类型

默认值

描述

topkToppSamplingType

TopkToppSamplingType

SINGLE_TOPK_SAMPLING

取样处理类型。

  • SAMPLING_UNDEFINED:未定义,不作为取样处理类型。
  • SINGLE_TOPK_SAMPLING: 非batch级别随机种子、top-k。BATCH_TOPK_MULTINOMIAL_SAMPLING: batch级别随机种子、top-k的multinomial取样。
  • BATCH_TOPK_EXPONENTIAL_SAMPLING: batch级别随机种子,top-k的exponential取样。
  • SAMPLING_MAX: 枚举最大值,不作为取样处理类型。

randSeed

uint32_t

0

top-p阶段随机抽样使用的随机数种子,默认值为0。当topktoppSamplingtype = SINGLE_TOPK_SAMPLING时使用。

topk

uint32_t

100

top-k阶段保留的词的个数,需要小于词表的词数,默认值为100。top-k必须大于0且小于或等于输入probs最后一维的大小。当topktoppSamplingtype = SINGLE_TOPK_SAMPLING时使用。

randSeeds

std::vector<uint32_t>

-

每个batch下top-p阶段随机抽样使用的随机数种子。维度与batch大小一致。当topktoppSamplingtype = BATCH_TOPK_MULTINOMIAL_SAMPLING时使用。

输入输出

  • topkToppSamplingType = SINGLE_TOPK_SAMPLING(非batch级随机种子、topk取样)

    参数

    维度

    数据类型

    格式

    描述

    probs

    [batch, voc_size]

    float16

    ND

    输入,词表概率。

    topp

    [batch, 1]

    float16

    ND

    输入topp,topp截取的概率,batch的值需与probs的一致。

    sampled_indices

    [batch, 1]

    int32

    ND

    输出,取样的idx。

    sampled_probs

    [batch, 1]

    float16

    ND

    输出,取样的值。

  • topkToppSamplingType = BATCH_TOPK_MULTINOMIAL_SAMPLING(batch级随机种子,topk的multinomial取样)

    参数

    维度

    数据类型

    格式

    描述

    probs

    [batch, voc_size]

    float16

    ND

    输入,词表概率。

    topk

    [batch, 1]

    int32

    ND

    输入,topk截取的位置,batch的值需与probs的一致。

    topp

    [batch, 1]

    float16

    ND

    输入,topp截取的概率,batch的值需与probs的一致。

    sampled_indices

    [batch, 1]

    int32

    ND

    输出,取样的idx。

    sampled_probs

    [batch, 1]

    float16

    ND

    输出,取样的值。

  • topkToppSamplingType = BATCH_TOPK_EXPONENTIAL_SAMPLING(batch级随机种子,topk的Exponential取样)

    参数

    维度

    数据类型

    格式

    描述

    probs

    [batch, voc_size]

    float16

    ND

    输入,词表概率。

    topk

    [batch, 1]

    float16

    ND

    输入,topk截取的位置,batch的值需与probs的一致。

    topp

    [batch, 1]

    float16

    ND

    输入,topp截取的概率,batch的值需与probs的一致。

    exp

    [batch, voc_size]

    float16

    ND

    输入,所除的指数分布,维度需与probs的一致。

    sampled_indices

    [batch, 1]

    int32

    ND

    输出,取样的idx。

    sampled_probs

    [batch, 1]

    float16

    ND

    输出,取样的值。

功能列表

  • 非batch级随机种子、topk取样

    使用单一的randSeed和topk,对输入的词表概率的所有batch使用统一的topk值进行截取,再对截取后的词表概率的所有batch使用统一的randSeed进行topp取样。

    • 使用的参数

      topkToppSamplingType = SINGLE_TOPK_SAMPLING、topk、randSeed

    • 流程图
      图1 非batch级随机种子topk取样流程图
  • batch级别随机种子、topk的multinomial取样
    对于词表概率的每一个batch使用不同的topk进行截取,再对截取后的词表概率的每个batch使用不同的随机种子进行topp的multinomial取样。
    • 使用的参数

      topkToppSamplingType = BATCH_TOPK_MULTINOMIAL_SAMPLING、randSeeds

    • 流程图
      图2 batch级别随机种子topk的multinomial取样流程图
  • batch级随机种子,topk的Exponential取样

    对于词表概率的每一个batch使用不同的topk进行截取,再对截取后的词表概率的每个batch使用不同的随机种子进行topp的exponential取样。

    • 使用的参数

      topkToppSamplingType = BATCH_TOPK_EXPONENTIAL_SAMPLING

    • 流程图
      图3 batch级别随机种子topk的Exponential取样流程图

规格约束

probs必须是是两维张量。