Files
2026-07-13 13:18:33 +08:00

79 lines
2.5 KiB
Python

# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0
# DeepSpeed Team
import torch
from ...model_implementations.parameter_base import ParameterBase, ParamList
"""
Moe Parameters
These parameters are compatible with any model inheriting from ``DSMoETransformerModelBase``.
"""
class MoEGatingWeightParameter(ParameterBase):
"""
Gating weight matrix.
"""
params: torch.Tensor
"""
Projection matrix from the input activations to the gate logits.
"""
def finalize(self) -> torch.Tensor:
return self.inference_model.transform_moe_gate_param(self.params)
class UnfusedMoEMLP1Parameter(ParameterBase):
"""
This container should be used when the experts are held in separate parameters
and need to be joined into a single group.
"""
experts: ParamList("n_experts") # noqa: F821
def finalize(self) -> torch.Tensor:
stacked_experts = torch.stack([p for p in self.experts], dim=0)
return self.inference_model.transform_moe_mlp_1_param(stacked_experts)
class UnfusedMoEMLP2Parameter(ParameterBase):
"""
This container should be used when the experts are held in separate parameters
and need to be joined into a single group.
"""
experts: ParamList("n_experts") # noqa: F821
def finalize(self) -> torch.Tensor:
stacked_experts = torch.stack([p for p in self.experts], dim=0)
return self.inference_model.transform_moe_mlp_2_param(stacked_experts)
class UnfusedMoEGatedMLPParameter(ParameterBase):
"""
MoE Parameter for a gated activation function in which the gating matrix is not
fused in the same parameter as the non-gating matrix.
This is a stacked version of the ``GatedMLPParameter``. Please see that class for more
documentation on the layout of the parameters.
"""
gating_experts: ParamList("n_experts") # noqa: F821
up_experts: ParamList("n_experts") # noqa: F821
def finalize(self) -> torch.Tensor:
transposed_experts = []
for gate, up in zip(self.gating_experts, self.up_experts):
assert gate.shape[0] == up.shape[0], "Gated MLP parameters must have the same number of neurons."
total_neurons = gate.shape[0] + up.shape[0]
fused_expert = torch.cat([gate, up], dim=-1).reshape(total_neurons, -1)
transposed_experts.append(fused_expert)
stacked_experts = torch.stack(transposed_experts, dim=0)
return self.inference_model.transform_moe_mlp_1_param(stacked_experts)