[性能]:基准测试vllm复制内核和pytorch索引复制

nc1teljy  于 3个月前  发布在  其他
关注(0)|答案(4)|浏览(30)

建议改进性能
我打开了这个问题来跟踪一个随机的想法:
目前我们有一个副本内核:
vllm/csrc/cache_kernels.cu
e288df0 的第214行到第220行
| | template<typenamescalar_t> |
| | __global__voidreshape_and_cache_flash_kernel( |
| | constscalar_t* restrict key, // [num_tokens, num_heads, head_size] |
| | constscalar_t* restrict value, // [num_tokens, num_heads, head_size] |
| | scalar_t* restrict k_cache, // [num_blocks, block_size, num_heads, head_size] |
| | scalar_t* restrict v_cache, // [num_blocks, block_size, num_heads, head_size] |
| | constint64_t* restrict slot_mapping, // [num_tokens] |
本质上,它执行以下向量复制:

key_cache_view = key_cache.reshape(-1, num_heads * head_size)
    value_cache_view = value_cache.reshape(-1, num_heads * head_size)
    key_view = key.reshape(-1, num_heads * head_size)
    value_view = value.reshape(-1, num_heads * head_size)
    key_cache_view[slot_mapping] = key_view
    value_cache_view[slot_mapping] = value_view

需要注意的是,我们在 slot_mapping 中有特殊值:-1 表示跳过复制。如果可能的话,我们可以在块管理器中为填充的 kv 预留一个插槽,然后我们可以使用 PyTorch 的索引复制,而不必自己维护一个单独的复制内核。
两个待办事项:

  • 在块管理器中为填充的 kv 预留插槽的开销是多少?
  • PyTorch 复制内核是否优于当前的手写内核?

@cadedaniel,他了解很多关于块管理器的知识;@WoosukKwon,他了解很多关于 CUDA 内核的知识。
性能回归报告:

  • 无响应*

性能讨论:

  • 无响应*

您当前的环境(如果您认为这是必要的):

  • 无响应*
hlswsv35

hlswsv351#

在我看来,这个想法很好。块管理器v2将很快支持空块的概念。我们可以将其扩展到在禁用滑动窗口时分配这样的空块。
https://github.com/vllm-project/vllm/pull/4545/files#diff-c5d7846ef0a9ff5a745d767aa28fea36bd34a97b1ef4c31ad9f8f48bcd9730b4R127

ct2axkht

ct2axkht2#

期待着那一天!

9njqaruj

9njqaruj3#

愿意帮助进行PyTorch内核的基准测试,与当前手写的版本进行比较。

xxhby3vn

xxhby3vn4#

我对比了vLLM KV缓存拷贝内核与pytorch索引拷贝的性能。似乎vLLM内核更快。
vLLM内核:4.4006272315979毫秒
Torch内核:11.914390563964844毫秒
我使用的基准测试脚本:
benchmark_kernel.txt

相关问题