随机合成数据集使用指南

一. 应用简介

该功能仅支持性能测评相关场景,而不支持精度测评相关场景

该功能旨在不提供真实数据集,而考虑使用构造随机的合成数据集的场景,用于大语言模型推理性能基准测试。

二. 使用指导

2.1 修改配置文件

配置ais_bench/benchmark/configs/datasets/synthetic 目录下的配置模板文件中的synthetic_config参数。

当前提供了两种不同构造类型的随机数据集配置模板文件,用户可根据自己的需求选择合适的模板文件进行修改:

  • synthetic_gen_string.py: 生成随机长度字符串(模拟真实输入)

    synthetic_config = {
        "Type": "string",
        ... # 其他参数
    }
    
  • synthetic_gen_tokenid.py: 生成随机token id序列(直接输入编码后的Token)

    synthetic_config = {
        "Type": "tokenid",
        ... # 其他参数
    }
    

注意: ais_bench/benchmark/configs/datasets/synthetic/synthetic_gen.py模板所使用配置需在ais_bench/benchmark/configs/datasets/synthetic中进行修改。为了统一数据集配置模式,此方法将在后续版本中弃用。

2.2 命令执行

在命令行执行如下命令启动测评:

ais_bench --models {model_api_file} --datasets synthetic_gen_{string/tokenid} {other_option_args}

三. 参数说明

以下仅做配置文件中参数的大概说明,详细取值要求需参考配置文件中预留的注释和使用场景。

3.1 公共参数

参数名称

类型

说明

取值范围

Type

string

数据集类型(必填)

string/tokenid

RequestCount

int

生成的请求总数(必填)

[1, 1,048,576]


3.2 String类型配置(Type="string"时需配置)

"StringConfig" : {
    "Input" : {          # 输入序列配置
        "Method": str,    # 分布类型:uniform/gaussian/zipf
        "Params": {}      # 对应分布的参数
    },
    "Output" : {         # 输出序列配置(参数同上)
        "Method": str,
        "Params": {}
    }
}

输入输出分布参数说明

关键规则

  • 所有数值参数的最大值默认应小于 2^20(即 1,048,576)

  • 请求的最大输入/输出长度还会受到服务化配置的限制,具体参考该配置文件中的注释描述

分布类型

参数

类型

说明

取值范围

uniform

MinValue

int

输入/出序列的最小长度

[1, 1,048,576]

MaxValue

int

输入/出序列的最大长度(可等于MinValue)

[≥MinValue]

gaussian

Mean

float

分布中心值(均值)

[-3.0e38, 3.0e38]

Var

float

方差(控制数据分散程度)

[0, 3.0e38]

MinValue

int

输入/出序列的硬性下限

[1, 1,048,576]

MaxValue

int

输入/出序列的硬性上限

[≥MinValue]

zipf

Alpha

float

形状参数(值越大分布越均匀)

(1.0, 10.0]

MinValue

int

输入/出序列的最小长度

[1, 1,048,576]

MaxValue

int

输入/出序列的最大长度(必须大于MinValue)

[>MinValue]


3.3 TokenId类型配置(Type="tokenid"时需配置)

"TokenIdConfig" : {
    "RequestSize": int,  # 单请求token数量
    "PrefixLen": int     # 所有请求的公共前缀token数量
}

四. 配置示例

4.1 String类型示例

1. Uniform均匀分布

synthetic_config = {
    "Type": "string",
    "RequestCount": 1000,
    "StringConfig": {
        "Input": {
            "Method": "uniform",
            "Params": {"MinValue": 50, "MaxValue": 500}  # 输入长度50-500
        },
        "Output": {
            "Method": "uniform",
            "Params": {"MinValue": 20, "MaxValue": 200}  # 输出长度20-200
        }
    }
}

特性:输入/输出长度在区间内等概率分布,适用于基准性能测试


2. Gaussian高斯分布

synthetic_config = {
    "Type": "string",
    "RequestCount": 800,
    "StringConfig": {
        "Input": {
            "Method": "gaussian",
            "Params": {
                "Mean": 256,       # 中心值256
                "Var": 10,         # 方差10
                "MinValue": 64,    # 实际范围64-512
                "MaxValue": 512
            }
        },
        "Output": {
            "Method": "gaussian",
            "Params": {
                "Mean": 128,
                "Var": 50,
                "MinValue": 32,
                "MaxValue": 256
            }
        }
    }
}

分布特征:约95%的输入长度在[236,276]范围内(μ±2σ)


3. Zipf齐夫分布

synthetic_config = {
    "Type": "string",
    "RequestCount": 1200,
    "StringConfig": {
        "Input": {
            "Method": "zipf",
            "Params": {
                "Alpha": 1.5,      # 强长尾效应
                "MinValue": 10,    # 输入长度范围10-1000
                "MaxValue": 1000
            }
        },
        "Output": {
            "Method": "zipf",
            "Params": {
                "Alpha": 2.0,     # 较平缓分布
                "MinValue": 5,
                "MaxValue": 500
            }
        }
    }
}

典型场景:模拟真实场景中的请求长尾分布,当Alpha=1.5时,约20%的请求占60%的计算量


4. 混合分布配置

synthetic_config = {
    "Type": "string",
    "RequestCount": 1500,
    "StringConfig": {
        "Input": {
            "Method": "zipf",    # 输入长尾分布
            "Params": {
                "Alpha": 1.2,
                "MinValue": 10,
                "MaxValue": 2000
            }
        },
        "Output": {
            "Method": "uniform",  # 输出均匀分布
            "Params": {
                "MinValue": 50,
                "MaxValue": 300
            }
        }
    }
}

4.2 TokenId类型示例

长文本压力测试

synthetic_config = {
    "Type": "tokenid",
    "RequestCount": 1000,
    "TokenIdConfig": {
        "RequestSize": 2048,   # 单请求2048个token
        "PrefixLen": 0
    }
}

短文本性能测试

synthetic_config = {
    "Type": "tokenid",
    "RequestCount": 5000,
    "TokenIdConfig": {
        "RequestSize": 128,    # 短文本处理场景
        "PrefixLen": 0
    }
}

公共前缀性能测试

synthetic_config = {
    "Type": "tokenid",
    "RequestCount": 5000,
    "TokenIdConfig": {
        "RequestSize": 512,    # 单请求512个token
        "PrefixLen": 256      # 所有请求前面256个token相等
    }
}

五. 常见问题

Q1: 选择分布类型?

  • 均匀分布:适用于压力测试的基线场景

  • 高斯分布:模拟真实场景中的平均请求长度

  • Zipf分布:生成长尾分布数据(如1%的请求占50%的计算量)

  • 分布组合建议

    • 压力测试:Input使用zipf分布,Output使用uniform分布

    • 稳定性测试:Input/Output均使用gaussian分布

Q2: 为什么在指定了 输入长度 情况下,但性能测评结果矩阵还是会显示非预期值?

  • tokenid模式:发送时会将每条由模型权重词表范围下随机生成的token所组成的、指定长度的prompt重新decode为字符串格式后再发送给服务化,由于每个模型的词表映射可能出现多对一、一对多等情况,故可能出现波动

  • string模式:该模式下的输入长度指代输入的string的长度,而非token的长度

  • 预处理阶段:在使用chat相关的api时,可能会在前后进行一些额外的字符串拼接

Q3:为什么在String模式下,指定了 输出长度,但性能测评结果矩阵还是会显示非预期值?

  • 相差很大:请检查在model api配置文件中是否正确配置generation_kwargs中的ignore_eos参数(可以使得服务化处理输出时忽略终止符直至输出长度达到预设值)为True


六. 注意事项

  1. tokenid模式:该模式下的tokenid取值范围取决于在模型配置文件中指定的模型的词表范围

  2. string模式:当MinValue=MaxValue时生成固定长度序列