fa_utils.py 3.2 KB
Newer Older
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
5
6
from typing import Optional

from vllm import envs
from vllm.logger import init_logger
7
from vllm.platforms import current_platform
8
9
10

logger = init_logger(__name__)

11
12
if current_platform.is_cuda():
    from vllm import _custom_ops as ops
13

14
    reshape_and_cache_flash = ops.reshape_and_cache_flash
15
    from vllm.vllm_flash_attn import flash_attn_varlen_func, get_scheduler_metadata
16
17
elif current_platform.is_xpu():
    from vllm._ipex_ops import ipex_ops as ops
18

19
20
21
22
    reshape_and_cache_flash = ops.reshape_and_cache_flash
    flash_attn_varlen_func = ops.flash_attn_varlen_func
    get_scheduler_metadata = ops.get_scheduler_metadata

23

24
def get_flash_attn_version(requires_alibi: bool = False) -> Optional[int]:
25
26
    # import here to avoid circular dependencies
    from vllm.platforms import current_platform
27

28
29
    if current_platform.is_xpu():
        return 2
30
31
    try:
        from vllm.vllm_flash_attn.flash_attn_interface import (
32
33
34
35
            fa_version_unsupported_reason,
            is_fa_version_supported,
        )

36
37
38
39
40
        device_capability = current_platform.get_device_capability()

        assert device_capability is not None

        # 1. default version depending on platform
41
42
43
        fa_version = (
            3 if (device_capability.major == 9 and is_fa_version_supported(3)) else 2
        )
44
45
46
47
48
49
50
51

        # 2. override if passed by environment
        if envs.VLLM_FLASH_ATTN_VERSION is not None:
            assert envs.VLLM_FLASH_ATTN_VERSION in [2, 3]
            fa_version = envs.VLLM_FLASH_ATTN_VERSION

        # 3. fallback for unsupported combinations
        if device_capability.major == 10 and fa_version == 3:
52
53
            logger.warning_once(
                "Cannot use FA version 3 on Blackwell platform "
54
55
                "defaulting to FA version 2."
            )
56
57
58
            fa_version = 2

        if requires_alibi and fa_version == 3:
59
60
61
            logger.warning_once(
                "Cannot use FA version 3 with ALiBi, defaulting to FA version 2."
            )
62
63
64
            fa_version = 2

        if not is_fa_version_supported(fa_version):
65
66
67
68
69
            logger.error(
                "Cannot use FA version %d is not supported due to %s",
                fa_version,
                fa_version_unsupported_reason(fa_version),
            )
70
71
72
73
74

        assert is_fa_version_supported(fa_version)
        return fa_version
    except (ImportError, AssertionError):
        return None
75
76
77


def flash_attn_supports_fp8() -> bool:
78
79
80
81
    return (
        get_flash_attn_version() == 3
        and current_platform.get_device_capability().major == 9
    )
82
83


84
85
def flash_attn_supports_mla():
    from vllm.platforms import current_platform
86

87
88
89
    if current_platform.is_cuda():
        try:
            from vllm.vllm_flash_attn.flash_attn_interface import (
90
91
92
93
94
                is_fa_version_supported,
            )

            return (
                is_fa_version_supported(3)
95
                and current_platform.get_device_capability()[0] == 9
96
            )
97
98
99
100
101
        except (ImportError, AssertionError):
            pass
    return False


102
103
def is_flash_attn_varlen_func_available() -> bool:
    return current_platform.is_cuda() or current_platform.is_xpu()