有用的运行时选项#

这部分总结了可以调整以提升已构建引擎性能的运行时配置旋钮。与之前使用 LLM-API 构建和保存引擎但未处理任何请求的示例相比,运行时旋钮在使用 LLM-API 实际运行推理时指定,例如在LLM-API 端到端示例中所示。

容量调度器策略#

TensorRT-LLM 当前支持三种批处理调度器策略:GUARANTEED_NO_EVICT(默认)、MAX_UTILIZATIONSTATIC_BATCH

启用飞行中序列批处理时,可以将调度策略设置为 MAX_UTILIZATION,以便在前向循环的每次迭代中尽可能多地打包请求。它通过积极调度请求来最大化 GPU 利用率,但也可能面临达到 KV 缓存大小限制时需要暂停请求的风险。

对于内存分配方面更保守的 KV 缓存限制方法,应将 CapacitySchedulerPolicy 设置为 GUARANTEED_NO_EVICT,以保证已开始的请求永远不会暂停。

如果目标是最大化吞吐量,用户应尝试 MAX_UTILIZATION。但是,他们需要记住,如果请求必须暂停,这可能会对延迟产生负面影响。

STATIC_BATCH 是旧模式,不推荐用于生产环境。

要将容量调度器策略从默认的 GUARANTEED_NO_EVICT 切换到 MAX_UTILIZATION,您可以修改LLM-API 端到端示例如下:

from tensorrt_llm import LLM, SamplingParams
from tensorrt_llm.bindings.executor import SchedulerConfig, CapacitySchedulerPolicy


def main():
    prompts = [
        "Hello, I am",
        "The president of the United States is",
        "The capital of France is",
        "The future of AI is",
    ]

    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

    scheduler_config = SchedulerConfig(
        capacity_scheduler_policy=CapacitySchedulerPolicy.MAX_UTILIZATION
    )

    llm  =  LLM(
    model="meta-llama/Llama-3.3-70B-Instruct",
    tensor_parallel_size=4,
    scheduler_config=scheduler_config
    )

    outputs = llm.generate(prompts, sampling_params)

    # Print the outputs.
    for output in outputs:
        prompt = output.prompt
        generated_text = output.outputs[0].text
        print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

if __name__ == '__main__':
    main()

上下文分块策略#

之前讨论的,上下文分块会增加上下文和生成阶段之间批处理的可能性,从而平衡每次迭代的计算量并通常提高吞吐量。

TensorRT-LLM 当前支持两种上下文分块策略:FIRST_COME_FIRST_SERVED(默认)优先调度先到达请求的所有上下文分块,而 EQUAL_PROGRESS 则调度来自所有请求的上下文分块,然后再调度任一请求的下一个分块。

FIRST_COME_FIRST_SERVED 应实现总体更好的性能,而 EQUAL_PROGRESS 在理论上有助于确保大多数请求的首个令牌时间 (TTFT) 相对相似。

要将上下文分块策略从默认的 FIRST_COME_FIRST_SERVED 切换到 EQUAL_PROGRESS,您可以修改LLM-API 端到端示例如下:

from tensorrt_llm import LLM, SamplingParams
from tensorrt_llm.bindings.executor import SchedulerConfig, ContextChunkingPolicy


def main():
    prompts = [
        "Hello, I am",
        "The president of the United States is",
        "The capital of France is",
        "The future of AI is",
    ]

    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

    scheduler_config = SchedulerConfig(
        context_chunking_policy=ContextChunkingPolicy.EQUAL_PROGRESS
    )

    llm  =  LLM(
    model="meta-llama/Llama-3.3-70B-Instruct",
    tensor_parallel_size=4,
    scheduler_config=scheduler_config
    )

    outputs = llm.generate(prompts, sampling_params)

    # Print the outputs.
    for output in outputs:
        prompt = output.prompt
        generated_text = output.outputs[0].text
        print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

if __name__ == '__main__':
    main()

分页 KV 缓存中的最大令牌数和 KV 缓存空闲 GPU 内存比例#

参数 max_tokens_in_paged_kv_cachekv_cache_free_gpu_mem_fraction 可用于控制 KV 缓存管理器处理的最大令牌数。正确设置它们有助于更好地控制推理期间可供 KV 缓存管理器使用的内存量。请记住,增加可供 KV 缓存管理器使用的内存量往往会转化为更高的可实现吞吐量。

标志 max_tokens_in_paged_kv_cache 直接设置 KV 缓存管理器中的最大令牌数。未设置时,该值将根据 kv_cache_free_gpu_mem_fraction 设置计算得出。

kv_cache_free_gpu_mem_fraction 是一个介于 0.01.0 之间的浮点数,表示用于 KV 缓存的 GPU 内存(加载模型后)的最大比例。默认值为 0.90,表示 90% 的空闲 GPU 内存将用于在 KV 缓存中保存令牌。根据该值,TensorRT-LLM 可以确定 KV 缓存管理器中的最大令牌数。

当两个参数都设置时,KV 缓存管理器中的最大令牌数将被设置为 max_tokens_in_paged_kv_cache 和根据可用于 KV 缓存的内存量计算出的值中的较小者。

除非用户清楚了解模型所需的 KV 缓存最大令牌数,否则建议不要设置 max_tokens_in_paged_kv_cache。对于 kv_cache_free_gpu_mem_fraction,如果在同一 GPU 上没有其他程序执行,建议测试高达 0.95 的值以实现高吞吐量。请注意,参数 kv_cache_free_gpu_mem_fraction 不能设置为 1.0,因为必须为输入和输出预留一些内存。

要设置 kv_cache_free_gpu_mem_fraction,您可以修改LLM-API 端到端示例如下:

from tensorrt_llm import LLM, SamplingParams
from tensorrt_llm.bindings.executor import KvCacheConfig


def main():
    prompts = [
        "Hello, I am",
        "The president of the United States is",
        "The capital of France is",
        "The future of AI is",
    ]

    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

    kv_cache_config = KvCacheConfig(free_gpu_memory_fraction=0.95)

    llm  =  LLM(
    model="meta-llama/Llama-3.3-70B-Instruct",
    tensor_parallel_size=8,
    kv_cache_config=kv_cache_config
    )

    outputs = llm.generate(prompts, sampling_params)

    # Print the outputs.
    for output in outputs:
        prompt = output.prompt
        generated_text = output.outputs[0].text
        print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

if __name__ == '__main__':
    main()

如果您想设置 max_tokens_in_paged_kv_cache,则将 free_gpu_memory_fraction 替换为 max_tokens 并指定数字。

    kv_cache_config = KvCacheConfig(max_tokens=<number of tokens>)

最大注意力窗口大小#

标志 max_attention_window_size 设置了使用滑动窗口注意力等技术生成一个令牌时所关注的最大令牌数。有关更多详细信息,请参阅此文档。它默认为最大序列长度(构建引擎时的 max_seq_len),这意味着该功能默认禁用。

当设置为小于 max_seq_len 的值(在引擎构建期间)时,将只存储最后 max_attention_window_size 个令牌的 KV 缓存。如果在运行时输入序列长度超过 max_attention_window_size 值,精度可能会开始下降,但运行时性能会更好(因为计算量和 GPU 内存分配减少)。用户可以修改该值以提高运行时性能,但会牺牲一定的精度。

就像kv_cache_free_gpu_mem_fraction一样,可以在 LLM-API 中通过 KVCacheConfig 指定 max_attention_window_size。要指定 max_attention_window_size,您可以实例化 KVCacheConfig,如下所示:

    kv_cache_config = KvCacheConfig(max_attention_window=<number of tokens>)