ruda_tensor/
packed_experts.rs1use crate::{Backend,grouped_nf4::Nf4ExpertPayload,tensor::{FloatTensor,IntTensor}};
3use core::fmt;
4
5#[derive(Clone,Copy,Debug,PartialEq,Eq)]
7pub struct AwqExpertOptions {
8 pub experts:usize,
10 pub expert_start:usize,
12 pub input_features:usize,
14 pub output_features:usize,
16 pub group_size:usize,
18}
19#[derive(Clone,Debug)]
21pub struct AwqExpertPayload<B:Backend> {
22 pub qweight:IntTensor<B>,
24 pub qzeros:IntTensor<B>,
26 pub scales:FloatTensor<B>,
28 pub bias:Option<FloatTensor<B>>,
30 pub options:AwqExpertOptions,
32}
33#[derive(Clone,Debug)]
35pub enum PackedExpertPayload<B:Backend> {
36 Nf4(Nf4ExpertPayload<B>),
38 Awq(AwqExpertPayload<B>),
40}
41impl<B:Backend> PackedExpertPayload<B> {
42 pub fn expert_range(&self) -> (usize,usize) {match self {Self::Nf4(value)=>(value.options.experts,value.options.expert_start),
44 Self::Awq(value)=>(value.options.experts,value.options.expert_start)}}
45}
46#[derive(Debug)]
48pub enum PackedExpertAutodiffError<E:fmt::Debug> {
49 Native(E),
51 TrainableMetadata,
53 HigherDerivativeUnsupported,
55}
56impl<E:fmt::Debug> fmt::Display for PackedExpertAutodiffError<E> {
57 fn fmt(&self,f:&mut fmt::Formatter<'_>) -> fmt::Result {match self {Self::Native(error)=>write!(f,"native packed expert: {error:?}"),
58 Self::TrainableMetadata=>f.write_str("packed expert quantization metadata and bias must be frozen"),
59 Self::HigherDerivativeUnsupported=>f.write_str("native packed expert input VJPs provide first-order derivatives only")}}
60}
61impl<E:fmt::Debug> core::error::Error for PackedExpertAutodiffError<E> {}
62pub trait FrozenPackedExpertOps:Backend {
64 type PackedExpertError:fmt::Debug;
66 type PackedProjectionState:Clone+Send+fmt::Debug+'static;
68 type PackedSwiGluState:Clone+Send+fmt::Debug+'static;
70 fn packed_expert_forward(input:FloatTensor<Self>,global_ids:IntTensor<Self>,payload:PackedExpertPayload<Self>)
72 -> Result<(FloatTensor<Self>,Self::PackedProjectionState),Self::PackedExpertError>;
73 fn packed_expert_input_backward(state:Self::PackedProjectionState,gradient:FloatTensor<Self>) -> Result<FloatTensor<Self>,Self::PackedExpertError>;
75 fn packed_swiglu_forward(input:FloatTensor<Self>,global_ids:IntTensor<Self>,gate:PackedExpertPayload<Self>,up:PackedExpertPayload<Self>,down:PackedExpertPayload<Self>,retain_input:bool)
78 -> Result<(FloatTensor<Self>,Self::PackedSwiGluState),Self::PackedExpertError>;
79 fn packed_swiglu_input_backward(state:Self::PackedSwiGluState,gradient:FloatTensor<Self>) -> Result<FloatTensor<Self>,Self::PackedExpertError>;
81}