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 Nf4Window {payload:Nf4ExpertPayload<B>,element_offset:usize},
43}
44impl<B:Backend> PackedExpertPayload<B> {
45 pub fn expert_range(&self) -> (usize,usize) {match self {Self::Nf4(value)=>(value.options.experts,value.options.expert_start),
47 Self::Nf4Window {payload,..}=>(payload.options.experts,payload.options.expert_start),
48 Self::Awq(value)=>(value.options.experts,value.options.expert_start)}}
49}
50#[derive(Debug)]
52pub enum PackedExpertAutodiffError<E:fmt::Debug> {
53 Native(E),
55 TrainableMetadata,
57 HigherDerivativeUnsupported,
59}
60impl<E:fmt::Debug> fmt::Display for PackedExpertAutodiffError<E> {
61 fn fmt(&self,f:&mut fmt::Formatter<'_>) -> fmt::Result {match self {Self::Native(error)=>write!(f,"native packed expert: {error:?}"),
62 Self::TrainableMetadata=>f.write_str("packed expert quantization metadata and bias must be frozen"),
63 Self::HigherDerivativeUnsupported=>f.write_str("native packed expert input VJPs provide first-order derivatives only")}}
64}
65impl<E:fmt::Debug> core::error::Error for PackedExpertAutodiffError<E> {}
66pub trait FrozenPackedExpertOps:Backend {
68 type PackedExpertError:fmt::Debug;
70 type PackedProjectionState:Clone+Send+fmt::Debug+'static;
72 type PackedSwiGluState:Clone+Send+fmt::Debug+'static;
74 fn packed_expert_forward(input:FloatTensor<Self>,global_ids:IntTensor<Self>,payload:PackedExpertPayload<Self>)
76 -> Result<(FloatTensor<Self>,Self::PackedProjectionState),Self::PackedExpertError>;
77 fn packed_expert_input_backward(state:Self::PackedProjectionState,gradient:FloatTensor<Self>) -> Result<FloatTensor<Self>,Self::PackedExpertError>;
79 fn packed_swiglu_forward(input:FloatTensor<Self>,global_ids:IntTensor<Self>,gate:PackedExpertPayload<Self>,up:PackedExpertPayload<Self>,down:PackedExpertPayload<Self>,retain_input:bool)
82 -> Result<(FloatTensor<Self>,Self::PackedSwiGluState),Self::PackedExpertError>;
83 fn packed_swiglu_input_backward(state:Self::PackedSwiGluState,gradient:FloatTensor<Self>) -> Result<FloatTensor<Self>,Self::PackedExpertError>;
85}