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_info | LoRA 请求的运行统计数据 |
| 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_seconds | token 间延迟(秒)的直方图 |
| vllm:request_generation_tokens | 处理的生成 token 数量 |
| vllm:generation_tokens_total | 生成的 token 总数。 |
| vllm:max_num_generation_tokens | 请求的最大生成 token 数量。目前与 vllm:request_generation_tokens 相同,因为始终只返回一个选择 |
| vllm:request_params_max_tokens | max_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-token 和 inter-token-latency 参数定义。如果为请求启用了 P/D(预填充/解码分离),将使用 kv-cache-transfer-latency 代替 time-to-first-token。
对于 stream=true 的请求:time-to-first-token 或 kv-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
- function
- 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
- content
- usage
- object
- do_remote_decode
- do_remote_prefill
- remote_block_ids
- remote_engine_id
- remote_host
- remote_port
- 请求 (request)
/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
- 请求 (request)
/v1/models- 响应 (response)
- object
- data
- id
- object
- created
- owned_by
- root
- parent
- 响应 (response)
更多详情请参阅 vLLM 文档
命令行参数
config: 指向 yaml 配置文件路径,该文件可以包含模拟器的命令行参数。如果参数在配置文件和命令行中都有定义,命令行中的值将覆盖配置文件的值。示例配置文件可以在manifests/config.yaml找到port: 模拟器监听的端口,默认为 8000model: 当前“加载”的模型,必填served-model-name: 由 API 暴露的模型名称(空格分隔的字符串列表)lora-modules: LoRA 适配器列表(空格分隔的 JSON 字符串列表):{"name": "name", "path": "lora_path", "base_model_name": "id"},可选,默认为空max-loras: 单个批次中的最大 LoRA 数量,可选,默认为 1max-cpu-loras: 存储在 CPU 内存中的最大 LoRA 数量,可选,必须 >= max-loras,默认为 max-lorasmax-model-len: 模型的上下文窗口,单个请求中的最大 token 数量(包括输入和输出),可选,默认为 1024max-num-seqs: 每轮迭代的最大序列数(可以同时处理的最大推理请求数),默认为 5max-waiting-queue-length: 推理请求等待队列的最大长度,默认为 1000mode: 模拟器模式,可选,默认为randomecho: 返回与请求中发送的相同文本random: 从一组预定义句子中随机返回一个句子
latency-calculator: 指定用于模拟响应时间的延迟计算器。默认情况下,延迟基于模拟器的当前负载和配置的延迟参数(如time-to-first-token和prefill-time-per-token)计算。支持的值为per-token和constant,表示计算是否考虑提示词大小。time-to-first-token: 首 token 时间(例如 100ms。不推荐使用整数格式),可选,默认位 0time-to-first-token-std-dev: 返回首 token 之前时间的标准差,例如 100ms(如果缺少单位则以毫秒计),可选,默认位 0,不能超过time-to-first-token的 30%,实际首 token 时间与time-to-first-token的差异不会超过 70%inter-token-latency: “生成”每个额外 token 的时间(例如 100ms。不推荐使用整数格式),可选,默认为 0inter-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-overhead、prefill-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: 工具调用中整数参数的最大可能值,可选,默认为 100min-tool-call-integer-param: 工具调用中整数参数的最小可能值,可选,默认为 0max-tool-call-number-param: 工具调用中数值(浮点数)参数的最大可能值,可选,默认为 100min-tool-call-number-param: 工具调用中数值(浮点数)参数的最小可能值,可选,默认为 0max-tool-call-array-param-length: 工具调用中数组参数的最大可能长度,可选,默认为 5min-tool-call-array-param-length: 工具调用中数组参数的最小可能长度,可选,默认为 1tool-call-not-required-param-probability: 在工具调用中添加非必填参数的概率,可选,默认为 50object-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,128tokenizers-cache-dir: 缓存分词器(tokenizer)的目录hash-seed: 生成哈希的种子(如果未设置,则从 PYTHONHASHSEED 环境变量读取)zmq-endpoint: 发布事件的 ZMQ 地址zmq-max-connect-attempts: ZMQ 连接尝试的最大次数,默认为 0,最大为 10event-batch-size: 一起发送的 KV 缓存事件的最大数量,默认为 16
failure-injection-rate: 注入故障的概率 (0-100),可选,默认为 0failure-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-portPOD_NAMESPACE: 模拟器 Pod 命名空间。如果定义,响应将包含带有此值的 HTTP 标头x-inference-namespacePOD_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。
以下环境变量可用于更改镜像标签:REGISTRY、SIM_TAG、IMAGE_TAG_BASE 或 IMG。
注意:在 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 模拟器
- 通过运行以下命令设置 PYTHONPATH 环境变量(分词代码需要):
. env-setup.sh
- 启动模拟器
./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_tokens、max_completions_tokens 和 ignore_eos 将被忽略。
Random 模式
在 random 模式下,响应生成期间会使用请求中的 max_tokens、max_completions_tokens 和 ignore_eos 字段。
使用预定义文本生成响应
模拟器可以从预定义的句子列表中生成响应。如果指定了 max_tokens 或 max_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 完成响应。
如果数据集中心不存在提示词哈希,则选择一个长度 ≤ 最大长度的随机响应;如果所有响应都更长,则选择并修剪一个随机响应。