跳转至正文

Go Report Card License Join Slack

vLLM 模拟器

为了辅助开发和测试,我们开发了一个轻量级的 vLLM 模拟器。它并不真正运行推理,但它会模拟对 vLLM 的 HTTP REST 端点的响应。目前它支持部分 OpenAI 兼容的 API

  • /v1/chat/completions
  • /v1/completions
  • /v1/models

此外,还支持一组 vLLM HTTP 端点。这些包括

端点描述
/v1/load_lora_adapter模拟 LoRA 适配器的动态注册
/v1/unload_lora_adapter模拟 LoRA 适配器的动态卸载和注销
/metrics暴露 Prometheus 指标。详情请参阅下表
/health标准健康检查端点
/ready标准就绪状态端点

此外,它支持 vLLM Prometheus 指标的一个子集。这些指标通过 /metrics HTTP REST 端点暴露。目前支持以下指标

指标描述
vllm:kv_cache_usage_perc当前正在使用的 KV 缓存块比例(从 0 到 1)
vllm:lora_requests_infoLoRA 请求的运行统计数据
vllm:num_requests_running当前在 GPU 上运行的请求数量
vllm:num_requests_waiting排队请求数量的 Prometheus 指标
vllm:e2e_request_latency_seconds端到端请求延迟(秒)的直方图
vllm:request_inference_time_seconds请求在 RUNNING 阶段所用时间的直方图
vllm:request_queue_time_seconds请求在 WAITING 阶段所用时间的直方图
vllm:request_prefill_time_seconds请求在 PREFILL 阶段所用时间的直方图
vllm:request_decode_time_seconds请求在 DECODE 阶段所用时间的直方图
vllm:time_to_first_token_seconds首 token 时间(秒)的直方图
vllm:time_per_output_token_seconds每个输出 token 所用时间(秒)的直方图
vllm:inter_token_latency_secondstoken 间延迟(秒)的直方图
vllm:request_generation_tokens处理的生成 token 数量
vllm:generation_tokens_total生成的 token 总数。
vllm:max_num_generation_tokens请求的最大生成 token 数量。目前与 vllm:request_generation_tokens 相同,因为始终只返回一个选择
vllm:request_params_max_tokensmax_tokens 请求参数的直方图
vllm:request_prompt_tokens处理的 prefill token 数量
vllm:prompt_tokens_total处理的 prompt token 总数
vllm:request_success_total成功处理的请求计数

模拟推理与命令行参数中或通过 /v1/load_lora_adapter HTTP REST 端点指定的模型和 LoRA 适配器没有连接。/v1/models 端点根据相同的命令行参数以及通过 /v1/load_lora_adapter HTTP REST 端点加载的参数返回模拟结果。

模拟器支持两种运行模式

  • echo 模式:响应包含请求中接收到的相同文本。对于 /v1/chat/completions,使用角色为 user 的最后一条消息。
  • random 模式:响应从一组预定义句子中随机选择。

响应的时间由 time-to-first-tokeninter-token-latency 参数定义。如果为请求启用了 P/D(预填充/解码分离),将使用 kv-cache-transfer-latency 代替 time-to-first-token

对于 stream=true 的请求:time-to-first-tokenkv-cache-transfer-latency 定义了返回第一个 token 之前的延迟,inter-token-latency 定义了流中后续 token 之间的延迟。

对于 stream=false 的请求:响应在延迟 <time-to-first-token> + (<inter-token-latency> * (<number_of_output_tokens> - 1)) 之后返回,在 P/D 情况下为 <kv-cache-transfer-latency> + (<inter-token-latency> * (<number_of_output_tokens> - 1))

它可以独立运行,也可以在 Pod 中运行,用于在 Kind 等包下进行测试。

局限性

API 响应包含 OpenAI API 提供的字段子集。

点击显示请求/响应的结构
  • /v1/chat/completions
    • 请求 (request)
      • stream
      • model
      • messages
        • role
        • content
        • tool_calls
          • function
            • name
            • arguments
            • id
          • type
          • index
      • max_tokens
      • max_completion_tokens
      • tools
        • type
        • function
          • name
          • arguments
      • tool_choice
      • logprobs
      • top_logprobs
      • stream_options
        • include_usage
      • do_remote_decode
      • do_remote_prefill
      • remote_block_ids
      • remote_engine_id
      • remote_host
      • remote_port
      • ignore_eos
    • 响应 (response)
      • id
      • created
      • model
      • choices
        • index
        • finish_reason
        • message
        • logprobs
          • content
            • token
            • logprob
            • bytes
            • top_logprobs
      • usage
      • object
      • do_remote_decode
      • do_remote_prefill
      • remote_block_ids
      • remote_engine_id
      • remote_host
      • remote_port
  • /v1/completions
    • 请求 (request)
      • stream
      • model
      • prompt
      • max_tokens
      • stream_options
        • include_usage
      • do_remote_decode
      • do_remote_prefill
      • remote_block_ids
      • remote_engine_id
      • remote_host
      • remote_port
      • ignore_eos
      • logprobs
    • 响应 (response)
      • id
      • created
      • model
      • choices
        • index
        • finish_reason
        • text
        • logprobs
          • tokens
          • token_logprobs
          • top_logprobs
          • text_offset
      • usage
      • object
      • do_remote_decode
      • do_remote_prefill
      • remote_block_ids
      • remote_engine_id
      • remote_host
      • remote_port
  • /v1/models
    • 响应 (response)
      • object
      • data
        • id
        • object
        • created
        • owned_by
        • root
        • parent

更多详情请参阅 vLLM 文档

命令行参数

  • config: 指向 yaml 配置文件路径,该文件可以包含模拟器的命令行参数。如果参数在配置文件和命令行中都有定义,命令行中的值将覆盖配置文件的值。示例配置文件可以在 manifests/config.yaml 找到
  • port: 模拟器监听的端口,默认为 8000
  • model: 当前“加载”的模型,必填
  • served-model-name: 由 API 暴露的模型名称(空格分隔的字符串列表)
  • lora-modules: LoRA 适配器列表(空格分隔的 JSON 字符串列表):{"name": "name", "path": "lora_path", "base_model_name": "id"},可选,默认为空
  • max-loras: 单个批次中的最大 LoRA 数量,可选,默认为 1
  • max-cpu-loras: 存储在 CPU 内存中的最大 LoRA 数量,可选,必须 >= max-loras,默认为 max-loras
  • max-model-len: 模型的上下文窗口,单个请求中的最大 token 数量(包括输入和输出),可选,默认为 1024
  • max-num-seqs: 每轮迭代的最大序列数(可以同时处理的最大推理请求数),默认为 5
  • max-waiting-queue-length: 推理请求等待队列的最大长度,默认为 1000
  • mode: 模拟器模式,可选,默认为 random
    • echo: 返回与请求中发送的相同文本
    • random: 从一组预定义句子中随机返回一个句子

  • latency-calculator: 指定用于模拟响应时间的延迟计算器。默认情况下,延迟基于模拟器的当前负载和配置的延迟参数(如 time-to-first-tokenprefill-time-per-token)计算。支持的值为 per-tokenconstant,表示计算是否考虑提示词大小。
  • time-to-first-token: 首 token 时间(例如 100ms。不推荐使用整数格式),可选,默认位 0
  • time-to-first-token-std-dev: 返回首 token 之前时间的标准差,例如 100ms(如果缺少单位则以毫秒计),可选,默认位 0,不能超过 time-to-first-token 的 30%,实际首 token 时间与 time-to-first-token 的差异不会超过 70%
  • inter-token-latency: “生成”每个额外 token 的时间(例如 100ms。不推荐使用整数格式),可选,默认为 0
  • inter-token-latency-std-dev: 生成 token 之间时间的标准差,例如 100ms(如果缺少单位则以毫秒计),可选,默认为 0,不能超过 inter-token-latency 的 30%,实际 token 间延迟与 inter-token-latency 的差异不会超过 70%
  • kv-cache-transfer-latency: 从远程 vLLM 传输 KV 缓存的时间(例如 100ms。不推荐使用整数格式),默认为 0。通常比 time-to-first-token 短得多
  • kv-cache-transfer-latency-std-dev: 在启用 P/D 的情况下,从另一个 vLLM 实例“传输” KV 缓存的时间标准差,例如 100ms(如果缺少单位则以毫秒计),可选,默认为 0,不能超过 kv-cache-transfer-latency 的 30%,实际延迟与 kv-cache-transfer-latency 的差异不会超过 70%

  • prefill-overhead: 预填充的固定开销时间(例如 100ms。不推荐使用整数格式),可选,默认为 0,用于计算首 token 时间,如果 time-to-first-token 不为 0,则此项将被忽略
  • prefill-time-per-token: 预填充期间生成每个 token 所用的时间(例如 100ms。不推荐使用整数格式),可选,默认为 0,如果 time-to-first-token 不为 0,则此项将被忽略
  • prefill-time-std-dev: 类似于 time-to-first-token-std-dev,但应用于最终预填充时间(由 prefill-overheadprefill-time-per-token 和 prompt token 数量计算得出),如果 time-to-first-token 不为 0,则此项将被忽略
  • kv-cache-transfer-time-per-token: 在启用 P/D 的情况下,传输每个 token 缓存所用的时间(例如 100ms。不推荐使用整数格式),可选,默认为 0,如果 kv-cache-transfer-latency 不为 0,则此项将被忽略
  • kv-cache-transfer-time-std-dev: 类似于 time-to-first-token-std-dev,但应用于启用 P/D 情况下的最终 KV 缓存传输时间(由 kv-cache-transfer-time-per-token 和 prompt token 数量计算得出),如果 kv-cache-transfer-latency 不为 0,则此项将被忽略

  • time-factor-under-load: 负载下的时间因子。当处理并行请求时,该乘法因子会影响请求的总耗时。该值必须 >= 1.0,默认为 1.0。如果因子为 1.0,则不增加额外时间。当因子为 x(且 x > 1.0)且存在 max-num-seqs 个请求时,总时间将乘以 x。当请求数少于 MaxNumSeqs 时,额外时间会成比例递减至 1.0。
  • seed: 操作的随机种子(如果未设置,则使用当前 Unix 纳秒时间)

  • max-tool-call-integer-param: 工具调用中整数参数的最大可能值,可选,默认为 100
  • min-tool-call-integer-param: 工具调用中整数参数的最小可能值,可选,默认为 0
  • max-tool-call-number-param: 工具调用中数值(浮点数)参数的最大可能值,可选,默认为 100
  • min-tool-call-number-param: 工具调用中数值(浮点数)参数的最小可能值,可选,默认为 0
  • max-tool-call-array-param-length: 工具调用中数组参数的最大可能长度,可选,默认为 5
  • min-tool-call-array-param-length: 工具调用中数组参数的最小可能长度,可选,默认为 1
  • tool-call-not-required-param-probability: 在工具调用中添加非必填参数的概率,可选,默认为 50
  • object-tool-call-not-required-field-probability: 在工具调用的对象中添加非必填字段的概率,可选,默认为 50

  • enable-kvcache: 如果为 true,模拟器中将启用 KV 缓存支持。在这种情况下,将模拟 KV 缓存,并在添加或逐出 KV 缓存块时发布 ZQM 事件。
  • kv-cache-size: KV 缓存中 token 块的最大数量
  • block-size: 连续 token 块的大小,可能的值:8,16,32,64,128
  • tokenizers-cache-dir: 缓存分词器(tokenizer)的目录
  • hash-seed: 生成哈希的种子(如果未设置,则从 PYTHONHASHSEED 环境变量读取)
  • zmq-endpoint: 发布事件的 ZMQ 地址
  • zmq-max-connect-attempts: ZMQ 连接尝试的最大次数,默认为 0,最大为 10
  • event-batch-size: 一起发送的 KV 缓存事件的最大数量,默认为 16

  • failure-injection-rate: 注入故障的概率 (0-100),可选,默认为 0
  • failure-types: 要注入的具体故障类型列表 (rate_limit, invalid_api_key, context_length, server_error, invalid_request, model_not_found),可选,如果为空则使用所有类型

  • fake-metrics: 表示发送到 Prometheus 的一组预定义指标,用于替代真实指标。指定后,将仅报告这些虚假指标——真实指标和虚假指标永远不会一起报告。该集合应包含以下各项的值:
    • running-requests(运行中的请求)
    • waiting-requests(等待中的请求)
    • kv-cache-usage(KV 缓存使用率)
    • loras - 一个包含 LoRA 信息对象的数组,每个对象具有以下字段:running(正在运行的请求所使用的 LoRA 列表,逗号分隔)、waiting(等待中的请求将使用的 LoRA 列表,逗号分隔)和 timestamp(自 1970 年 1 月 1 日以来的秒数,此指标的时间戳)。
    • ttft-buckets-values - 首 token 时间 (TTFT) 分桶的值数组,数组中的每个值对应相应分桶的值。数组包含的值可能少于分桶数量,所有缺失的尾随值均假定为 0。分桶上界为:0.001, 0.005, 0.01, 0.02, 0.04, 0.06, 0.08, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0, 20.0, 40.0, 80.0, 160.0, 640.0, 2560.0, +Inf。
    • tpot-buckets-values - 每个输出 token 时间 (TPOT) 分桶的值数组,数组中的每个值对应相应分桶的值。数组包含的值可能少于分桶数量,所有缺失的尾随值均假定为 0。分桶上界为:0.01, 0.025, 0.05, 0.075, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0, 20.0, 40.0, 80.0, +Inf。
    • e2erl-buckets-values - 端到端请求延迟分桶的值数组,数组中的每个值对应相应分桶的值。数组包含的值可能少于分桶数量,所有缺失的尾随值均假定为 0。分桶上界为:0.3, 0.5, 0.8, 1.0, 1.5, 2.0, 2.5, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 60.0, 120.0, 240.0, 480.0, 960.0, 1920.0, 7680.0, +Inf。
    • queue-time-buckets-values - 请求队列时间分桶的值数组,数组中的每个值对应相应分桶的值。数组包含的值可能少于分桶数量,所有缺失的尾随值均假定为 0。分桶上界为:0.3, 0.5, 0.8, 1.0, 1.5, 2.0, 2.5, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 60.0, 120.0, 240.0, 480.0, 960.0, 1920.0, 7680.0, +Inf。
    • inf-time-buckets-values - 请求推理时间分桶的值数组,数组中的每个值对应相应分桶的值。数组包含的值可能少于分桶数量,所有缺失的尾随值均假定为 0。分桶上界为:0.3, 0.5, 0.8, 1.0, 1.5, 2.0, 2.5, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 60.0, 120.0, 240.0, 480.0, 960.0, 1920.0, 7680.0, +Inf。
    • prefill-time-buckets-values - 请求预填充时间分桶的值数组,数组中的每个值对应相应分桶的值。数组包含的值可能少于分桶数量,所有缺失的尾随值均假定为 0。分桶上界为:0.3, 0.5, 0.8, 1.0, 1.5, 2.0, 2.5, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 60.0, 120.0, 240.0, 480.0, 960.0, 1920.0, 7680.0, +Inf。
    • decode-time-buckets-values - 请求解码时间分桶的值数组,数组中的每个值对应相应分桶的值。数组包含的值可能少于分桶数量,所有缺失的尾随值均假定为 0。分桶上界为:0.3, 0.5, 0.8, 1.0, 1.5, 2.0, 2.5, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 60.0, 120.0, 240.0, 480.0, 960.0, 1920.0, 7680.0, +Inf。
    • request-prompt-tokens - prompt 长度分桶的值数组
    • request-generation-tokens - 生成长度分桶的值数组
    • request-max-generation-tokens - max_num_generation_tokens 分桶的值数组
    • request-params-max-tokens - max_tokens 参数分桶的值数组
    • request-success-total - 按完成原因 (finish reason) 分类的成功请求数,键:finish-reason(stop, length 等)。

    示例
    --fake-metrics '{"running-requests":10,"waiting-requests":30,"kv-cache-usage":0.4,"loras":[{"running":"lora4,lora2","waiting":"lora3","timestamp":1257894567},{"running":"lora4,lora3","waiting":"","timestamp":1257894569}]}'

  • data-parallel-size: 在数据并行部署中运行的 rank 数量,从 1 到 8,默认为 1。端口分配如下:rank 0 将在配置的 port 上运行,rank 1 在 port+1 上运行,依此类推。
  • data-parallel-rank: 此实例的 rank,仅在将数据并行 rank 作为独立进程运行时使用

  • dataset-path: 可选的本地文件路径,指向用于从数据集生成响应的 SQLite 数据库文件。
    • 如果未设置,将使用硬编码的预设响应。
    • 如果已设置但文件不存在,将使用 dataset-url 下载数据库到 dataset-path 指定的路径。
    • 如果文件存在但当前被另一个进程占用,响应将从预设文本随机生成(其行为与未设置路径时相同)。
    • 响应通过对话历史的哈希值从数据集中检索;如果未找到匹配的历史记录,则回退到随机的数据集响应,并受最大输出 token 数和 EoS token 处理的约束。
    • 有关 SQLite 数据库文件预期格式的详细信息,请参考 llm-d 转换后的 ShareGPT
  • dataset-url: 用于响应生成的 SQLite 数据库文件的可选下载 URL。
    • 此参数仅在同时设置了 dataset-path 且该路径下文件不存在时使用。
    • 如果需要下载文件,它将保存到 dataset-path 指定的位置。
    • 如果文件已存在于 dataset-path,则不会再次下载
    • 示例 URL https://hugging-face.cn/datasets/hf07397/inference-sim-datasets/resolve/91ffa7aafdfd6b3b1af228a517edc1e8f22cd274/huggingface/ShareGPT_Vicuna_unfiltered/conversations.sqlite3
  • dataset-in-memory: 如果为 true,整个数据集将加载到内存中以实现更快的访问。根据数据集的大小,这可能需要大量内存。默认为 false。

  • ssl-certfile: 用于 HTTPS 的 SSL 证书文件路径(可选)
  • ssl-keyfile: 用于 HTTPS 的 SSL 私钥文件路径(可选)
  • self-signed-certs: 启用自动生成用于 HTTPS 的自签名证书

此外,由于我们使用 klog,以下参数也可用

  • add_dir_header: 如果为 true,将文件目录添加到日志消息的头部
  • alsologtostderr: 同时输出到标准错误和文件(当 -logtostderr=true 时无效)
  • log_backtrace_at: 当日志记录到特定文件的行号时:N, 发出堆栈跟踪(默认 :0)
  • log_dir: 如果不为空,在此目录中编写日志文件(当 -logtostderr=true 时无效)
  • log_file: 如果不为空,使用此日志文件(当 -logtostderr=true 时无效)
  • log_file_max_size: 定义日志文件可以增长到的最大大小(当 -logtostderr=true 时无效)。单位是兆字节。如果值为 0,则最大文件大小不受限制。(默认 1800)
  • logtostderr: 输出到标准错误而不是文件(默认 true)
  • one_output: 如果为 true,仅将日志写入其原生严重性级别(而非同时写入每个较低的严重性级别;当 -logtostderr=true 时无效)
  • skip_headers: 如果为 true,避免在日志消息中使用头部前缀
  • skip_log_headers: 如果为 true,在打开日志文件时避免使用头部(当 -logtostderr=true 时无效)
  • stderrthreshold: 在同时写入文件和标准错误时,等于或高于此阈值的日志将输出到标准错误(当 -logtostderr=true 或 -alsologtostderr=true 时无效)(默认 2)
  • v: 日志级别详细程度的数字。支持的级别有
    • 警告 (1) - 警告消息
    • 信息 (2) - 通用应用程序消息,例如加载的配置内容、加载了哪个响应数据集等。
    • 调试 (4) - 调试消息,例如收到的 /completions 和 /chat/completions 请求、处理的加载/卸载 LoRA 请求等。
    • 追踪 (5) - 最高详细程度,例如关于补全请求处理和请求队列处理的详细消息等。
  • vmodule: 逗号分隔的 pattern=N 设置列表,用于文件过滤日志记录

环境变量

  • POD_NAME: 模拟器 Pod 名称。如果定义,响应将包含带有此值的 HTTP 标头 x-inference-pod,以及带有接收请求端口的 HTTP 标头 x-inference-port
  • POD_NAMESPACE: 模拟器 Pod 命名空间。如果定义,响应将包含带有此值的 HTTP 标头 x-inference-namespace
  • POD_IP: 模拟器 Pod IP 地址。用于 kv-events 主题名称。yaml 中的定义示例
    env:
    - name: POD_IP
    valueFrom:
    fieldRef:
    fieldPath: status.podIP

从 v0.2.0 之前的版本迁移

  • max-running-requests 已被 max-num-seqs 取代
  • lora 已被 lora-modules 取代,后者现在是一个 JSON 字符串列表,例如 {"name": "name", "path": "lora_path", "base_model_name": "id"}

使用 Docker 镜像

构建

要构建 vLLM 模拟器的 Docker 镜像,请运行

make image-build

请注意,默认镜像标签为 ghcr.io/llm-d/llm-d-inference-sim:dev
以下环境变量可用于更改镜像标签:REGISTRYSIM_TAGIMAGE_TAG_BASEIMG

注意:在 macOS 上,请使用 make image-build TARGETOS=linux 来拉取正确的基础镜像。

运行

要在 Docker 下运行 vLLM 模拟器镜像,请运行

docker run --rm --publish 8000:8000 ghcr.io/llm-d/llm-d-inference-sim:dev  --port 8000 --model "Qwen/Qwen2.5-1.5B-Instruct"  --lora-modules ``{"name":"tweet-summary-0"}`` ``{"name":"tweet-summary-1"}``

注意: 要运行最新发布版本的 vLLM 模拟器,请在上述 docker 命令中将 dev 替换为当前的发布版本,版本信息可以在 GitHub 上找到。

注意: 上述命令在 8000 端口上暴露模拟器,并提供 Qwen/Qwen2.5-1.5B-Instruct 模型服务。

独立测试

构建

要将 vLLM 模拟器构建为在本地运行的可执行文件,请运行

make build

运行

要在独立测试环境中运行 vLLM 模拟器

  1. 通过运行以下命令设置 PYTHONPATH 环境变量(分词代码需要):
. env-setup.sh
  1. 启动模拟器
./bin/llm-d-inference-sim --model my_model --port 8000

Kubernetes 测试

要在 Kubernetes 集群中运行 vLLM 模拟器,请运行

kubectl apply -f manifests/deployment.yaml

在本地使用 kind 测试时,先用 make build-image 构建 docker 镜像,然后加载到集群中

kind load --name kind docker-image ghcr.io/llm-d/llm-d-inference-sim:dev

更新 deployment.yaml 文件以使用 dev 标签。

要验证部署是否可用,请运行

kubectl get deployment vllm-llama3-8b-instruct
kubectl get service vllm-llama3-8b-instruct-svc

使用 kubectl port-forward 在本地机器上暴露服务

kubectl port-forward svc/vllm-llama3-8b-instruct-svc 8000:8000

使用 curl 测试 API

curl -X POST https://:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '`{
"model": "meta-llama/Llama-3.1-8B-Instruct",
"messages": [
{"role": "user", "content": "Hello!"}`
]
}'

预填充/解码 (P/D) 分离示例

P/D(预填充/解码)解耦部署的示例配置可以在 manifests/disaggregation 中找到。

响应生成

/v1/completions/v1/chat/completions 端点根据模拟器配置和具体的请求参数生成响应。

Echo 模式

echo 模式下,响应始终镜像请求内容。在 /v1/completions 的情况下,返回 prompt 字段。在 /v1/chat/completions 的情况下,返回最后一条消息。

在此模式下,参数 max_tokensmax_completions_tokensignore_eos 将被忽略。

Random 模式

random 模式下,响应生成期间会使用请求中的 max_tokensmax_completions_tokensignore_eos 字段。

使用预定义文本生成响应

模拟器可以从预定义的句子列表中生成响应。如果指定了 max_tokensmax_completions_tokens,响应长度将使用具有六个分桶的直方图进行计算,概率如下:20%, 30%, 20%, 5%, 10%, 15%。对于最大长度 ≤ 120 的情况,分桶大小相等。对于最大长度 > 120 的情况,除第四个分桶外,所有分桶的大小均为 20;第四个分桶覆盖剩余范围。设置分桶后,将根据这些概率对响应长度进行采样。

示例
max-len = 120: 分桶为 1-20, 21-40, 41-60, 61-80, 81-100, 101-120。
max-len = 200: 分桶为 1-20, 21-40, 41-60, 61-160, 161-180, 181-200。

如果未指定最大响应长度,则默认为 <model length>-<input-length />。在这种情况下,响应长度从均值为 40、标准差为 20 的高斯分布中采样。

确定响应长度后

从预定义列表中选择一个随机句子,如果超过所需长度则进行修剪。如果句子较短,则连接额外的随机句子,直到满足所需的 token 计数。

如果 ignore_eos 为 true,响应始终达到允许的最大长度。

如果响应长度等于最大长度,finish_reason 设置为 LENGTH;否则,设置为 STOP。

使用响应数据集进行响应生成

如果命令行中设置了 dataset-url,数据集将下载到 dataset-path 指定的位置。

如果 dataset-path 中存在有效数据集,它将用于响应选择。请求提示词将被哈希处理,并根据数据集条目匹配此值。如果所有匹配项都更长,则选择随机匹配项并进行修剪。

如果 ignore_eos 为 true 且没有匹配项满足所需长度,则使用预定义列表中的随机 token 完成响应。

如果数据集中心不存在提示词哈希,则选择一个长度 ≤ 最大长度的随机响应;如果所有响应都更长,则选择并修剪一个随机响应。

内容来源

此内容自动从 llm-d/llm-d-inference-sim 仓库 main 分支上的 README.md 同步。

📝 如需建议更改,请 编辑源文件创建 issue