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_type
和 group_size
是相关参数,不能修改。
weight_type
表示权重的数据类型。目前支持 fp16
和 int4
。int4
表示4位权重。当 weight_type
为 int4
时,group_size
表示使用 awq
量化权重时的组大小。在 LMDeploy 预构建包中,包含了 group size = 128
的内核。
批量大小#
最大批量大小仍然通过max_batch_size
设置。但其默认值已从32更改为64,并且max_batch_size
不再与cache_max_entry_count
相关。
键/值缓存大小#
k/v 缓存内存由 cache_block_seq_len
和 cache_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_count
为0.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的原理,请参考:
https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases
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_type
和 group_size
是相关参数,不能修改。
weight_type
表示权重的数据类型。目前支持 fp16
和 int4
。int4
表示4位权重。当 weight_type
为 int4
时,group_size
表示使用 awq
量化权重时的组大小。在 LMDeploy 预构建包中,包含了 group size = 128
的内核。
批量大小#
max_batch_size
决定了推理过程中批次的最大大小。一般来说,批次大小越大,吞吐量越高。但要确保 max_batch_size <= cache_max_entry_count
键/值缓存大小#
TurboMind 根据 session_len
、cache_chunk_size
和 cache_max_entry_count
分配 k/v 缓存内存。
session_len
表示序列的最大长度,即上下文窗口的大小。cache_chunk_size
表示在添加新序列时要分配的键/值序列的大小。cache_max_entry_count
表示可以缓存的最大键/值序列数。
kv int8 开关#
在启动8bit k/v推理时,更改quant_policy = 4
和use_context_fmha = 0
。请参考kv int8获取指南。
长时间上下文切换#
通过设置 use_dynamic_ntk = 1
,您可以启用RoPE的动态NTK选项,这允许模型使用长文本输入和输出。
关于动态NTK的原理,请参考:
https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases
https://kexue.fm/archives/9675
你也可以通过设置use_logn_attn = 1
来开启LogN attention scaling。