candle_transformers/models/
with_tracing.rs1use candle::{Module, Result, Tensor};
2use candle_nn::VarBuilder;
3
4#[derive(Debug, Clone)]
5pub struct Embedding {
6 inner: candle_nn::Embedding,
7 span: tracing::Span,
8}
9
10impl Embedding {
11 pub fn new(d1: usize, d2: usize, vb: VarBuilder) -> Result<Self> {
12 let inner = candle_nn::embedding(d1, d2, vb)?;
13 let span = tracing::span!(tracing::Level::TRACE, "embedding");
14 Ok(Self { inner, span })
15 }
16
17 pub fn from_weights(weights: Tensor) -> Result<Self> {
18 let (_in_size, out_size) = weights.dims2()?;
19 let inner = candle_nn::Embedding::new(weights, out_size);
20 let span = tracing::span!(tracing::Level::TRACE, "embedding");
21 Ok(Self { inner, span })
22 }
23
24 pub fn embeddings(&self) -> &Tensor {
25 self.inner.embeddings()
26 }
27}
28
29impl Module for Embedding {
30 fn forward(&self, xs: &Tensor) -> Result<Tensor> {
31 let _enter = self.span.enter();
32 self.inner.forward(xs)
33 }
34}
35
36#[derive(Debug, Clone)]
37pub struct Linear {
38 inner: candle_nn::Linear,
39 span: tracing::Span,
40}
41
42impl Linear {
43 pub fn from_weights(weights: Tensor, bias: Option<Tensor>) -> Self {
44 let inner = candle_nn::Linear::new(weights, bias);
45 let span = tracing::span!(tracing::Level::TRACE, "linear");
46 Self { inner, span }
47 }
48}
49
50pub fn linear_b(d1: usize, d2: usize, b: bool, vb: VarBuilder) -> Result<Linear> {
51 let inner = candle_nn::linear_b(d1, d2, b, vb)?;
52 let span = tracing::span!(tracing::Level::TRACE, "linear");
53 Ok(Linear { inner, span })
54}
55
56pub fn linear(d1: usize, d2: usize, vb: VarBuilder) -> Result<Linear> {
57 let inner = candle_nn::linear(d1, d2, vb)?;
58 let span = tracing::span!(tracing::Level::TRACE, "linear");
59 Ok(Linear { inner, span })
60}
61
62pub fn linear_no_bias(d1: usize, d2: usize, vb: VarBuilder) -> Result<Linear> {
63 let inner = candle_nn::linear_no_bias(d1, d2, vb)?;
64 let span = tracing::span!(tracing::Level::TRACE, "linear");
65 Ok(Linear { inner, span })
66}
67
68impl Module for Linear {
69 fn forward(&self, xs: &Tensor) -> Result<Tensor> {
70 let _enter = self.span.enter();
71 self.inner.forward(xs)
72 }
73}
74
75#[derive(Debug, Clone)]
77pub struct Conv2d {
78 inner: candle_nn::Conv2d,
79 span: tracing::Span,
80}
81
82impl Module for Conv2d {
83 fn forward(&self, x: &Tensor) -> Result<Tensor> {
84 let _enter = self.span.enter();
85 self.inner.forward(x)
86 }
87}
88
89pub fn conv2d(
90 in_channels: usize,
91 out_channels: usize,
92 kernel_size: usize,
93 cfg: candle_nn::Conv2dConfig,
94 vs: candle_nn::VarBuilder,
95) -> Result<Conv2d> {
96 let span = tracing::span!(tracing::Level::TRACE, "conv2d");
97 let inner = candle_nn::conv2d(in_channels, out_channels, kernel_size, cfg, vs)?;
98 Ok(Conv2d { inner, span })
99}
100
101#[derive(Clone)]
103pub struct QMatMul {
104 inner: candle::quantized::QMatMul,
105 span: tracing::Span,
106}
107
108impl QMatMul {
109 pub fn new(
110 out_dim: usize,
111 in_dim: usize,
112 vb: crate::quantized_var_builder::VarBuilder,
113 ) -> Result<Self> {
114 let ws = vb.get((in_dim, out_dim), "weight")?;
115 let inner = candle::quantized::QMatMul::from_arc(ws)?;
116 let span = tracing::span!(tracing::Level::TRACE, "qmatmul");
117 Ok(Self { inner, span })
118 }
119
120 pub fn from_weights(ws: std::sync::Arc<candle::quantized::QTensor>) -> Result<Self> {
121 let inner = candle::quantized::QMatMul::from_arc(ws)?;
122 let span = tracing::span!(tracing::Level::TRACE, "qmatmul");
123 Ok(Self { inner, span })
124 }
125}
126
127impl Module for QMatMul {
128 fn forward(&self, xs: &Tensor) -> Result<Tensor> {
129 let _enter = self.span.enter();
130 self.inner.forward(xs)
131 }
132}
133
134impl std::fmt::Debug for QMatMul {
135 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
136 write!(f, "QMatMul")
137 }
138}
139
140#[derive(Clone, Debug)]
141pub struct LayerNorm {
142 inner: candle_nn::LayerNorm,
143 span: tracing::Span,
144}
145
146impl LayerNorm {
147 pub fn new(weight: Tensor, bias: Tensor, eps: f64) -> Self {
148 let inner = candle_nn::LayerNorm::new(weight, bias, eps);
149 let span = tracing::span!(tracing::Level::TRACE, "layer-norm");
150 Self { inner, span }
151 }
152}
153
154impl Module for LayerNorm {
155 fn forward(&self, xs: &Tensor) -> Result<Tensor> {
156 let _enter = self.span.enter();
157 self.inner.forward(xs)
158 }
159}
160
161pub fn layer_norm<C: Into<candle_nn::LayerNormConfig>>(
162 size: usize,
163 c: C,
164 vb: VarBuilder,
165) -> Result<LayerNorm> {
166 let inner = candle_nn::layer_norm(size, c, vb)?;
167 let span = tracing::span!(tracing::Level::TRACE, "layer-norm");
168 Ok(LayerNorm { inner, span })
169}
170
171#[derive(Debug, Clone)]
172pub struct RmsNorm {
173 inner: candle_nn::RmsNorm,
174 span: tracing::Span,
175}
176
177impl RmsNorm {
178 pub fn new(size: usize, eps: f64, vb: VarBuilder) -> Result<Self> {
179 let span = tracing::span!(tracing::Level::TRACE, "rms-norm");
180 let inner = candle_nn::rms_norm(size, eps, vb)?;
181 Ok(Self { inner, span })
182 }
183
184 pub fn forward_diff(&self, x: &Tensor) -> Result<Tensor> {
185 let _enter = self.span.enter();
186 self.inner.forward_diff(x)
187 }
188}
189
190impl Module for RmsNorm {
191 fn forward(&self, x: &Tensor) -> Result<Tensor> {
192 let _enter = self.span.enter();
193 self.inner.forward(x)
194 }
195}