Files
wehub-resource-sync 7ce4c8e27e
pre-commit / pre-run-check (push) Has been cancelled
pre-commit / pre-commit (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:55:37 +08:00

224 lines
5.6 KiB
Python

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
"""Compatibility wrapper for HPC API changes.
Users of vLLM should always import **only** these wrappers.
"""
import functools
import importlib
import importlib.util
import torch
from vllm.logger import init_logger
logger = init_logger(__name__)
@functools.cache
def has_hpc() -> bool:
"""Return `True` if hpc package is available."""
# Use find_spec to check if the module exists without importing it
# This avoids potential CUDA initialization side effects
if importlib.util.find_spec("hpc") is None:
logger.warning_once(
"HPC attention requires the hpc module to be installed. "
"Please install it from https://github.com/Tencent/hpc-ops"
)
return False
return True
# Remove 'torch._library.custom_ops':
# The output of this custom operator (1) must not also be an input to
# this custom operator and (2) may not alias any inputs to this custom
# operator or other returns. The most common way to trigger this error
# is if we have y = custom_op(x) and y and x are the same Tensor.
# Please instead return a clone of the offending output tensor(s) (e.g.
# return x.clone()) or refactor the custom operator to not return y.
# @torch.library.custom_op(
# "vllm::fuse_moe_impl",
# mutates_args=[],
# device_types="cuda",
# )
def fuse_moe_impl(
x: torch.Tensor,
gate_up_weight: torch.Tensor,
down_weight: torch.Tensor,
gate_up_scale: torch.Tensor,
down_scale: torch.Tensor,
act_and_mul_scale: torch.Tensor,
topk_ids: torch.Tensor,
topk_scale: torch.Tensor,
rank_ep: int,
num_expert_total: int,
use_bf16_mul: bool = True,
shared_output: torch.Tensor = None,
output: torch.Tensor = None,
) -> torch.Tensor:
from hpc import fuse_moe as fuse_moe_
return fuse_moe_(
x,
gate_up_weight,
down_weight,
gate_up_scale,
down_scale,
act_and_mul_scale,
topk_ids,
topk_scale,
rank_ep,
num_expert_total,
use_bf16_mul,
shared_output,
output=output,
)
# @torch.library.register_fake(
# "vllm::fuse_moe_impl",
# )
def fuse_moe_impl_fake(
x: torch.Tensor,
gate_up_weight: torch.Tensor,
down_weight: torch.Tensor,
gate_up_scale: torch.Tensor,
down_scale: torch.Tensor,
act_and_mul_scale: torch.Tensor,
topk_ids: torch.Tensor,
topk_scale: torch.Tensor,
rank_ep: int,
num_expert_total: int,
use_bf16_mul: bool = True,
shared_output: torch.Tensor = None,
output: torch.Tensor = None,
) -> torch.Tensor:
return torch.empty_like(x)
def hpc_fuse_moe(
x: torch.Tensor,
gate_up_weight: torch.Tensor,
down_weight: torch.Tensor,
gate_up_scale: torch.Tensor,
down_scale: torch.Tensor,
act_and_mul_scale: torch.Tensor,
topk_ids: torch.Tensor,
topk_scale: torch.Tensor,
rank_ep: int,
num_expert_total: int,
use_bf16_mul: bool = True,
shared_output: torch.Tensor = None,
output: torch.Tensor = None,
) -> torch.Tensor:
return fuse_moe_impl(
x,
gate_up_weight,
down_weight,
gate_up_scale,
down_scale,
act_and_mul_scale,
topk_ids,
topk_scale,
rank_ep,
num_expert_total,
use_bf16_mul,
shared_output,
output=output,
)
# @torch.library.custom_op(
# "vllm::fuse_moe_blockwise_impl",
# mutates_args=[],
# device_types="cuda",
# )
def fuse_moe_blockwise_impl(
x: torch.Tensor,
x_scale: torch.Tensor,
gate_up_weight: torch.Tensor,
gate_up_weight_scale: torch.Tensor,
down_weight: torch.Tensor,
down_weight_scale: torch.Tensor,
topk_ids: torch.Tensor,
topk_scale: torch.Tensor,
rank_ep: int,
num_expert_total: int,
shared_output: torch.Tensor = None,
output: torch.Tensor = None,
) -> torch.Tensor:
from hpc import fuse_moe_blockwise as fuse_moe_blockwise_
return fuse_moe_blockwise_(
x,
x_scale,
gate_up_weight,
gate_up_weight_scale,
down_weight,
down_weight_scale,
topk_ids,
topk_scale,
rank_ep,
num_expert_total,
shared_output,
output=output,
)
# @torch.library.register_fake(
# "vllm::fuse_moe_blockwise_impl",
# )
def fuse_moe_blockwise_impl_fake(
x: torch.Tensor,
x_scale: torch.Tensor,
gate_up_weight: torch.Tensor,
gate_up_weight_scale: torch.Tensor,
down_weight: torch.Tensor,
down_weight_scale: torch.Tensor,
topk_ids: torch.Tensor,
topk_scale: torch.Tensor,
rank_ep: int,
num_expert_total: int,
shared_output: torch.Tensor = None,
output: torch.Tensor = None,
) -> torch.Tensor:
return torch.empty_like(x)
def hpc_fuse_moe_blockwise(
x: torch.Tensor,
x_scale: torch.Tensor,
gate_up_weight: torch.Tensor,
gate_up_weight_scale: torch.Tensor,
down_weight: torch.Tensor,
down_weight_scale: torch.Tensor,
topk_ids: torch.Tensor,
topk_scale: torch.Tensor,
rank_ep: int,
num_expert_total: int,
shared_output: torch.Tensor = None,
output: torch.Tensor = None,
) -> torch.Tensor:
return fuse_moe_blockwise_impl(
x,
x_scale,
gate_up_weight,
gate_up_weight_scale,
down_weight,
down_weight_scale,
topk_ids,
topk_scale,
rank_ep,
num_expert_total,
shared_output,
output=output,
)
__all__ = [
"has_hpc",
"hpc_fuse_moe",
"hpc_fuse_moe_blockwise",
]