Skip to content

Commit 30507cb

Browse files
authored
Fix max_position_embeddings handling in NomicBertConfig and FlashNomicBertConfig (#876)
Signed-off-by: Alvaro Bartolome <36760800+alvarobartt@users.noreply.github.com>
1 parent 4f7dd3c commit 30507cb

3 files changed

Lines changed: 38 additions & 19 deletions

File tree

backends/candle/src/models/flash_nomic.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ pub struct FlashNomicBertModel {
196196
pool: Pool,
197197
pub device: Device,
198198

199-
max_trained_positions: u32,
199+
max_position_embeddings: u32,
200200
rotary_cache: (Tensor, Tensor),
201201
scaled_rotary_cache: Option<(Tensor, Tensor)>,
202202

@@ -233,14 +233,17 @@ impl FlashNomicBertModel {
233233
let embeddings = NomicBertEmbeddings::load(vb.clone(), config)?;
234234
let encoder = NomicBertEncoder::load(vb.pp("encoder"), config)?;
235235

236+
let max_position_embeddings = config
237+
.max_position_embeddings
238+
.unwrap_or(config.max_trained_positions.unwrap_or(2048));
239+
236240
let rotary_dim = encoder.layers[0].attention.attention_head_size;
237241
let inv_freqs = get_inv_freqs(rotary_dim, config.rotary_emb_base, vb.device(), None)?;
238242
let rotary_cache = get_cos_sin(config.n_positions, &inv_freqs, vb.dtype(), false)?;
239243

240244
let scaled_rotary_cache = if let Some(scaling_factor) = config.rotary_scaling_factor {
241245
let new_base = (config.rotary_emb_base
242-
* ((scaling_factor * config.n_positions as f32
243-
/ config.max_trained_positions as f32)
246+
* ((scaling_factor * config.n_positions as f32 / max_position_embeddings as f32)
244247
- (scaling_factor - 1.0)))
245248
.powi((rotary_dim as f32 / (rotary_dim as f32 - 2.0)) as i32);
246249
let inv_freqs = get_inv_freqs(rotary_dim, new_base, vb.device(), None)?;
@@ -258,7 +261,7 @@ impl FlashNomicBertModel {
258261
embeddings,
259262
encoder,
260263
pool,
261-
max_trained_positions: config.max_trained_positions as u32,
264+
max_position_embeddings: max_position_embeddings as u32,
262265
rotary_cache,
263266
scaled_rotary_cache,
264267
device: vb.device().clone(),
@@ -283,7 +286,7 @@ impl FlashNomicBertModel {
283286
)?;
284287

285288
let (cos, sin) = if self.scaled_rotary_cache.is_some()
286-
&& batch.max_length > self.max_trained_positions
289+
&& batch.max_length > self.max_position_embeddings
287290
{
288291
let cos = index_select(
289292
&self.scaled_rotary_cache.as_ref().unwrap().0,

backends/candle/src/models/nomic.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,13 @@ pub struct NomicConfig {
1818
pub mlp_fc1_bias: bool,
1919
pub mlp_fc2_bias: bool,
2020
pub rotary_scaling_factor: Option<f32>,
21-
#[serde(default = "default_max_trained_positions")]
22-
pub max_trained_positions: usize,
21+
22+
// NOTE: `max_trained_positions` is specific for NomicBERT when it required custom code, but
23+
// since Transformers v5 it's no longer required, and it now defines `max_position_embeddings`
24+
// in the `config.json` instead. Not included as an `alias` since both can be present at the
25+
// same time, see https://huggingface.co/nomic-ai/nomic-embed-text-v1.5/blob/e9b6763023c676ca8431644204f50c2b100d9aab/config.json#L33-L34
26+
pub max_trained_positions: Option<usize>,
27+
pub max_position_embeddings: Option<usize>,
2328

2429
pub moe_every_n_layers: Option<usize>,
2530
pub moe_normalize_expert_weights: Option<bool>,
@@ -39,10 +44,6 @@ pub struct NomicConfig {
3944
pub layer_norm_epsilon: f32,
4045
}
4146

42-
fn default_max_trained_positions() -> usize {
43-
2048
44-
}
45-
4647
impl NomicConfig {
4748
// For now, we only support these parameters
4849
pub fn valid(&self) -> bool {
@@ -668,7 +669,7 @@ pub struct NomicBertModel {
668669
dtype: DType,
669670

670671
rotary_dim: usize,
671-
max_trained_positions: u32,
672+
max_position_embeddings: u32,
672673
rotary_cache: (Tensor, Tensor),
673674
scaled_rotary_cache: Option<(Tensor, Tensor)>,
674675

@@ -702,15 +703,18 @@ impl NomicBertModel {
702703
let embeddings = NomicBertEmbeddings::load(vb.clone(), config)?;
703704
let encoder = NomicBertEncoder::load(vb.pp("encoder"), config)?;
704705

706+
let max_position_embeddings = config
707+
.max_position_embeddings
708+
.unwrap_or(config.max_trained_positions.unwrap_or(2048));
709+
705710
let rotary_dim = encoder.layers[0].attention.attention_head_size;
706711
let inv_freqs_tensor =
707712
get_inv_freqs(rotary_dim, config.rotary_emb_base, vb.device(), None)?;
708713
let rotary_cache = get_cos_sin(config.n_positions, &inv_freqs_tensor, vb.dtype(), true)?;
709714

710715
let scaled_rotary_cache = if let Some(scaling_factor) = config.rotary_scaling_factor {
711716
let new_base = (config.rotary_emb_base
712-
* ((scaling_factor * config.n_positions as f32
713-
/ config.max_trained_positions as f32)
717+
* ((scaling_factor * config.n_positions as f32 / max_position_embeddings as f32)
714718
- (scaling_factor - 1.0)))
715719
.powi((rotary_dim as f32 / (rotary_dim as f32 - 2.0)) as i32);
716720
let inv_freqs_tensor = get_inv_freqs(rotary_dim, new_base, vb.device(), None)?;
@@ -729,7 +733,7 @@ impl NomicBertModel {
729733
encoder,
730734
pool,
731735
rotary_dim,
732-
max_trained_positions: config.max_trained_positions as u32,
736+
max_position_embeddings: max_position_embeddings as u32,
733737
rotary_cache,
734738
scaled_rotary_cache,
735739
num_attention_heads: config.n_head,
@@ -855,7 +859,7 @@ impl NomicBertModel {
855859
Tensor::from_vec(input_lengths, (batch_size, 1), &self.device)?.to_dtype(self.dtype)?;
856860

857861
let (cos, sin) = if self.scaled_rotary_cache.is_some()
858-
&& batch.max_length > self.max_trained_positions
862+
&& batch.max_length > self.max_position_embeddings
859863
{
860864
let cos = self
861865
.scaled_rotary_cache

router/src/lib.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,19 @@ pub async fn run(
202202
}
203203
}
204204

205+
let max_position_embeddings = match config.max_position_embeddings {
206+
Some(max_position_embeddings) => max_position_embeddings,
207+
None => match config.max_trained_positions {
208+
Some(max_trained_positions) => max_trained_positions,
209+
None => anyhow::bail!("At least any of `max_position_embeddings` or `max_trained_positions` (only applies for NomicBERT), in that order of priority, should be defined in `config.json`."),
210+
},
211+
};
212+
205213
let base_input_length = match st_config {
206214
Some(config) => config.max_seq_length,
207215
None => {
208216
tracing::warn!("Could not find a Sentence Transformers config");
209-
config.max_position_embeddings - position_offset
217+
max_position_embeddings - position_offset
210218
}
211219
};
212220

@@ -461,8 +469,12 @@ fn get_backend_model_type(
461469
pub struct ModelConfig {
462470
pub architectures: Vec<String>,
463471
pub model_type: String,
464-
#[serde(alias = "n_positions")]
465-
pub max_position_embeddings: usize,
472+
// NOTE: `max_trained_positions` is specific for NomicBERT when it required custom code, but
473+
// since Transformers v5 it's no longer required, and it now defines `max_position_embeddings`
474+
// in the `config.json` instead. Not included as an `alias` since both can be present at the
475+
// same time, see https://huggingface.co/nomic-ai/nomic-embed-text-v1.5/blob/e9b6763023c676ca8431644204f50c2b100d9aab/config.json#L33-L34
476+
pub max_trained_positions: Option<usize>,
477+
pub max_position_embeddings: Option<usize>,
466478
#[serde(default)]
467479
pub pad_token_id: Option<usize>,
468480
pub id2label: Option<HashMap<String, String>>,

0 commit comments

Comments
 (0)