如何配置过去与现在缓冲区共享
过去与现在缓冲区共享是一种可用于节省内存和处理时间的优化技术。
当使用缓冲区共享时,过去和现在的 KV 缓存缓冲区指向同一块内存。
当不使用缓冲区共享时,现在的 KV 缓存缓冲区会在模型的每次前向传播之前重新分配,并复制到过去的 KV 缓存缓冲区中。
这一点在下图中有所体现

KV 缓存的大小取决于是否启用缓冲区共享。
KV 缓存的大小
当 past_present_share_buffer 为 true 时
过去 KV 缓存的大小 = 现在 KV 缓存的大小(字节)
$batch_size * num_key_value_heads * max_length * head_size $
例如,对于 4位量化的 Phi-4-mini-instruct 模型,当批次大小为 1 且最大长度为 4k 时,缓存大小为:$1 * 8 * 4096 * 128 = 4GB$
请注意,缓存的大小很大程度上由 max_length 参数的值决定。
当 past_present_share_buffer 为 false 时
过去 KV 缓存的大小(字节)= $batch_size * num_key_value_heads * past_sequence_length * head_size$
现在 KV 缓存的大小(字节)= $batch_size * num_key_value_heads * (past_sequence_length + 1) * head_size$
例如,对于 4位量化的 DeepSeek R1 Qwen 1.5B 模型,当批次大小为 1 且过去序列长度为 1k 时,过去缓存的大小为:$1 * 2 * 1024 * 128 = 256M$,现在缓存的大小为:$1 * 2 * 1025 * 128 = 257M$