TurboMind 配置#

TurboMind 是 LMDeploy 的推理引擎之一。在使用它进行模型推理时,您需要将输入模型转换为 TurboMind 模型。在 TurboMind 模型文件夹中,除了模型权重文件外,TurboMind 模型还包括一些其他文件,其中最重要的是与推理性能密切相关的配置文件 triton_models/weights/config.ini

如果您使用的是LMDeploy版本0.0.x,请参考turbomind 1.0 config部分以了解配置中的相关内容。否则,请阅读turbomind 2.0 config以熟悉配置细节。

TurboMind 2.x 配置#

llama-2-7b-chat模型为例。在TurboMind 2.x中,其config.ini内容如下:

[llama]
model_name = llama2
tensor_para_size = 1
head_num = 32
kv_head_num = 32
vocab_size = 32000
num_layer = 32
inter_size = 11008
norm_eps = 1e-06
attn_bias = 0
start_id = 1
end_id = 2
session_len = 4104
weight_type = fp16
rotary_embedding = 128
rope_theta = 10000.0
size_per_head = 128
group_size = 0
max_batch_size = 64
max_context_token_num = 1
step_length = 1
cache_max_entry_count = 0.5
cache_block_seq_len = 128
cache_chunk_size = 1
enable_prefix_caching = False
quant_policy = 0
max_position_embeddings = 2048
rope_scaling_factor = 0.0
use_logn_attn = 0

这些参数由模型属性和推理参数组成。模型属性包括层数、头数、维度等,它们是不可修改的

model_name = llama2
head_num = 32
kv_head_num = 32
vocab_size = 32000
num_layer = 32
inter_size = 11008
norm_eps = 1e-06
attn_bias = 0
start_id = 1
end_id = 2
rotary_embedding = 128
rope_theta = 10000.0
size_per_head = 128

与TurboMind 1.0相比,配置中的模型属性部分保持不变,而推理参数发生了变化。在接下来的部分中,我们将重点介绍推理参数。

数据类型#

weight_typegroup_size 是相关参数,不能修改

weight_type 表示权重的数据类型。目前支持 fp16int4int4 表示4位权重。当 weight_typeint4 时,group_size 表示使用 awq 量化权重时的组大小。在 LMDeploy 预构建包中,包含了 group size = 128 的内核。

批量大小#

最大批量大小仍然通过max_batch_size设置。但其默认值已从32更改为64,并且max_batch_size不再与cache_max_entry_count相关。

键/值缓存大小#

k/v 缓存内存由 cache_block_seq_lencache_max_entry_count 决定。

TurboMind 2.x 已经实现了分页注意力机制,以块的形式管理k/v缓存。

cache_block_seq_len 表示一个k/v块中的令牌序列长度,默认值为128。TurboMind根据以下公式计算k/v块的内存大小:

cache_block_seq_len * num_layer * kv_head_num * size_per_head * 2 * sizeof(kv_data_type)

对于llama2-7b模型,当将k/v存储为half类型时,一个k/v块的内存为:128 * 32 * 32 * 128 * 2 * sizeof(half) = 64MB

cache_max_entry_count 的含义根据其值而变化:

  • 当它是一个介于 (0, 1) 之间的小数时,cache_max_entry_count 表示 k/v 块使用的内存百分比。例如,如果 turbomind 在 A100-80G GPU 上启动,且 cache_max_entry_count0.5,则 k/v 块使用的总内存为 80 * 0.5 = 40G

  • 当lmdeploy大于v0.2.1时,cache_max_entry_count决定了k/v块的空闲内存百分比,默认为0.8。例如,在A100-80G GPU上运行13b模型的Turbomind,k/v块的内存将为(80 - 26) * 0.8 = 43.2G,利用了54G空闲内存的80%。

  • 当它是一个大于0的整数时,它表示k/v块的总数

cache_chunk_size 表示每次需要新的 k/v 缓存块时分配的 k/v 缓存块的大小。不同的值代表不同的含义:

  • 当它是一个大于0的整数时,会分配cache_chunk_size数量的k/v缓存块。

  • 当值为-1时,分配cache_max_entry_count数量的k/v缓存块。

  • 当值为0时,分配sqrt(cache_max_entry_count)数量的k/v缓存块。

前缀缓存开关#

前缀缓存功能可以通过设置enable_prefix_caching参数来控制。当设置为True时,表示该功能已启用,当设置为False时,表示该功能已禁用。默认值为False

前缀缓存功能主要适用于多个请求具有相同提示前缀(如系统提示)的场景。这个相同前缀部分的k/v块将被缓存并由多个请求重用,从而节省冗余计算的开销并提高推理性能。相同提示前缀越长,性能提升越大。

由于k/v块是前缀缓存中重用的最小粒度,如果相同的提示前缀小于一个块(前缀长度 < cache_block_seq_len),推理性能将不会有所提升。

KV量化和推理开关#

  • quant_policy=4 表示4位k/v量化和推理

  • quant_policy=8 表示8位k/v量化和推理

请参考kv quant获取详细指南。

长上下文切换#

通过设置 rope_scaling_factor = 1.0,您可以启用 RoPE 的动态 NTK 选项,该选项允许模型使用长文本输入和输出。

关于动态NTK的原理,请参考:

  1. https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases

  2. https://kexue.fm/archives/9675

你也可以通过设置use_logn_attn = 1来开启LogN attention scaling

TurboMind 1.0 配置#

llama-2-7b-chat模型为例,在TurboMind 1.0中,其config.ini内容如下:

[llama]
model_name = llama2
tensor_para_size = 1
head_num = 32
kv_head_num = 32
vocab_size = 32000
num_layer = 32
inter_size = 11008
norm_eps = 1e-06
attn_bias = 0
start_id = 1
end_id = 2
session_len = 4104
weight_type = fp16
rotary_embedding = 128
rope_theta = 10000.0
size_per_head = 128
group_size = 0
max_batch_size = 32
max_context_token_num = 4
step_length = 1
cache_max_entry_count = 48
cache_chunk_size = 1
use_context_fmha = 1
quant_policy = 0
max_position_embeddings = 2048
use_dynamic_ntk = 0
use_logn_attn = 0

这些参数由模型属性和推理参数组成。模型属性包括层数、头数、维度等,它们是不可修改的

model_name = llama2
head_num = 32
kv_head_num = 32
vocab_size = 32000
num_layer = 32
inter_size = 11008
norm_eps = 1e-06
attn_bias = 0
start_id = 1
end_id = 2
rotary_embedding = 128
rope_theta = 10000.0
size_per_head = 128

在接下来的部分中,我们将重点介绍推理参数。

数据类型#

weight_typegroup_size 是相关参数,不能修改

weight_type 表示权重的数据类型。目前支持 fp16int4int4 表示4位权重。当 weight_typeint4 时,group_size 表示使用 awq 量化权重时的组大小。在 LMDeploy 预构建包中,包含了 group size = 128 的内核。

批量大小#

max_batch_size 决定了推理过程中批次的最大大小。一般来说,批次大小越大,吞吐量越高。但要确保 max_batch_size <= cache_max_entry_count

键/值缓存大小#

TurboMind 根据 session_lencache_chunk_sizecache_max_entry_count 分配 k/v 缓存内存。

  • session_len 表示序列的最大长度,即上下文窗口的大小。

  • cache_chunk_size 表示在添加新序列时要分配的键/值序列的大小。

  • cache_max_entry_count 表示可以缓存的最大键/值序列数。

kv int8 开关#

在启动8bit k/v推理时,更改quant_policy = 4use_context_fmha = 0。请参考kv int8获取指南。

长时间上下文切换#

通过设置 use_dynamic_ntk = 1,您可以启用RoPE的动态NTK选项,这允许模型使用长文本输入和输出。

关于动态NTK的原理,请参考:

  1. https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases

  2. https://kexue.fm/archives/9675

你也可以通过设置use_logn_attn = 1来开启LogN attention scaling