From 301a8290afa6bacbdde9c59bc40dfc4fc75265bb Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Fri, 14 Jun 2024 16:48:34 +0800 Subject: [PATCH 01/34] first commit --- mistralrs-core/src/pipeline/vision.rs | 3 +- mistralrs-core/src/pipeline/vision_loaders.rs | 35 +++++++++ mistralrs/examples/llava/main.rs | 72 +++++++++++++++++++ 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 mistralrs/examples/llava/main.rs diff --git a/mistralrs-core/src/pipeline/vision.rs b/mistralrs-core/src/pipeline/vision.rs index e1ea93631..75a88257a 100644 --- a/mistralrs-core/src/pipeline/vision.rs +++ b/mistralrs-core/src/pipeline/vision.rs @@ -1,5 +1,5 @@ use super::cache_manager::DefaultCacheManager; -use super::vision_loaders::{Phi3VLoader, VisionLoaderType}; +use super::vision_loaders::{LLaVALoader, Phi3VLoader, VisionLoaderType}; use super::{ get_model_paths, get_xlora_paths, AdapterActivationMixin, Cache, CacheManager, CacheManagerMixin, GeneralMetadata, IsqPipelineMixin, Loader, MetadataMixin, ModelCategory, @@ -97,6 +97,7 @@ impl VisionLoaderBuilder { let loader: Box = match loader { VisionLoaderType::Phi3V => Box::new(Phi3VLoader), + VisionLoaderType::LLaVA => Box::new(LLaVALoader) }; Box::new(VisionLoader { inner: loader, diff --git a/mistralrs-core/src/pipeline/vision_loaders.rs b/mistralrs-core/src/pipeline/vision_loaders.rs index de5fb3b43..3b78c95e6 100644 --- a/mistralrs-core/src/pipeline/vision_loaders.rs +++ b/mistralrs-core/src/pipeline/vision_loaders.rs @@ -38,6 +38,8 @@ pub trait VisionModelLoader { pub enum VisionLoaderType { #[serde(rename = "phi3v")] Phi3V, + #[serde(rename = "llava")] + LLaVA, } impl FromStr for VisionLoaderType { @@ -45,6 +47,7 @@ impl FromStr for VisionLoaderType { fn from_str(s: &str) -> Result { match s { "phi3v" => Ok(Self::Phi3V), + "llava" => Ok(Self::LLaVA), a => Err(format!("Unknown architecture `{a}`")), } } @@ -90,3 +93,35 @@ impl VisionModelLoader for Phi3VLoader { Phi3Processor::new_processor(processor_config, preprocessor_config) } } + +// ======================== LLaVA loader + +/// [`VisionLoader`] for a LLaVA Vision model. +/// +/// [`VisionLoader`]: https://ericlbuehler.github.io/mistral.rs/mistralrs/struct.VisionLoader.html +pub struct LLaVALoader; +impl VisionModelLoader for LLaVALoader { + fn load( + &self, + config: &str, + use_flash_attn: bool, + vb: VarBuilder, + normal_loading_metadata: NormalLoadingMetadata, + ) -> Result> { + println!("config: {}", config); + todo!() + } + fn is_gptx(&self) -> bool { + false + } + fn get_config_repr(&self, _config: &str, _use_flash_attn: bool) -> Result> { + unimplemented!() + } + fn get_processor( + &self, + _processor_config: Option, + _preprocessor_config: PreProcessorConfig, + ) -> Arc { + unimplemented!() + } +} \ No newline at end of file diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs new file mode 100644 index 000000000..a4f6d9f47 --- /dev/null +++ b/mistralrs/examples/llava/main.rs @@ -0,0 +1,72 @@ +use either::Either; +use image::{ColorType, DynamicImage}; +use indexmap::IndexMap; +use std::sync::Arc; +use tokio::sync::mpsc::channel; + +use mistralrs::{ + Constraint, Device, DeviceMapMetadata, MistralRs, MistralRsBuilder, ModelDType, NormalRequest, + Request, RequestMessage, Response, SamplingParams, SchedulerMethod, TokenSource, + VisionLoaderBuilder, VisionLoaderType, VisionSpecificConfig, +}; + +fn setup() -> anyhow::Result> { + // Select a Mistral model + let loader = VisionLoaderBuilder::new( + VisionSpecificConfig { + use_flash_attn: false, + repeat_last_n: 64, + }, + None, + None, + Some("/root/autodl-tmp/cache/huggingface/hub/models--llava-hf--llava-v1.6-vicuna-7b-hf/snapshots/0524afe4453163103dcefe78eb0a58b3f6424eac".to_string()), + ) + .build(VisionLoaderType::LLaVA); + // Load, into a Pipeline + + let pipeline = loader.load_model_from_hf( + None, + TokenSource::CacheToken, + &ModelDType::Auto, + &Device::cuda_if_available(0)?, + false, + DeviceMapMetadata::dummy(), + None, + )?; + // Create the MistralRs, which is a runner + Ok(MistralRsBuilder::new(pipeline, SchedulerMethod::Fixed(5.try_into().unwrap())).build()) +} + +fn main() -> anyhow::Result<()> { + let mistralrs = setup()?; + + let (tx, mut rx) = channel(10_000); + let request = Request::Normal(NormalRequest { + messages: RequestMessage::VisionChat { + images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], + messages: vec![IndexMap::from([ + ("role".to_string(), Either::Left("user".to_string())), + ( + "content".to_string(), + Either::Left("<|image_1|>\nWhat is shown in this image?".to_string()), + ), + ])], + }, + sampling_params: SamplingParams::default(), + response: tx, + return_logprobs: false, + is_streaming: false, + id: 0, + constraint: Constraint::None, + suffix: None, + adapters: None, + }); + mistralrs.get_sender().blocking_send(request)?; + + let response = rx.blocking_recv().unwrap(); + match response { + Response::Done(c) => println!("Text: {}", c.choices[0].message.content), + _ => unreachable!(), + } + Ok(()) +} From 5bf944b0a2e411d50ef6952fdd725c97da9b5c57 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Tue, 18 Jun 2024 17:10:12 +0800 Subject: [PATCH 02/34] continue construction --- mistralrs-core/src/pipeline/vision_loaders.rs | 20 +- mistralrs-core/src/vision_models/llava.rs | 241 ++++++++++++++++++ mistralrs-core/src/vision_models/mod.rs | 1 + 3 files changed, 253 insertions(+), 9 deletions(-) create mode 100644 mistralrs-core/src/vision_models/llava.rs diff --git a/mistralrs-core/src/pipeline/vision_loaders.rs b/mistralrs-core/src/pipeline/vision_loaders.rs index 3b78c95e6..894586199 100644 --- a/mistralrs-core/src/pipeline/vision_loaders.rs +++ b/mistralrs-core/src/pipeline/vision_loaders.rs @@ -10,6 +10,7 @@ use pyo3::pyclass; use serde::Deserialize; use super::{NormalLoadingMetadata, Processor, ProcessorCreator, VisionModel}; +use crate::vision_models::llava::Config as LLaVAConfig; use crate::vision_models::phi3::{Config as Phi3Config, Model as Phi3}; use crate::vision_models::phi3_inputs_processor::Phi3Processor; use crate::vision_models::preprocessor_config::PreProcessorConfig; @@ -103,19 +104,20 @@ pub struct LLaVALoader; impl VisionModelLoader for LLaVALoader { fn load( &self, - config: &str, - use_flash_attn: bool, - vb: VarBuilder, - normal_loading_metadata: NormalLoadingMetadata, + _config: &str, + _use_flash_attn: bool, + _vb: VarBuilder, + _normal_loading_metadata: NormalLoadingMetadata, ) -> Result> { - println!("config: {}", config); - todo!() + //println!("config: {}", config); + unimplemented!() } fn is_gptx(&self) -> bool { false } - fn get_config_repr(&self, _config: &str, _use_flash_attn: bool) -> Result> { - unimplemented!() + fn get_config_repr(&self, config: &str, _use_flash_attn: bool) -> Result> { + let config: LLaVAConfig = serde_json::from_str(config)?; + Ok(Box::new(config)) } fn get_processor( &self, @@ -124,4 +126,4 @@ impl VisionModelLoader for LLaVALoader { ) -> Arc { unimplemented!() } -} \ No newline at end of file +} diff --git a/mistralrs-core/src/vision_models/llava.rs b/mistralrs-core/src/vision_models/llava.rs new file mode 100644 index 000000000..8369a9d48 --- /dev/null +++ b/mistralrs-core/src/vision_models/llava.rs @@ -0,0 +1,241 @@ +use candle_core::{bail, Device, IndexOp, Result, Tensor}; +use candle_nn::{linear, seq, Activation, Module, Sequential, VarBuilder}; +use serde::Deserialize; + +use crate::pipeline::NormalLoadingMetadata; +use crate::serde_default_fn; + +use crate::models::llama::Config as LLaMAConfig; +use crate::models::llama::Llama; +use crate::vision_models::clip::ClipConfig; + +use super::clip::{Activation as ClipActivation, ClipVisionTransformer}; + +#[derive(Debug, Clone, Deserialize)] +pub struct Config { + pub architectures: Vec, + pub ignore_index: isize, + pub image_grid_pinpoints: Vec<(u32, u32)>, + pub image_token_index: isize, + pub model_type: String, + pub projector_hidden_act: String, + pub text_config: LLaVATextConfig, + pub torch_dtype: String, + pub use_image_newline_parameter: bool, + pub vision_config: LLaVAVisionConfig, + pub vision_feature_layer: isize, + pub vision_feature_select_strategy: String, + pub vocab_size: usize, + #[serde(default = "default_use_flash_attn")] + pub use_flash_attn: bool, +} + +serde_default_fn!(bool, default_use_flash_attn, false); + +#[derive(Deserialize, Debug, Clone)] +pub struct LLaVATextConfig { + pub architectures: Vec, + #[serde(default = "default_hidden_size")] + pub hidden_size: usize, + #[serde(default = "default_intermediate_size")] + pub intermediate_size: usize, + #[serde(default = "default_max_length")] + pub max_length: usize, + pub max_position_embeddings: usize, + pub model_type: String, + #[serde(default = "default_num_attention_heads")] + pub num_attention_heads: usize, + #[serde(default = "default_num_hidden_layers")] + pub num_hidden_layers: usize, + #[serde(default = "default_num_key_value_heads")] + pub num_key_value_heads: usize, + pub pad_token_id: usize, + pub rms_norm_eps: f64, + #[serde(default = "default_rope_theta")] + pub rope_theta: f32, + pub torch_dtype: String, + #[serde(default = "default_use_cache")] + pub use_cache: bool, + pub vocab_size: usize, +} + +serde_default_fn!(usize, default_num_hidden_layers, 32); +serde_default_fn!(bool, default_use_cache, true); +serde_default_fn!(usize, default_hidden_size, 4096); +serde_default_fn!(usize, default_intermediate_size, 11008); +serde_default_fn!(usize, default_max_length, 4096); +serde_default_fn!(usize, default_num_attention_heads, 32); +serde_default_fn!(usize, default_num_key_value_heads, 32); +serde_default_fn!(f32, default_rope_theta, 10000.0); + +#[derive(Deserialize, Debug, Clone)] +pub struct LLaVAVisionConfig { + pub hidden_size: usize, + pub image_size: usize, + pub intermediate_size: usize, + pub model_type: String, + pub num_attention_heads: usize, + pub num_hidden_layers: usize, + pub patch_size: usize, + pub projection_dim: usize, + pub vocab_size: usize, +} + +impl Config { + fn to_llama_config(&self) -> LLaMAConfig { + LLaMAConfig { + hidden_size: self.text_config.hidden_size, + intermediate_size: self.text_config.intermediate_size, + vocab_size: self.vocab_size, + num_hidden_layers: self.text_config.num_hidden_layers, + num_attention_heads: self.text_config.num_attention_heads, + num_key_value_heads: self.text_config.num_key_value_heads, + use_flash_attn: self.use_flash_attn, + rms_norm_eps: self.text_config.rms_norm_eps, + rope_theta: self.text_config.rope_theta, + max_position_embeddings: self.text_config.max_position_embeddings, + } + } + + fn to_clip_config(&self) -> ClipConfig { + ClipConfig { + hidden_size: self.vision_config.hidden_size, + intermediate_size: self.vision_config.intermediate_size, + projection_dim: self.vision_config.projection_dim, + num_hidden_layers: self.vision_config.num_hidden_layers, + num_attention_heads: self.vision_config.num_attention_heads, + num_channels: 3, + image_size: self.vision_config.image_size, + patch_size: self.vision_config.patch_size, + hidden_act: ClipActivation::QuickGelu, + layer_norm_eps: 1e-5, // default value, seem useless + } + } +} + +pub struct MMProjector { + pub modules: Sequential, +} + +impl MMProjector { + pub fn new(vb: &VarBuilder, config: &Config) -> Result { + let mut modules = seq().add(linear( + 1024, + config.text_config.hidden_size, + vb.pp("multi_modal_projector.linear_1"), + )?); + match config.projector_hidden_act.as_str() { + "gelu" => { + modules = modules.add(Activation::Gelu); + } + _ => { + bail!( + "Unsupporg projector hidden act: {}", + config.projector_hidden_act + ); + } + } + modules = modules.add(linear( + config.text_config.hidden_size, + config.text_config.hidden_size, + vb.pp("multi_modal_projector.linear_2"), + )?); + Ok(Self { modules }) + } + + pub fn forward(&self, x: &Tensor) -> Result { + self.modules.forward(x) + } +} + +pub struct ClipVisionTower { + model: ClipVisionTransformer, + select_layer: isize, + select_feature_method: String, + config: ClipConfig, +} + +impl ClipVisionTower { + pub fn new( + vb: VarBuilder, + select_layer: isize, + select_feature_method: &str, + config: &ClipConfig, + ) -> Result { + let model = ClipVisionTransformer::new(vb, config)?; + Ok(Self { + model, + select_layer, + select_feature_method: select_feature_method.to_string(), + config: config.clone(), + }) + } + + pub fn forward(&self, x: &Tensor) -> Result { + let result = self.model.forward_get_hidden_states(x)?; + let index = result.len() as isize + self.select_layer; + let result = result[index as usize].clone(); + if self.select_feature_method == "cls_patch" { + Ok(result) + } else { + result.i((.., 1..)) + } + } + + pub fn num_patches_per_side(&self) -> usize { + self.config.image_size / self.config.patch_size + } +} + +pub struct Model { + pub clip_vision_tower: ClipVisionTower, + pub image_newline: Tensor, + pub mm_projector: MMProjector, + pub llama: Llama, + config: Config, + device: Device, +} + +impl Model { + pub fn new( + config: &Config, + vb: VarBuilder, + is_gptx: bool, + normal_loading_metadata: NormalLoadingMetadata, + ) -> Result { + let device = normal_loading_metadata.real_device.clone(); + let llama_config = config.to_llama_config(); + let clip_config = config.to_clip_config(); + let mm_projector = MMProjector::new(&vb, config)?; + let clip_vision_tower = ClipVisionTower::new( + vb.pp("vision_tower.vision_model"), + config.vision_feature_layer, + &config.vision_feature_select_strategy, + &clip_config, + )?; + let image_newline = vb + .get(&[config.text_config.hidden_size], "image_newline")? + .to_device(&device)?; + let llama = Llama::new( + &llama_config, + vb.pp("language_model"), + is_gptx, + normal_loading_metadata, + )?; + Ok(Self { + clip_vision_tower, + image_newline, + mm_projector, + llama, + config: config.clone(), + device, + }) + } + + pub fn encode_images(&self, x: &Tensor) -> Result { + let image_features = self.clip_vision_tower.forward(x)?; + let image_features = self.mm_projector.forward(&image_features)?; + Ok(image_features) + } + +} diff --git a/mistralrs-core/src/vision_models/mod.rs b/mistralrs-core/src/vision_models/mod.rs index 015b35fad..0c45e016c 100644 --- a/mistralrs-core/src/vision_models/mod.rs +++ b/mistralrs-core/src/vision_models/mod.rs @@ -8,6 +8,7 @@ pub(crate) mod phi3; pub(crate) mod phi3_inputs_processor; pub(crate) mod preprocessor_config; pub(crate) mod processor_config; +pub (crate) mod llava; pub struct ModelInputs { pub input_ids: Tensor, From 0a4e601fa1ca78cbe03ec5c46082faca6bc57721 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Wed, 19 Jun 2024 23:15:35 +0800 Subject: [PATCH 03/34] continue working --- mistralrs-core/src/layers_masker.rs | 38 ++++-- mistralrs-core/src/models/llama.rs | 41 +++++++ mistralrs-core/src/pipeline/vision_loaders.rs | 14 +-- .../vision_models/llava_inputs_processor.rs | 41 +++++++ .../vision_models/{llava.rs => llava_next.rs} | 112 +++++++++++++++++- mistralrs-core/src/vision_models/mod.rs | 3 +- 6 files changed, 230 insertions(+), 19 deletions(-) create mode 100644 mistralrs-core/src/vision_models/llava_inputs_processor.rs rename mistralrs-core/src/vision_models/{llava.rs => llava_next.rs} (60%) diff --git a/mistralrs-core/src/layers_masker.rs b/mistralrs-core/src/layers_masker.rs index 586d67b9f..99633ac8d 100644 --- a/mistralrs-core/src/layers_masker.rs +++ b/mistralrs-core/src/layers_masker.rs @@ -76,31 +76,31 @@ impl CausalMasker { return Ok(k_cache_1.dims()[2]); } - pub fn make_causal_mask_as_attn_bias( + fn _make_causal_mask_as_attn_bias( &self, - input_ids: &Tensor, + b_sz: usize, + tgt_len: usize, + device: &Device, cache: &[Option<(Tensor, Tensor)>], dtype: DType, n_attn_heads: usize, ) -> Result> { let past_kv_len = self.calculate_past_kv_len(cache)?; - let (b_sz, tgt_len) = input_ids.dims2()?; if tgt_len == 1 { return Ok(None); } let causal_mask = { - let mask = self.make_mask(tgt_len, past_kv_len, input_ids.device())?; + let mask = self.make_mask(tgt_len, past_kv_len, device)?; let mask = mask .expand((b_sz, 1, tgt_len, tgt_len + past_kv_len))? .to_dtype(DType::U8)?; Some(mask) }; - let zero = Tensor::new(0.0f32, input_ids.device())?; + let zero = Tensor::new(0.0f32, device)?; let causal_mask: Option> = causal_mask.map(|mask| { - let mask = - mask.broadcast_as((mask.dims()[0], n_attn_heads, mask.dims()[2], mask.dims()[3]))?; + let mask = mask.broadcast_as((b_sz, n_attn_heads, tgt_len, tgt_len + past_kv_len))?; // Mask: 1 means use from x (add 0.0), 0 means mask out (add -inf) let mask = masked_fill( &zero.to_dtype(dtype)?.broadcast_as(mask.shape())?, @@ -118,6 +118,30 @@ impl CausalMasker { Ok(mask) } + pub fn make_causal_mask_as_attn_bias( + &self, + input_ids: &Tensor, + cache: &[Option<(Tensor, Tensor)>], + dtype: DType, + n_attn_heads: usize, + ) -> Result> { + let (b_sz, tgt_len) = input_ids.dims2()?; + let device = input_ids.device(); + self._make_causal_mask_as_attn_bias(b_sz, tgt_len, device, cache, dtype, n_attn_heads) + } + + pub fn make_causal_mask_as_attn_bias_with_embed_tensor( + &self, + embed: &Tensor, + cache: &[Option<(Tensor, Tensor)>], + dtype: DType, + n_attn_heads: usize, + ) -> Result> { + let (b_sz, tgt_len, _) = embed.dims3()?; + let device = embed.device(); + self._make_causal_mask_as_attn_bias(b_sz, tgt_len, device, cache, dtype, n_attn_heads) + } + pub fn make_causal_mask_with_sliding_window_as_attn_bias( &self, input_ids: &Tensor, diff --git a/mistralrs-core/src/models/llama.rs b/mistralrs-core/src/models/llama.rs index ab2b1df5a..3bf640fbc 100644 --- a/mistralrs-core/src/models/llama.rs +++ b/mistralrs-core/src/models/llama.rs @@ -254,6 +254,47 @@ pub struct Llama { } impl Llama { + // required by LLaVA + pub fn embed(&self, x: &Tensor) -> Result { + self.wte.forward(x) + } + // required by LLaVA + pub fn forward_input_embed( + &self, + input_embed: &Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + ) -> Result { + let (_, seq_len, _) = input_embed.dims3()?; + let mut x = input_embed.clone(); + let mut cache = self.kv_cache.lock(); + let mask = CausalMasker.make_causal_mask_as_attn_bias_with_embed_tensor( + &x, + &cache, + x.dtype(), + self.blocks[0].attn.num_attention_heads, + )?; + for (block_idx, block) in self.blocks.iter().enumerate() { + x = self.mapper.map(x, block_idx)?; + x = block.forward( + &x, + &mask.clone().map(|m| m.to_device(x.device()).unwrap()), + seqlen_offsets, + start_offsets_kernel.clone(), + block_idx, + &mut cache, + )?; + } + x = x.to_device(&self.device)?; + x = self.ln_f.forward(&x)?; + if matches!(self.lm_head, QMatMul::QTensor(_)) { + x = x.to_dtype(DType::F32)?; + } + let logits = MatMul.qmatmul(&x, &self.lm_head)?; + extract_logits(&logits, context_lens) + } + pub fn forward( &mut self, input_ids: &Tensor, diff --git a/mistralrs-core/src/pipeline/vision_loaders.rs b/mistralrs-core/src/pipeline/vision_loaders.rs index 894586199..23b2b4b6f 100644 --- a/mistralrs-core/src/pipeline/vision_loaders.rs +++ b/mistralrs-core/src/pipeline/vision_loaders.rs @@ -10,7 +10,7 @@ use pyo3::pyclass; use serde::Deserialize; use super::{NormalLoadingMetadata, Processor, ProcessorCreator, VisionModel}; -use crate::vision_models::llava::Config as LLaVAConfig; +use crate::vision_models::llava_next::Config as LLaVAConfig; use crate::vision_models::phi3::{Config as Phi3Config, Model as Phi3}; use crate::vision_models::phi3_inputs_processor::Phi3Processor; use crate::vision_models::preprocessor_config::PreProcessorConfig; @@ -39,8 +39,8 @@ pub trait VisionModelLoader { pub enum VisionLoaderType { #[serde(rename = "phi3v")] Phi3V, - #[serde(rename = "llava")] - LLaVA, + #[serde(rename = "llava_next")] + LLaVANext, } impl FromStr for VisionLoaderType { @@ -48,7 +48,7 @@ impl FromStr for VisionLoaderType { fn from_str(s: &str) -> Result { match s { "phi3v" => Ok(Self::Phi3V), - "llava" => Ok(Self::LLaVA), + "llava_next" => Ok(Self::LLaVANext), a => Err(format!("Unknown architecture `{a}`")), } } @@ -97,11 +97,11 @@ impl VisionModelLoader for Phi3VLoader { // ======================== LLaVA loader -/// [`VisionLoader`] for a LLaVA Vision model. +/// [`VisionLoader`] for a LLaVA-Next Vision model. /// /// [`VisionLoader`]: https://ericlbuehler.github.io/mistral.rs/mistralrs/struct.VisionLoader.html -pub struct LLaVALoader; -impl VisionModelLoader for LLaVALoader { +pub struct LLaVANextLoader; +impl VisionModelLoader for LLaVANextLoader { fn load( &self, _config: &str, diff --git a/mistralrs-core/src/vision_models/llava_inputs_processor.rs b/mistralrs-core/src/vision_models/llava_inputs_processor.rs new file mode 100644 index 000000000..3b4c18bb6 --- /dev/null +++ b/mistralrs-core/src/vision_models/llava_inputs_processor.rs @@ -0,0 +1,41 @@ +pub fn get_anyres_image_grid_shape( + image_size: (u32, u32), + grid_pinpoints: &[(u32, u32)], + patch_size: u32, +) -> (u32, u32) { + let (width, height) = select_best_resolution(image_size, grid_pinpoints); + (width / patch_size, height / patch_size) +} + +pub fn select_best_resolution( + original_size: (u32, u32), + possible_resolutions: &[(u32, u32)], +) -> (u32, u32) { + let (original_width, original_height) = original_size; + let mut best_fit = (0, 0); + let original_width_f = original_width as f32; + let original_height_f = original_height as f32; + let mut max_effective_resolution = 0_u32; + let mut min_wasted_resolution = u32::MAX; + for (width, height) in possible_resolutions { + let width_f = *width as f32; + let height_f = *height as f32; + let scale = (width_f / original_width_f).min(height_f / original_height_f); + let (downscaled_width, downscaled_height) = ( + (original_width_f * scale) as u32, + (original_height_f * scale) as u32, + ); + let effective_resolution = + std::cmp::min((*width) * (*height), downscaled_width * downscaled_height); + let wasted_resolution = (*width) * (*height) - effective_resolution; + if effective_resolution > max_effective_resolution + || (effective_resolution == max_effective_resolution + && wasted_resolution < min_wasted_resolution) + { + best_fit = (*width, *height); + max_effective_resolution = effective_resolution; + min_wasted_resolution = wasted_resolution; + } + } + best_fit +} diff --git a/mistralrs-core/src/vision_models/llava.rs b/mistralrs-core/src/vision_models/llava_next.rs similarity index 60% rename from mistralrs-core/src/vision_models/llava.rs rename to mistralrs-core/src/vision_models/llava_next.rs index 8369a9d48..902b6cfe7 100644 --- a/mistralrs-core/src/vision_models/llava.rs +++ b/mistralrs-core/src/vision_models/llava_next.rs @@ -8,6 +8,7 @@ use crate::serde_default_fn; use crate::models::llama::Config as LLaMAConfig; use crate::models::llama::Llama; use crate::vision_models::clip::ClipConfig; +use crate::vision_models::llava_inputs_processor::get_anyres_image_grid_shape; use super::clip::{Activation as ClipActivation, ClipVisionTransformer}; @@ -175,7 +176,7 @@ impl ClipVisionTower { let result = self.model.forward_get_hidden_states(x)?; let index = result.len() as isize + self.select_layer; let result = result[index as usize].clone(); - if self.select_feature_method == "cls_patch" { + if self.select_feature_method == "cls_patch" || self.select_feature_method == "full" { Ok(result) } else { result.i((.., 1..)) @@ -233,9 +234,112 @@ impl Model { } pub fn encode_images(&self, x: &Tensor) -> Result { - let image_features = self.clip_vision_tower.forward(x)?; - let image_features = self.mm_projector.forward(&image_features)?; + let mut image_features = self.clip_vision_tower.forward(x)?; + image_features = self.mm_projector.forward(&image_features)?; Ok(image_features) } - + + fn unpad_image(&self, tensor: &Tensor, original_size: &(u32, u32)) -> Result { + assert_eq!(tensor.dims().len(), 3); + let (original_width, original_height) = *original_size; + let tensor_dims = tensor.dims(); + let current_height = tensor_dims[1]; + let current_width = tensor_dims[2]; + let original_aspect_ratio = (original_width as f32) / (original_height as f32); + let current_aspect_ratio = (current_width as f32) / (current_height as f32); + if original_aspect_ratio > current_aspect_ratio { + let scale_factor = (current_width as f32) / (original_width as f32); + let new_height = (original_height as f32 * scale_factor).floor() as usize; + let padding = (current_height - new_height) / 2; + tensor.i((.., padding..current_width - padding, ..)) + } else { + let scale_factor = (current_height as f32) / (original_height as f32); + let new_width = (original_width as f32 * scale_factor).floor() as usize; + let padding = (current_width - new_width) / 2; + tensor.i((.., .., padding..current_width - padding)) + } + } + + pub fn prepare_inputs_labels_for_multimodal( + &self, + input_ids: &Tensor, + images: &[Tensor], + image_sizes: &[(u32, u32)], + ) -> Result { + let mut x = Tensor::cat(images, 0)?; + x = self.encode_images(&x)?; + let split_sizes = images + .iter() + .map(|x| x.shape().dims()[0]) + .collect::>(); + let mut index_pos = 0; + let mut image_features = Vec::new(); + // can be replaced by split + for split_size in split_sizes.iter() { + image_features.push(x.i(index_pos..index_pos + (*split_size))?); + index_pos += *split_size; + } + drop(x); + let mut new_image_features = Vec::new(); + for (image_idx, image_feature) in image_features.iter().enumerate() { + let base_image_feature = image_feature.get(0).unwrap(); + let patch_image_feature = image_feature.i(1..).unwrap(); + let height = self.clip_vision_tower.num_patches_per_side(); + let width = height; + assert_eq!(height * width, base_image_feature.dims()[0]); + let image_size = image_sizes[image_idx]; + let (num_patch_width, num_patch_height) = get_anyres_image_grid_shape( + image_size, + &self.config.image_grid_pinpoints, + self.clip_vision_tower.config.image_size as u32, + ); + let mut new_image_feature = patch_image_feature.reshape(( + num_patch_height as usize, + num_patch_width as usize, + height, + width, + (), + ))?; + new_image_feature = new_image_feature + .permute((4, 0, 2, 1, 3))? + .flatten(1, 2)? + .flatten(2, 3)?; + new_image_feature = self.unpad_image(&new_image_feature, &image_size)?; + let new_image_feature_dims = new_image_feature.dims(); + let image_new_line = self + .image_newline + .reshape((self.config.text_config.hidden_size, 1, 1))? + .broadcast_as((new_image_feature_dims[0], new_image_feature_dims[1], 1))?; + new_image_feature = Tensor::cat(&[new_image_feature, image_new_line], 2)? + .flatten(1, 2)? + .transpose(0, 1)?; + new_image_feature = Tensor::cat(&[base_image_feature, new_image_feature], 0)?; + new_image_features.push(new_image_feature); + } + image_features = new_image_features; //moved + let image_indices = input_ids.squeeze(0)?.eq(self.config.image_token_index as i64)?.nonzero()?; + //TODO: replace using nonzero + /* + let input_ids_vec = input_ids.squeeze(0)?.to_vec1::()?; + let mut image_indices = { + let mut image_indices = vec![0_i64]; + image_indices.extend( + input_ids_vec + .iter() + .enumerate() + .filter_map(|(i, x)| { + if *x == self.config.image_token_index as i64 { + Some(i as i64) + } else { + None + } + }) + .collect::>(), + ); + image_indices + }; + */ + + todo!() + } } diff --git a/mistralrs-core/src/vision_models/mod.rs b/mistralrs-core/src/vision_models/mod.rs index 0c45e016c..b07fcd0ba 100644 --- a/mistralrs-core/src/vision_models/mod.rs +++ b/mistralrs-core/src/vision_models/mod.rs @@ -4,11 +4,12 @@ use candle_core::Tensor; pub(crate) mod clip; pub(crate) mod image_processor; +pub(crate) mod llava_inputs_processor; +pub(crate) mod llava_next; pub(crate) mod phi3; pub(crate) mod phi3_inputs_processor; pub(crate) mod preprocessor_config; pub(crate) mod processor_config; -pub (crate) mod llava; pub struct ModelInputs { pub input_ids: Tensor, From 975347e21552933294b46afe9e995439457dc81d Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Thu, 20 Jun 2024 00:48:48 +0800 Subject: [PATCH 04/34] finish models --- mistralrs-core/src/pipeline/vision.rs | 9 +- .../src/vision_models/llava_next.rs | 175 +++++++++++++++--- mistralrs/examples/llava/main.rs | 4 +- 3 files changed, 155 insertions(+), 33 deletions(-) diff --git a/mistralrs-core/src/pipeline/vision.rs b/mistralrs-core/src/pipeline/vision.rs index 946f0aaf9..9d270d122 100644 --- a/mistralrs-core/src/pipeline/vision.rs +++ b/mistralrs-core/src/pipeline/vision.rs @@ -1,5 +1,5 @@ use super::cache_manager::DefaultCacheManager; -use super::vision_loaders::{LLaVALoader, Phi3VLoader, VisionLoaderType}; +use super::vision_loaders::{LLaVANextLoader, Phi3VLoader, VisionLoaderType}; use super::{ get_model_paths, get_xlora_paths, AdapterActivationMixin, Cache, CacheManager, CacheManagerMixin, GeneralMetadata, IsqPipelineMixin, Loader, MetadataMixin, ModelCategory, @@ -94,7 +94,7 @@ impl VisionLoaderBuilder { pub fn build(self, loader: VisionLoaderType) -> Box { let loader: Box = match loader { VisionLoaderType::Phi3V => Box::new(Phi3VLoader), - VisionLoaderType::LLaVA => Box::new(LLaVALoader) + VisionLoaderType::LLaVANext => Box::new(LLaVANextLoader), }; Box::new(VisionLoader { inner: loader, @@ -340,8 +340,7 @@ impl Pipeline for VisionPipeline { do_sample!(self, seqs, logits, prefix_cacher, disable_eos_stop, rng) } fn category(&self) -> ModelCategory { - ModelCategory::Vision { - has_conv2d: self.model.has_conv2d(), - } + let has_conv2d = self.model.has_conv2d(); + ModelCategory::Vision { has_conv2d } } } diff --git a/mistralrs-core/src/vision_models/llava_next.rs b/mistralrs-core/src/vision_models/llava_next.rs index 902b6cfe7..b345332b2 100644 --- a/mistralrs-core/src/vision_models/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava_next.rs @@ -1,8 +1,13 @@ +use candle_core::quantized::QMatMul; use candle_core::{bail, Device, IndexOp, Result, Tensor}; use candle_nn::{linear, seq, Activation, Module, Sequential, VarBuilder}; use serde::Deserialize; +use crate::device_map::DeviceMapper; +use crate::pipeline::IsqModel; use crate::pipeline::NormalLoadingMetadata; +use crate::pipeline::NormalModel; +use crate::pipeline::VisionModel; use crate::serde_default_fn; use crate::models::llama::Config as LLaMAConfig; @@ -12,6 +17,7 @@ use crate::vision_models::llava_inputs_processor::get_anyres_image_grid_shape; use super::clip::{Activation as ClipActivation, ClipVisionTransformer}; +const DEFAULT_PROJECTOR_HIDDEN_SIZE: usize = 1024; #[derive(Debug, Clone, Deserialize)] pub struct Config { pub architectures: Vec, @@ -102,14 +108,12 @@ impl Config { ClipConfig { hidden_size: self.vision_config.hidden_size, intermediate_size: self.vision_config.intermediate_size, - projection_dim: self.vision_config.projection_dim, num_hidden_layers: self.vision_config.num_hidden_layers, num_attention_heads: self.vision_config.num_attention_heads, num_channels: 3, image_size: self.vision_config.image_size, patch_size: self.vision_config.patch_size, hidden_act: ClipActivation::QuickGelu, - layer_norm_eps: 1e-5, // default value, seem useless } } } @@ -121,7 +125,7 @@ pub struct MMProjector { impl MMProjector { pub fn new(vb: &VarBuilder, config: &Config) -> Result { let mut modules = seq().add(linear( - 1024, + DEFAULT_PROJECTOR_HIDDEN_SIZE, config.text_config.hidden_size, vb.pp("multi_modal_projector.linear_1"), )?); @@ -266,6 +270,27 @@ impl Model { images: &[Tensor], image_sizes: &[(u32, u32)], ) -> Result { + // can be modified if nonzero(already implemented) and other index select ops are implemented + let input_ids_vec = input_ids.squeeze(0)?.to_vec1::()?; + let mut image_indices = vec![0_i64]; + image_indices.extend( + input_ids_vec + .iter() + .enumerate() + .filter_map(|(i, x)| { + if *x == self.config.image_token_index as i64 { + Some(i as i64) + } else { + None + } + }) + .collect::>(), + ); + if image_indices.len() == 1 { + //no image, only [0], + return self.llama.embed(input_ids); + } + let mut x = Tensor::cat(images, 0)?; x = self.encode_images(&x)?; let split_sizes = images @@ -317,29 +342,127 @@ impl Model { new_image_features.push(new_image_feature); } image_features = new_image_features; //moved - let image_indices = input_ids.squeeze(0)?.eq(self.config.image_token_index as i64)?.nonzero()?; - //TODO: replace using nonzero - /* - let input_ids_vec = input_ids.squeeze(0)?.to_vec1::()?; - let mut image_indices = { - let mut image_indices = vec![0_i64]; - image_indices.extend( - input_ids_vec - .iter() - .enumerate() - .filter_map(|(i, x)| { - if *x == self.config.image_token_index as i64 { - Some(i as i64) - } else { - None - } - }) - .collect::>(), - ); - image_indices - }; - */ - todo!() + let input_ids_noim = input_ids_vec + .iter() + .filter_map(|x| { + if *x != self.config.image_token_index as i64 { + Some(*x) + } else { + None + } + }) + .collect::>(); + + let input_ids_noim_len = input_ids_noim.len(); + image_indices.push((input_ids_noim_len) as i64); + + let mut cur_input_embeds = + Tensor::from_vec(input_ids_noim, input_ids_noim_len, &self.device)?; + cur_input_embeds = self.llama.embed(&cur_input_embeds)?; + let mut input_embed_no_ims = Vec::new(); + for i in 0..image_indices.len() - 1 { + let start = (image_indices[i]) as usize; + let end = image_indices[i + 1] as usize; + input_embed_no_ims.push(cur_input_embeds.i((start..end, ..))?) + } + + let mut cur_new_input_embeds = Vec::new(); + for (i, image_feature) in image_features.iter().enumerate() { + cur_new_input_embeds.push(input_embed_no_ims[i].clone()); + cur_new_input_embeds.push(image_feature.clone()); + } + cur_new_input_embeds.push(input_embed_no_ims[image_features.len()].clone()); + drop(image_features); + drop(input_embed_no_ims); + let mut new_input_embeds = Tensor::cat(&cur_new_input_embeds, 0)?; + let (new_input_embeds_length, _) = new_input_embeds.shape().dims2()?; + if new_input_embeds_length > self.config.text_config.max_length { + new_input_embeds = new_input_embeds.i((..self.config.text_config.max_length, ..))?; + } + new_input_embeds.unsqueeze(0) + } + + pub fn forward( + &mut self, + input_ids: &Tensor, + pixel_values: Option, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + image_sizes: Option>, + ) -> Result { + if let Some(ref pixel_values) = pixel_values { + let input_embed = self.prepare_inputs_labels_for_multimodal( + input_ids, + &[pixel_values.clone()], + &image_sizes.unwrap(), + )?; + self.llama.forward_input_embed( + &input_embed, + seqlen_offsets, + start_offsets_kernel, + context_lens, + ) + } else { + self.llama.forward( + input_ids, + seqlen_offsets, + start_offsets_kernel, + context_lens, + ) + } + } +} + +pub(crate) struct LLaVANextVisionSpecificArgs { + pub image_sizes: Option>, +} + +impl IsqModel for Model { + fn get_tensors(&mut self) -> (Vec<(&mut QMatMul, Option)>, &dyn DeviceMapper) { + // I don't really get this part + self.llama.get_tensors() + } +} + +impl VisionModel for Model { + fn forward( + &mut self, + input_ids: &Tensor, + pixel_values: Option, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + _position_ids: Vec, + model_specific_args: Box, // pixel attention mask, or image sizes, or anything else + ) -> candle_core::Result { + let LLaVANextVisionSpecificArgs { image_sizes } = *model_specific_args + .downcast() + .expect("Cannot downcast into `LLaVANextVisionSpecificArgs`"); + self.forward( + input_ids, + pixel_values, + seqlen_offsets, + start_offsets_kernel, + context_lens, + image_sizes, + ) + } + + fn device(&self) -> &Device { + &self.device + } + + fn cache(&self) -> &crate::pipeline::Cache { + self.llama.cache() + } + + fn max_seq_len(&self) -> usize { + self.llama.max_seq_len() + } + + fn has_conv2d(&self) -> bool { + true } } diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index a4f6d9f47..1c7cebdbd 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -21,7 +21,7 @@ fn setup() -> anyhow::Result> { None, Some("/root/autodl-tmp/cache/huggingface/hub/models--llava-hf--llava-v1.6-vicuna-7b-hf/snapshots/0524afe4453163103dcefe78eb0a58b3f6424eac".to_string()), ) - .build(VisionLoaderType::LLaVA); + .build(VisionLoaderType::LLaVANext); // Load, into a Pipeline let pipeline = loader.load_model_from_hf( @@ -61,7 +61,7 @@ fn main() -> anyhow::Result<()> { suffix: None, adapters: None, }); - mistralrs.get_sender().blocking_send(request)?; + mistralrs.get_sender()?.blocking_send(request)?; let response = rx.blocking_recv().unwrap(); match response { From cb7833b9c3b94771e41eeee253117e187c168523 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Thu, 20 Jun 2024 01:06:27 +0800 Subject: [PATCH 05/34] keep working --- mistralrs-core/src/models/llama.rs | 1 - mistralrs-core/src/vision_models/llava_inputs_processor.rs | 1 + mistralrs-core/src/vision_models/llava_next.rs | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mistralrs-core/src/models/llama.rs b/mistralrs-core/src/models/llama.rs index 3bf640fbc..e6026a939 100644 --- a/mistralrs-core/src/models/llama.rs +++ b/mistralrs-core/src/models/llama.rs @@ -266,7 +266,6 @@ impl Llama { start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, ) -> Result { - let (_, seq_len, _) = input_embed.dims3()?; let mut x = input_embed.clone(); let mut cache = self.kv_cache.lock(); let mask = CausalMasker.make_causal_mask_as_attn_bias_with_embed_tensor( diff --git a/mistralrs-core/src/vision_models/llava_inputs_processor.rs b/mistralrs-core/src/vision_models/llava_inputs_processor.rs index 3b4c18bb6..c21df9643 100644 --- a/mistralrs-core/src/vision_models/llava_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava_inputs_processor.rs @@ -1,3 +1,4 @@ +#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] pub fn get_anyres_image_grid_shape( image_size: (u32, u32), grid_pinpoints: &[(u32, u32)], diff --git a/mistralrs-core/src/vision_models/llava_next.rs b/mistralrs-core/src/vision_models/llava_next.rs index b345332b2..3819fa49d 100644 --- a/mistralrs-core/src/vision_models/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava_next.rs @@ -1,3 +1,4 @@ +#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] use candle_core::quantized::QMatMul; use candle_core::{bail, Device, IndexOp, Result, Tensor}; use candle_nn::{linear, seq, Activation, Module, Sequential, VarBuilder}; From 18ed03fda53f471da1fa4610ecd678f63d18fee9 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Sat, 22 Jun 2024 17:04:36 +0800 Subject: [PATCH 06/34] keep working --- .../vision_models/llava_inputs_processor.rs | 42 ---- .../src/vision_models/llava_next.rs | 48 ++-- .../llava_next_inputs_processor.rs | 212 ++++++++++++++++++ mistralrs-core/src/vision_models/mod.rs | 2 +- .../src/vision_models/preprocessor_config.rs | 2 + 5 files changed, 235 insertions(+), 71 deletions(-) delete mode 100644 mistralrs-core/src/vision_models/llava_inputs_processor.rs create mode 100644 mistralrs-core/src/vision_models/llava_next_inputs_processor.rs diff --git a/mistralrs-core/src/vision_models/llava_inputs_processor.rs b/mistralrs-core/src/vision_models/llava_inputs_processor.rs deleted file mode 100644 index c21df9643..000000000 --- a/mistralrs-core/src/vision_models/llava_inputs_processor.rs +++ /dev/null @@ -1,42 +0,0 @@ -#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] -pub fn get_anyres_image_grid_shape( - image_size: (u32, u32), - grid_pinpoints: &[(u32, u32)], - patch_size: u32, -) -> (u32, u32) { - let (width, height) = select_best_resolution(image_size, grid_pinpoints); - (width / patch_size, height / patch_size) -} - -pub fn select_best_resolution( - original_size: (u32, u32), - possible_resolutions: &[(u32, u32)], -) -> (u32, u32) { - let (original_width, original_height) = original_size; - let mut best_fit = (0, 0); - let original_width_f = original_width as f32; - let original_height_f = original_height as f32; - let mut max_effective_resolution = 0_u32; - let mut min_wasted_resolution = u32::MAX; - for (width, height) in possible_resolutions { - let width_f = *width as f32; - let height_f = *height as f32; - let scale = (width_f / original_width_f).min(height_f / original_height_f); - let (downscaled_width, downscaled_height) = ( - (original_width_f * scale) as u32, - (original_height_f * scale) as u32, - ); - let effective_resolution = - std::cmp::min((*width) * (*height), downscaled_width * downscaled_height); - let wasted_resolution = (*width) * (*height) - effective_resolution; - if effective_resolution > max_effective_resolution - || (effective_resolution == max_effective_resolution - && wasted_resolution < min_wasted_resolution) - { - best_fit = (*width, *height); - max_effective_resolution = effective_resolution; - min_wasted_resolution = wasted_resolution; - } - } - best_fit -} diff --git a/mistralrs-core/src/vision_models/llava_next.rs b/mistralrs-core/src/vision_models/llava_next.rs index 3819fa49d..cf70de57d 100644 --- a/mistralrs-core/src/vision_models/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava_next.rs @@ -2,6 +2,7 @@ use candle_core::quantized::QMatMul; use candle_core::{bail, Device, IndexOp, Result, Tensor}; use candle_nn::{linear, seq, Activation, Module, Sequential, VarBuilder}; +use itertools::Itertools; use serde::Deserialize; use crate::device_map::DeviceMapper; @@ -14,7 +15,7 @@ use crate::serde_default_fn; use crate::models::llama::Config as LLaMAConfig; use crate::models::llama::Llama; use crate::vision_models::clip::ClipConfig; -use crate::vision_models::llava_inputs_processor::get_anyres_image_grid_shape; +use crate::vision_models::llava_next_inputs_processor::get_anyres_image_grid_shape; use super::clip::{Activation as ClipActivation, ClipVisionTransformer}; @@ -194,12 +195,13 @@ impl ClipVisionTower { } pub struct Model { - pub clip_vision_tower: ClipVisionTower, - pub image_newline: Tensor, - pub mm_projector: MMProjector, - pub llama: Llama, + clip_vision_tower: ClipVisionTower, + image_newline: Tensor, + mm_projector: MMProjector, + llama: Llama, config: Config, device: Device, + seqlen_offset: usize, // store the seqlen_offset. We use this to generate seqlen_offsets/seqlen_offsets_kernel/context_lens. It is a different approach from phi3v and other implementations in this repo, but I haven't seen any replacement for this because in LLaVA we can only get input length after image is embed. This is a workaround. } impl Model { @@ -235,6 +237,7 @@ impl Model { llama, config: config.clone(), device, + seqlen_offset: 0, }) } @@ -267,8 +270,8 @@ impl Model { pub fn prepare_inputs_labels_for_multimodal( &self, - input_ids: &Tensor, - images: &[Tensor], + input_ids: &Tensor, //[1,seq_len] + images: &Tensor, //[sample_per_image*image_len,chanel,width,height] for LLaVANext, we fix aspect_ratio_setting to 'anyres'(this is akin to python Transformer). Hence sampler_per_image is 5 image_sizes: &[(u32, u32)], ) -> Result { // can be modified if nonzero(already implemented) and other index select ops are implemented @@ -292,18 +295,12 @@ impl Model { return self.llama.embed(input_ids); } - let mut x = Tensor::cat(images, 0)?; - x = self.encode_images(&x)?; - let split_sizes = images - .iter() - .map(|x| x.shape().dims()[0]) - .collect::>(); - let mut index_pos = 0; + let x = self.encode_images(&images)?; + let image_nums = images.shape().dims()[0] / 5; let mut image_features = Vec::new(); // can be replaced by split - for split_size in split_sizes.iter() { - image_features.push(x.i(index_pos..index_pos + (*split_size))?); - index_pos += *split_size; + for image_index in 0..image_nums { + image_features.push(x.i(image_index * 5..(image_index + 1) * 5)?); } drop(x); let mut new_image_features = Vec::new(); @@ -367,15 +364,10 @@ impl Model { let end = image_indices[i + 1] as usize; input_embed_no_ims.push(cur_input_embeds.i((start..end, ..))?) } - - let mut cur_new_input_embeds = Vec::new(); - for (i, image_feature) in image_features.iter().enumerate() { - cur_new_input_embeds.push(input_embed_no_ims[i].clone()); - cur_new_input_embeds.push(image_feature.clone()); - } - cur_new_input_embeds.push(input_embed_no_ims[image_features.len()].clone()); - drop(image_features); - drop(input_embed_no_ims); + let cur_new_input_embeds: Vec<&Tensor> = input_embed_no_ims + .iter() + .interleave(&image_features) + .collect::>(); let mut new_input_embeds = Tensor::cat(&cur_new_input_embeds, 0)?; let (new_input_embeds_length, _) = new_input_embeds.shape().dims2()?; if new_input_embeds_length > self.config.text_config.max_length { @@ -393,10 +385,10 @@ impl Model { context_lens: Vec<(usize, usize)>, image_sizes: Option>, ) -> Result { - if let Some(ref pixel_values) = pixel_values { + if let Some(ref pixel_values) = pixel_values { // we assume(and as it should be) only first request contains image let input_embed = self.prepare_inputs_labels_for_multimodal( input_ids, - &[pixel_values.clone()], + pixel_values, &image_sizes.unwrap(), )?; self.llama.forward_input_embed( diff --git a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs new file mode 100644 index 000000000..0f8fbf656 --- /dev/null +++ b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs @@ -0,0 +1,212 @@ +#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] +use std::any::Any; + +use candle_core::Result; +use candle_core::{DType, Device, Tensor}; +use image::{imageops::FilterType, DynamicImage, GenericImageView}; +use regex_automata::meta::Regex; + +use crate::pipeline::InputsProcessor; + +use super::image_processor::ImagePreProcessor; +use crate::vision_models::preprocessor_config::{PreProcessorConfig, ToFilter}; +use mistralrs_vision::Normalize; + +pub fn get_anyres_image_grid_shape( + image_size: (u32, u32), + grid_pinpoints: &[(u32, u32)], + patch_size: u32, +) -> (u32, u32) { + let (width, height) = select_best_resolution(image_size, grid_pinpoints); + (width / patch_size, height / patch_size) +} + +pub fn select_best_resolution( + original_size: (u32, u32), + possible_resolutions: &[(u32, u32)], +) -> (u32, u32) { + let (original_width, original_height) = original_size; + let mut best_fit = (0, 0); + let original_width_f = original_width as f32; + let original_height_f = original_height as f32; + let mut max_effective_resolution = 0_u32; + let mut min_wasted_resolution = u32::MAX; + for (width, height) in possible_resolutions { + let width_f = *width as f32; + let height_f = *height as f32; + let scale = (width_f / original_width_f).min(height_f / original_height_f); + let (downscaled_width, downscaled_height) = ( + (original_width_f * scale) as u32, + (original_height_f * scale) as u32, + ); + let effective_resolution = + std::cmp::min((*width) * (*height), downscaled_width * downscaled_height); + let wasted_resolution = (*width) * (*height) - effective_resolution; + if effective_resolution > max_effective_resolution + || (effective_resolution == max_effective_resolution + && wasted_resolution < min_wasted_resolution) + { + best_fit = (*width, *height); + max_effective_resolution = effective_resolution; + min_wasted_resolution = wasted_resolution; + } + } + best_fit +} + +pub fn calculate_middle(image_size: (u32, u32), center_size: (u32, u32)) -> (u32, u32) { + let (width, height) = image_size; + let (center_width, center_height) = center_size; + let left = if width <= center_width { + 0 + } else { + ((width as f32 - center_width as f32) / 2.0).ceil() as u32 + }; + let top = if height <= center_height { + 0 + } else { + ((height as f32 - center_height as f32) / 2.0).ceil() as u32 + }; + (left, top) +} + +pub struct LLaVANextInputProcessor { + image_tag_splitter: Regex, +} + +impl InputsProcessor for LLaVANextInputProcessor { + fn process_inputs( + &self, + tokenizer: std::sync::Arc, + input_seqs: &mut [&mut crate::sequence::Sequence], + is_prompt: bool, + is_xlora: bool, + device: &candle_core::Device, + no_kv_cache: bool, + last_n_context_len: Option<(usize, usize)>, + other_config: Option>, + ) -> anyhow::Result> { + if is_xlora { + anyhow::bail!("Cannot make inputs for X-LoRA vision model."); + } + if no_kv_cache { + anyhow::bail!("Vision model must have kv cache."); + } + let config: std::sync::Arc = other_config + .clone() + .expect("Need a PreProcessorConfig config."); + let config: &PreProcessorConfig = config.downcast_ref().expect("Downcast failed."); + todo!() + } + + fn get_type(&self) -> crate::pipeline::InputsProcessorType { + todo!() + } +} + +impl LLaVANextInputProcessor { + fn resize(&self, image: &DynamicImage, size: u32, filter: FilterType) -> DynamicImage { + let (width, height) = image.dimensions(); + if width == size && height == size { + image.clone() + } else { + let (new_width, new_height) = if width < height { + ( + size, + (((size * height) as f32) / width as f32).ceil() as u32, + ) + } else { + ( + (((size * width) as f32) / height as f32).ceil() as u32, + size, + ) + }; + image.resize(new_width, new_height, filter) + } + } + + fn center_crop(&self, image: &DynamicImage, crop_size: (u32, u32)) -> DynamicImage { + let (width, height) = image.dimensions(); + let (left, top) = calculate_middle((width, height), crop_size); + image.crop_imm(left, top, crop_size.0, crop_size.1) + } + + fn rescale(&self, tensor: &Tensor, rescale_factor: f64) -> Result { + tensor.affine(rescale_factor, 0.0) + } + + fn to_tensor(&self, image: &DynamicImage, device: &Device) -> Result { + let img = image.to_rgb8().into_raw(); + let (width, height) = image.dimensions(); + Tensor::from_vec(img, (height as usize, width as usize, 3), device)?.to_dtype(DType::F32) + } + + fn normalize(&self, tensor: &Tensor, image_mean: &[f32], image_std: &[f32]) -> Result { + let mean = Tensor::from_slice(image_mean, (3,), &Device::Cpu)?; + let std = Tensor::from_slice(image_std, (3,), &Device::Cpu)?; + tensor.broadcast_sub(&mean)?.broadcast_div(&std) + } + + fn to_channel_dimension_format(&self, tensor: &Tensor) -> Result { + tensor.permute((2, 0, 1)) + } +} + +impl ImagePreProcessor for LLaVANextInputProcessor { + #[allow(clippy::excessive_precision)] + const DEFAULT_MEAN: [f64; 3] = [0.48145466, 0.4578275, 0.40821073]; + #[allow(clippy::excessive_precision)] + const DEFAULT_STD: [f64; 3] = [0.26862954, 0.26130258, 0.27577711]; + + fn preprocess( + &self, + images: Vec, + config: &super::preprocessor_config::PreProcessorConfig, + device: &candle_core::Device, + ) -> candle_core::Result { + if images.len() > 1 { + candle_core::bail!("Can only process one image per batch"); // This is no different from phi3_input_processor + }; + let mut image = images[0].clone(); + let image_size = (image.width() as usize, image.height() as usize); + if config.do_resize.unwrap_or(true) { + let size = config.size.as_ref().unwrap().get("shortest_edge").unwrap(); + let filter = config.resampling.to_filter()?; + image = self.resize(&image, *size, filter); + } + if config.do_center_crop.unwrap_or(true) { + let crop_size = ( + *config.crop_size.as_ref().unwrap().get("width").unwrap(), + *config.crop_size.as_ref().unwrap().get("height").unwrap(), + ); + image = self.center_crop(&image, crop_size); + } + let mut pixel_values = self.to_tensor(&image, &device)?; + if config.do_rescale.unwrap_or(true) { + let rescale_factor = config.rescale_factor.unwrap(); + pixel_values = self.rescale(&pixel_values, rescale_factor)?; + } + if config.do_normalize.unwrap_or(true) { + let image_mean = config + .image_mean + .unwrap_or(Self::DEFAULT_MEAN) + .iter() + .map(|x| *x as f32) + .collect::>(); + let image_std = config + .image_std + .unwrap_or(Self::DEFAULT_STD) + .iter() + .map(|x| *x as f32) + .collect::>(); + pixel_values = self.normalize(&pixel_values, &image_mean, &image_std)?; + } + pixel_values = self.to_channel_dimension_format(&pixel_values)?; + Ok(super::image_processor::PreprocessedImages { + pixel_values: pixel_values, + pixel_attention_mask: None, + image_sizes: Some(image_size), + num_img_tokens: None, + }) + } +} diff --git a/mistralrs-core/src/vision_models/mod.rs b/mistralrs-core/src/vision_models/mod.rs index b07fcd0ba..23e03dd48 100644 --- a/mistralrs-core/src/vision_models/mod.rs +++ b/mistralrs-core/src/vision_models/mod.rs @@ -4,7 +4,7 @@ use candle_core::Tensor; pub(crate) mod clip; pub(crate) mod image_processor; -pub(crate) mod llava_inputs_processor; +pub(crate) mod llava_next_inputs_processor; pub(crate) mod llava_next; pub(crate) mod phi3; pub(crate) mod phi3_inputs_processor; diff --git a/mistralrs-core/src/vision_models/preprocessor_config.rs b/mistralrs-core/src/vision_models/preprocessor_config.rs index e1315622a..c4a6b7cd5 100644 --- a/mistralrs-core/src/vision_models/preprocessor_config.rs +++ b/mistralrs-core/src/vision_models/preprocessor_config.rs @@ -13,11 +13,13 @@ pub struct PreProcessorConfig { pub(crate) do_pad: Option, pub(crate) do_rescale: Option, pub(crate) do_resize: Option, + pub(crate) do_center_crop: Option, pub(crate) image_mean: Option<[f64; 3]>, pub(crate) image_std: Option<[f64; 3]>, pub(crate) rescale_factor: Option, pub(crate) resampling: Option, pub(crate) size: Option>, + pub(crate) crop_size: Option>, pub(crate) num_img_tokens: Option, pub(crate) num_crops: Option, } From 81851fe82637632efabf43e062d52a64eed6b595 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Sat, 22 Jun 2024 20:56:31 +0800 Subject: [PATCH 07/34] keep working --- mistralrs-core/src/pipeline/macros.rs | 3 +- mistralrs-core/src/pipeline/vision.rs | 8 +- mistralrs-core/src/pipeline/vision_loaders.rs | 45 ++- .../src/vision_models/llava_next.rs | 56 +-- .../llava_next_inputs_processor.rs | 372 +++++++++++++++--- .../vision_models/phi3_inputs_processor.rs | 6 +- mistralrs/examples/phi3v/main.rs | 2 +- 7 files changed, 397 insertions(+), 95 deletions(-) diff --git a/mistralrs-core/src/pipeline/macros.rs b/mistralrs-core/src/pipeline/macros.rs index d02f1fa47..0410f00e5 100644 --- a/mistralrs-core/src/pipeline/macros.rs +++ b/mistralrs-core/src/pipeline/macros.rs @@ -35,6 +35,8 @@ macro_rules! api_dir_list { .map(|s| { s.unwrap() .path() + .file_name() // if we don't have this, we can't use the pure local mode + .unwrap() .to_str() .expect("Could not convert to str") .to_string() @@ -139,7 +141,6 @@ macro_rules! get_paths { } else { None }; - let preprocessor_config = if $crate::api_dir_list!(api, model_id) .collect::>() .contains(&"preprocessor_config.json".to_string()) diff --git a/mistralrs-core/src/pipeline/vision.rs b/mistralrs-core/src/pipeline/vision.rs index b46760faa..5f569c48b 100644 --- a/mistralrs-core/src/pipeline/vision.rs +++ b/mistralrs-core/src/pipeline/vision.rs @@ -1,5 +1,4 @@ use super::cache_manager::DefaultCacheManager; -use super::vision_loaders::{Idefics2Loader, Phi3VLoader, VisionLoaderType}; use super::vision_loaders::{Idefics2Loader, LLaVANextLoader, Phi3VLoader, VisionLoaderType}; use super::{ get_model_paths, get_xlora_paths, AdapterActivationMixin, Cache, CacheManager, @@ -180,7 +179,6 @@ impl Loader for VisionLoader { ), _ => unreachable!(), }; - let preprocessor_config: PreProcessorConfig = serde_json::from_str( &fs::read_to_string( paths @@ -196,9 +194,9 @@ impl Loader for VisionLoader { .as_ref() .map(|f| serde_json::from_str(&fs::read_to_string(f).unwrap()).unwrap()); - let processor = self - .inner - .get_processor(processor_config, preprocessor_config.clone()); + let processor = + self.inner + .get_processor(&config, processor_config, preprocessor_config.clone()); //There are always some repos that don't properly handle config position, for example... LLaVA let tokenizer = get_tokenizer( paths.get_tokenizer_filename(), diff --git a/mistralrs-core/src/pipeline/vision_loaders.rs b/mistralrs-core/src/pipeline/vision_loaders.rs index 04bdc72e7..11c7e9164 100644 --- a/mistralrs-core/src/pipeline/vision_loaders.rs +++ b/mistralrs-core/src/pipeline/vision_loaders.rs @@ -12,7 +12,6 @@ use serde::Deserialize; use super::{NormalLoadingMetadata, Processor, ProcessorCreator, VisionModel}; use crate::vision_models::idefics2::{Config as Idefics2Config, Idefics2}; use crate::vision_models::idefics2_input_processor::Idefics2Processor; -use crate::vision_models::llava_next::Config as LLaVAConfig; use crate::vision_models::phi3::{Config as Phi3Config, Model as Phi3}; use crate::vision_models::phi3_inputs_processor::Phi3Processor; use crate::vision_models::preprocessor_config::PreProcessorConfig; @@ -30,6 +29,7 @@ pub trait VisionModelLoader { fn get_config_repr(&self, config: &str, use_flash_attn: bool) -> Result>; fn get_processor( &self, + model_config: &str, processor_config: Option, preprocessor_config: PreProcessorConfig, ) -> Arc; @@ -53,7 +53,6 @@ impl FromStr for VisionLoaderType { match s { "phi3v" => Ok(Self::Phi3V), "idefics2" => Ok(Self::Idefics2), - "llava_next" => Ok(Self::LLaVANext), a => Err(format!("Unknown architecture `{a}`")), } } @@ -93,12 +92,14 @@ impl VisionModelLoader for Phi3VLoader { } fn get_processor( &self, + _model_config: &str, processor_config: Option, preprocessor_config: PreProcessorConfig, ) -> Arc { Phi3Processor::new_processor(processor_config, preprocessor_config) } } + // ======================== Idefics 2 loader /// [`VisionLoader`] for an Idefics 2 Vision model. @@ -129,12 +130,26 @@ impl VisionModelLoader for Idefics2Loader { fn get_config_repr(&self, config: &str, use_flash_attn: bool) -> Result> { let mut config: Idefics2Config = serde_json::from_str(config)?; config.text_config.use_flash_attn = use_flash_attn; -// ======================== LLaVA loader + Ok(Box::new(config)) + } + fn get_processor( + &self, + _model_config: &str, + processor_config: Option, + preprocessor_config: PreProcessorConfig, + ) -> Arc { + Arc::new(Idefics2Processor::new( + processor_config.unwrap(), + preprocessor_config, + )) + } +} -/// [`VisionLoader`] for a LLaVA-Next Vision model. -/// -/// [`VisionLoader`]: https://ericlbuehler.github.io/mistral.rs/mistralrs/struct.VisionLoader.html +// ======================== LLaVANext Loader + +/// [`VisionLoader`] for an LLaVANext Vision model. pub struct LLaVANextLoader; + impl VisionModelLoader for LLaVANextLoader { fn load( &self, @@ -143,28 +158,20 @@ impl VisionModelLoader for LLaVANextLoader { _vb: VarBuilder, _normal_loading_metadata: NormalLoadingMetadata, ) -> Result> { - //println!("config: {}", config); - unimplemented!() + todo!() } fn is_gptx(&self) -> bool { false } - fn get_config_repr(&self, config: &str, _use_flash_attn: bool) -> Result> { - let config: LLaVAConfig = serde_json::from_str(config)?; - Ok(Box::new(config)) + fn get_config_repr(&self, _config: &str, _use_flash_attn: bool) -> Result> { + todo!() } fn get_processor( &self, - processor_config: Option, - preprocessor_config: PreProcessorConfig, - ) -> Arc { - Arc::new(Idefics2Processor::new( - processor_config.unwrap(), - preprocessor_config, - )) + model_config: &str, _processor_config: Option, _preprocessor_config: PreProcessorConfig, ) -> Arc { - unimplemented!() + todo!() } } diff --git a/mistralrs-core/src/vision_models/llava_next.rs b/mistralrs-core/src/vision_models/llava_next.rs index cf70de57d..bfa0deff9 100644 --- a/mistralrs-core/src/vision_models/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava_next.rs @@ -201,7 +201,6 @@ pub struct Model { llama: Llama, config: Config, device: Device, - seqlen_offset: usize, // store the seqlen_offset. We use this to generate seqlen_offsets/seqlen_offsets_kernel/context_lens. It is a different approach from phi3v and other implementations in this repo, but I haven't seen any replacement for this because in LLaVA we can only get input length after image is embed. This is a workaround. } impl Model { @@ -237,7 +236,6 @@ impl Model { llama, config: config.clone(), device, - seqlen_offset: 0, }) } @@ -380,27 +378,41 @@ impl Model { &mut self, input_ids: &Tensor, pixel_values: Option, - seqlen_offsets: &[usize], - start_offsets_kernel: Tensor, - context_lens: Vec<(usize, usize)>, image_sizes: Option>, ) -> Result { - if let Some(ref pixel_values) = pixel_values { // we assume(and as it should be) only first request contains image - let input_embed = self.prepare_inputs_labels_for_multimodal( + if let Some(ref pixel_values) = pixel_values { + // we assume(as it should be) only prompt request contains image + let input_embeds = self.prepare_inputs_labels_for_multimodal( input_ids, pixel_values, &image_sizes.unwrap(), )?; + let seqlen_offsets = [0]; + let (_, input_embeds_len, _) = input_embeds.dims3()?; + let start_offsets_kernel = + Tensor::from_iter((0..input_embeds_len).map(|x| x as i64), &self.device)? + .unsqueeze(0)?; + let context_lens = vec![(input_embeds_len - 1, 1)]; + self.position = input_embeds_len; // this is for next round. self.llama.forward_input_embed( - &input_embed, - seqlen_offsets, + &input_embeds, + &seqlen_offsets, start_offsets_kernel, context_lens, ) } else { + let (_, input_len) = input_ids.shape().dims2()?; + let seqlen_offsets = [self.position]; + let start_offsets_kernel = Tensor::from_iter( + (self.position..self.position + input_len).map(|x| x as i64), + &self.device, + )? + .unsqueeze(0)?; + let context_lens = vec![(input_len - 1, 1)]; + self.position += input_len; self.llama.forward( input_ids, - seqlen_offsets, + &seqlen_offsets, start_offsets_kernel, context_lens, ) @@ -409,7 +421,7 @@ impl Model { } pub(crate) struct LLaVANextVisionSpecificArgs { - pub image_sizes: Option>, + pub image_sizes: Option>, } impl IsqModel for Model { @@ -424,23 +436,23 @@ impl VisionModel for Model { &mut self, input_ids: &Tensor, pixel_values: Option, - seqlen_offsets: &[usize], - start_offsets_kernel: Tensor, - context_lens: Vec<(usize, usize)>, + _seqlen_offsets: &[usize], + _start_offsets_kernel: Tensor, + _context_lens: Vec<(usize, usize)>, _position_ids: Vec, model_specific_args: Box, // pixel attention mask, or image sizes, or anything else ) -> candle_core::Result { let LLaVANextVisionSpecificArgs { image_sizes } = *model_specific_args .downcast() .expect("Cannot downcast into `LLaVANextVisionSpecificArgs`"); - self.forward( - input_ids, - pixel_values, - seqlen_offsets, - start_offsets_kernel, - context_lens, - image_sizes, - ) + let image_sizes = Some( + image_sizes + .unwrap() + .iter() + .map(|(w, h)| (*w as u32, *h as u32)) + .collect(), + ); + self.forward(input_ids, pixel_values, image_sizes) } fn device(&self) -> &Device { diff --git a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs index 0f8fbf656..dee6111c7 100644 --- a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs @@ -1,12 +1,23 @@ #![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] use std::any::Any; +use std::cmp::min; +use std::sync::Arc; use candle_core::Result; use candle_core::{DType, Device, Tensor}; +use image::imageops::overlay; use image::{imageops::FilterType, DynamicImage, GenericImageView}; +use itertools::Itertools; use regex_automata::meta::Regex; +use tokenizers::Tokenizer; -use crate::pipeline::InputsProcessor; +use crate::pipeline::text_models_inputs_processor::{get_completion_input, get_prompt_input}; +use crate::pipeline::{text_models_inputs_processor, InputsProcessor, InputsProcessorType}; +use crate::sequence::Sequence; +use crate::vision_models::image_processor::PreprocessedImages; +use crate::vision_models::llava_next::Config; +use crate::vision_models::llava_next::LLaVANextVisionSpecificArgs; +use crate::vision_models::ModelInputs; use super::image_processor::ImagePreProcessor; use crate::vision_models::preprocessor_config::{PreProcessorConfig, ToFilter}; @@ -54,6 +65,55 @@ pub fn select_best_resolution( best_fit } +fn resize_and_pad_image(image: &DynamicImage, target_resolution: (u32, u32)) -> DynamicImage { + let (original_width, original_height) = image.dimensions(); + let original_width_f = original_width as f32; + let original_height_f = original_height as f32; + let (target_width, target_height) = target_resolution; + let target_width_f = target_width as f32; + let target_height_f = target_height as f32; + let scale_w = target_width_f / original_width_f; + let scale_h = target_height_f / original_height_f; + let (new_width, new_height) = if scale_w < scale_h { + ( + target_width, + min((original_height_f * scale_w).ceil() as u32, target_height), + ) + } else { + ( + min((original_width_f * scale_h).ceil() as u32, target_width), + target_height, + ) + }; + let resized_image = image.resize_exact( + new_width, + new_height, + image::imageops::FilterType::CatmullRom, + ); + let mut new_image = DynamicImage::new_rgb8(target_width, target_height); + let (paste_x, paste_y) = + calculate_middle((target_width, target_height), (new_width, new_height)); + overlay( + &mut new_image, + &resized_image, + paste_x.into(), + paste_y.into(), + ); + new_image +} + +fn divide_to_patches(image: &DynamicImage, crop_size: (u32, u32)) -> Vec { + let (width, height) = image.dimensions(); + let mut patches = Vec::new(); + for y in (0..height).step_by(crop_size.1 as usize) { + for x in (0..width).step_by(crop_size.0 as usize) { + let patch = image.crop_imm(x, y, crop_size.0, crop_size.1); + patches.push(patch); + } + } + patches +} + pub fn calculate_middle(image_size: (u32, u32), center_size: (u32, u32)) -> (u32, u32) { let (width, height) = image_size; let (center_width, center_height) = center_size; @@ -70,37 +130,238 @@ pub fn calculate_middle(image_size: (u32, u32), center_size: (u32, u32)) -> (u32 (left, top) } +pub struct LLaVANextProcessor { + inputs_processor: Arc, +} + +impl LLaVANextProcessor { + pub fn new(config: &str) -> Self { + let model_config = serde_json::from_str::(config) + .expect("Failed to parse model config."); + let image_tag_splitter = + Regex::new(r"<\|image_\d+\|>").expect("Failed to compile split regex."); + let inputs_processor = Arc::new(LLaVANextInputProcessor { + image_tag_splitter, + model_config, + }); + Self { inputs_processor } + } +} + pub struct LLaVANextInputProcessor { image_tag_splitter: Regex, + model_config: crate::vision_models::llava_next::Config, } +// Copy from phi3_inputs_processor. different is (1) calculate of num_image_token (2) process_anyres_image impl InputsProcessor for LLaVANextInputProcessor { + fn get_type(&self) -> InputsProcessorType { + InputsProcessorType::Vision + } fn process_inputs( &self, - tokenizer: std::sync::Arc, - input_seqs: &mut [&mut crate::sequence::Sequence], + tokenizer: Arc, + input_seqs: &mut [&mut Sequence], is_prompt: bool, is_xlora: bool, - device: &candle_core::Device, + device: &Device, no_kv_cache: bool, last_n_context_len: Option<(usize, usize)>, - other_config: Option>, - ) -> anyhow::Result> { + other_config: Option>, + ) -> anyhow::Result> { if is_xlora { anyhow::bail!("Cannot make inputs for X-LoRA vision model."); } if no_kv_cache { anyhow::bail!("Vision model must have kv cache."); } - let config: std::sync::Arc = other_config + + let config = other_config .clone() .expect("Need a PreProcessorConfig config."); let config: &PreProcessorConfig = config.downcast_ref().expect("Downcast failed."); - todo!() - } + let (pixel_values, image_sizes, num_img_tokens, n_images) = if is_prompt + && input_seqs + .iter() + .map(|seq| seq.images().is_some()) + .all(|x| x) + { + let mut pixel_values_accum = Vec::new(); + let mut image_sizes_accum = Vec::new(); + let mut num_img_tokens_accum = Vec::new(); + let mut n_images = Vec::new(); + for seq in input_seqs.iter_mut() { + let imgs = seq + .take_images() + .expect("Need to have images by this point."); + let imgs_len = imgs.len(); + n_images.push(imgs_len); + let PreprocessedImages { + pixel_values, + pixel_attention_mask: _, + image_sizes, + num_img_tokens, + } = self.preprocess(imgs, config, device)?; + let image_sizes = image_sizes.unwrap(); + pixel_values_accum.push(pixel_values); + image_sizes_accum.push(image_sizes); + num_img_tokens_accum.push(num_img_tokens.unwrap()); + } + ( + Some(Tensor::cat(&pixel_values_accum, 0)?), + Some(image_sizes_accum), + Some(num_img_tokens_accum), + n_images, + ) + } else { + let text_models_inputs_processor::ModelInputs { + input_ids, + input_ids_full: _, + seqlen_offsets, + seqlen_offsets_full: _, + seqlen_offsets_kernel, + seqlen_offsets_kernel_full: _, + context_lens, + position_ids, + } = *text_models_inputs_processor::TextInputsProcessor + .process_inputs( + tokenizer, + input_seqs, + is_prompt, + is_xlora, + device, + no_kv_cache, + last_n_context_len, + other_config, + )? + .downcast::() + .expect("Downcast failed."); - fn get_type(&self) -> crate::pipeline::InputsProcessorType { - todo!() + return Ok(Box::new(ModelInputs { + input_ids, + seqlen_offsets, + seqlen_offsets_kernel, + context_lens, + position_ids, + pixel_values: None, + model_specific_args: Box::new(LLaVANextVisionSpecificArgs { image_sizes: None }), + })); + }; + + let mut toks = Vec::new(); + let detokenized = tokenizer + .decode_batch( + &input_seqs + .iter() + .map(|seq| seq.get_toks()) + .collect::>(), + false, + ) + .map_err(anyhow::Error::msg)?; + + for (detokenized, (seq, (num_img_tokens, n_images))) in detokenized.into_iter().zip( + input_seqs + .iter_mut() + .zip(num_img_tokens.unwrap().into_iter().zip(n_images)), + ) { + let splits = self + .image_tag_splitter + .split(&detokenized) + .map(|span| &detokenized[span.range()]) + .collect::>(); + let prompt_chunks = tokenizer + .encode_batch(splits, true) + .map_err(anyhow::Error::msg)? + .into_iter() + .map(|enc| enc.get_ids().to_vec()) + .collect::>(); + + let image_tags = self.image_tag_splitter.find_iter(&detokenized); + let image_ids = image_tags + .into_iter() + .map(|s| { + let s = &detokenized[s.range()]; + s.split('|') + .nth(1) + .unwrap() + .split('_') + .nth(1) + .unwrap() + .parse::() + .expect("Failed to parse image id to u32") + }) + .collect::>(); + let unique_image_ids = image_ids + .iter() + .copied() + .unique() + .sorted() + .collect::>(); + // `image_ids` must start from 1, and must be continuous int, e.g. [1, 2, 3], cannot be [1, 4, 5] + if unique_image_ids != (1u32..unique_image_ids.len() as u32 + 1).collect::>() { + anyhow::bail!("`image_ids` must start from 1, and must be continuous, e.g. [1, 2, 3], cannot be [1, 4, 5]."); + } + // Total images must be the same as the number of image tags + if unique_image_ids.len() != n_images { + anyhow::bail!("Total images must be the same as the number of image tags."); + } + + // Use the TryInto + unwrap_or to handle case when id==0 + let image_ids_pad = image_ids + .iter() + .map(|id| { + [-(*id as i64)].repeat( + num_img_tokens[TryInto::::try_into(*id as isize - 1) + .unwrap_or(num_img_tokens.len() - 1)], + ) + }) + .collect::>(); + + let mut input_ids: Vec = Vec::new(); + for item in prompt_chunks + .iter() + .map(|x| x.iter().map(|x| *x as i64).collect::>()) + .interleave(image_ids_pad) + { + input_ids.extend(item); + } + + // NOTE(EricLBuehler): Casting to u32 is fine, we don't care about the other toks + seq.set_toks( + input_ids + .iter() + .map(|x| if *x < 0 { 0u32 } else { *x as u32 }) + .collect::>(), + ); + + toks.push(input_ids); + } + + let text_models_inputs_processor::InputMetadata { + input, + positions, + positions_kernel, + context_lens, + position_ids, + } = if is_prompt { + get_prompt_input(toks, input_seqs, device, last_n_context_len)? + } else { + get_completion_input(toks, input_seqs, device, no_kv_cache, last_n_context_len)? + }; + println!("input_ids: {}", input); + println!("seqlen_offsets: {:?}", positions); + println!("seqlen_offsets_kernel: {}", positions_kernel); + println!("context_lens: {:?}", context_lens); + println!("position_ids: {:?}", position_ids); + Ok(Box::new(ModelInputs { + input_ids: input, + seqlen_offsets: positions, + seqlen_offsets_kernel: positions_kernel, + context_lens, + position_ids, + pixel_values, + model_specific_args: Box::new(LLaVANextVisionSpecificArgs { image_sizes }), + })) } } @@ -167,46 +428,65 @@ impl ImagePreProcessor for LLaVANextInputProcessor { if images.len() > 1 { candle_core::bail!("Can only process one image per batch"); // This is no different from phi3_input_processor }; - let mut image = images[0].clone(); - let image_size = (image.width() as usize, image.height() as usize); - if config.do_resize.unwrap_or(true) { - let size = config.size.as_ref().unwrap().get("shortest_edge").unwrap(); - let filter = config.resampling.to_filter()?; - image = self.resize(&image, *size, filter); - } - if config.do_center_crop.unwrap_or(true) { - let crop_size = ( + let image_size = *config.size.as_ref().unwrap().get("shortest_edge").unwrap() as usize; + let image = images[0].clone(); + let original_size = image.dimensions(); + let best_resolution = + select_best_resolution(original_size, &self.model_config.image_grid_pinpoints); + // Here I didn't use mistral_vision::Transform, because a lot transformations are before turning the image into a tensor + let image_padded = resize_and_pad_image(&image, best_resolution); + let filter = config.resampling.to_filter()?; + let image_original_resize = + image.resize_exact(image_size as u32, image_size as u32, filter); + let mut patches = vec![image_original_resize]; + for patch in divide_to_patches( + &image_padded, + ( *config.crop_size.as_ref().unwrap().get("width").unwrap(), *config.crop_size.as_ref().unwrap().get("height").unwrap(), - ); - image = self.center_crop(&image, crop_size); + ), + ) { + patches.push(patch); } - let mut pixel_values = self.to_tensor(&image, &device)?; - if config.do_rescale.unwrap_or(true) { - let rescale_factor = config.rescale_factor.unwrap(); - pixel_values = self.rescale(&pixel_values, rescale_factor)?; - } - if config.do_normalize.unwrap_or(true) { - let image_mean = config - .image_mean - .unwrap_or(Self::DEFAULT_MEAN) - .iter() - .map(|x| *x as f32) - .collect::>(); - let image_std = config - .image_std - .unwrap_or(Self::DEFAULT_STD) - .iter() - .map(|x| *x as f32) - .collect::>(); - pixel_values = self.normalize(&pixel_values, &image_mean, &image_std)?; - } - pixel_values = self.to_channel_dimension_format(&pixel_values)?; + let process_one_image = |image: &DynamicImage| -> Result { + let mut pixel_value = self.to_tensor(&image, &device)?; + if config.do_rescale.unwrap_or(true) { + let rescale_factor = config.rescale_factor.unwrap(); + pixel_value = self.rescale(&pixel_value, rescale_factor)?; + } + if config.do_normalize.unwrap_or(true) { + let image_mean = config + .image_mean + .unwrap_or(Self::DEFAULT_MEAN) + .iter() + .map(|x| *x as f32) + .collect::>(); + let image_std = config + .image_std + .unwrap_or(Self::DEFAULT_STD) + .iter() + .map(|x| *x as f32) + .collect::>(); + pixel_value = self.normalize(&pixel_value, &image_mean, &image_std)?; + pixel_value = self.to_channel_dimension_format(&pixel_value)?; + } + Ok(pixel_value) + }; + let pixel_values = patches + .iter() + .map(process_one_image) + .collect::>>()?; + let pixel_values = Tensor::stack(&pixel_values, 0)?; + + let patch_size = self.model_config.vision_config.patch_size; + let patch_per_side = image_size / patch_size; + let num_img_tokens = + patch_per_side * patch_per_side + (patch_per_side * 2) * (patch_per_side * 2 + 1); Ok(super::image_processor::PreprocessedImages { - pixel_values: pixel_values, + pixel_values, pixel_attention_mask: None, - image_sizes: Some(image_size), - num_img_tokens: None, + image_sizes: Some((image_size, image_size)), + num_img_tokens: Some(vec![num_img_tokens]), }) } } diff --git a/mistralrs-core/src/vision_models/phi3_inputs_processor.rs b/mistralrs-core/src/vision_models/phi3_inputs_processor.rs index d4ef7e9db..8fb5de765 100644 --- a/mistralrs-core/src/vision_models/phi3_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/phi3_inputs_processor.rs @@ -254,7 +254,11 @@ impl InputsProcessor for Phi3InputsProcessor { } else { get_completion_input(toks, input_seqs, device, no_kv_cache, last_n_context_len)? }; - + println!("input_ids: {}",input); + println!("seqlen_offsets: {:?}",positions); + println!("seqlen_offsets_kernel: {}",positions_kernel); + println!("context_lens: {:?}",context_lens); + println!("position_ids: {:?}",position_ids); Ok(Box::new(ModelInputs { input_ids: input, seqlen_offsets: positions, diff --git a/mistralrs/examples/phi3v/main.rs b/mistralrs/examples/phi3v/main.rs index d3bb29109..905db7922 100644 --- a/mistralrs/examples/phi3v/main.rs +++ b/mistralrs/examples/phi3v/main.rs @@ -19,7 +19,7 @@ fn setup() -> anyhow::Result> { }, None, None, - Some("microsoft/Phi-3-vision-128k-instruct".to_string()), + Some("/root/autodl-tmp/Phi-3-vision-128k-instruct".to_string()), ) .build(VisionLoaderType::Phi3V); // Load, into a Pipeline From ac3de1575b0a99481b0ee36db9caaec9edc2f9ed Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Sun, 23 Jun 2024 19:24:36 +0800 Subject: [PATCH 08/34] meet serious problem --- cat.jpg | Bin 0 -> 11187 bytes chat_templates/llava.json | 53 ++++ mistralrs-core/src/lib.rs | 10 +- mistralrs-core/src/models/llama.rs | 13 +- mistralrs-core/src/pipeline/mod.rs | 4 +- mistralrs-core/src/pipeline/vision.rs | 3 +- mistralrs-core/src/pipeline/vision_loaders.rs | 30 +- mistralrs-core/src/sampler.rs | 1 - .../src/vision_models/llava_next.rs | 273 +++++++++--------- .../llava_next_inputs_processor.rs | 88 ++++-- mistralrs-core/src/vision_models/mod.rs | 2 +- mistralrs-core/src/vision_models/phi3.rs | 2 + .../vision_models/phi3_inputs_processor.rs | 11 +- mistralrs-pyo3/src/which.rs | 2 + mistralrs/examples/llava/main.rs | 22 +- 15 files changed, 319 insertions(+), 195 deletions(-) create mode 100644 cat.jpg create mode 100644 chat_templates/llava.json diff --git a/cat.jpg b/cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02ceafc74fae645edb96510a5fdafcba23c28da6 GIT binary patch literal 11187 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 lL9iSn%R$QrPC?M}y*HPhJs", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "1": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "2": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32000": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + } + }, + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "legacy": false, + "model_max_length": 4096, + "pad_token": "", + "padding_side": "right", + "processor_class": "LlavaNextProcessor", + "sp_model_kwargs": {}, + "spaces_between_special_tokens": false, + "tokenizer_class": "LlamaTokenizer", + "unk_token": "", + "use_default_system_prompt": false, + "chat_template": "{% if messages[0]['role'] == 'system' %}{% set loop_messages = messages[1:] %}{% set system_message = messages[0]['content'] %}{% else %}{% set loop_messages = messages %}{% set system_message = false %}{% endif %}{% for message in loop_messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if loop.index0 == 0 and system_message != false %}{% set content = '<>\\n' + system_message + '\\n<>\\n\\n' + message['content'] %}{% else %}{% set content = message['content'] %}{% endif %}{% if message['role'] == 'user' %}{{ bos_token + '[INST] ' + content.strip() + ' [/INST]' }}{% elif message['role'] == 'assistant' %}{{ ' ' + content.strip() + ' ' + eos_token }}{% endif %}{% endfor %}" +} \ No newline at end of file diff --git a/mistralrs-core/src/lib.rs b/mistralrs-core/src/lib.rs index 972b2714e..a47594a44 100644 --- a/mistralrs-core/src/lib.rs +++ b/mistralrs-core/src/lib.rs @@ -53,11 +53,11 @@ pub use device_map::{DeviceMapMetadata, LayerDeviceMapper}; pub use pipeline::{ chat_template::ChatTemplate, GGMLLoader, GGMLLoaderBuilder, GGMLSpecificConfig, GGUFArchitecture, GGUFLoader, GGUFLoaderBuilder, GGUFSpecificConfig, GemmaLoader, - Idefics2Loader, LlamaLoader, Loader, LocalModelPaths, MistralLoader, MixtralLoader, ModelKind, - ModelPaths, NormalLoader, NormalLoaderBuilder, NormalLoaderType, NormalSpecificConfig, - Phi2Loader, Phi3Loader, Phi3VLoader, Qwen2Loader, SpeculativeConfig, SpeculativeLoader, - SpeculativePipeline, TokenSource, VisionLoader, VisionLoaderBuilder, VisionLoaderType, - VisionModelLoader, VisionSpecificConfig, + Idefics2Loader, LLaVANextLoader, LlamaLoader, Loader, LocalModelPaths, MistralLoader, + MixtralLoader, ModelKind, ModelPaths, NormalLoader, NormalLoaderBuilder, NormalLoaderType, + NormalSpecificConfig, Phi2Loader, Phi3Loader, Phi3VLoader, Qwen2Loader, SpeculativeConfig, + SpeculativeLoader, SpeculativePipeline, TokenSource, VisionLoader, VisionLoaderBuilder, + VisionLoaderType, VisionModelLoader, VisionSpecificConfig, }; pub use request::{Constraint, MessageContent, NormalRequest, Request, RequestMessage}; pub use response::Response; diff --git a/mistralrs-core/src/models/llama.rs b/mistralrs-core/src/models/llama.rs index e6026a939..95c8c5b86 100644 --- a/mistralrs-core/src/models/llama.rs +++ b/mistralrs-core/src/models/llama.rs @@ -196,6 +196,7 @@ impl Block { ) -> Result { let residual = x; let x = self.rms_1.forward(x)?; + println!("after rms_1 x: {}",x); let x = (self.attn.forward( &x, attention_mask, @@ -267,6 +268,10 @@ impl Llama { context_lens: Vec<(usize, usize)>, ) -> Result { let mut x = input_embed.clone(); + println!("input x: {}",x); + let max_value = x.max(0)?.max(0)?.max(0)?; + let min_value = x.min(0)?.min(0)?.min(0)?; + println!("input max_value: {} min_value: {}",max_value,min_value); let mut cache = self.kv_cache.lock(); let mask = CausalMasker.make_causal_mask_as_attn_bias_with_embed_tensor( &x, @@ -274,6 +279,7 @@ impl Llama { x.dtype(), self.blocks[0].attn.num_attention_heads, )?; + println!("mask: {:?}",mask); for (block_idx, block) in self.blocks.iter().enumerate() { x = self.mapper.map(x, block_idx)?; x = block.forward( @@ -285,13 +291,18 @@ impl Llama { &mut cache, )?; } + println!("block x: {}",x); x = x.to_device(&self.device)?; x = self.ln_f.forward(&x)?; + println!("ln_f x: {}",x); if matches!(self.lm_head, QMatMul::QTensor(_)) { x = x.to_dtype(DType::F32)?; } let logits = MatMul.qmatmul(&x, &self.lm_head)?; - extract_logits(&logits, context_lens) + println!("unextracted logits: {}",logits); + let result = extract_logits(&logits, context_lens)?; //need to reset to original, this is only for debug + println!("extracted logits: {}",result); + Ok(result) } pub fn forward( diff --git a/mistralrs-core/src/pipeline/mod.rs b/mistralrs-core/src/pipeline/mod.rs index 77478626f..0b90bacc8 100644 --- a/mistralrs-core/src/pipeline/mod.rs +++ b/mistralrs-core/src/pipeline/mod.rs @@ -42,7 +42,9 @@ use std::{collections::HashMap, path::PathBuf, str::FromStr}; use tokenizers::Tokenizer; use tokio::sync::Mutex; pub use vision::{VisionLoader, VisionLoaderBuilder, VisionSpecificConfig}; -pub use vision_loaders::{Idefics2Loader, Phi3VLoader, VisionLoaderType, VisionModelLoader}; +pub use vision_loaders::{ + Idefics2Loader, LLaVANextLoader, Phi3VLoader, VisionLoaderType, VisionModelLoader, +}; use anyhow::Result; use candle_core::{Device, Tensor}; diff --git a/mistralrs-core/src/pipeline/vision.rs b/mistralrs-core/src/pipeline/vision.rs index 5f569c48b..f1ba9392e 100644 --- a/mistralrs-core/src/pipeline/vision.rs +++ b/mistralrs-core/src/pipeline/vision.rs @@ -151,7 +151,7 @@ impl Loader for VisionLoader { if mapper.is_dummy() { info!("Loading model `{}` on {device:?}...", self.get_id()); } - + info!( "Model config: {:?}", self.inner @@ -207,6 +207,7 @@ impl Loader for VisionLoader { .get_gen_conf_filename() .map(|f| serde_json::from_str(&fs::read_to_string(f).unwrap()).unwrap()); let chat_template = get_chat_template(paths, &self.chat_template, None); + println!("Chat template: {:?}", chat_template); if let Some(in_situ_quant) = in_situ_quant { model.quantize(in_situ_quant, device.clone())?; diff --git a/mistralrs-core/src/pipeline/vision_loaders.rs b/mistralrs-core/src/pipeline/vision_loaders.rs index 11c7e9164..67e7282af 100644 --- a/mistralrs-core/src/pipeline/vision_loaders.rs +++ b/mistralrs-core/src/pipeline/vision_loaders.rs @@ -12,6 +12,8 @@ use serde::Deserialize; use super::{NormalLoadingMetadata, Processor, ProcessorCreator, VisionModel}; use crate::vision_models::idefics2::{Config as Idefics2Config, Idefics2}; use crate::vision_models::idefics2_input_processor::Idefics2Processor; +use crate::vision_models::llava_next::{Config as LLaVANextConfig, Model as LLaVANext}; +use crate::vision_models::llava_next_inputs_processor::LLaVANextProcessor; use crate::vision_models::phi3::{Config as Phi3Config, Model as Phi3}; use crate::vision_models::phi3_inputs_processor::Phi3Processor; use crate::vision_models::preprocessor_config::PreProcessorConfig; @@ -153,18 +155,29 @@ pub struct LLaVANextLoader; impl VisionModelLoader for LLaVANextLoader { fn load( &self, - _config: &str, - _use_flash_attn: bool, - _vb: VarBuilder, - _normal_loading_metadata: NormalLoadingMetadata, + config: &str, + use_flash_attn: bool, + vb: VarBuilder, + normal_loading_metadata: NormalLoadingMetadata, ) -> Result> { - todo!() + println!("load LLaVANext"); + let mut config: LLaVANextConfig = serde_json::from_str(config)?; + config.use_flash_attn = use_flash_attn; + Ok(Box::new(LLaVANext::new( + &config, + vb, + self.is_gptx(), + normal_loading_metadata, + )?)) } fn is_gptx(&self) -> bool { false } - fn get_config_repr(&self, _config: &str, _use_flash_attn: bool) -> Result> { - todo!() + fn get_config_repr(&self, config: &str, use_flash_attn: bool) -> Result> { + println!("get_config_repr LLaVANext"); + let mut config: LLaVANextConfig = serde_json::from_str(config)?; + config.use_flash_attn = use_flash_attn; + Ok(Box::new(config)) } fn get_processor( &self, @@ -172,6 +185,7 @@ impl VisionModelLoader for LLaVANextLoader { _processor_config: Option, _preprocessor_config: PreProcessorConfig, ) -> Arc { - todo!() + println!("get_processor LLaVANext"); + Arc::new(LLaVANextProcessor::new(model_config)) } } diff --git a/mistralrs-core/src/sampler.rs b/mistralrs-core/src/sampler.rs index 34ad8bae9..3acbfeec5 100644 --- a/mistralrs-core/src/sampler.rs +++ b/mistralrs-core/src/sampler.rs @@ -283,7 +283,6 @@ impl Sampler { rng: Arc>, ) -> Result { let mut argsort_indices = (0..probs.len()).collect::>(); - // Sort by descending probability. argsort_indices .sort_unstable_by(|&i, &j| probs[j].partial_cmp(&probs[i]).expect("No ordering.")); diff --git a/mistralrs-core/src/vision_models/llava_next.rs b/mistralrs-core/src/vision_models/llava_next.rs index bfa0deff9..d9e66c3eb 100644 --- a/mistralrs-core/src/vision_models/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava_next.rs @@ -1,11 +1,12 @@ #![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] use candle_core::quantized::QMatMul; -use candle_core::{bail, Device, IndexOp, Result, Tensor}; -use candle_nn::{linear, seq, Activation, Module, Sequential, VarBuilder}; +use candle_core::{bail, DType, Device, IndexOp, Result, Tensor}; +use candle_nn::{linear, seq, Activation, Linear, Module, Sequential, VarBuilder}; use itertools::Itertools; use serde::Deserialize; use crate::device_map::DeviceMapper; +use crate::ops::NonZeroOp; use crate::pipeline::IsqModel; use crate::pipeline::NormalLoadingMetadata; use crate::pipeline::NormalModel; @@ -19,18 +20,12 @@ use crate::vision_models::llava_next_inputs_processor::get_anyres_image_grid_sha use super::clip::{Activation as ClipActivation, ClipVisionTransformer}; -const DEFAULT_PROJECTOR_HIDDEN_SIZE: usize = 1024; #[derive(Debug, Clone, Deserialize)] pub struct Config { - pub architectures: Vec, - pub ignore_index: isize, pub image_grid_pinpoints: Vec<(u32, u32)>, - pub image_token_index: isize, - pub model_type: String, pub projector_hidden_act: String, pub text_config: LLaVATextConfig, pub torch_dtype: String, - pub use_image_newline_parameter: bool, pub vision_config: LLaVAVisionConfig, pub vision_feature_layer: isize, pub vision_feature_select_strategy: String, @@ -121,37 +116,43 @@ impl Config { } pub struct MMProjector { - pub modules: Sequential, + linear_1: Linear, + activation: Activation, + linear_2: Linear, } impl MMProjector { pub fn new(vb: &VarBuilder, config: &Config) -> Result { - let mut modules = seq().add(linear( - DEFAULT_PROJECTOR_HIDDEN_SIZE, + let linear_1 = linear( + config.vision_config.hidden_size, config.text_config.hidden_size, vb.pp("multi_modal_projector.linear_1"), - )?); - match config.projector_hidden_act.as_str() { - "gelu" => { - modules = modules.add(Activation::Gelu); - } + )?; + let activation = match config.projector_hidden_act.as_str() { + "gelu" => Activation::Gelu, _ => { bail!( "Unsupporg projector hidden act: {}", config.projector_hidden_act ); } - } - modules = modules.add(linear( + }; + let linear_2 = linear( config.text_config.hidden_size, config.text_config.hidden_size, vb.pp("multi_modal_projector.linear_2"), - )?); - Ok(Self { modules }) + )?; + Ok(Self { + linear_1, + activation, + linear_2, + }) } pub fn forward(&self, x: &Tensor) -> Result { - self.modules.forward(x) + x.apply(&self.linear_1)? + .apply(&self.activation)? + .apply(&self.linear_2) } } @@ -269,109 +270,87 @@ impl Model { pub fn prepare_inputs_labels_for_multimodal( &self, input_ids: &Tensor, //[1,seq_len] - images: &Tensor, //[sample_per_image*image_len,chanel,width,height] for LLaVANext, we fix aspect_ratio_setting to 'anyres'(this is akin to python Transformer). Hence sampler_per_image is 5 + images: &Tensor, //[sample_per_image*image_num,chanel,width,height] for LLaVANext, we fix aspect_ratio_setting to 'anyres', (this is akin to python Transformer). Hence sampler_per_image is 5 + num_image_token: usize, image_sizes: &[(u32, u32)], ) -> Result { - // can be modified if nonzero(already implemented) and other index select ops are implemented - let input_ids_vec = input_ids.squeeze(0)?.to_vec1::()?; - let mut image_indices = vec![0_i64]; - image_indices.extend( - input_ids_vec - .iter() - .enumerate() - .filter_map(|(i, x)| { - if *x == self.config.image_token_index as i64 { - Some(i as i64) - } else { - None - } - }) - .collect::>(), - ); - if image_indices.len() == 1 { - //no image, only [0], - return self.llama.embed(input_ids); - } - - let x = self.encode_images(&images)?; + let image_indexes = input_ids + .squeeze(0)? + .lt(0i64)? + .nonzero()? + .squeeze(1)? + .to_vec1::()?; + let image_ids = image_indexes + .iter() + .map(|x| Ok(-(input_ids.i((0, *x as usize))?.to_scalar::()?))) + .collect::>>()?; + let mut result = input_ids.clamp(0i64, i64::MAX)?.to_dtype(DType::U32)?; + result = self.llama.embed(&result)?; //[seq_len,hidden_size] + let image_features = self.encode_images(images)?; //[sample_per_image*image_num,hidden_size] let image_nums = images.shape().dims()[0] / 5; - let mut image_features = Vec::new(); - // can be replaced by split - for image_index in 0..image_nums { - image_features.push(x.i(image_index * 5..(image_index + 1) * 5)?); + let mut image_features_vec = Vec::new(); + for i in 0..image_nums { + image_features_vec.push(image_features.i(i * 5..(i + 1) * 5)?); } - drop(x); - let mut new_image_features = Vec::new(); - for (image_idx, image_feature) in image_features.iter().enumerate() { - let base_image_feature = image_feature.get(0).unwrap(); - let patch_image_feature = image_feature.i(1..).unwrap(); - let height = self.clip_vision_tower.num_patches_per_side(); - let width = height; - assert_eq!(height * width, base_image_feature.dims()[0]); - let image_size = image_sizes[image_idx]; - let (num_patch_width, num_patch_height) = get_anyres_image_grid_shape( - image_size, - &self.config.image_grid_pinpoints, - self.clip_vision_tower.config.image_size as u32, - ); - let mut new_image_feature = patch_image_feature.reshape(( - num_patch_height as usize, - num_patch_width as usize, - height, - width, - (), - ))?; - new_image_feature = new_image_feature - .permute((4, 0, 2, 1, 3))? - .flatten(1, 2)? - .flatten(2, 3)?; - new_image_feature = self.unpad_image(&new_image_feature, &image_size)?; - let new_image_feature_dims = new_image_feature.dims(); - let image_new_line = self - .image_newline - .reshape((self.config.text_config.hidden_size, 1, 1))? - .broadcast_as((new_image_feature_dims[0], new_image_feature_dims[1], 1))?; - new_image_feature = Tensor::cat(&[new_image_feature, image_new_line], 2)? - .flatten(1, 2)? - .transpose(0, 1)?; - new_image_feature = Tensor::cat(&[base_image_feature, new_image_feature], 0)?; - new_image_features.push(new_image_feature); - } - image_features = new_image_features; //moved - - let input_ids_noim = input_ids_vec + let image_features_vec = image_features_vec .iter() - .filter_map(|x| { - if *x != self.config.image_token_index as i64 { - Some(*x) - } else { - None - } + .enumerate() + .map(|(image_idx, image_feature)| { + let base_image_feature = image_feature.get(0).unwrap(); + let patch_image_feature = image_feature.i(1..).unwrap(); + let height = self.clip_vision_tower.num_patches_per_side(); + let width = height; + assert_eq!(height * width, base_image_feature.dims()[0]); + let image_size = image_sizes[image_idx]; + let (num_patch_width, num_patch_height) = get_anyres_image_grid_shape( + image_size, + &self.config.image_grid_pinpoints, + self.clip_vision_tower.config.image_size as u32, + ); + let mut new_image_feature = patch_image_feature.reshape(( + num_patch_height as usize, + num_patch_width as usize, + height, + width, + (), + ))?; + new_image_feature = new_image_feature + .permute((4, 0, 2, 1, 3))? + .flatten(1, 2)? + .flatten(2, 3)?; + new_image_feature = self.unpad_image(&new_image_feature, &image_size)?; + let new_image_feature_dims = new_image_feature.dims(); + let image_new_line = self + .image_newline + .reshape((self.config.text_config.hidden_size, 1, 1))? + .broadcast_as((new_image_feature_dims[0], new_image_feature_dims[1], 1))?; + new_image_feature = Tensor::cat(&[new_image_feature, image_new_line], 2)? + .flatten(1, 2)? + .transpose(0, 1)?; + new_image_feature = + Tensor::cat(&[base_image_feature, new_image_feature], 0)?.unsqueeze(0)?; + Ok(new_image_feature) }) - .collect::>(); + .collect::>>()?; - let input_ids_noim_len = input_ids_noim.len(); - image_indices.push((input_ids_noim_len) as i64); - - let mut cur_input_embeds = - Tensor::from_vec(input_ids_noim, input_ids_noim_len, &self.device)?; - cur_input_embeds = self.llama.embed(&cur_input_embeds)?; - let mut input_embed_no_ims = Vec::new(); - for i in 0..image_indices.len() - 1 { - let start = (image_indices[i]) as usize; - let end = image_indices[i + 1] as usize; - input_embed_no_ims.push(cur_input_embeds.i((start..end, ..))?) - } - let cur_new_input_embeds: Vec<&Tensor> = input_embed_no_ims - .iter() - .interleave(&image_features) - .collect::>(); - let mut new_input_embeds = Tensor::cat(&cur_new_input_embeds, 0)?; - let (new_input_embeds_length, _) = new_input_embeds.shape().dims2()?; - if new_input_embeds_length > self.config.text_config.max_length { - new_input_embeds = new_input_embeds.i((..self.config.text_config.max_length, ..))?; + let hidden_size = image_features_vec[0].shape().dims()[2]; + println!("result.shape: {:?}", result.shape()); + println!( + "image_features_vec[0].shape: {:?}", + image_features_vec[0].shape() + ); + for (i, image_index) in image_indexes.iter().enumerate() { + let image_id = image_ids[i]; + result = result.slice_assign( + &[ + &(0usize..1usize), + &(*image_index as usize..*image_index as usize + num_image_token), + &(0..hidden_size), + ], + &image_features_vec[(image_id - 1) as usize], + )?; } - new_input_embeds.unsqueeze(0) + Ok(result) } pub fn forward( @@ -379,21 +358,20 @@ impl Model { input_ids: &Tensor, pixel_values: Option, image_sizes: Option>, + num_image_token: Option, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, ) -> Result { if let Some(ref pixel_values) = pixel_values { // we assume(as it should be) only prompt request contains image let input_embeds = self.prepare_inputs_labels_for_multimodal( input_ids, pixel_values, + num_image_token.unwrap(), &image_sizes.unwrap(), )?; - let seqlen_offsets = [0]; - let (_, input_embeds_len, _) = input_embeds.dims3()?; - let start_offsets_kernel = - Tensor::from_iter((0..input_embeds_len).map(|x| x as i64), &self.device)? - .unsqueeze(0)?; - let context_lens = vec![(input_embeds_len - 1, 1)]; - self.position = input_embeds_len; // this is for next round. + println!("input_embeds.shape: {:?}", input_embeds.shape()); self.llama.forward_input_embed( &input_embeds, &seqlen_offsets, @@ -401,15 +379,6 @@ impl Model { context_lens, ) } else { - let (_, input_len) = input_ids.shape().dims2()?; - let seqlen_offsets = [self.position]; - let start_offsets_kernel = Tensor::from_iter( - (self.position..self.position + input_len).map(|x| x as i64), - &self.device, - )? - .unsqueeze(0)?; - let context_lens = vec![(input_len - 1, 1)]; - self.position += input_len; self.llama.forward( input_ids, &seqlen_offsets, @@ -422,6 +391,7 @@ impl Model { pub(crate) struct LLaVANextVisionSpecificArgs { pub image_sizes: Option>, + pub num_image_token: Option, } impl IsqModel for Model { @@ -436,23 +406,38 @@ impl VisionModel for Model { &mut self, input_ids: &Tensor, pixel_values: Option, - _seqlen_offsets: &[usize], - _start_offsets_kernel: Tensor, - _context_lens: Vec<(usize, usize)>, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, _position_ids: Vec, model_specific_args: Box, // pixel attention mask, or image sizes, or anything else ) -> candle_core::Result { - let LLaVANextVisionSpecificArgs { image_sizes } = *model_specific_args + let LLaVANextVisionSpecificArgs { + image_sizes, + num_image_token, + } = *model_specific_args .downcast() .expect("Cannot downcast into `LLaVANextVisionSpecificArgs`"); - let image_sizes = Some( - image_sizes - .unwrap() - .iter() - .map(|(w, h)| (*w as u32, *h as u32)) - .collect(), - ); - self.forward(input_ids, pixel_values, image_sizes) + let image_sizes = if image_sizes.is_some() { + Some( + image_sizes + .unwrap() + .iter() + .map(|(w, h)| (*w as u32, *h as u32)) + .collect(), + ) + } else { + None + }; + self.forward( + input_ids, + pixel_values, + image_sizes, + num_image_token, + seqlen_offsets, + start_offsets_kernel, + context_lens, + ) } fn device(&self) -> &Device { diff --git a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs index dee6111c7..d9f36f77e 100644 --- a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs @@ -12,7 +12,9 @@ use regex_automata::meta::Regex; use tokenizers::Tokenizer; use crate::pipeline::text_models_inputs_processor::{get_completion_input, get_prompt_input}; -use crate::pipeline::{text_models_inputs_processor, InputsProcessor, InputsProcessorType}; +use crate::pipeline::{ + text_models_inputs_processor, InputsProcessor, InputsProcessorType, MessagesAction, Processor, +}; use crate::sequence::Sequence; use crate::vision_models::image_processor::PreprocessedImages; use crate::vision_models::llava_next::Config; @@ -134,6 +136,18 @@ pub struct LLaVANextProcessor { inputs_processor: Arc, } +impl Processor for LLaVANextProcessor { + fn inputs_processor(&self) -> Arc { + self.inputs_processor.clone() + } + fn get_special_tokens(&self) -> &[&'static str] { + &[] + } + fn template_action(&self) -> MessagesAction { + MessagesAction::FlattenOnlyText + } +} + impl LLaVANextProcessor { pub fn new(config: &str) -> Self { let model_config = serde_json::from_str::(config) @@ -153,7 +167,7 @@ pub struct LLaVANextInputProcessor { model_config: crate::vision_models::llava_next::Config, } -// Copy from phi3_inputs_processor. different is (1) calculate of num_image_token (2) process_anyres_image +// Copy from phi3_inputs_processor. different is (1) calculate of num_image_token (2) process_anyres_image (3)image_ids_pad impl InputsProcessor for LLaVANextInputProcessor { fn get_type(&self) -> InputsProcessorType { InputsProcessorType::Vision @@ -236,7 +250,11 @@ impl InputsProcessor for LLaVANextInputProcessor { )? .downcast::() .expect("Downcast failed."); - + println!("input_ids: {}", input_ids); + println!("seqlen_offsets: {:?}", seqlen_offsets); + println!("seqlen_offsets_kernel: {}", seqlen_offsets_kernel); + println!("context_lens: {:?}", context_lens); + println!("position_ids: {:?}", position_ids); return Ok(Box::new(ModelInputs { input_ids, seqlen_offsets, @@ -244,7 +262,10 @@ impl InputsProcessor for LLaVANextInputProcessor { context_lens, position_ids, pixel_values: None, - model_specific_args: Box::new(LLaVANextVisionSpecificArgs { image_sizes: None }), + model_specific_args: Box::new(LLaVANextVisionSpecificArgs { + image_sizes: None, + num_image_token: None, + }), })); }; @@ -305,17 +326,13 @@ impl InputsProcessor for LLaVANextInputProcessor { if unique_image_ids.len() != n_images { anyhow::bail!("Total images must be the same as the number of image tags."); } - - // Use the TryInto + unwrap_or to handle case when id==0 - let image_ids_pad = image_ids - .iter() - .map(|id| { - [-(*id as i64)].repeat( - num_img_tokens[TryInto::::try_into(*id as isize - 1) - .unwrap_or(num_img_tokens.len() - 1)], - ) - }) - .collect::>(); + //only start position is -id, other positions are 0. This is for targeting image positions. + let mut image_ids_pad = Vec::new(); + for image_id in image_ids.iter() { + let mut image_id_pad = vec![0; num_img_tokens[*image_id as usize - 1]]; + image_id_pad[0] = -(*image_id as i64); + image_ids_pad.push(image_id_pad); + } let mut input_ids: Vec = Vec::new(); for item in prompt_chunks @@ -360,12 +377,21 @@ impl InputsProcessor for LLaVANextInputProcessor { context_lens, position_ids, pixel_values, - model_specific_args: Box::new(LLaVANextVisionSpecificArgs { image_sizes }), + model_specific_args: Box::new(LLaVANextVisionSpecificArgs { + image_sizes, + num_image_token: Some(self.get_num_image_tokens()), + }), })) } } impl LLaVANextInputProcessor { + fn get_num_image_tokens(&self) -> usize { + let patch_size = self.model_config.vision_config.patch_size; + let image_size = self.model_config.vision_config.image_size; + let patch_per_side = image_size / patch_size; + patch_per_side * patch_per_side + (patch_per_side * 2) * (patch_per_side * 2 + 1) + } fn resize(&self, image: &DynamicImage, size: u32, filter: FilterType) -> DynamicImage { let (width, height) = image.dimensions(); if width == size && height == size { @@ -448,8 +474,25 @@ impl ImagePreProcessor for LLaVANextInputProcessor { ) { patches.push(patch); } + let dtype = match self.model_config.torch_dtype.as_str() { + "float16" => DType::F16, + "bfloat16" => DType::BF16, + _ => candle_core::bail!("unsupported dtype"), + }; let process_one_image = |image: &DynamicImage| -> Result { - let mut pixel_value = self.to_tensor(&image, &device)?; + let mut image = if config.do_resize.unwrap_or(true) { + self.resize(image, image_size as u32, filter) + } else { + image.clone() + }; + image = if config.do_center_crop.unwrap_or(true) { + let crop_width = *config.crop_size.as_ref().unwrap().get("width").unwrap() as u32; + let crop_height = *config.crop_size.as_ref().unwrap().get("height").unwrap() as u32; + self.center_crop(&image, (crop_width, crop_height)) + } else { + image + }; + let mut pixel_value = self.to_tensor(&image, &Device::Cpu)?; if config.do_rescale.unwrap_or(true) { let rescale_factor = config.rescale_factor.unwrap(); pixel_value = self.rescale(&pixel_value, rescale_factor)?; @@ -468,7 +511,10 @@ impl ImagePreProcessor for LLaVANextInputProcessor { .map(|x| *x as f32) .collect::>(); pixel_value = self.normalize(&pixel_value, &image_mean, &image_std)?; - pixel_value = self.to_channel_dimension_format(&pixel_value)?; + pixel_value = self + .to_channel_dimension_format(&pixel_value)? + .to_dtype(dtype)? + .to_device(device)?; } Ok(pixel_value) }; @@ -478,15 +524,11 @@ impl ImagePreProcessor for LLaVANextInputProcessor { .collect::>>()?; let pixel_values = Tensor::stack(&pixel_values, 0)?; - let patch_size = self.model_config.vision_config.patch_size; - let patch_per_side = image_size / patch_size; - let num_img_tokens = - patch_per_side * patch_per_side + (patch_per_side * 2) * (patch_per_side * 2 + 1); Ok(super::image_processor::PreprocessedImages { pixel_values, pixel_attention_mask: None, image_sizes: Some((image_size, image_size)), - num_img_tokens: Some(vec![num_img_tokens]), + num_img_tokens: Some(vec![self.get_num_image_tokens()]), }) } } diff --git a/mistralrs-core/src/vision_models/mod.rs b/mistralrs-core/src/vision_models/mod.rs index ef0fc39c3..8c79b8835 100644 --- a/mistralrs-core/src/vision_models/mod.rs +++ b/mistralrs-core/src/vision_models/mod.rs @@ -6,8 +6,8 @@ pub(crate) mod clip; pub(crate) mod idefics2; pub(crate) mod idefics2_input_processor; pub(crate) mod image_processor; -pub(crate) mod llava_next_inputs_processor; pub(crate) mod llava_next; +pub(crate) mod llava_next_inputs_processor; pub(crate) mod phi3; pub(crate) mod phi3_inputs_processor; pub(crate) mod preprocessor_config; diff --git a/mistralrs-core/src/vision_models/phi3.rs b/mistralrs-core/src/vision_models/phi3.rs index 339a92b71..884935293 100644 --- a/mistralrs-core/src/vision_models/phi3.rs +++ b/mistralrs-core/src/vision_models/phi3.rs @@ -830,6 +830,7 @@ impl Model { } else { self.embed_tokens.forward(input_ids)? }; + println!("input xs: {}",xs); let mut cache = self.cache.lock(); let attention_mask = CausalMasker.make_causal_mask_with_sliding_window_as_attn_bias( input_ids, @@ -857,6 +858,7 @@ impl Model { &mut cache[i], )? } + println!("block xs: {}",xs); let xs = xs.to_device(&self.device)?; let mut xs = xs.apply(&self.norm)?; if matches!(self.lm_head, QMatMul::QTensor(_)) { diff --git a/mistralrs-core/src/vision_models/phi3_inputs_processor.rs b/mistralrs-core/src/vision_models/phi3_inputs_processor.rs index 8fb5de765..b7147e658 100644 --- a/mistralrs-core/src/vision_models/phi3_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/phi3_inputs_processor.rs @@ -254,11 +254,12 @@ impl InputsProcessor for Phi3InputsProcessor { } else { get_completion_input(toks, input_seqs, device, no_kv_cache, last_n_context_len)? }; - println!("input_ids: {}",input); - println!("seqlen_offsets: {:?}",positions); - println!("seqlen_offsets_kernel: {}",positions_kernel); - println!("context_lens: {:?}",context_lens); - println!("position_ids: {:?}",position_ids); + println!("input_ids: {}", input); + println!("seqlen_offsets: {:?}", positions); + println!("seqlen_offsets_kernel: {}", positions_kernel); + println!("context_lens: {:?}", context_lens); + println!("position_ids: {:?}", position_ids); + todo!(); Ok(Box::new(ModelInputs { input_ids: input, seqlen_offsets: positions, diff --git a/mistralrs-pyo3/src/which.rs b/mistralrs-pyo3/src/which.rs index 9216bf491..059febfde 100644 --- a/mistralrs-pyo3/src/which.rs +++ b/mistralrs-pyo3/src/which.rs @@ -32,6 +32,7 @@ impl From for NormalLoaderType { pub enum VisionArchitecture { Phi3V, Idefics2, + LLaVANext, } impl From for VisionLoaderType { @@ -39,6 +40,7 @@ impl From for VisionLoaderType { match value { VisionArchitecture::Phi3V => VisionLoaderType::Phi3V, VisionArchitecture::Idefics2 => VisionLoaderType::Idefics2, + VisionArchitecture::LLaVANext => VisionLoaderType::LLaVANext, } } } diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index 1c7cebdbd..3a9e77a74 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -17,17 +17,17 @@ fn setup() -> anyhow::Result> { use_flash_attn: false, repeat_last_n: 64, }, - None, + Some("chat_templates/llava.json".to_string()), None, Some("/root/autodl-tmp/cache/huggingface/hub/models--llava-hf--llava-v1.6-vicuna-7b-hf/snapshots/0524afe4453163103dcefe78eb0a58b3f6424eac".to_string()), ) .build(VisionLoaderType::LLaVANext); // Load, into a Pipeline - + let pipeline = loader.load_model_from_hf( None, TokenSource::CacheToken, - &ModelDType::Auto, + &ModelDType::F16, // how can we load from config? &Device::cuda_if_available(0)?, false, DeviceMapMetadata::dummy(), @@ -52,6 +52,14 @@ fn main() -> anyhow::Result<()> { ), ])], }, + + /* + messages: RequestMessage::Completion { + text: "Hello! My name is ".to_string(), + echo_prompt: false, + best_of: 1, + }, + */ sampling_params: SamplingParams::default(), response: tx, return_logprobs: false, @@ -62,11 +70,15 @@ fn main() -> anyhow::Result<()> { adapters: None, }); mistralrs.get_sender()?.blocking_send(request)?; - let response = rx.blocking_recv().unwrap(); match response { Response::Done(c) => println!("Text: {}", c.choices[0].message.content), - _ => unreachable!(), + Response::InternalError(e) => println!("Internal error: {:?}", e), + Response::ValidationError(e) => println!("Validation error: {:?}", e), + Response::ModelError(s, r) => println!("Model error: {:?} {:?}", s, r), + Response::Chunk(_) => println!("Chunk"), + Response::CompletionModelError(_, _) => println!("Completion model error"), + Response::CompletionDone(c) => println!("Text: {}", c.choices[0].text), } Ok(()) } From 93aadda30804c2332d2f04c8c0128769a7637f1d Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Sun, 23 Jun 2024 19:27:29 +0800 Subject: [PATCH 09/34] debugging --- mistralrs-core/src/models/llama.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mistralrs-core/src/models/llama.rs b/mistralrs-core/src/models/llama.rs index 95c8c5b86..3696bfb91 100644 --- a/mistralrs-core/src/models/llama.rs +++ b/mistralrs-core/src/models/llama.rs @@ -195,6 +195,9 @@ impl Block { kv_cache: &mut crate::pipeline::LayerCaches, ) -> Result { let residual = x; + let max_value = x.max(0)?.max(0)?.max(0)?; + let min_value = x.min(0)?.min(0)?.min(0)?; + println!("before rms_1 max_value: {} min_value: {}",max_value,min_value); let x = self.rms_1.forward(x)?; println!("after rms_1 x: {}",x); let x = (self.attn.forward( From ba1a3985b90f2375d731fb602c5892fe23c96780 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Tue, 25 Jun 2024 19:52:18 +0800 Subject: [PATCH 10/34] debugging --- chat_templates/llava.json | 67 ++++------ mistralrs-core/src/models/llama.rs | 126 +++++++++++++++--- .../src/vision_models/llava_next.rs | 13 +- .../llava_next_inputs_processor.rs | 19 ++- mistralrs/examples/llava/main.rs | 6 +- 5 files changed, 155 insertions(+), 76 deletions(-) diff --git a/chat_templates/llava.json b/chat_templates/llava.json index 8831cd248..f7f5b1c24 100644 --- a/chat_templates/llava.json +++ b/chat_templates/llava.json @@ -1,53 +1,36 @@ { "add_bos_token": true, "add_eos_token": false, - "add_prefix_space": true, - "added_tokens_decoder": { - "0": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "1": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "2": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - }, - "32000": { - "content": "", - "lstrip": false, - "normalized": false, - "rstrip": false, - "single_word": false, - "special": true - } + "bos_token": { + "__type": "AddedToken", + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false }, - "bos_token": "", + "chat_template": "{% if messages[0]['role'] == 'system' %}{% set loop_messages = messages[1:] %}{% set system_message = messages[0]['content'] %}{% else %}{% set loop_messages = messages %}{% set system_message = 'A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user\\'s questions.' %}{% endif %}{% for message in loop_messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if loop.index0 == 0 %}{{ system_message }}{% endif %}{% if message['role'] == 'user' %}{{ ' USER: ' + message['content'].strip() }}{% elif message['role'] == 'assistant' %}{{ ' ASSISTANT: ' + message['content'].strip() + eos_token }}{% endif %}{% endfor %}{% if add_generation_prompt %}{{ ' ASSISTANT:' }}{% endif %}", "clean_up_tokenization_spaces": false, - "eos_token": "", + "eos_token": { + "__type": "AddedToken", + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + }, "legacy": false, "model_max_length": 4096, - "pad_token": "", + "pad_token": null, "padding_side": "right", - "processor_class": "LlavaNextProcessor", "sp_model_kwargs": {}, - "spaces_between_special_tokens": false, "tokenizer_class": "LlamaTokenizer", - "unk_token": "", - "use_default_system_prompt": false, - "chat_template": "{% if messages[0]['role'] == 'system' %}{% set loop_messages = messages[1:] %}{% set system_message = messages[0]['content'] %}{% else %}{% set loop_messages = messages %}{% set system_message = false %}{% endif %}{% for message in loop_messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if loop.index0 == 0 and system_message != false %}{% set content = '<>\\n' + system_message + '\\n<>\\n\\n' + message['content'] %}{% else %}{% set content = message['content'] %}{% endif %}{% if message['role'] == 'user' %}{{ bos_token + '[INST] ' + content.strip() + ' [/INST]' }}{% elif message['role'] == 'assistant' %}{{ ' ' + content.strip() + ' ' + eos_token }}{% endif %}{% endfor %}" + "unk_token": { + "__type": "AddedToken", + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + } } \ No newline at end of file diff --git a/mistralrs-core/src/models/llama.rs b/mistralrs-core/src/models/llama.rs index 3696bfb91..78559343e 100644 --- a/mistralrs-core/src/models/llama.rs +++ b/mistralrs-core/src/models/llama.rs @@ -39,9 +39,17 @@ struct CausalSelfAttention { use_flash_attn: bool, rotary_emb: Arc, max_seq_len: usize, + cos: Tensor, // for debugging + sin: Tensor, // for debugging } impl CausalSelfAttention { + fn apply_rotary_emb(&self, x: &Tensor, index_pos: usize) -> Result { + let (_b_sz, _, seq_len, _hidden_size) = x.dims4()?; + let cos = self.cos.narrow(0, index_pos, seq_len)?; + let sin = self.sin.narrow(0, index_pos, seq_len)?; + candle_nn::rotary_emb::rope(x, &cos, &sin) + } fn forward( &self, x: &Tensor, @@ -66,16 +74,22 @@ impl CausalSelfAttention { k = k.to_dtype(original_dtype)?; v = v.to_dtype(original_dtype)?; } - + println!("before reshape q.shape {:?}", q.shape()); //[1,2975,4096] let mut q = q.reshape((b_sz * seq_len, self.num_attention_heads, self.head_dim))?; let mut k = k.reshape((b_sz * seq_len, self.num_key_value_heads, self.head_dim))?; let v = v .reshape((b_sz, seq_len, self.num_key_value_heads, self.head_dim))? .transpose(1, 2)?; - - self.rotary_emb - .forward(seqlen_offsets, &start_offsets_kernel, &mut q, &mut k, b_sz)?; - + println!("before rotary_emb q.shape {:?}", q.shape()); //[2975,32,128] + //self.rotary_emb + // .forward(seqlen_offsets, &start_offsets_kernel, &mut q, &mut k, b_sz)?; + q = q.transpose(0,1)?.reshape((b_sz,self.num_attention_heads,seq_len,self.head_dim))?;//[1,32,2975,128] + k = k.transpose(0,1)?.reshape((b_sz,self.num_key_value_heads,seq_len,self.head_dim))?; + q = self.apply_rotary_emb(&q, seqlen_offsets[0])?;//[1,32,2975,128] + k = self.apply_rotary_emb(&k, seqlen_offsets[0])?; + q = q.transpose(1,2)?.reshape((b_sz*seq_len,self.num_attention_heads,self.head_dim))?;//[2975,32,128] + k = k.transpose(1,2)?.reshape((b_sz*seq_len,self.num_key_value_heads,self.head_dim))?; + println!("after rotary_emb q.shape {:?}", q.shape()); //[2975,32,128] if q.rank() == 3 { q = q .reshape((b_sz, seq_len, self.num_attention_heads, self.head_dim))? @@ -86,6 +100,7 @@ impl CausalSelfAttention { .transpose(1, 2)? .contiguous()?; } + let (k, v) = crate::pipeline::Cache::update_kv_cache(&mut kv_cache[block_idx], k, v, false)?; @@ -116,7 +131,13 @@ impl CausalSelfAttention { Ok(y) } - fn load(vb: VarBuilder, cfg: &Config, rope: Arc) -> Result { + fn load( + vb: VarBuilder, + cfg: &Config, + rope: Arc, + cos: &Tensor, + sin: &Tensor, + ) -> Result { let size_in = cfg.hidden_size; let size_q = (cfg.hidden_size / cfg.num_attention_heads) * cfg.num_attention_heads; let size_kv = (cfg.hidden_size / cfg.num_attention_heads) * cfg.num_key_value_heads; @@ -135,6 +156,8 @@ impl CausalSelfAttention { use_flash_attn: cfg.use_flash_attn, rotary_emb: rope, max_seq_len: cfg.max_position_embeddings, + cos: cos.clone(), + sin: sin.clone(), }) } } @@ -184,6 +207,13 @@ struct Block { mlp: Mlp, } +use half::f16; +fn get_max_min_value(x: &Tensor) -> Result<(f16, f16)> { + let max_value = x.max(0)?.max(0)?.max(0)?.to_scalar::()?; + let min_value = x.min(0)?.min(0)?.min(0)?.to_scalar::()?; + Ok((max_value, min_value)) +} + impl Block { fn forward( &self, @@ -195,11 +225,17 @@ impl Block { kv_cache: &mut crate::pipeline::LayerCaches, ) -> Result { let residual = x; - let max_value = x.max(0)?.max(0)?.max(0)?; - let min_value = x.min(0)?.min(0)?.min(0)?; - println!("before rms_1 max_value: {} min_value: {}",max_value,min_value); + let (max_value, min_value) = get_max_min_value(x)?; + println!( + "before rms_1 max_value: {} min_value: {}", + max_value, min_value + ); let x = self.rms_1.forward(x)?; - println!("after rms_1 x: {}",x); + let (max_value, min_value) = get_max_min_value(&x)?; + println!( + "after rms_1 max_value: {} min_value: {}", + max_value, min_value + ); let x = (self.attn.forward( &x, attention_mask, @@ -208,8 +244,33 @@ impl Block { block_idx, kv_cache, )? + residual)?; + let (max_value, min_value) = get_max_min_value(&x)?; + println!( + "after attn max_value: {} min_value: {}", + max_value, min_value + ); let residual = &x; - let x = (self.mlp.forward(&self.rms_2.forward(&x)?)? + residual)?; + // for debugging + let x = self.rms_2.forward(&x)?; + let (max_value, min_value) = get_max_min_value(&x)?; + println!( + "after rms_2 max_value: {} min_value: {}", + max_value, min_value + ); + let x = self.mlp.forward(&x)?; + let (max_value, min_value) = get_max_min_value(&x)?; + println!( + "after mlp max_value: {} min_value: {}", + max_value, min_value + ); + let x = (x + residual)?; + let (max_value, min_value) = get_max_min_value(&x)?; + println!( + "after residual max_value: {} min_value: {}", + max_value, min_value + ); + // debugging ends + //let x = (self.mlp.forward(&self.rms_2.forward(&x)?)? + residual)?; Ok(x) } @@ -220,11 +281,15 @@ impl Block { layer_idx: usize, loading_isq: bool, rope: Arc, + cos: &Tensor, + sin: &Tensor, ) -> Result { let attn = CausalSelfAttention::load( mapper.set_device(layer_idx, vb.pp("self_attn"), loading_isq), cfg, rope, + cos, + sin, )?; let mlp = Mlp::load(mapper.set_device(layer_idx, vb.pp("mlp"), loading_isq), cfg)?; let rms_1 = RmsNorm::new( @@ -255,6 +320,9 @@ pub struct Llama { pub kv_cache: crate::pipeline::Cache, pub device: Device, mapper: Box, + // for debugging + cos: Tensor, + sin: Tensor, } impl Llama { @@ -271,10 +339,11 @@ impl Llama { context_lens: Vec<(usize, usize)>, ) -> Result { let mut x = input_embed.clone(); - println!("input x: {}",x); - let max_value = x.max(0)?.max(0)?.max(0)?; - let min_value = x.min(0)?.min(0)?.min(0)?; - println!("input max_value: {} min_value: {}",max_value,min_value); + let (max_value, min_value) = get_max_min_value(&x)?; + println!( + "input_embed max_value: {} min_value: {}", + max_value, min_value + ); let mut cache = self.kv_cache.lock(); let mask = CausalMasker.make_causal_mask_as_attn_bias_with_embed_tensor( &x, @@ -282,7 +351,6 @@ impl Llama { x.dtype(), self.blocks[0].attn.num_attention_heads, )?; - println!("mask: {:?}",mask); for (block_idx, block) in self.blocks.iter().enumerate() { x = self.mapper.map(x, block_idx)?; x = block.forward( @@ -294,17 +362,13 @@ impl Llama { &mut cache, )?; } - println!("block x: {}",x); x = x.to_device(&self.device)?; x = self.ln_f.forward(&x)?; - println!("ln_f x: {}",x); if matches!(self.lm_head, QMatMul::QTensor(_)) { x = x.to_dtype(DType::F32)?; } let logits = MatMul.qmatmul(&x, &self.lm_head)?; - println!("unextracted logits: {}",logits); let result = extract_logits(&logits, context_lens)?; //need to reset to original, this is only for debug - println!("extracted logits: {}",result); Ok(result) } @@ -349,6 +413,24 @@ impl Llama { is_gptx: bool, normal_loading_metadata: NormalLoadingMetadata, ) -> Result { + //this is for debugging + let n_elem = cfg.hidden_size / cfg.num_attention_heads; + let theta: Vec<_> = (0..n_elem) + .step_by(2) + .map(|i| 1f32 / cfg.rope_theta.powf(i as f32 / n_elem as f32)) + .collect(); + let device = normal_loading_metadata.real_device.clone(); + let theta = Tensor::new(theta.as_slice(), &device)?; + let idx_theta = Tensor::arange(0, cfg.max_position_embeddings as u32, &device)? + .to_dtype(DType::F32)? + .reshape((cfg.max_position_embeddings, 1))? + .matmul(&theta.reshape((1, theta.elem_count()))?)?; + // This is different from the paper, see: + // https://github.com/huggingface/transformers/blob/6112b1c6442aaf7affd2b0676a1cd4eee30c45cf/src/transformers/models/llama/modeling_llama.py#L112 + let cos = idx_theta.cos()?.to_dtype(vb.dtype())?; + let sin = idx_theta.sin()?.to_dtype(vb.dtype())?; + // debug end + let mapper = normal_loading_metadata .mapper .into_mapper(cfg.num_hidden_layers, &normal_loading_metadata.real_device)?; @@ -390,6 +472,8 @@ impl Llama { i, normal_loading_metadata.loading_isq, rotary_emb, + &cos, + &sin, ) .expect("Failed to load block.") }) @@ -403,6 +487,8 @@ impl Llama { kv_cache: crate::pipeline::Cache::new(cfg.num_hidden_layers, false), device: normal_loading_metadata.real_device, mapper, + cos, // for debugging + sin, // for debugging }) } } diff --git a/mistralrs-core/src/vision_models/llava_next.rs b/mistralrs-core/src/vision_models/llava_next.rs index d9e66c3eb..c6ef495ce 100644 --- a/mistralrs-core/src/vision_models/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava_next.rs @@ -332,20 +332,17 @@ impl Model { Ok(new_image_feature) }) .collect::>>()?; - - let hidden_size = image_features_vec[0].shape().dims()[2]; - println!("result.shape: {:?}", result.shape()); - println!( - "image_features_vec[0].shape: {:?}", - image_features_vec[0].shape() - ); for (i, image_index) in image_indexes.iter().enumerate() { let image_id = image_ids[i]; + println!( + "image_index: {}, num_Image_token: {}", + image_index, num_image_token + ); result = result.slice_assign( &[ &(0usize..1usize), &(*image_index as usize..*image_index as usize + num_image_token), - &(0..hidden_size), + &(..), ], &image_features_vec[(image_id - 1) as usize], )?; diff --git a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs index d9f36f77e..70de2f291 100644 --- a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs @@ -290,13 +290,27 @@ impl InputsProcessor for LLaVANextInputProcessor { .split(&detokenized) .map(|span| &detokenized[span.range()]) .collect::>(); + /* let prompt_chunks = tokenizer .encode_batch(splits, true) .map_err(anyhow::Error::msg)? .into_iter() .map(|enc| enc.get_ids().to_vec()) .collect::>(); - + */ + let prompt_chunks = splits + .iter() + .map(|s| { + tokenizer + .encode(*s, true) + .unwrap() + .get_ids() + .to_vec() + .iter() + .map(|x| *x as i64) + .collect() + }) + .collect::>>(); let image_tags = self.image_tag_splitter.find_iter(&detokenized); let image_ids = image_tags .into_iter() @@ -333,7 +347,6 @@ impl InputsProcessor for LLaVANextInputProcessor { image_id_pad[0] = -(*image_id as i64); image_ids_pad.push(image_id_pad); } - let mut input_ids: Vec = Vec::new(); for item in prompt_chunks .iter() @@ -365,7 +378,7 @@ impl InputsProcessor for LLaVANextInputProcessor { } else { get_completion_input(toks, input_seqs, device, no_kv_cache, last_n_context_len)? }; - println!("input_ids: {}", input); + println!("input_ids: {:?}", input.squeeze(0)?.to_vec1::()?); println!("seqlen_offsets: {:?}", positions); println!("seqlen_offsets_kernel: {}", positions_kernel); println!("context_lens: {:?}", context_lens); diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index 3a9e77a74..2488f3ff5 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -42,18 +42,18 @@ fn main() -> anyhow::Result<()> { let (tx, mut rx) = channel(10_000); let request = Request::Normal(NormalRequest { + messages: RequestMessage::VisionChat { images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], messages: vec![IndexMap::from([ ("role".to_string(), Either::Left("user".to_string())), ( "content".to_string(), - Either::Left("<|image_1|>\nWhat is shown in this image?".to_string()), + Either::Left("<|image_1|>what is this image show?".to_string()), ), ])], }, - - /* + /* messages: RequestMessage::Completion { text: "Hello! My name is ".to_string(), echo_prompt: false, From 6bdf529cc8881374d1e5f117cc614ae7411e1988 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Thu, 27 Jun 2024 14:15:01 +0800 Subject: [PATCH 11/34] debugging --- mistralrs-core/src/models/llama.rs | 8 ++++---- mistralrs-core/src/pipeline/vision_loaders.rs | 2 +- .../llava_next_inputs_processor.rs | 20 +------------------ 3 files changed, 6 insertions(+), 24 deletions(-) diff --git a/mistralrs-core/src/models/llama.rs b/mistralrs-core/src/models/llama.rs index 78559343e..d108cfa97 100644 --- a/mistralrs-core/src/models/llama.rs +++ b/mistralrs-core/src/models/llama.rs @@ -74,20 +74,20 @@ impl CausalSelfAttention { k = k.to_dtype(original_dtype)?; v = v.to_dtype(original_dtype)?; } - println!("before reshape q.shape {:?}", q.shape()); //[1,2975,4096] + println!("before reshape q.shape {:?}", q.shape()); let mut q = q.reshape((b_sz * seq_len, self.num_attention_heads, self.head_dim))?; let mut k = k.reshape((b_sz * seq_len, self.num_key_value_heads, self.head_dim))?; let v = v .reshape((b_sz, seq_len, self.num_key_value_heads, self.head_dim))? .transpose(1, 2)?; - println!("before rotary_emb q.shape {:?}", q.shape()); //[2975,32,128] + println!("before rotary_emb q.shape {:?}", q.shape()); //self.rotary_emb // .forward(seqlen_offsets, &start_offsets_kernel, &mut q, &mut k, b_sz)?; - q = q.transpose(0,1)?.reshape((b_sz,self.num_attention_heads,seq_len,self.head_dim))?;//[1,32,2975,128] + q = q.transpose(0,1)?.reshape((b_sz,self.num_attention_heads,seq_len,self.head_dim))?; k = k.transpose(0,1)?.reshape((b_sz,self.num_key_value_heads,seq_len,self.head_dim))?; q = self.apply_rotary_emb(&q, seqlen_offsets[0])?;//[1,32,2975,128] k = self.apply_rotary_emb(&k, seqlen_offsets[0])?; - q = q.transpose(1,2)?.reshape((b_sz*seq_len,self.num_attention_heads,self.head_dim))?;//[2975,32,128] + q = q.transpose(1,2)?.reshape((b_sz*seq_len,self.num_attention_heads,self.head_dim))?; k = k.transpose(1,2)?.reshape((b_sz*seq_len,self.num_key_value_heads,self.head_dim))?; println!("after rotary_emb q.shape {:?}", q.shape()); //[2975,32,128] if q.rank() == 3 { diff --git a/mistralrs-core/src/pipeline/vision_loaders.rs b/mistralrs-core/src/pipeline/vision_loaders.rs index 67e7282af..43fb87bd1 100644 --- a/mistralrs-core/src/pipeline/vision_loaders.rs +++ b/mistralrs-core/src/pipeline/vision_loaders.rs @@ -23,7 +23,7 @@ pub trait VisionModelLoader { fn load( &self, config: &str, - use_flash_attn: bool, + use_flash_attn: bool, vb: VarBuilder, normal_loading_metadata: NormalLoadingMetadata, ) -> Result>; diff --git a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs index 70de2f291..b6ab01003 100644 --- a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs @@ -250,11 +250,6 @@ impl InputsProcessor for LLaVANextInputProcessor { )? .downcast::() .expect("Downcast failed."); - println!("input_ids: {}", input_ids); - println!("seqlen_offsets: {:?}", seqlen_offsets); - println!("seqlen_offsets_kernel: {}", seqlen_offsets_kernel); - println!("context_lens: {:?}", context_lens); - println!("position_ids: {:?}", position_ids); return Ok(Box::new(ModelInputs { input_ids, seqlen_offsets, @@ -290,17 +285,9 @@ impl InputsProcessor for LLaVANextInputProcessor { .split(&detokenized) .map(|span| &detokenized[span.range()]) .collect::>(); - /* - let prompt_chunks = tokenizer - .encode_batch(splits, true) - .map_err(anyhow::Error::msg)? - .into_iter() - .map(|enc| enc.get_ids().to_vec()) - .collect::>(); - */ let prompt_chunks = splits .iter() - .map(|s| { + .map(|s| { // we don't use encode_batch here, because encode_batch will pad 0 to the end of the shor sequences, which will cause the image_ids_pad to be wrong. tokenizer .encode(*s, true) .unwrap() @@ -378,11 +365,6 @@ impl InputsProcessor for LLaVANextInputProcessor { } else { get_completion_input(toks, input_seqs, device, no_kv_cache, last_n_context_len)? }; - println!("input_ids: {:?}", input.squeeze(0)?.to_vec1::()?); - println!("seqlen_offsets: {:?}", positions); - println!("seqlen_offsets_kernel: {}", positions_kernel); - println!("context_lens: {:?}", context_lens); - println!("position_ids: {:?}", position_ids); Ok(Box::new(ModelInputs { input_ids: input, seqlen_offsets: positions, From 04161efe4a1ed578d42ae98063ddefb8578d8fcb Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Thu, 27 Jun 2024 14:23:42 +0800 Subject: [PATCH 12/34] restore inrelate codes --- mistralrs-core/src/models/llama.rs | 154 +----------------- mistralrs-core/src/pipeline/mod.rs | 8 - mistralrs-core/src/pipeline/vision.rs | 2 +- mistralrs-core/src/pipeline/vision_loaders.rs | 5 +- .../src/vision_models/llava_next.rs | 5 - .../llava_next_inputs_processor.rs | 3 +- mistralrs-core/src/vision_models/phi3.rs | 2 - .../vision_models/phi3_inputs_processor.rs | 7 +- mistralrs/examples/llava/main.rs | 3 +- mistralrs/examples/phi3v/main.rs | 2 +- 10 files changed, 14 insertions(+), 177 deletions(-) diff --git a/mistralrs-core/src/models/llama.rs b/mistralrs-core/src/models/llama.rs index cb668554c..737a0038d 100644 --- a/mistralrs-core/src/models/llama.rs +++ b/mistralrs-core/src/models/llama.rs @@ -40,17 +40,9 @@ struct CausalSelfAttention { use_flash_attn: bool, rotary_emb: Arc, max_seq_len: usize, - cos: Tensor, // for debugging - sin: Tensor, // for debugging } impl CausalSelfAttention { - fn apply_rotary_emb(&self, x: &Tensor, index_pos: usize) -> Result { - let (_b_sz, _, seq_len, _hidden_size) = x.dims4()?; - let cos = self.cos.narrow(0, index_pos, seq_len)?; - let sin = self.sin.narrow(0, index_pos, seq_len)?; - candle_nn::rotary_emb::rope(x, &cos, &sin) - } fn forward( &self, x: &Tensor, @@ -75,22 +67,16 @@ impl CausalSelfAttention { k = k.to_dtype(original_dtype)?; v = v.to_dtype(original_dtype)?; } - println!("before reshape q.shape {:?}", q.shape()); + let mut q = q.reshape((b_sz * seq_len, self.num_attention_heads, self.head_dim))?; let mut k = k.reshape((b_sz * seq_len, self.num_key_value_heads, self.head_dim))?; let v = v .reshape((b_sz, seq_len, self.num_key_value_heads, self.head_dim))? .transpose(1, 2)?; - println!("before rotary_emb q.shape {:?}", q.shape()); - //self.rotary_emb - // .forward(seqlen_offsets, &start_offsets_kernel, &mut q, &mut k, b_sz)?; - q = q.transpose(0,1)?.reshape((b_sz,self.num_attention_heads,seq_len,self.head_dim))?; - k = k.transpose(0,1)?.reshape((b_sz,self.num_key_value_heads,seq_len,self.head_dim))?; - q = self.apply_rotary_emb(&q, seqlen_offsets[0])?;//[1,32,2975,128] - k = self.apply_rotary_emb(&k, seqlen_offsets[0])?; - q = q.transpose(1,2)?.reshape((b_sz*seq_len,self.num_attention_heads,self.head_dim))?; - k = k.transpose(1,2)?.reshape((b_sz*seq_len,self.num_key_value_heads,self.head_dim))?; - println!("after rotary_emb q.shape {:?}", q.shape()); //[2975,32,128] + + self.rotary_emb + .forward(seqlen_offsets, &start_offsets_kernel, &mut q, &mut k, b_sz)?; + if q.rank() == 3 { q = q .reshape((b_sz, seq_len, self.num_attention_heads, self.head_dim))? @@ -101,7 +87,6 @@ impl CausalSelfAttention { .transpose(1, 2)? .contiguous()?; } - let (k, v) = crate::pipeline::Cache::update_kv_cache(&mut kv_cache[block_idx], k, v, false)?; @@ -132,13 +117,7 @@ impl CausalSelfAttention { Ok(y) } - fn load( - vb: VarBuilder, - cfg: &Config, - rope: Arc, - cos: &Tensor, - sin: &Tensor, - ) -> Result { + fn load(vb: VarBuilder, cfg: &Config, rope: Arc) -> Result { let size_in = cfg.hidden_size; let size_q = (cfg.hidden_size / cfg.num_attention_heads) * cfg.num_attention_heads; let size_kv = (cfg.hidden_size / cfg.num_attention_heads) * cfg.num_key_value_heads; @@ -157,8 +136,6 @@ impl CausalSelfAttention { use_flash_attn: cfg.use_flash_attn, rotary_emb: rope, max_seq_len: cfg.max_position_embeddings, - cos: cos.clone(), - sin: sin.clone(), }) } } @@ -208,13 +185,6 @@ struct Block { mlp: Mlp, } -use half::f16; -fn get_max_min_value(x: &Tensor) -> Result<(f16, f16)> { - let max_value = x.max(0)?.max(0)?.max(0)?.to_scalar::()?; - let min_value = x.min(0)?.min(0)?.min(0)?.to_scalar::()?; - Ok((max_value, min_value)) -} - impl Block { fn forward( &self, @@ -226,17 +196,7 @@ impl Block { kv_cache: &mut crate::pipeline::LayerCaches, ) -> Result { let residual = x; - let (max_value, min_value) = get_max_min_value(x)?; - println!( - "before rms_1 max_value: {} min_value: {}", - max_value, min_value - ); let x = self.rms_1.forward(x)?; - let (max_value, min_value) = get_max_min_value(&x)?; - println!( - "after rms_1 max_value: {} min_value: {}", - max_value, min_value - ); let x = (self.attn.forward( &x, attention_mask, @@ -245,33 +205,8 @@ impl Block { block_idx, kv_cache, )? + residual)?; - let (max_value, min_value) = get_max_min_value(&x)?; - println!( - "after attn max_value: {} min_value: {}", - max_value, min_value - ); let residual = &x; - // for debugging - let x = self.rms_2.forward(&x)?; - let (max_value, min_value) = get_max_min_value(&x)?; - println!( - "after rms_2 max_value: {} min_value: {}", - max_value, min_value - ); - let x = self.mlp.forward(&x)?; - let (max_value, min_value) = get_max_min_value(&x)?; - println!( - "after mlp max_value: {} min_value: {}", - max_value, min_value - ); - let x = (x + residual)?; - let (max_value, min_value) = get_max_min_value(&x)?; - println!( - "after residual max_value: {} min_value: {}", - max_value, min_value - ); - // debugging ends - //let x = (self.mlp.forward(&self.rms_2.forward(&x)?)? + residual)?; + let x = (self.mlp.forward(&self.rms_2.forward(&x)?)? + residual)?; Ok(x) } @@ -282,15 +217,11 @@ impl Block { layer_idx: usize, loading_isq: bool, rope: Arc, - cos: &Tensor, - sin: &Tensor, ) -> Result { let attn = CausalSelfAttention::load( mapper.set_device(layer_idx, vb.pp("self_attn"), loading_isq), cfg, rope, - cos, - sin, )?; let mlp = Mlp::load(mapper.set_device(layer_idx, vb.pp("mlp"), loading_isq), cfg)?; let rms_1 = RmsNorm::new( @@ -321,58 +252,9 @@ pub struct Llama { pub kv_cache: crate::pipeline::Cache, pub device: Device, mapper: Box, - // for debugging - cos: Tensor, - sin: Tensor, } impl Llama { - // required by LLaVA - pub fn embed(&self, x: &Tensor) -> Result { - self.wte.forward(x) - } - // required by LLaVA - pub fn forward_input_embed( - &self, - input_embed: &Tensor, - seqlen_offsets: &[usize], - start_offsets_kernel: Tensor, - context_lens: Vec<(usize, usize)>, - ) -> Result { - let mut x = input_embed.clone(); - let (max_value, min_value) = get_max_min_value(&x)?; - println!( - "input_embed max_value: {} min_value: {}", - max_value, min_value - ); - let mut cache = self.kv_cache.lock(); - let mask = CausalMasker.make_causal_mask_as_attn_bias_with_embed_tensor( - &x, - &cache, - x.dtype(), - self.blocks[0].attn.num_attention_heads, - )?; - for (block_idx, block) in self.blocks.iter().enumerate() { - x = self.mapper.map(x, block_idx)?; - x = block.forward( - &x, - &mask.clone().map(|m| m.to_device(x.device()).unwrap()), - seqlen_offsets, - start_offsets_kernel.clone(), - block_idx, - &mut cache, - )?; - } - x = x.to_device(&self.device)?; - x = self.ln_f.forward(&x)?; - if matches!(self.lm_head, QMatMul::QTensor(_)) { - x = x.to_dtype(DType::F32)?; - } - let logits = MatMul.qmatmul(&x, &self.lm_head)?; - let result = extract_logits(&logits, context_lens)?; //need to reset to original, this is only for debug - Ok(result) - } - pub fn forward( &self, input_ids: &Tensor, @@ -414,24 +296,6 @@ impl Llama { is_gptx: bool, normal_loading_metadata: NormalLoadingMetadata, ) -> Result { - //this is for debugging - let n_elem = cfg.hidden_size / cfg.num_attention_heads; - let theta: Vec<_> = (0..n_elem) - .step_by(2) - .map(|i| 1f32 / cfg.rope_theta.powf(i as f32 / n_elem as f32)) - .collect(); - let device = normal_loading_metadata.real_device.clone(); - let theta = Tensor::new(theta.as_slice(), &device)?; - let idx_theta = Tensor::arange(0, cfg.max_position_embeddings as u32, &device)? - .to_dtype(DType::F32)? - .reshape((cfg.max_position_embeddings, 1))? - .matmul(&theta.reshape((1, theta.elem_count()))?)?; - // This is different from the paper, see: - // https://github.com/huggingface/transformers/blob/6112b1c6442aaf7affd2b0676a1cd4eee30c45cf/src/transformers/models/llama/modeling_llama.py#L112 - let cos = idx_theta.cos()?.to_dtype(vb.dtype())?; - let sin = idx_theta.sin()?.to_dtype(vb.dtype())?; - // debug end - let mapper = normal_loading_metadata .mapper .into_mapper(cfg.num_hidden_layers, &normal_loading_metadata.real_device)?; @@ -476,8 +340,6 @@ impl Llama { i, normal_loading_metadata.loading_isq, rotary_emb, - &cos, - &sin, ) .expect("Failed to load block.") }) @@ -491,8 +353,6 @@ impl Llama { kv_cache: crate::pipeline::Cache::new(cfg.num_hidden_layers, false), device: normal_loading_metadata.real_device, mapper, - cos, // for debugging - sin, // for debugging }) } } diff --git a/mistralrs-core/src/pipeline/mod.rs b/mistralrs-core/src/pipeline/mod.rs index 6f76ac546..a5d603d2c 100644 --- a/mistralrs-core/src/pipeline/mod.rs +++ b/mistralrs-core/src/pipeline/mod.rs @@ -727,14 +727,6 @@ mod tests { )); } } - if !failed.is_empty() { - for (i, line) in failed.iter().enumerate() { - println!("------------ Template {i} ------------"); - println!("{line}"); - } - println!("------------------------"); - panic!("{}/{n_templates} chat templates failed.", failed.len()); - } } #[test] diff --git a/mistralrs-core/src/pipeline/vision.rs b/mistralrs-core/src/pipeline/vision.rs index cd8681b17..0c62ce68c 100644 --- a/mistralrs-core/src/pipeline/vision.rs +++ b/mistralrs-core/src/pipeline/vision.rs @@ -156,7 +156,7 @@ impl Loader for VisionLoader { device.device_pretty_repr() ); } - + info!( "Model config: {:?}", self.inner diff --git a/mistralrs-core/src/pipeline/vision_loaders.rs b/mistralrs-core/src/pipeline/vision_loaders.rs index 43fb87bd1..997bed0d3 100644 --- a/mistralrs-core/src/pipeline/vision_loaders.rs +++ b/mistralrs-core/src/pipeline/vision_loaders.rs @@ -23,7 +23,7 @@ pub trait VisionModelLoader { fn load( &self, config: &str, - use_flash_attn: bool, + use_flash_attn: bool, vb: VarBuilder, normal_loading_metadata: NormalLoadingMetadata, ) -> Result>; @@ -160,7 +160,6 @@ impl VisionModelLoader for LLaVANextLoader { vb: VarBuilder, normal_loading_metadata: NormalLoadingMetadata, ) -> Result> { - println!("load LLaVANext"); let mut config: LLaVANextConfig = serde_json::from_str(config)?; config.use_flash_attn = use_flash_attn; Ok(Box::new(LLaVANext::new( @@ -174,7 +173,6 @@ impl VisionModelLoader for LLaVANextLoader { false } fn get_config_repr(&self, config: &str, use_flash_attn: bool) -> Result> { - println!("get_config_repr LLaVANext"); let mut config: LLaVANextConfig = serde_json::from_str(config)?; config.use_flash_attn = use_flash_attn; Ok(Box::new(config)) @@ -185,7 +183,6 @@ impl VisionModelLoader for LLaVANextLoader { _processor_config: Option, _preprocessor_config: PreProcessorConfig, ) -> Arc { - println!("get_processor LLaVANext"); Arc::new(LLaVANextProcessor::new(model_config)) } } diff --git a/mistralrs-core/src/vision_models/llava_next.rs b/mistralrs-core/src/vision_models/llava_next.rs index c6ef495ce..010b7bca3 100644 --- a/mistralrs-core/src/vision_models/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava_next.rs @@ -334,10 +334,6 @@ impl Model { .collect::>>()?; for (i, image_index) in image_indexes.iter().enumerate() { let image_id = image_ids[i]; - println!( - "image_index: {}, num_Image_token: {}", - image_index, num_image_token - ); result = result.slice_assign( &[ &(0usize..1usize), @@ -368,7 +364,6 @@ impl Model { num_image_token.unwrap(), &image_sizes.unwrap(), )?; - println!("input_embeds.shape: {:?}", input_embeds.shape()); self.llama.forward_input_embed( &input_embeds, &seqlen_offsets, diff --git a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs index b6ab01003..3216712fe 100644 --- a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs @@ -287,7 +287,8 @@ impl InputsProcessor for LLaVANextInputProcessor { .collect::>(); let prompt_chunks = splits .iter() - .map(|s| { // we don't use encode_batch here, because encode_batch will pad 0 to the end of the shor sequences, which will cause the image_ids_pad to be wrong. + .map(|s| { + // we don't use encode_batch here, because encode_batch will pad 0 to the end of the shor sequences, which will cause the image_ids_pad to be wrong. tokenizer .encode(*s, true) .unwrap() diff --git a/mistralrs-core/src/vision_models/phi3.rs b/mistralrs-core/src/vision_models/phi3.rs index 693584321..92a6d3164 100644 --- a/mistralrs-core/src/vision_models/phi3.rs +++ b/mistralrs-core/src/vision_models/phi3.rs @@ -833,7 +833,6 @@ impl Model { } else { self.embed_tokens.forward(input_ids)? }; - println!("input xs: {}",xs); let mut cache = self.cache.lock(); let attention_mask = CausalMasker.make_causal_mask_with_sliding_window_as_attn_bias( input_ids, @@ -856,7 +855,6 @@ impl Model { &mut cache[i], )? } - println!("block xs: {}",xs); let xs = xs.to_device(&self.device)?; let mut xs = xs.apply(&self.norm)?; if matches!(self.lm_head, QMatMul::QTensor(_)) { diff --git a/mistralrs-core/src/vision_models/phi3_inputs_processor.rs b/mistralrs-core/src/vision_models/phi3_inputs_processor.rs index b7147e658..d4ef7e9db 100644 --- a/mistralrs-core/src/vision_models/phi3_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/phi3_inputs_processor.rs @@ -254,12 +254,7 @@ impl InputsProcessor for Phi3InputsProcessor { } else { get_completion_input(toks, input_seqs, device, no_kv_cache, last_n_context_len)? }; - println!("input_ids: {}", input); - println!("seqlen_offsets: {:?}", positions); - println!("seqlen_offsets_kernel: {}", positions_kernel); - println!("context_lens: {:?}", context_lens); - println!("position_ids: {:?}", position_ids); - todo!(); + Ok(Box::new(ModelInputs { input_ids: input, seqlen_offsets: positions, diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index 2488f3ff5..098393af0 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -42,7 +42,6 @@ fn main() -> anyhow::Result<()> { let (tx, mut rx) = channel(10_000); let request = Request::Normal(NormalRequest { - messages: RequestMessage::VisionChat { images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], messages: vec![IndexMap::from([ @@ -53,7 +52,7 @@ fn main() -> anyhow::Result<()> { ), ])], }, - /* + /* messages: RequestMessage::Completion { text: "Hello! My name is ".to_string(), echo_prompt: false, diff --git a/mistralrs/examples/phi3v/main.rs b/mistralrs/examples/phi3v/main.rs index 596b5b4b6..9287a06f9 100644 --- a/mistralrs/examples/phi3v/main.rs +++ b/mistralrs/examples/phi3v/main.rs @@ -19,7 +19,7 @@ fn setup() -> anyhow::Result> { }, None, None, - Some("/root/autodl-tmp/Phi-3-vision-128k-instruct".to_string()), + Some("microsoft/Phi-3-vision-128k-instruct".to_string()), ) .build(VisionLoaderType::Phi3V); // Load, into a Pipeline From f7a619ba0ff6ff36d3cbae4e3aa8039ab7923126 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Thu, 27 Jun 2024 14:26:04 +0800 Subject: [PATCH 13/34] restore change --- mistralrs-core/src/pipeline/mod.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/mistralrs-core/src/pipeline/mod.rs b/mistralrs-core/src/pipeline/mod.rs index a5d603d2c..80db528d7 100644 --- a/mistralrs-core/src/pipeline/mod.rs +++ b/mistralrs-core/src/pipeline/mod.rs @@ -42,9 +42,7 @@ use std::{collections::HashMap, path::PathBuf, str::FromStr}; use tokenizers::Tokenizer; use tokio::sync::Mutex; pub use vision::{VisionLoader, VisionLoaderBuilder, VisionSpecificConfig}; -pub use vision_loaders::{ - Idefics2Loader, LLaVANextLoader, Phi3VLoader, VisionLoaderType, VisionModelLoader, -}; +pub use vision_loaders::{Idefics2Loader, Phi3VLoader, VisionLoaderType, VisionModelLoader}; use anyhow::Result; use candle_core::{Device, Tensor}; @@ -727,6 +725,14 @@ mod tests { )); } } + if !failed.is_empty() { + for (i, line) in failed.iter().enumerate() { + println!("------------ Template {i} ------------"); + println!("{line}"); + } + println!("------------------------"); + panic!("{}/{n_templates} chat templates failed.", failed.len()); + } } #[test] From ac268d29df49064d3f68f2c4dde0787f39675759 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Thu, 27 Jun 2024 17:32:56 +0800 Subject: [PATCH 14/34] finish llama-llavanext --- mistralrs-core/src/pipeline/mod.rs | 4 +- .../vision_models/llava/llava_llm/llama.rs | 433 ++++++++++++++++++ .../src/vision_models/llava/llava_llm/mod.rs | 47 ++ .../vision_models/{ => llava}/llava_next.rs | 77 ++-- .../llava_next_inputs_processor.rs | 14 +- mistralrs-core/src/vision_models/llava/mod.rs | 3 + mistralrs-core/src/vision_models/mod.rs | 5 +- 7 files changed, 535 insertions(+), 48 deletions(-) create mode 100644 mistralrs-core/src/vision_models/llava/llava_llm/llama.rs create mode 100644 mistralrs-core/src/vision_models/llava/llava_llm/mod.rs rename mistralrs-core/src/vision_models/{ => llava}/llava_next.rs (90%) rename mistralrs-core/src/vision_models/{ => llava}/llava_next_inputs_processor.rs (97%) create mode 100644 mistralrs-core/src/vision_models/llava/mod.rs diff --git a/mistralrs-core/src/pipeline/mod.rs b/mistralrs-core/src/pipeline/mod.rs index 80db528d7..6f76ac546 100644 --- a/mistralrs-core/src/pipeline/mod.rs +++ b/mistralrs-core/src/pipeline/mod.rs @@ -42,7 +42,9 @@ use std::{collections::HashMap, path::PathBuf, str::FromStr}; use tokenizers::Tokenizer; use tokio::sync::Mutex; pub use vision::{VisionLoader, VisionLoaderBuilder, VisionSpecificConfig}; -pub use vision_loaders::{Idefics2Loader, Phi3VLoader, VisionLoaderType, VisionModelLoader}; +pub use vision_loaders::{ + Idefics2Loader, LLaVANextLoader, Phi3VLoader, VisionLoaderType, VisionModelLoader, +}; use anyhow::Result; use candle_core::{Device, Tensor}; diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs new file mode 100644 index 000000000..873c561da --- /dev/null +++ b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs @@ -0,0 +1,433 @@ +//LLaMA without fused RoPE +#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] + +use candle_core::{quantized::QMatMul, DType, Device, Result, Tensor}; +use candle_nn::{embedding, linear_no_bias as linear, Embedding, Module, VarBuilder}; + +use crate::{ + device_map::DeviceMapper, + layers::{repeat_kv, CausalMasker, MatMul, RmsNorm, ScaledDotProductAttention}, + models::llama::Config, + pipeline::{extract_logits, IsqModel, NormalLoadingMetadata, NormalModel}, + utils::progress::NiceProgressBar, +}; + +use super::{LLaVALLM, OrdinaryRoPE}; + +#[derive(Debug, Clone)] +struct CausalSelfAttention { + q_proj: QMatMul, + k_proj: QMatMul, + v_proj: QMatMul, + o_proj: QMatMul, + num_attention_heads: usize, + num_key_value_heads: usize, + head_dim: usize, + use_flash_attn: bool, + max_seq_len: usize, +} + +impl CausalSelfAttention { + fn forward( + &self, + x: &Tensor, + attention_mask: &Option, + seqlen_offsets: &[usize], + _start_offsets_kernel: Tensor, + block_idx: usize, + kv_cache: &mut crate::pipeline::LayerCaches, + rope_parameter: (&Tensor, &Tensor), + ) -> Result { + let (b_sz, seq_len, hidden_size) = x.dims3()?; + + let original_dtype = x.dtype(); + let mut x = x.clone(); + if matches!(self.q_proj, QMatMul::QTensor(_)) { + x = x.to_dtype(DType::F32)?; + } + let mut q = MatMul.qmatmul(&x, &self.q_proj)?; + let mut k = MatMul.qmatmul(&x, &self.k_proj)?; + let mut v = MatMul.qmatmul(&x, &self.v_proj)?; + if matches!(self.q_proj, QMatMul::QTensor(_)) { + q = q.to_dtype(original_dtype)?; + k = k.to_dtype(original_dtype)?; + v = v.to_dtype(original_dtype)?; + } + let mut q = q + .reshape((b_sz, seq_len, self.num_attention_heads, self.head_dim))? + .transpose(1, 2)?.contiguous()?; + let mut k = k + .reshape((b_sz, seq_len, self.num_key_value_heads, self.head_dim))? + .transpose(1, 2)?.contiguous()?; + q = OrdinaryRoPE::forward(&q, seqlen_offsets[0], rope_parameter.0, rope_parameter.1)?; + k = OrdinaryRoPE::forward(&k, seqlen_offsets[0], rope_parameter.0, rope_parameter.1)?; + let v = v + .reshape((b_sz, seq_len, self.num_key_value_heads, self.head_dim))? + .transpose(1, 2)?; + + let (k, v) = + crate::pipeline::Cache::update_kv_cache(&mut kv_cache[block_idx], k, v, false)?; + + let k = repeat_kv(k, self.num_attention_heads / self.num_key_value_heads)?.contiguous()?; + let v = repeat_kv(v, self.num_attention_heads / self.num_key_value_heads)?.contiguous()?; + + let mut y = ScaledDotProductAttention.run_attention( + &q, + &k, + &v, + self.num_attention_heads, + self.head_dim, + attention_mask.clone().as_ref(), + self.use_flash_attn, + b_sz, + seq_len, + )?; + + if matches!(self.q_proj, QMatMul::QTensor(_)) { + y = y.to_dtype(DType::F32)?; + } + let y = y.transpose(1, 2)?.reshape(&[b_sz, seq_len, hidden_size])?; + let mut y = MatMul.qmatmul(&y, &self.o_proj)?; + if matches!(self.q_proj, QMatMul::QTensor(_)) { + y = y.to_dtype(original_dtype)?; + } + Ok(y) + } + + fn load(vb: VarBuilder, cfg: &Config) -> Result { + let size_in = cfg.hidden_size; + let size_q = (cfg.hidden_size / cfg.num_attention_heads) * cfg.num_attention_heads; + let size_kv = (cfg.hidden_size / cfg.num_attention_heads) * cfg.num_key_value_heads; + let q_proj = linear(size_in, size_q, vb.pp("q_proj"))?; + let k_proj = linear(size_in, size_kv, vb.pp("k_proj"))?; + let v_proj = linear(size_in, size_kv, vb.pp("v_proj"))?; + let o_proj = linear(size_q, size_in, vb.pp("o_proj"))?; + Ok(Self { + q_proj: QMatMul::Tensor(q_proj.weight().clone()), + k_proj: QMatMul::Tensor(k_proj.weight().clone()), + v_proj: QMatMul::Tensor(v_proj.weight().clone()), + o_proj: QMatMul::Tensor(o_proj.weight().clone()), + num_attention_heads: cfg.num_attention_heads, + num_key_value_heads: cfg.num_key_value_heads, + head_dim: cfg.hidden_size / cfg.num_attention_heads, + use_flash_attn: cfg.use_flash_attn, + max_seq_len: cfg.max_position_embeddings, + }) + } +} + +#[derive(Debug, Clone)] +struct Mlp { + c_fc1: QMatMul, + c_fc2: QMatMul, + c_proj: QMatMul, +} + +impl Mlp { + fn forward(&self, x: &Tensor) -> Result { + let original_dtype = x.dtype(); + let mut x = x.clone(); + if matches!(self.c_fc1, QMatMul::QTensor(_)) { + x = x.to_dtype(DType::F32)?; + } + let x = (candle_nn::ops::silu(&MatMul.qmatmul(&x, &self.c_fc1)?)? + * MatMul.qmatmul(&x, &self.c_fc2)?)?; + let mut res = MatMul.qmatmul(&x, &self.c_proj)?; + if matches!(self.c_fc1, QMatMul::QTensor(_)) { + res = res.to_dtype(original_dtype)?; + } + Ok(res) + } + + fn load(vb: VarBuilder, cfg: &Config) -> Result { + let h_size = cfg.hidden_size; + let i_size = cfg.intermediate_size; + let c_fc1 = linear(h_size, i_size, vb.pp("gate_proj"))?; + let c_fc2 = linear(h_size, i_size, vb.pp("up_proj"))?; + let c_proj = linear(i_size, h_size, vb.pp("down_proj"))?; + Ok(Self { + c_fc1: QMatMul::Tensor(c_fc1.weight().clone()), + c_fc2: QMatMul::Tensor(c_fc2.weight().clone()), + c_proj: QMatMul::Tensor(c_proj.weight().clone()), + }) + } +} + +#[derive(Debug, Clone)] +struct Block { + rms_1: RmsNorm, + attn: CausalSelfAttention, + rms_2: RmsNorm, + mlp: Mlp, +} + +impl Block { + fn forward( + &self, + x: &Tensor, + attention_mask: &Option, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + block_idx: usize, + kv_cache: &mut crate::pipeline::LayerCaches, + rope_parameters: (&Tensor, &Tensor), + ) -> Result { + let residual = x; + let x = self.rms_1.forward(x)?; + let x = (self.attn.forward( + &x, + attention_mask, + seqlen_offsets, + start_offsets_kernel, + block_idx, + kv_cache, + rope_parameters, + )? + residual)?; + let residual = &x; + let x = (self.mlp.forward(&self.rms_2.forward(&x)?)? + residual)?; + Ok(x) + } + + fn load( + vb: VarBuilder, + cfg: &Config, + mapper: &dyn DeviceMapper, + layer_idx: usize, + loading_isq: bool, + ) -> Result { + let attn = CausalSelfAttention::load( + mapper.set_device(layer_idx, vb.pp("self_attn"), loading_isq), + cfg, + )?; + let mlp = Mlp::load(mapper.set_device(layer_idx, vb.pp("mlp"), loading_isq), cfg)?; + let rms_1 = RmsNorm::new( + cfg.hidden_size, + cfg.rms_norm_eps, + mapper.set_device(layer_idx, vb.pp("input_layernorm"), loading_isq), + )?; + let rms_2 = RmsNorm::new( + cfg.hidden_size, + cfg.rms_norm_eps, + mapper.set_device(layer_idx, vb.pp("post_attention_layernorm"), loading_isq), + )?; + Ok(Self { + rms_1, + attn, + rms_2, + mlp, + }) + } +} + +#[derive(Debug)] +pub struct Llama { + wte: Embedding, + blocks: Vec, + ln_f: RmsNorm, + lm_head: QMatMul, + pub kv_cache: crate::pipeline::Cache, + pub device: Device, + mapper: Box, + rope_parameters: (Tensor, Tensor), +} + +impl Llama { + pub fn forward_input( + &self, + input_ids: &Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + ) -> Result { + let mut x = self.wte.forward(input_ids)?; + let mut cache = self.kv_cache.lock(); + let mask = CausalMasker.make_causal_mask_as_attn_bias( + input_ids, + &cache, + x.dtype(), + self.blocks[0].attn.num_attention_heads, + )?; + for (block_idx, block) in self.blocks.iter().enumerate() { + x = self.mapper.map(x, block_idx)?; + x = block.forward( + &x, + &mask.clone().map(|m| m.to_device(x.device()).unwrap()), + seqlen_offsets, + start_offsets_kernel.clone(), + block_idx, + &mut cache, + (&self.rope_parameters.0, &self.rope_parameters.1), + )?; + } + let x = x.to_device(&self.device)?; + let mut x = self.ln_f.forward(&x)?; + if matches!(self.lm_head, QMatMul::QTensor(_)) { + x = x.to_dtype(DType::F32)?; + } + let logits = MatMul.qmatmul(&x, &self.lm_head)?; + extract_logits(&logits, context_lens) + } + + pub fn new( + cfg: &Config, + vb: VarBuilder, + _is_gptx: bool, + normal_loading_metadata: NormalLoadingMetadata, + ) -> Result { + let mapper = normal_loading_metadata + .mapper + .into_mapper(cfg.num_hidden_layers, &normal_loading_metadata.real_device)?; + // let vb = vb.set_dtype(mapper.get_min_dtype()?); + + let wte = embedding( + cfg.vocab_size, + cfg.hidden_size, + mapper.set_nm_device(vb.pp("model.embed_tokens"), false), + )?; + let lm_head = linear( + cfg.hidden_size, + cfg.vocab_size, + mapper.set_nm_device(vb.pp("lm_head"), normal_loading_metadata.loading_isq), + )?; + let ln_f = RmsNorm::new( + cfg.hidden_size, + cfg.rms_norm_eps, + mapper.set_nm_device(vb.pp("model.norm"), false), + )?; + let head_dim = cfg.hidden_size / cfg.num_attention_heads; + + let blocks: Vec<_> = NiceProgressBar(0..cfg.num_hidden_layers, "Loading repeating layers") + .into_iter() + .map(|i| { + Block::load( + vb.pp(&format!("model.layers.{i}")), + cfg, + &*mapper, + i, + normal_loading_metadata.loading_isq, + ) + .expect("Failed to load block.") + }) + .collect(); + let rope_parameters = OrdinaryRoPE::create_parameters( + head_dim, + cfg.max_position_embeddings, + cfg.rope_theta, + vb.dtype(), + &normal_loading_metadata.real_device, + )?; + Ok(Self { + wte, + blocks, + ln_f, + lm_head: QMatMul::Tensor(lm_head.weight().clone()), + kv_cache: crate::pipeline::Cache::new(cfg.num_hidden_layers, false), + device: normal_loading_metadata.real_device, + mapper, + rope_parameters, + }) + } +} + +impl IsqModel for Llama { + fn get_tensors(&mut self) -> (Vec<(&mut QMatMul, Option)>, &dyn DeviceMapper) { + let mut tensors = Vec::new(); + tensors.push((&mut self.lm_head, None)); + for (i, layer) in self.blocks.iter_mut().enumerate() { + tensors.push((&mut layer.attn.q_proj, Some(i))); + tensors.push((&mut layer.attn.k_proj, Some(i))); + tensors.push((&mut layer.attn.v_proj, Some(i))); + tensors.push((&mut layer.attn.o_proj, Some(i))); + tensors.push((&mut layer.mlp.c_fc1, Some(i))); + tensors.push((&mut layer.mlp.c_fc2, Some(i))); + tensors.push((&mut layer.mlp.c_proj, Some(i))); + } + (tensors, &*self.mapper) + } +} + +impl NormalModel for Llama { + fn forward( + &self, + input_ids: &Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + _position_ids: Vec, + ) -> Result { + self.forward_input( + input_ids, + seqlen_offsets, + start_offsets_kernel, + context_lens, + ) + } + fn xlora_forward( + &self, + _input_ids: &Tensor, + _input_ids_full: &Tensor, + _seqlen_offsets: &[usize], + _seqlen_offsets_full: &[usize], + _start_offsets_kernel: Tensor, + _start_offsets_kernel_full: Tensor, + _no_kv_cache: bool, + _non_granular_state: &Option, + _context_lens: Vec<(usize, usize)>, + _position_ids: Vec, + ) -> Result { + unimplemented!() + } + fn cache(&self) -> &crate::pipeline::Cache { + &self.kv_cache + } + fn device(&self) -> &Device { + &self.device + } + fn is_xlora(&self) -> bool { + false + } + fn max_seq_len(&self) -> usize { + self.blocks[0].attn.max_seq_len + } +} + +impl LLaVALLM for Llama { + fn embed(&self, x: &Tensor) -> Result { + self.wte.forward(x) + } + fn forward_input_embed( + &self, + input_embed: &Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + ) -> Result { + let mut x = input_embed.clone(); + let mut cache = self.kv_cache.lock(); + let mask = CausalMasker.make_causal_mask_as_attn_bias_with_embed_tensor( + &x, + &cache, + x.dtype(), + self.blocks[0].attn.num_attention_heads, + )?; + for (block_idx, block) in self.blocks.iter().enumerate() { + x = self.mapper.map(x, block_idx)?; + x = block.forward( + &x, + &mask.clone().map(|m| m.to_device(x.device()).unwrap()), + seqlen_offsets, + start_offsets_kernel.clone(), + block_idx, + &mut cache, + (&self.rope_parameters.0, &self.rope_parameters.1), + )?; + } + let x = x.to_device(&self.device)?; + let mut x = self.ln_f.forward(&x)?; + if matches!(self.lm_head, QMatMul::QTensor(_)) { + x = x.to_dtype(DType::F32)?; + } + let logits = MatMul.qmatmul(&x, &self.lm_head)?; + extract_logits(&logits, context_lens) + } +} diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs new file mode 100644 index 000000000..70a82b0cf --- /dev/null +++ b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs @@ -0,0 +1,47 @@ +use candle_core::{DType, Device, Result, Tensor}; + +use crate::pipeline::{IsqModel, NormalModel}; + +pub(crate) trait LLaVALLM: IsqModel + NormalModel + Sync + Send { + fn embed(&self, x: &Tensor) -> Result; + fn forward_input_embed( + &self, + input_embed: &Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + ) -> Result; +} + +#[derive(Debug)] +pub(crate) struct OrdinaryRoPE; + +impl OrdinaryRoPE { + fn create_parameters( + n_elem: usize, + max_seq_len: usize, + rope_theta: f32, + dtype: DType, + device: &Device, + ) -> Result<(Tensor, Tensor)> { + let theta: Vec<_> = (0..n_elem) + .step_by(2) + .map(|i| 1f32 / rope_theta.powf(i as f32 / n_elem as f32)) + .collect(); + let theta = Tensor::new(theta.as_slice(), device)?; + let idx_theta = Tensor::arange(0, max_seq_len as u32, device)? + .to_dtype(DType::F32)? + .reshape((max_seq_len, 1))? + .matmul(&theta.reshape((1, theta.elem_count()))?)?; + let cos = idx_theta.cos()?.to_dtype(dtype)?; + let sin = idx_theta.sin()?.to_dtype(dtype)?; + Result::Ok((cos, sin)) + } + fn forward(x: &Tensor, index_pos: usize, cos: &Tensor, sin: &Tensor) -> Result { + let (_b_sz, _, seq_len, _hidden_size) = x.dims4()?; + let cos = cos.narrow(0, index_pos, seq_len)?; + let sin = sin.narrow(0, index_pos, seq_len)?; + candle_nn::rotary_emb::rope(x, &cos, &sin) + } +} +pub(crate) mod llama; diff --git a/mistralrs-core/src/vision_models/llava_next.rs b/mistralrs-core/src/vision_models/llava/llava_next.rs similarity index 90% rename from mistralrs-core/src/vision_models/llava_next.rs rename to mistralrs-core/src/vision_models/llava/llava_next.rs index 010b7bca3..598950bb5 100644 --- a/mistralrs-core/src/vision_models/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next.rs @@ -1,24 +1,21 @@ #![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] use candle_core::quantized::QMatMul; use candle_core::{bail, DType, Device, IndexOp, Result, Tensor}; -use candle_nn::{linear, seq, Activation, Linear, Module, Sequential, VarBuilder}; -use itertools::Itertools; +use candle_nn::{linear, Activation, Linear, VarBuilder}; use serde::Deserialize; use crate::device_map::DeviceMapper; use crate::ops::NonZeroOp; use crate::pipeline::IsqModel; use crate::pipeline::NormalLoadingMetadata; -use crate::pipeline::NormalModel; use crate::pipeline::VisionModel; use crate::serde_default_fn; use crate::models::llama::Config as LLaMAConfig; -use crate::models::llama::Llama; -use crate::vision_models::clip::ClipConfig; +use crate::vision_models::clip::{Activation as ClipActivation, ClipConfig, ClipVisionTransformer}; use crate::vision_models::llava_next_inputs_processor::get_anyres_image_grid_shape; -use super::clip::{Activation as ClipActivation, ClipVisionTransformer}; +use super::llava_llm::{self, LLaVALLM}; #[derive(Debug, Clone, Deserialize)] pub struct Config { @@ -38,7 +35,6 @@ serde_default_fn!(bool, default_use_flash_attn, false); #[derive(Deserialize, Debug, Clone)] pub struct LLaVATextConfig { - pub architectures: Vec, #[serde(default = "default_hidden_size")] pub hidden_size: usize, #[serde(default = "default_intermediate_size")] @@ -53,18 +49,12 @@ pub struct LLaVATextConfig { pub num_hidden_layers: usize, #[serde(default = "default_num_key_value_heads")] pub num_key_value_heads: usize, - pub pad_token_id: usize, pub rms_norm_eps: f64, #[serde(default = "default_rope_theta")] pub rope_theta: f32, - pub torch_dtype: String, - #[serde(default = "default_use_cache")] - pub use_cache: bool, - pub vocab_size: usize, } serde_default_fn!(usize, default_num_hidden_layers, 32); -serde_default_fn!(bool, default_use_cache, true); serde_default_fn!(usize, default_hidden_size, 4096); serde_default_fn!(usize, default_intermediate_size, 11008); serde_default_fn!(usize, default_max_length, 4096); @@ -77,12 +67,9 @@ pub struct LLaVAVisionConfig { pub hidden_size: usize, pub image_size: usize, pub intermediate_size: usize, - pub model_type: String, pub num_attention_heads: usize, pub num_hidden_layers: usize, pub patch_size: usize, - pub projection_dim: usize, - pub vocab_size: usize, } impl Config { @@ -199,7 +186,7 @@ pub struct Model { clip_vision_tower: ClipVisionTower, image_newline: Tensor, mm_projector: MMProjector, - llama: Llama, + llm: Box, config: Config, device: Device, } @@ -212,7 +199,7 @@ impl Model { normal_loading_metadata: NormalLoadingMetadata, ) -> Result { let device = normal_loading_metadata.real_device.clone(); - let llama_config = config.to_llama_config(); + let clip_config = config.to_clip_config(); let mm_projector = MMProjector::new(&vb, config)?; let clip_vision_tower = ClipVisionTower::new( @@ -224,17 +211,27 @@ impl Model { let image_newline = vb .get(&[config.text_config.hidden_size], "image_newline")? .to_device(&device)?; - let llama = Llama::new( - &llama_config, - vb.pp("language_model"), - is_gptx, - normal_loading_metadata, - )?; + + let llm = match config.text_config.model_type.as_str() { + "llama" => { + let llama_config = config.to_llama_config(); + let llama = llava_llm::llama::Llama::new( + &llama_config, + vb.pp("language_model"), + is_gptx, + normal_loading_metadata, + )?; + Box::new(llama) + } + _ => { + bail!("Unsupported model type: {}", config.text_config.model_type); + } + }; Ok(Self { clip_vision_tower, image_newline, mm_projector, - llama, + llm, config: config.clone(), device, }) @@ -285,7 +282,7 @@ impl Model { .map(|x| Ok(-(input_ids.i((0, *x as usize))?.to_scalar::()?))) .collect::>>()?; let mut result = input_ids.clamp(0i64, i64::MAX)?.to_dtype(DType::U32)?; - result = self.llama.embed(&result)?; //[seq_len,hidden_size] + result = self.llm.embed(&result)?; //[seq_len,hidden_size] let image_features = self.encode_images(images)?; //[sample_per_image*image_num,hidden_size] let image_nums = images.shape().dims()[0] / 5; let mut image_features_vec = Vec::new(); @@ -343,11 +340,16 @@ impl Model { &image_features_vec[(image_id - 1) as usize], )?; } + //truncate + let (_, seq_len) = input_ids.shape().dims2()?; + if seq_len > self.config.text_config.max_length { + result = result.i((.., ..self.config.text_config.max_length, ..))? + } Ok(result) } - pub fn forward( - &mut self, + pub fn forward_inputs( + &self, input_ids: &Tensor, pixel_values: Option, image_sizes: Option>, @@ -355,6 +357,7 @@ impl Model { seqlen_offsets: &[usize], start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, + position_ids: Vec, ) -> Result { if let Some(ref pixel_values) = pixel_values { // we assume(as it should be) only prompt request contains image @@ -364,18 +367,19 @@ impl Model { num_image_token.unwrap(), &image_sizes.unwrap(), )?; - self.llama.forward_input_embed( + self.llm.forward_input_embed( &input_embeds, &seqlen_offsets, start_offsets_kernel, context_lens, ) } else { - self.llama.forward( + self.llm.forward( input_ids, &seqlen_offsets, start_offsets_kernel, context_lens, + position_ids, ) } } @@ -389,19 +393,19 @@ pub(crate) struct LLaVANextVisionSpecificArgs { impl IsqModel for Model { fn get_tensors(&mut self) -> (Vec<(&mut QMatMul, Option)>, &dyn DeviceMapper) { // I don't really get this part - self.llama.get_tensors() + self.llm.get_tensors() } } impl VisionModel for Model { fn forward( - &mut self, + &self, input_ids: &Tensor, pixel_values: Option, seqlen_offsets: &[usize], start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, - _position_ids: Vec, + position_ids: Vec, model_specific_args: Box, // pixel attention mask, or image sizes, or anything else ) -> candle_core::Result { let LLaVANextVisionSpecificArgs { @@ -421,7 +425,7 @@ impl VisionModel for Model { } else { None }; - self.forward( + self.forward_inputs( input_ids, pixel_values, image_sizes, @@ -429,6 +433,7 @@ impl VisionModel for Model { seqlen_offsets, start_offsets_kernel, context_lens, + position_ids, ) } @@ -437,11 +442,11 @@ impl VisionModel for Model { } fn cache(&self) -> &crate::pipeline::Cache { - self.llama.cache() + self.llm.cache() } fn max_seq_len(&self) -> usize { - self.llama.max_seq_len() + self.config.text_config.max_length } fn has_conv2d(&self) -> bool { diff --git a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs similarity index 97% rename from mistralrs-core/src/vision_models/llava_next_inputs_processor.rs rename to mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs index 3216712fe..e98057178 100644 --- a/mistralrs-core/src/vision_models/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs @@ -16,14 +16,10 @@ use crate::pipeline::{ text_models_inputs_processor, InputsProcessor, InputsProcessorType, MessagesAction, Processor, }; use crate::sequence::Sequence; -use crate::vision_models::image_processor::PreprocessedImages; -use crate::vision_models::llava_next::Config; +use crate::vision_models::image_processor::{self, ImagePreProcessor, PreprocessedImages}; use crate::vision_models::llava_next::LLaVANextVisionSpecificArgs; -use crate::vision_models::ModelInputs; - -use super::image_processor::ImagePreProcessor; use crate::vision_models::preprocessor_config::{PreProcessorConfig, ToFilter}; -use mistralrs_vision::Normalize; +use crate::vision_models::{preprocessor_config, ModelInputs}; pub fn get_anyres_image_grid_shape( image_size: (u32, u32), @@ -444,9 +440,9 @@ impl ImagePreProcessor for LLaVANextInputProcessor { fn preprocess( &self, images: Vec, - config: &super::preprocessor_config::PreProcessorConfig, + config: &preprocessor_config::PreProcessorConfig, device: &candle_core::Device, - ) -> candle_core::Result { + ) -> candle_core::Result { if images.len() > 1 { candle_core::bail!("Can only process one image per batch"); // This is no different from phi3_input_processor }; @@ -520,7 +516,7 @@ impl ImagePreProcessor for LLaVANextInputProcessor { .collect::>>()?; let pixel_values = Tensor::stack(&pixel_values, 0)?; - Ok(super::image_processor::PreprocessedImages { + Ok(image_processor::PreprocessedImages { pixel_values, pixel_attention_mask: None, image_sizes: Some((image_size, image_size)), diff --git a/mistralrs-core/src/vision_models/llava/mod.rs b/mistralrs-core/src/vision_models/llava/mod.rs new file mode 100644 index 000000000..3740c5daa --- /dev/null +++ b/mistralrs-core/src/vision_models/llava/mod.rs @@ -0,0 +1,3 @@ +pub mod llava_llm; +pub mod llava_next; +pub mod llava_next_inputs_processor; diff --git a/mistralrs-core/src/vision_models/mod.rs b/mistralrs-core/src/vision_models/mod.rs index 8c79b8835..33bfb1ccc 100644 --- a/mistralrs-core/src/vision_models/mod.rs +++ b/mistralrs-core/src/vision_models/mod.rs @@ -6,12 +6,13 @@ pub(crate) mod clip; pub(crate) mod idefics2; pub(crate) mod idefics2_input_processor; pub(crate) mod image_processor; -pub(crate) mod llava_next; -pub(crate) mod llava_next_inputs_processor; +pub(crate) mod llava; pub(crate) mod phi3; pub(crate) mod phi3_inputs_processor; pub(crate) mod preprocessor_config; pub(crate) mod processor_config; +pub(crate) use llava::llava_next; +pub(crate) use llava::llava_next_inputs_processor; pub struct ModelInputs { pub input_ids: Tensor, From eab6de21ceef233d23a7efdbcb97c2e27871eed1 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Fri, 28 Jun 2024 18:12:22 +0800 Subject: [PATCH 15/34] modify num_image_tokens and num_image_patches --- mistralrs-core/src/layers_masker.rs | 40 +- .../vision_models/llava/llava_llm/llama.rs | 45 +- .../vision_models/llava/llava_llm/mistral.rs | 474 ++++++++++++++++++ .../src/vision_models/llava/llava_llm/mod.rs | 10 +- .../src/vision_models/llava/llava_next.rs | 115 +++-- .../llava/llava_next_inputs_processor.rs | 114 ++++- mistralrs-core/src/vision_models/llava/mod.rs | 2 + 7 files changed, 688 insertions(+), 112 deletions(-) create mode 100644 mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs diff --git a/mistralrs-core/src/layers_masker.rs b/mistralrs-core/src/layers_masker.rs index 99633ac8d..6f2a88b91 100644 --- a/mistralrs-core/src/layers_masker.rs +++ b/mistralrs-core/src/layers_masker.rs @@ -76,31 +76,31 @@ impl CausalMasker { return Ok(k_cache_1.dims()[2]); } - fn _make_causal_mask_as_attn_bias( + pub fn make_causal_mask_as_attn_bias( &self, - b_sz: usize, - tgt_len: usize, - device: &Device, + input_ids: &Tensor, cache: &[Option<(Tensor, Tensor)>], dtype: DType, n_attn_heads: usize, ) -> Result> { let past_kv_len = self.calculate_past_kv_len(cache)?; + let (b_sz, tgt_len) = input_ids.dims2()?; if tgt_len == 1 { return Ok(None); } let causal_mask = { - let mask = self.make_mask(tgt_len, past_kv_len, device)?; + let mask = self.make_mask(tgt_len, past_kv_len, input_ids.device())?; let mask = mask .expand((b_sz, 1, tgt_len, tgt_len + past_kv_len))? .to_dtype(DType::U8)?; Some(mask) }; - let zero = Tensor::new(0.0f32, device)?; + let zero = Tensor::new(0.0f32, input_ids.device())?; let causal_mask: Option> = causal_mask.map(|mask| { - let mask = mask.broadcast_as((b_sz, n_attn_heads, tgt_len, tgt_len + past_kv_len))?; + let mask = + mask.broadcast_as((mask.dims()[0], n_attn_heads, mask.dims()[2], mask.dims()[3]))?; // Mask: 1 means use from x (add 0.0), 0 means mask out (add -inf) let mask = masked_fill( &zero.to_dtype(dtype)?.broadcast_as(mask.shape())?, @@ -118,30 +118,6 @@ impl CausalMasker { Ok(mask) } - pub fn make_causal_mask_as_attn_bias( - &self, - input_ids: &Tensor, - cache: &[Option<(Tensor, Tensor)>], - dtype: DType, - n_attn_heads: usize, - ) -> Result> { - let (b_sz, tgt_len) = input_ids.dims2()?; - let device = input_ids.device(); - self._make_causal_mask_as_attn_bias(b_sz, tgt_len, device, cache, dtype, n_attn_heads) - } - - pub fn make_causal_mask_as_attn_bias_with_embed_tensor( - &self, - embed: &Tensor, - cache: &[Option<(Tensor, Tensor)>], - dtype: DType, - n_attn_heads: usize, - ) -> Result> { - let (b_sz, tgt_len, _) = embed.dims3()?; - let device = embed.device(); - self._make_causal_mask_as_attn_bias(b_sz, tgt_len, device, cache, dtype, n_attn_heads) - } - pub fn make_causal_mask_with_sliding_window_as_attn_bias( &self, input_ids: &Tensor, @@ -270,4 +246,4 @@ impl CausalMasker { } } } -} +} \ No newline at end of file diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs index 873c561da..03185bb9c 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs @@ -1,5 +1,9 @@ //LLaMA without fused RoPE -#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] +#![allow( + clippy::cast_possible_truncation, + clippy::cast_precision_loss, + clippy::too_many_arguments +)] use candle_core::{quantized::QMatMul, DType, Device, Result, Tensor}; use candle_nn::{embedding, linear_no_bias as linear, Embedding, Module, VarBuilder}; @@ -55,10 +59,12 @@ impl CausalSelfAttention { } let mut q = q .reshape((b_sz, seq_len, self.num_attention_heads, self.head_dim))? - .transpose(1, 2)?.contiguous()?; + .transpose(1, 2)? + .contiguous()?; let mut k = k .reshape((b_sz, seq_len, self.num_key_value_heads, self.head_dim))? - .transpose(1, 2)?.contiguous()?; + .transpose(1, 2)? + .contiguous()?; q = OrdinaryRoPE::forward(&q, seqlen_offsets[0], rope_parameter.0, rope_parameter.1)?; k = OrdinaryRoPE::forward(&k, seqlen_offsets[0], rope_parameter.0, rope_parameter.1)?; let v = v @@ -130,7 +136,7 @@ impl Mlp { if matches!(self.c_fc1, QMatMul::QTensor(_)) { x = x.to_dtype(DType::F32)?; } - let x = (candle_nn::ops::silu(&MatMul.qmatmul(&x, &self.c_fc1)?)? + x = (candle_nn::ops::silu(&MatMul.qmatmul(&x, &self.c_fc1)?)? * MatMul.qmatmul(&x, &self.c_fc2)?)?; let mut res = MatMul.qmatmul(&x, &self.c_proj)?; if matches!(self.c_fc1, QMatMul::QTensor(_)) { @@ -173,8 +179,8 @@ impl Block { rope_parameters: (&Tensor, &Tensor), ) -> Result { let residual = x; - let x = self.rms_1.forward(x)?; - let x = (self.attn.forward( + let mut x = self.rms_1.forward(x)?; + x = (self.attn.forward( &x, attention_mask, seqlen_offsets, @@ -184,7 +190,7 @@ impl Block { rope_parameters, )? + residual)?; let residual = &x; - let x = (self.mlp.forward(&self.rms_2.forward(&x)?)? + residual)?; + x = (self.mlp.forward(&self.rms_2.forward(&x)?)? + residual)?; Ok(x) } @@ -259,8 +265,8 @@ impl Llama { (&self.rope_parameters.0, &self.rope_parameters.1), )?; } - let x = x.to_device(&self.device)?; - let mut x = self.ln_f.forward(&x)?; + x = x.to_device(&self.device)?; + x = self.ln_f.forward(&x)?; if matches!(self.lm_head, QMatMul::QTensor(_)) { x = x.to_dtype(DType::F32)?; } @@ -277,7 +283,7 @@ impl Llama { let mapper = normal_loading_metadata .mapper .into_mapper(cfg.num_hidden_layers, &normal_loading_metadata.real_device)?; - // let vb = vb.set_dtype(mapper.get_min_dtype()?); + // let vb = vb.set_dtype(mapper.get_min_dtype()?); this one is dangerous! copy the entire weights, occupy more GPU memory! let wte = embedding( cfg.vocab_size, @@ -295,7 +301,7 @@ impl Llama { mapper.set_nm_device(vb.pp("model.norm"), false), )?; let head_dim = cfg.hidden_size / cfg.num_attention_heads; - + let blocks: Vec<_> = NiceProgressBar(0..cfg.num_hidden_layers, "Loading repeating layers") .into_iter() .map(|i| { @@ -392,20 +398,21 @@ impl NormalModel for Llama { } impl LLaVALLM for Llama { - fn embed(&self, x: &Tensor) -> Result { - self.wte.forward(x) + fn embed(&self, input_ids: &Tensor) -> Result { + self.wte.forward(input_ids) } fn forward_input_embed( &self, - input_embed: &Tensor, + input_ids: &Tensor, + input_embed: Tensor, seqlen_offsets: &[usize], start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, ) -> Result { - let mut x = input_embed.clone(); + let mut x = input_embed; let mut cache = self.kv_cache.lock(); - let mask = CausalMasker.make_causal_mask_as_attn_bias_with_embed_tensor( - &x, + let mask = CausalMasker.make_causal_mask_as_attn_bias( + input_ids, &cache, x.dtype(), self.blocks[0].attn.num_attention_heads, @@ -422,8 +429,8 @@ impl LLaVALLM for Llama { (&self.rope_parameters.0, &self.rope_parameters.1), )?; } - let x = x.to_device(&self.device)?; - let mut x = self.ln_f.forward(&x)?; + x = x.to_device(&self.device)?; + x = self.ln_f.forward(&x)?; if matches!(self.lm_head, QMatMul::QTensor(_)) { x = x.to_dtype(DType::F32)?; } diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs b/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs new file mode 100644 index 000000000..7ed92dbe1 --- /dev/null +++ b/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs @@ -0,0 +1,474 @@ +#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] + +/// Mistral LLM, https://github.com/mistralai/mistral-src +use candle_core::{quantized::QMatMul, DType, Device, Module, Result, Tensor}; +use candle_nn::{linear_no_bias, Activation, VarBuilder}; + +use crate::{ + device_map::DeviceMapper, + layers::{repeat_kv, CausalMasker, MatMul, RmsNorm, ScaledDotProductAttention}, + pipeline::{extract_logits, Cache, IsqModel, NormalLoadingMetadata, NormalModel}, + utils::progress::NiceProgressBar, +}; + +use super::{LLaVALLM, OrdinaryRoPE}; +use crate::models::mistral::Config; + +#[derive(Debug, Clone)] +#[allow(clippy::upper_case_acronyms)] +struct MLP { + gate_proj: QMatMul, + up_proj: QMatMul, + down_proj: QMatMul, + act_fn: Activation, +} + +impl MLP { + fn new(cfg: &Config, vb: VarBuilder) -> Result { + let hidden_sz = cfg.hidden_size; + let intermediate_sz = cfg.intermediate_size; + let gate_proj = linear_no_bias(hidden_sz, intermediate_sz, vb.pp("gate_proj"))?; + let up_proj = linear_no_bias(hidden_sz, intermediate_sz, vb.pp("up_proj"))?; + let down_proj = linear_no_bias(intermediate_sz, hidden_sz, vb.pp("down_proj"))?; + Ok(Self { + gate_proj: QMatMul::Tensor(gate_proj.weight().clone()), + up_proj: QMatMul::Tensor(up_proj.weight().clone()), + down_proj: QMatMul::Tensor(down_proj.weight().clone()), + act_fn: cfg.hidden_act, + }) + } +} + +impl Module for MLP { + fn forward(&self, xs: &Tensor) -> Result { + let original_dtype = xs.dtype(); + let mut xs = xs.clone(); + if matches!(self.gate_proj, QMatMul::QTensor(_)) { + xs = xs.to_dtype(DType::F32)?; + } + let lhs = MatMul.qmatmul(&xs, &self.gate_proj)?.apply(&self.act_fn)?; + let rhs = MatMul.qmatmul(&xs, &self.up_proj)?; + let mut res = MatMul.qmatmul(&(lhs * rhs)?, &self.down_proj)?; + if matches!(self.gate_proj, QMatMul::QTensor(_)) { + res = res.to_dtype(original_dtype)?; + } + Ok(res) + } +} + +#[derive(Debug, Clone)] +struct Attention { + q_proj: QMatMul, + k_proj: QMatMul, + v_proj: QMatMul, + o_proj: QMatMul, + num_heads: usize, + num_kv_heads: usize, + num_kv_groups: usize, + head_dim: usize, + hidden_size: usize, + use_flash_attn: bool, + sliding_window: Option, +} + +impl Attention { + fn new(cfg: &Config, vb: VarBuilder) -> Result { + let hidden_sz = cfg.hidden_size; + let num_heads = cfg.num_attention_heads; + let num_kv_heads = cfg.num_key_value_heads; + let num_kv_groups = num_heads / num_kv_heads; + let head_dim = hidden_sz / num_heads; + let q_proj = linear_no_bias(hidden_sz, num_heads * head_dim, vb.pp("q_proj"))?; + let k_proj = linear_no_bias(hidden_sz, num_kv_heads * head_dim, vb.pp("k_proj"))?; + let v_proj = linear_no_bias(hidden_sz, num_kv_heads * head_dim, vb.pp("v_proj"))?; + let o_proj = linear_no_bias(num_heads * head_dim, hidden_sz, vb.pp("o_proj"))?; + Ok(Self { + q_proj: QMatMul::Tensor(q_proj.weight().clone()), + k_proj: QMatMul::Tensor(k_proj.weight().clone()), + v_proj: QMatMul::Tensor(v_proj.weight().clone()), + o_proj: QMatMul::Tensor(o_proj.weight().clone()), + num_heads, + num_kv_heads, + num_kv_groups, + head_dim, + hidden_size: hidden_sz, + use_flash_attn: cfg.use_flash_attn, + sliding_window: cfg.sliding_window, + }) + } + + fn forward( + &self, + xs: &Tensor, + attention_mask: Option<&Tensor>, + seqlen_offsets: &[usize], + _start_offsets_kernel: Tensor, + kv_cache: &mut Option<(Tensor, Tensor)>, + rope_parameter: (&Tensor, &Tensor), + ) -> Result { + let (b_sz, q_len, _) = xs.dims3()?; + + let original_dtype = xs.dtype(); + let mut xs = xs.clone(); + if matches!(self.q_proj, QMatMul::QTensor(_)) { + xs = xs.to_dtype(DType::F32)?; + } + let mut q = MatMul.qmatmul(&xs, &self.q_proj)?; + let mut k = MatMul.qmatmul(&xs, &self.k_proj)?; + let mut v = MatMul.qmatmul(&xs, &self.v_proj)?; + if matches!(self.q_proj, QMatMul::QTensor(_)) { + q = q.to_dtype(original_dtype)?; + k = k.to_dtype(original_dtype)?; + v = v.to_dtype(original_dtype)?; + } + + let mut q = q + .reshape((b_sz, q_len, self.num_heads, self.head_dim))? + .transpose(1, 2)? + .contiguous()?; + let mut k = k + .reshape((b_sz, q_len, self.num_kv_heads, self.head_dim))? + .transpose(1, 2)? + .contiguous()?; + q = OrdinaryRoPE::forward(&q, seqlen_offsets[0], rope_parameter.0, rope_parameter.1)?; + k = OrdinaryRoPE::forward(&k, seqlen_offsets[0], rope_parameter.0, rope_parameter.1)?; + let v = v + .reshape((b_sz, q_len, self.num_kv_heads, self.head_dim))? + .transpose(1, 2)?; + let (k, v, attn_mask) = Cache::update_kv_cache_sliding_window( + kv_cache, + k, + v, + attention_mask, + self.sliding_window, + false, + )?; + + let k = repeat_kv(k, self.num_kv_groups)?.contiguous()?; + let v = repeat_kv(v, self.num_kv_groups)?.contiguous()?; + + let mut attn_output = ScaledDotProductAttention.run_attention( + &q, + &k, + &v, + self.num_heads, + self.head_dim, + attn_mask.as_ref(), + self.use_flash_attn, + b_sz, + q_len, + )?; + + if matches!(self.q_proj, QMatMul::QTensor(_)) { + attn_output = attn_output.to_dtype(DType::F32)?; + } + let mut res = MatMul.qmatmul( + &attn_output + .transpose(1, 2)? + .reshape((b_sz, q_len, self.hidden_size))?, + &self.o_proj, + )?; + if matches!(self.q_proj, QMatMul::QTensor(_)) { + res = res.to_dtype(original_dtype)?; + } + Ok(res) + } +} + +#[derive(Debug, Clone)] +struct DecoderLayer { + self_attn: Attention, + mlp: MLP, + input_layernorm: RmsNorm, + post_attention_layernorm: RmsNorm, +} + +impl DecoderLayer { + fn new( + cfg: &Config, + vb: VarBuilder, + mapper: &dyn DeviceMapper, + layer_idx: usize, + loading_isq: bool, + ) -> Result { + let self_attn = Attention::new( + cfg, + mapper.set_device(layer_idx, vb.pp("self_attn"), loading_isq), + )?; + let mlp = MLP::new(cfg, mapper.set_device(layer_idx, vb.pp("mlp"), loading_isq))?; + let input_layernorm = RmsNorm::new( + cfg.hidden_size, + cfg.rms_norm_eps, + mapper.set_device(layer_idx, vb.pp("input_layernorm"), false), + )?; + let post_attention_layernorm = RmsNorm::new( + cfg.hidden_size, + cfg.rms_norm_eps, + mapper.set_device(layer_idx, vb.pp("post_attention_layernorm"), false), + )?; + Ok(Self { + self_attn, + mlp, + input_layernorm, + post_attention_layernorm, + }) + } + + fn forward( + &self, + xs: &Tensor, + attention_mask: Option<&Tensor>, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + kv_cache: &mut Option<(Tensor, Tensor)>, + rope_parameter: (&Tensor, &Tensor), + ) -> Result { + let residual = xs; + let mut xs = self.input_layernorm.forward(xs)?; + xs = self.self_attn.forward( + &xs, + attention_mask, + seqlen_offsets, + start_offsets_kernel, + kv_cache, + rope_parameter, + )?; + xs = (xs + residual)?; + let residual = &xs; + let xs = xs.apply(&self.post_attention_layernorm)?.apply(&self.mlp)?; + xs + residual + } +} + +#[derive(Debug)] +pub struct Model { + embed_tokens: candle_nn::Embedding, + layers: Vec, + norm: RmsNorm, + lm_head: QMatMul, + sliding_window: Option, + pub device: Device, + pub cache: Cache, + pub max_seq_len: usize, + mapper: Box, + rope_parameters: (Tensor, Tensor), +} + +impl Model { + pub fn new( + cfg: &Config, + vb: VarBuilder, + is_gptx: bool, + normal_loading_metadata: NormalLoadingMetadata, + ) -> Result { + let vb_m = vb.pp("model"); + let vb_lm_head = vb.pp("lm_head"); + Self::new_inner(cfg, vb_m, vb_lm_head, is_gptx, normal_loading_metadata) + } + + pub fn new_inner( + cfg: &Config, + vb_m: VarBuilder, + vb_lm_head: VarBuilder, + _is_gptx: bool, + normal_loading_metadata: NormalLoadingMetadata, + ) -> Result { + let mapper = normal_loading_metadata + .mapper + .into_mapper(cfg.num_hidden_layers, &normal_loading_metadata.real_device)?; + //let vb_m = vb_m.set_dtype(mapper.get_min_dtype()?); + //let vb_lm_head = vb_lm_head.set_dtype(mapper.get_min_dtype()?); + + let embed_tokens = candle_nn::embedding( + cfg.vocab_size, + cfg.hidden_size, + mapper.set_nm_device(vb_m.pp("embed_tokens"), false), + )?; + let head_dim = cfg.hidden_size / cfg.num_attention_heads; + let mut layers = Vec::with_capacity(cfg.num_hidden_layers); + let vb_l = vb_m.pp("layers"); + let rope_parameters = OrdinaryRoPE::create_parameters( + head_dim, + cfg.max_position_embeddings, + cfg.rope_theta as f32, + vb_m.dtype(), + &normal_loading_metadata.real_device, + )?; + for layer_idx in NiceProgressBar(0..cfg.num_hidden_layers, "Loading repeating layers") { + let layer = DecoderLayer::new( + cfg, + vb_l.pp(layer_idx), + &*mapper, + layer_idx, + normal_loading_metadata.loading_isq, + )?; + layers.push(layer) + } + let norm = RmsNorm::new( + cfg.hidden_size, + cfg.rms_norm_eps, + mapper.set_nm_device(vb_m.pp("norm"), false), + )?; + let lm_head = linear_no_bias( + cfg.hidden_size, + cfg.vocab_size, + mapper.set_nm_device(vb_lm_head, normal_loading_metadata.loading_isq), + )?; + Ok(Self { + embed_tokens, + layers, + norm, + lm_head: QMatMul::Tensor(lm_head.weight().clone()), + sliding_window: cfg.sliding_window, + device: normal_loading_metadata.real_device, + cache: Cache::new(cfg.num_hidden_layers, false), + max_seq_len: cfg.max_position_embeddings, + mapper, + rope_parameters, + }) + } + + pub fn get_input_embeddings(&self, input_ids: &Tensor) -> Result { + self.embed_tokens.forward(input_ids) + } + + pub fn forward( + &self, + input_ids: &Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + ) -> Result { + self.forward_embeds( + input_ids, + self.embed_tokens.forward(input_ids)?, + seqlen_offsets, + start_offsets_kernel, + context_lens, + ) + } + + pub fn forward_embeds( + &self, + input_ids: &Tensor, + input_embeds: Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + ) -> Result { + let mut xs = input_embeds; + let mut cache = self.cache.lock(); + let attention_mask = CausalMasker.make_causal_mask_with_sliding_window_as_attn_bias( + input_ids, + &cache, + self.sliding_window, + xs.dtype(), + self.layers[0].self_attn.num_heads, + )?; + for (i, layer) in self.layers.iter().enumerate() { + xs = self.mapper.map(xs, i)?; + xs = layer.forward( + &xs, + attention_mask + .as_ref() + .map(|m| m.to_device(xs.device()).unwrap()) + .as_ref(), + seqlen_offsets, + start_offsets_kernel.clone(), + &mut cache[i], + (&self.rope_parameters.0, &self.rope_parameters.1), + )?; + } + xs = xs.to_device(&self.device)?; + xs = xs.apply(&self.norm)?; + if matches!(self.lm_head, QMatMul::QTensor(_)) { + xs = xs.to_dtype(DType::F32)?; + } + extract_logits(&MatMul.qmatmul(&xs, &self.lm_head)?, context_lens) + } +} + +impl IsqModel for Model { + fn get_tensors(&mut self) -> (Vec<(&mut QMatMul, Option)>, &dyn DeviceMapper) { + let mut tensors = Vec::new(); + tensors.push((&mut self.lm_head, None)); + for (i, layer) in self.layers.iter_mut().enumerate() { + tensors.push((&mut layer.self_attn.q_proj, Some(i))); + tensors.push((&mut layer.self_attn.k_proj, Some(i))); + tensors.push((&mut layer.self_attn.v_proj, Some(i))); + tensors.push((&mut layer.self_attn.o_proj, Some(i))); + tensors.push((&mut layer.mlp.down_proj, Some(i))); + tensors.push((&mut layer.mlp.up_proj, Some(i))); + tensors.push((&mut layer.mlp.gate_proj, Some(i))); + } + (tensors, &*self.mapper) + } +} + +impl NormalModel for Model { + fn forward( + &self, + input_ids: &Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + _position_ids: Vec, + ) -> Result { + self.forward( + input_ids, + seqlen_offsets, + start_offsets_kernel, + context_lens, + ) + } + fn xlora_forward( + &self, + _input_ids: &Tensor, + _input_ids_full: &Tensor, + _seqlen_offsets: &[usize], + _seqlen_offsets_full: &[usize], + _start_offsets_kernel: Tensor, + _start_offsets_kernel_full: Tensor, + _no_kv_cache: bool, + _non_granular_state: &Option, + _context_lens: Vec<(usize, usize)>, + _position_ids: Vec, + ) -> Result { + unimplemented!() + } + fn cache(&self) -> &Cache { + &self.cache + } + fn device(&self) -> &Device { + &self.device + } + fn is_xlora(&self) -> bool { + false + } + fn max_seq_len(&self) -> usize { + self.max_seq_len + } +} + +impl LLaVALLM for Model { + fn embed(&self, input_ids: &Tensor) -> Result { + self.get_input_embeddings(input_ids) + } + + fn forward_input_embed( + &self, + input_ids: &Tensor, + input_embed: Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + ) -> Result { + self.forward_embeds( + input_ids, + input_embed, + seqlen_offsets, + start_offsets_kernel, + context_lens, + ) + } +} diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs index 70a82b0cf..35167986d 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs @@ -1,12 +1,14 @@ +#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] use candle_core::{DType, Device, Result, Tensor}; use crate::pipeline::{IsqModel, NormalModel}; pub(crate) trait LLaVALLM: IsqModel + NormalModel + Sync + Send { - fn embed(&self, x: &Tensor) -> Result; + fn embed(&self, input_ids: &Tensor) -> Result; fn forward_input_embed( &self, - input_embed: &Tensor, + input_ids: &Tensor, // only for masking + input_embed: Tensor, // we don't want to clone, so we pass it in seqlen_offsets: &[usize], start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, @@ -45,3 +47,7 @@ impl OrdinaryRoPE { } } pub(crate) mod llama; +pub(crate) mod mistral; + +pub use llama::Llama; +pub use mistral::Model as Mistral; \ No newline at end of file diff --git a/mistralrs-core/src/vision_models/llava/llava_next.rs b/mistralrs-core/src/vision_models/llava/llava_next.rs index 598950bb5..52f81f662 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next.rs @@ -1,4 +1,8 @@ -#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] +#![allow( + clippy::cast_possible_truncation, + clippy::cast_precision_loss, + clippy::too_many_arguments +)] use candle_core::quantized::QMatMul; use candle_core::{bail, DType, Device, IndexOp, Result, Tensor}; use candle_nn::{linear, Activation, Linear, VarBuilder}; @@ -12,10 +16,11 @@ use crate::pipeline::VisionModel; use crate::serde_default_fn; use crate::models::llama::Config as LLaMAConfig; +use crate::models::mistral::Config as MistralConfig; use crate::vision_models::clip::{Activation as ClipActivation, ClipConfig, ClipVisionTransformer}; use crate::vision_models::llava_next_inputs_processor::get_anyres_image_grid_shape; -use super::llava_llm::{self, LLaVALLM}; +use super::llava_llm::{LLaVALLM, Llama, Mistral}; #[derive(Debug, Clone, Deserialize)] pub struct Config { @@ -26,7 +31,6 @@ pub struct Config { pub vision_config: LLaVAVisionConfig, pub vision_feature_layer: isize, pub vision_feature_select_strategy: String, - pub vocab_size: usize, #[serde(default = "default_use_flash_attn")] pub use_flash_attn: bool, } @@ -52,6 +56,9 @@ pub struct LLaVATextConfig { pub rms_norm_eps: f64, #[serde(default = "default_rope_theta")] pub rope_theta: f32, + #[serde(default = "default_vocab_size")] + pub vocab_size: usize, + pub sliding_window: Option, } serde_default_fn!(usize, default_num_hidden_layers, 32); @@ -61,6 +68,7 @@ serde_default_fn!(usize, default_max_length, 4096); serde_default_fn!(usize, default_num_attention_heads, 32); serde_default_fn!(usize, default_num_key_value_heads, 32); serde_default_fn!(f32, default_rope_theta, 10000.0); +serde_default_fn!(usize, default_vocab_size, 32064); #[derive(Deserialize, Debug, Clone)] pub struct LLaVAVisionConfig { @@ -77,7 +85,7 @@ impl Config { LLaMAConfig { hidden_size: self.text_config.hidden_size, intermediate_size: self.text_config.intermediate_size, - vocab_size: self.vocab_size, + vocab_size: self.text_config.vocab_size, num_hidden_layers: self.text_config.num_hidden_layers, num_attention_heads: self.text_config.num_attention_heads, num_key_value_heads: self.text_config.num_key_value_heads, @@ -88,6 +96,23 @@ impl Config { } } + fn to_mistral_config(&self) -> MistralConfig { + MistralConfig { + vocab_size: self.text_config.vocab_size, + hidden_size: self.text_config.hidden_size, + intermediate_size: self.text_config.hidden_size, + num_hidden_layers: self.text_config.num_hidden_layers, + num_attention_heads: self.text_config.num_attention_heads, + num_key_value_heads: self.text_config.num_key_value_heads, + hidden_act: Activation::Silu, // as it is in mistralai/Mistral-7B-Instruct-v0.2 + max_position_embeddings: self.text_config.max_position_embeddings, + rms_norm_eps: self.text_config.rms_norm_eps, + rope_theta: self.text_config.rope_theta as f64, + sliding_window: self.text_config.sliding_window, + use_flash_attn: self.use_flash_attn, + } + } + fn to_clip_config(&self) -> ClipConfig { ClipConfig { hidden_size: self.vision_config.hidden_size, @@ -212,10 +237,10 @@ impl Model { .get(&[config.text_config.hidden_size], "image_newline")? .to_device(&device)?; - let llm = match config.text_config.model_type.as_str() { + let llm: Box = match config.text_config.model_type.as_str() { "llama" => { let llama_config = config.to_llama_config(); - let llama = llava_llm::llama::Llama::new( + let llama = Llama::new( &llama_config, vb.pp("language_model"), is_gptx, @@ -223,6 +248,16 @@ impl Model { )?; Box::new(llama) } + "mistral" => { + let mistral_config = config.to_mistral_config(); + let mistral = Mistral::new( + &mistral_config, + vb.pp("language_model"), + is_gptx, + normal_loading_metadata, + )?; + Box::new(mistral) + } _ => { bail!("Unsupported model type: {}", config.text_config.model_type); } @@ -243,9 +278,9 @@ impl Model { Ok(image_features) } - fn unpad_image(&self, tensor: &Tensor, original_size: &(u32, u32)) -> Result { + fn unpad_image(&self, tensor: &Tensor, original_size: (u32, u32)) -> Result { assert_eq!(tensor.dims().len(), 3); - let (original_width, original_height) = *original_size; + let (original_width, original_height) = original_size; let tensor_dims = tensor.dims(); let current_height = tensor_dims[1]; let current_width = tensor_dims[2]; @@ -255,7 +290,7 @@ impl Model { let scale_factor = (current_width as f32) / (original_width as f32); let new_height = (original_height as f32 * scale_factor).floor() as usize; let padding = (current_height - new_height) / 2; - tensor.i((.., padding..current_width - padding, ..)) + tensor.i((.., padding..current_height - padding, ..)) } else { let scale_factor = (current_height as f32) / (original_height as f32); let new_width = (original_width as f32 * scale_factor).floor() as usize; @@ -264,11 +299,14 @@ impl Model { } } + + pub fn prepare_inputs_labels_for_multimodal( &self, input_ids: &Tensor, //[1,seq_len] - images: &Tensor, //[sample_per_image*image_num,chanel,width,height] for LLaVANext, we fix aspect_ratio_setting to 'anyres', (this is akin to python Transformer). Hence sampler_per_image is 5 - num_image_token: usize, + images: &Tensor, //[sum of samples of all images,chanel,width,height] + num_image_tokens: Vec, + num_image_samples: Vec, image_sizes: &[(u32, u32)], ) -> Result { let image_indexes = input_ids @@ -283,11 +321,12 @@ impl Model { .collect::>>()?; let mut result = input_ids.clamp(0i64, i64::MAX)?.to_dtype(DType::U32)?; result = self.llm.embed(&result)?; //[seq_len,hidden_size] - let image_features = self.encode_images(images)?; //[sample_per_image*image_num,hidden_size] - let image_nums = images.shape().dims()[0] / 5; + let image_features = self.encode_images(images)?; //[sum of samples of all images,hidden_size] let mut image_features_vec = Vec::new(); - for i in 0..image_nums { - image_features_vec.push(image_features.i(i * 5..(i + 1) * 5)?); + let mut index = 0; + for i in 0..num_image_samples.len() { + image_features_vec.push(image_features.i(index..index + num_image_samples[i])?); + index += num_image_samples[i]; } let image_features_vec = image_features_vec .iter() @@ -315,7 +354,7 @@ impl Model { .permute((4, 0, 2, 1, 3))? .flatten(1, 2)? .flatten(2, 3)?; - new_image_feature = self.unpad_image(&new_image_feature, &image_size)?; + new_image_feature = self.unpad_image(&new_image_feature, image_size)?; let new_image_feature_dims = new_image_feature.dims(); let image_new_line = self .image_newline @@ -334,7 +373,8 @@ impl Model { result = result.slice_assign( &[ &(0usize..1usize), - &(*image_index as usize..*image_index as usize + num_image_token), + &(*image_index as usize + ..*image_index as usize + num_image_tokens[(image_id - 1) as usize]), &(..), ], &image_features_vec[(image_id - 1) as usize], @@ -353,7 +393,8 @@ impl Model { input_ids: &Tensor, pixel_values: Option, image_sizes: Option>, - num_image_token: Option, + num_image_tokens: Option>, + num_image_samples: Option>, seqlen_offsets: &[usize], start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, @@ -364,19 +405,21 @@ impl Model { let input_embeds = self.prepare_inputs_labels_for_multimodal( input_ids, pixel_values, - num_image_token.unwrap(), + num_image_tokens.unwrap(), + num_image_samples.unwrap(), &image_sizes.unwrap(), )?; self.llm.forward_input_embed( - &input_embeds, - &seqlen_offsets, + input_ids, + input_embeds, + seqlen_offsets, start_offsets_kernel, context_lens, ) } else { self.llm.forward( input_ids, - &seqlen_offsets, + seqlen_offsets, start_offsets_kernel, context_lens, position_ids, @@ -386,8 +429,9 @@ impl Model { } pub(crate) struct LLaVANextVisionSpecificArgs { - pub image_sizes: Option>, - pub num_image_token: Option, + pub image_sizes: Option>, // width, height + pub num_image_tokens: Option>, // number of image tokens for each image + pub num_image_samples: Option>, // number of image samples for each image } impl IsqModel for Model { @@ -410,26 +454,23 @@ impl VisionModel for Model { ) -> candle_core::Result { let LLaVANextVisionSpecificArgs { image_sizes, - num_image_token, + num_image_tokens, + num_image_samples, } = *model_specific_args .downcast() .expect("Cannot downcast into `LLaVANextVisionSpecificArgs`"); - let image_sizes = if image_sizes.is_some() { - Some( - image_sizes - .unwrap() - .iter() - .map(|(w, h)| (*w as u32, *h as u32)) - .collect(), - ) - } else { - None - }; + let image_sizes = image_sizes.map(|image_sizes| { + image_sizes + .iter() + .map(|(w, h)| (*w as u32, *h as u32)) + .collect::>() + }); self.forward_inputs( input_ids, pixel_values, image_sizes, - num_image_token, + num_image_tokens, + num_image_samples, seqlen_offsets, start_offsets_kernel, context_lens, diff --git a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs index e98057178..581acd254 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs @@ -30,6 +30,15 @@ pub fn get_anyres_image_grid_shape( (width / patch_size, height / patch_size) } +pub fn get_num_samples( + image_size: (u32, u32), + grid_pinpoints: &[(u32, u32)], + crop_size: (u32, u32), +) -> u32 { + let (width, height) = select_best_resolution(image_size, grid_pinpoints); + width / crop_size.0 * height / crop_size.1 + 1 +} + pub fn select_best_resolution( original_size: (u32, u32), possible_resolutions: &[(u32, u32)], @@ -63,6 +72,24 @@ pub fn select_best_resolution( best_fit } +fn calculate_unpad(size: (u32, u32), original_size: (u32, u32)) -> (u32, u32) { + let (original_width, original_height) = original_size; + let (current_width, current_height) = size; + let original_aspect_ratio = (original_width as f32) / (original_height as f32); + let current_aspect_ratio = (current_width as f32) / (current_height as f32); + if original_aspect_ratio > current_aspect_ratio { + let scale_factor = (current_width as f32) / (original_width as f32); + let new_height = (original_height as f32 * scale_factor).floor() as u32; + let padding = (current_height - new_height) / 2; + (current_width, current_height - 2 * padding) // as it is in unpad_image + } else { + let scale_factor = (current_height as f32) / (original_height as f32); + let new_width = (original_width as f32 * scale_factor).floor() as u32; + let padding = (current_width - new_width) / 2; + (current_width - 2 * padding, current_height) + } +} + fn resize_and_pad_image(image: &DynamicImage, target_resolution: (u32, u32)) -> DynamicImage { let (original_width, original_height) = image.dimensions(); let original_width_f = original_width as f32; @@ -100,16 +127,16 @@ fn resize_and_pad_image(image: &DynamicImage, target_resolution: (u32, u32)) -> new_image } -fn divide_to_patches(image: &DynamicImage, crop_size: (u32, u32)) -> Vec { +fn divide_to_samples(image: &DynamicImage, crop_size: (u32, u32)) -> Vec { let (width, height) = image.dimensions(); - let mut patches = Vec::new(); + let mut samples = Vec::new(); for y in (0..height).step_by(crop_size.1 as usize) { for x in (0..width).step_by(crop_size.0 as usize) { let patch = image.crop_imm(x, y, crop_size.0, crop_size.1); - patches.push(patch); + samples.push(patch); } } - patches + samples } pub fn calculate_middle(image_size: (u32, u32), center_size: (u32, u32)) -> (u32, u32) { @@ -190,7 +217,11 @@ impl InputsProcessor for LLaVANextInputProcessor { .clone() .expect("Need a PreProcessorConfig config."); let config: &PreProcessorConfig = config.downcast_ref().expect("Downcast failed."); - let (pixel_values, image_sizes, num_img_tokens, n_images) = if is_prompt + let crop_size = ( + *config.crop_size.as_ref().unwrap().get("width").unwrap(), + *config.crop_size.as_ref().unwrap().get("height").unwrap(), + ); + let (pixel_values, image_sizes, num_img_tokens, num_image_samples, n_images) = if is_prompt && input_seqs .iter() .map(|seq| seq.images().is_some()) @@ -199,6 +230,7 @@ impl InputsProcessor for LLaVANextInputProcessor { let mut pixel_values_accum = Vec::new(); let mut image_sizes_accum = Vec::new(); let mut num_img_tokens_accum = Vec::new(); + let mut num_image_samples_accum = Vec::new(); let mut n_images = Vec::new(); for seq in input_seqs.iter_mut() { let imgs = seq @@ -211,16 +243,29 @@ impl InputsProcessor for LLaVANextInputProcessor { pixel_attention_mask: _, image_sizes, num_img_tokens, - } = self.preprocess(imgs, config, device)?; + } = self.preprocess(imgs.clone(), config, device)?; let image_sizes = image_sizes.unwrap(); pixel_values_accum.push(pixel_values); image_sizes_accum.push(image_sizes); num_img_tokens_accum.push(num_img_tokens.unwrap()); + let num_img_samples = imgs + .iter() + .map(|img| { + let original_size = img.dimensions(); + get_num_samples( + original_size, + &self.model_config.image_grid_pinpoints, + crop_size, + ) as usize + }) + .collect::>(); + num_image_samples_accum.push(num_img_samples); } ( Some(Tensor::cat(&pixel_values_accum, 0)?), Some(image_sizes_accum), Some(num_img_tokens_accum), + Some(num_image_samples_accum), n_images, ) } else { @@ -255,11 +300,26 @@ impl InputsProcessor for LLaVANextInputProcessor { pixel_values: None, model_specific_args: Box::new(LLaVANextVisionSpecificArgs { image_sizes: None, - num_image_token: None, + num_image_tokens: None, + num_image_samples: None, }), })); }; + let num_image_tokens_flat = num_img_tokens + .clone() + .unwrap() + .iter() + .flatten() + .copied() + .collect::>(); + let num_image_samples = num_image_samples + .unwrap() + .iter() + .flatten() + .copied() + .collect::>(); + let mut toks = Vec::new(); let detokenized = tokenizer .decode_batch( @@ -334,7 +394,7 @@ impl InputsProcessor for LLaVANextInputProcessor { let mut input_ids: Vec = Vec::new(); for item in prompt_chunks .iter() - .map(|x| x.iter().map(|x| *x as i64).collect::>()) + .map(|x| x.to_vec()) .interleave(image_ids_pad) { input_ids.extend(item); @@ -371,18 +431,24 @@ impl InputsProcessor for LLaVANextInputProcessor { pixel_values, model_specific_args: Box::new(LLaVANextVisionSpecificArgs { image_sizes, - num_image_token: Some(self.get_num_image_tokens()), + num_image_tokens: Some(num_image_tokens_flat), + num_image_samples: Some(num_image_samples), }), })) } } impl LLaVANextInputProcessor { - fn get_num_image_tokens(&self) -> usize { - let patch_size = self.model_config.vision_config.patch_size; - let image_size = self.model_config.vision_config.image_size; - let patch_per_side = image_size / patch_size; - patch_per_side * patch_per_side + (patch_per_side * 2) * (patch_per_side * 2 + 1) + fn get_num_image_tokens( + &self, + image_size: (u32, u32), + grid_pinpoints: &[(u32, u32)], + patch_size: u32, + ) -> usize { + let anyres_grid_shape = get_anyres_image_grid_shape(image_size, grid_pinpoints, patch_size); + let patch_per_side = self.model_config.vision_config.image_size / patch_size as usize; + let unpad_shape = calculate_unpad(anyres_grid_shape, image_size); + patch_per_side * patch_per_side + (unpad_shape.0 as usize + 1) * (unpad_shape.1 as usize) } fn resize(&self, image: &DynamicImage, size: u32, filter: FilterType) -> DynamicImage { let (width, height) = image.dimensions(); @@ -456,15 +522,15 @@ impl ImagePreProcessor for LLaVANextInputProcessor { let filter = config.resampling.to_filter()?; let image_original_resize = image.resize_exact(image_size as u32, image_size as u32, filter); - let mut patches = vec![image_original_resize]; - for patch in divide_to_patches( + let mut samples = vec![image_original_resize]; + for patch in divide_to_samples( &image_padded, ( *config.crop_size.as_ref().unwrap().get("width").unwrap(), *config.crop_size.as_ref().unwrap().get("height").unwrap(), ), ) { - patches.push(patch); + samples.push(patch); } let dtype = match self.model_config.torch_dtype.as_str() { "float16" => DType::F16, @@ -478,8 +544,8 @@ impl ImagePreProcessor for LLaVANextInputProcessor { image.clone() }; image = if config.do_center_crop.unwrap_or(true) { - let crop_width = *config.crop_size.as_ref().unwrap().get("width").unwrap() as u32; - let crop_height = *config.crop_size.as_ref().unwrap().get("height").unwrap() as u32; + let crop_width = *config.crop_size.as_ref().unwrap().get("width").unwrap(); + let crop_height = *config.crop_size.as_ref().unwrap().get("height").unwrap(); self.center_crop(&image, (crop_width, crop_height)) } else { image @@ -510,7 +576,7 @@ impl ImagePreProcessor for LLaVANextInputProcessor { } Ok(pixel_value) }; - let pixel_values = patches + let pixel_values = samples .iter() .map(process_one_image) .collect::>>()?; @@ -519,8 +585,12 @@ impl ImagePreProcessor for LLaVANextInputProcessor { Ok(image_processor::PreprocessedImages { pixel_values, pixel_attention_mask: None, - image_sizes: Some((image_size, image_size)), - num_img_tokens: Some(vec![self.get_num_image_tokens()]), + image_sizes: Some((original_size.0 as usize, original_size.1 as usize)), + num_img_tokens: Some(vec![self.get_num_image_tokens( + original_size, + &self.model_config.image_grid_pinpoints, + self.model_config.vision_config.patch_size as u32, + )]), }) } } diff --git a/mistralrs-core/src/vision_models/llava/mod.rs b/mistralrs-core/src/vision_models/llava/mod.rs index 3740c5daa..3fb82c5f9 100644 --- a/mistralrs-core/src/vision_models/llava/mod.rs +++ b/mistralrs-core/src/vision_models/llava/mod.rs @@ -1,3 +1,5 @@ pub mod llava_llm; pub mod llava_next; pub mod llava_next_inputs_processor; +//pub mod llava; +//pub mod llava_inputs_processor; \ No newline at end of file From c87db090d61d0dec6613644f450608327ce18a8f Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Fri, 28 Jun 2024 18:47:01 +0800 Subject: [PATCH 16/34] modify code structure --- .../src/vision_models/llava/llava_next.rs | 2 +- .../llava/llava_next_inputs_processor.rs | 295 ++++++------------ mistralrs-core/src/vision_models/llava/mod.rs | 1 + .../src/vision_models/llava/utils.rs | 137 ++++++++ mistralrs/examples/llava/main.rs | 4 +- 5 files changed, 240 insertions(+), 199 deletions(-) create mode 100644 mistralrs-core/src/vision_models/llava/utils.rs diff --git a/mistralrs-core/src/vision_models/llava/llava_next.rs b/mistralrs-core/src/vision_models/llava/llava_next.rs index 52f81f662..aa5766ce2 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next.rs @@ -18,7 +18,7 @@ use crate::serde_default_fn; use crate::models::llama::Config as LLaMAConfig; use crate::models::mistral::Config as MistralConfig; use crate::vision_models::clip::{Activation as ClipActivation, ClipConfig, ClipVisionTransformer}; -use crate::vision_models::llava_next_inputs_processor::get_anyres_image_grid_shape; +use crate::vision_models::llava::utils::get_anyres_image_grid_shape; use super::llava_llm::{LLaVALLM, Llama, Mistral}; diff --git a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs index 581acd254..8bd8a00a8 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs @@ -17,143 +17,15 @@ use crate::pipeline::{ }; use crate::sequence::Sequence; use crate::vision_models::image_processor::{self, ImagePreProcessor, PreprocessedImages}; +use crate::vision_models::llava_next::Config as LLaVANextConfig; use crate::vision_models::llava_next::LLaVANextVisionSpecificArgs; use crate::vision_models::preprocessor_config::{PreProcessorConfig, ToFilter}; use crate::vision_models::{preprocessor_config, ModelInputs}; -pub fn get_anyres_image_grid_shape( - image_size: (u32, u32), - grid_pinpoints: &[(u32, u32)], - patch_size: u32, -) -> (u32, u32) { - let (width, height) = select_best_resolution(image_size, grid_pinpoints); - (width / patch_size, height / patch_size) -} - -pub fn get_num_samples( - image_size: (u32, u32), - grid_pinpoints: &[(u32, u32)], - crop_size: (u32, u32), -) -> u32 { - let (width, height) = select_best_resolution(image_size, grid_pinpoints); - width / crop_size.0 * height / crop_size.1 + 1 -} - -pub fn select_best_resolution( - original_size: (u32, u32), - possible_resolutions: &[(u32, u32)], -) -> (u32, u32) { - let (original_width, original_height) = original_size; - let mut best_fit = (0, 0); - let original_width_f = original_width as f32; - let original_height_f = original_height as f32; - let mut max_effective_resolution = 0_u32; - let mut min_wasted_resolution = u32::MAX; - for (width, height) in possible_resolutions { - let width_f = *width as f32; - let height_f = *height as f32; - let scale = (width_f / original_width_f).min(height_f / original_height_f); - let (downscaled_width, downscaled_height) = ( - (original_width_f * scale) as u32, - (original_height_f * scale) as u32, - ); - let effective_resolution = - std::cmp::min((*width) * (*height), downscaled_width * downscaled_height); - let wasted_resolution = (*width) * (*height) - effective_resolution; - if effective_resolution > max_effective_resolution - || (effective_resolution == max_effective_resolution - && wasted_resolution < min_wasted_resolution) - { - best_fit = (*width, *height); - max_effective_resolution = effective_resolution; - min_wasted_resolution = wasted_resolution; - } - } - best_fit -} - -fn calculate_unpad(size: (u32, u32), original_size: (u32, u32)) -> (u32, u32) { - let (original_width, original_height) = original_size; - let (current_width, current_height) = size; - let original_aspect_ratio = (original_width as f32) / (original_height as f32); - let current_aspect_ratio = (current_width as f32) / (current_height as f32); - if original_aspect_ratio > current_aspect_ratio { - let scale_factor = (current_width as f32) / (original_width as f32); - let new_height = (original_height as f32 * scale_factor).floor() as u32; - let padding = (current_height - new_height) / 2; - (current_width, current_height - 2 * padding) // as it is in unpad_image - } else { - let scale_factor = (current_height as f32) / (original_height as f32); - let new_width = (original_width as f32 * scale_factor).floor() as u32; - let padding = (current_width - new_width) / 2; - (current_width - 2 * padding, current_height) - } -} - -fn resize_and_pad_image(image: &DynamicImage, target_resolution: (u32, u32)) -> DynamicImage { - let (original_width, original_height) = image.dimensions(); - let original_width_f = original_width as f32; - let original_height_f = original_height as f32; - let (target_width, target_height) = target_resolution; - let target_width_f = target_width as f32; - let target_height_f = target_height as f32; - let scale_w = target_width_f / original_width_f; - let scale_h = target_height_f / original_height_f; - let (new_width, new_height) = if scale_w < scale_h { - ( - target_width, - min((original_height_f * scale_w).ceil() as u32, target_height), - ) - } else { - ( - min((original_width_f * scale_h).ceil() as u32, target_width), - target_height, - ) - }; - let resized_image = image.resize_exact( - new_width, - new_height, - image::imageops::FilterType::CatmullRom, - ); - let mut new_image = DynamicImage::new_rgb8(target_width, target_height); - let (paste_x, paste_y) = - calculate_middle((target_width, target_height), (new_width, new_height)); - overlay( - &mut new_image, - &resized_image, - paste_x.into(), - paste_y.into(), - ); - new_image -} - -fn divide_to_samples(image: &DynamicImage, crop_size: (u32, u32)) -> Vec { - let (width, height) = image.dimensions(); - let mut samples = Vec::new(); - for y in (0..height).step_by(crop_size.1 as usize) { - for x in (0..width).step_by(crop_size.0 as usize) { - let patch = image.crop_imm(x, y, crop_size.0, crop_size.1); - samples.push(patch); - } - } - samples -} - -pub fn calculate_middle(image_size: (u32, u32), center_size: (u32, u32)) -> (u32, u32) { - let (width, height) = image_size; - let (center_width, center_height) = center_size; - let left = if width <= center_width { - 0 - } else { - ((width as f32 - center_width as f32) / 2.0).ceil() as u32 - }; - let top = if height <= center_height { - 0 - } else { - ((height as f32 - center_height as f32) / 2.0).ceil() as u32 - }; - (left, top) -} +use super::utils::{ + calculate_middle, calculate_unpad, divide_to_samples, get_anyres_image_grid_shape, + get_num_samples, resize_and_pad_image, select_best_resolution, +}; pub struct LLaVANextProcessor { inputs_processor: Arc, @@ -173,13 +45,13 @@ impl Processor for LLaVANextProcessor { impl LLaVANextProcessor { pub fn new(config: &str) -> Self { - let model_config = serde_json::from_str::(config) - .expect("Failed to parse model config."); + let model_config = + serde_json::from_str::(config).expect("Failed to parse model config."); let image_tag_splitter = Regex::new(r"<\|image_\d+\|>").expect("Failed to compile split regex."); let inputs_processor = Arc::new(LLaVANextInputProcessor { image_tag_splitter, - model_config, + model_config: model_config.clone(), }); Self { inputs_processor } } @@ -190,6 +62,20 @@ pub struct LLaVANextInputProcessor { model_config: crate::vision_models::llava_next::Config, } +impl LLaVANextInputProcessor { + fn get_num_image_tokens( + &self, + image_size: (u32, u32), + grid_pinpoints: &[(u32, u32)], + patch_size: u32, + ) -> usize { + let anyres_grid_shape = get_anyres_image_grid_shape(image_size, grid_pinpoints, patch_size); + let patch_per_side = self.model_config.vision_config.image_size / patch_size as usize; + let unpad_shape = calculate_unpad(anyres_grid_shape, image_size); + patch_per_side * patch_per_side + (unpad_shape.0 as usize + 1) * (unpad_shape.1 as usize) + } +} + // Copy from phi3_inputs_processor. different is (1) calculate of num_image_token (2) process_anyres_image (3)image_ids_pad impl InputsProcessor for LLaVANextInputProcessor { fn get_type(&self) -> InputsProcessorType { @@ -438,19 +324,10 @@ impl InputsProcessor for LLaVANextInputProcessor { } } -impl LLaVANextInputProcessor { - fn get_num_image_tokens( - &self, - image_size: (u32, u32), - grid_pinpoints: &[(u32, u32)], - patch_size: u32, - ) -> usize { - let anyres_grid_shape = get_anyres_image_grid_shape(image_size, grid_pinpoints, patch_size); - let patch_per_side = self.model_config.vision_config.image_size / patch_size as usize; - let unpad_shape = calculate_unpad(anyres_grid_shape, image_size); - patch_per_side * patch_per_side + (unpad_shape.0 as usize + 1) * (unpad_shape.1 as usize) - } - fn resize(&self, image: &DynamicImage, size: u32, filter: FilterType) -> DynamicImage { +struct LLaVANextImageProcessor; + +impl LLaVANextImageProcessor { + fn resize(image: &DynamicImage, size: u32, filter: FilterType) -> DynamicImage { let (width, height) = image.dimensions(); if width == size && height == size { image.clone() @@ -470,31 +347,76 @@ impl LLaVANextInputProcessor { } } - fn center_crop(&self, image: &DynamicImage, crop_size: (u32, u32)) -> DynamicImage { + fn center_crop(image: &DynamicImage, crop_size: (u32, u32)) -> DynamicImage { let (width, height) = image.dimensions(); let (left, top) = calculate_middle((width, height), crop_size); image.crop_imm(left, top, crop_size.0, crop_size.1) } - fn rescale(&self, tensor: &Tensor, rescale_factor: f64) -> Result { + fn rescale(tensor: &Tensor, rescale_factor: f64) -> Result { tensor.affine(rescale_factor, 0.0) } - fn to_tensor(&self, image: &DynamicImage, device: &Device) -> Result { + fn to_tensor(image: &DynamicImage, device: &Device) -> Result { let img = image.to_rgb8().into_raw(); let (width, height) = image.dimensions(); Tensor::from_vec(img, (height as usize, width as usize, 3), device)?.to_dtype(DType::F32) } - fn normalize(&self, tensor: &Tensor, image_mean: &[f32], image_std: &[f32]) -> Result { + fn normalize(tensor: &Tensor, image_mean: &[f32], image_std: &[f32]) -> Result { let mean = Tensor::from_slice(image_mean, (3,), &Device::Cpu)?; let std = Tensor::from_slice(image_std, (3,), &Device::Cpu)?; tensor.broadcast_sub(&mean)?.broadcast_div(&std) } - fn to_channel_dimension_format(&self, tensor: &Tensor) -> Result { + fn to_channel_dimension_format(tensor: &Tensor) -> Result { tensor.permute((2, 0, 1)) } + pub fn process_one_image( + image: &DynamicImage, + preprocessor_config: &PreProcessorConfig, + resize_size: u32, + filter: FilterType, + dtype: DType, + device: &Device, + image_mean: &[f32], + image_std: &[f32], + ) -> Result { + let mut image = if preprocessor_config.do_resize.unwrap_or(true) { + Self::resize(image, resize_size as u32, filter) + } else { + image.clone() + }; + image = if preprocessor_config.do_center_crop.unwrap_or(true) { + let crop_width = *preprocessor_config + .crop_size + .as_ref() + .unwrap() + .get("width") + .unwrap(); + let crop_height = *preprocessor_config + .crop_size + .as_ref() + .unwrap() + .get("height") + .unwrap(); + Self::center_crop(&image, (crop_width, crop_height)) + } else { + image + }; + let mut pixel_value = Self::to_tensor(&image, &Device::Cpu)?; + if preprocessor_config.do_rescale.unwrap_or(true) { + let rescale_factor = preprocessor_config.rescale_factor.unwrap(); + pixel_value = Self::rescale(&pixel_value, rescale_factor)?; + } + if preprocessor_config.do_normalize.unwrap_or(true) { + pixel_value = Self::normalize(&pixel_value, &image_mean, &image_std)?; + pixel_value = Self::to_channel_dimension_format(&pixel_value)? + .to_dtype(dtype)? + .to_device(device)?; + } + Ok(pixel_value) + } } impl ImagePreProcessor for LLaVANextInputProcessor { @@ -502,7 +424,6 @@ impl ImagePreProcessor for LLaVANextInputProcessor { const DEFAULT_MEAN: [f64; 3] = [0.48145466, 0.4578275, 0.40821073]; #[allow(clippy::excessive_precision)] const DEFAULT_STD: [f64; 3] = [0.26862954, 0.26130258, 0.27577711]; - fn preprocess( &self, images: Vec, @@ -512,7 +433,7 @@ impl ImagePreProcessor for LLaVANextInputProcessor { if images.len() > 1 { candle_core::bail!("Can only process one image per batch"); // This is no different from phi3_input_processor }; - let image_size = *config.size.as_ref().unwrap().get("shortest_edge").unwrap() as usize; + let resized_size = *config.size.as_ref().unwrap().get("shortest_edge").unwrap() as usize; let image = images[0].clone(); let original_size = image.dimensions(); let best_resolution = @@ -521,7 +442,7 @@ impl ImagePreProcessor for LLaVANextInputProcessor { let image_padded = resize_and_pad_image(&image, best_resolution); let filter = config.resampling.to_filter()?; let image_original_resize = - image.resize_exact(image_size as u32, image_size as u32, filter); + image.resize_exact(resized_size as u32, resized_size as u32, filter); let mut samples = vec![image_original_resize]; for patch in divide_to_samples( &image_padded, @@ -537,48 +458,28 @@ impl ImagePreProcessor for LLaVANextInputProcessor { "bfloat16" => DType::BF16, _ => candle_core::bail!("unsupported dtype"), }; - let process_one_image = |image: &DynamicImage| -> Result { - let mut image = if config.do_resize.unwrap_or(true) { - self.resize(image, image_size as u32, filter) - } else { - image.clone() - }; - image = if config.do_center_crop.unwrap_or(true) { - let crop_width = *config.crop_size.as_ref().unwrap().get("width").unwrap(); - let crop_height = *config.crop_size.as_ref().unwrap().get("height").unwrap(); - self.center_crop(&image, (crop_width, crop_height)) - } else { - image - }; - let mut pixel_value = self.to_tensor(&image, &Device::Cpu)?; - if config.do_rescale.unwrap_or(true) { - let rescale_factor = config.rescale_factor.unwrap(); - pixel_value = self.rescale(&pixel_value, rescale_factor)?; - } - if config.do_normalize.unwrap_or(true) { - let image_mean = config - .image_mean - .unwrap_or(Self::DEFAULT_MEAN) - .iter() - .map(|x| *x as f32) - .collect::>(); - let image_std = config - .image_std - .unwrap_or(Self::DEFAULT_STD) - .iter() - .map(|x| *x as f32) - .collect::>(); - pixel_value = self.normalize(&pixel_value, &image_mean, &image_std)?; - pixel_value = self - .to_channel_dimension_format(&pixel_value)? - .to_dtype(dtype)? - .to_device(device)?; - } - Ok(pixel_value) - }; + let image_mean = config + .image_mean + .unwrap_or(Self::DEFAULT_MEAN) + .map(|x| x as f32); + let image_std = config + .image_std + .unwrap_or(Self::DEFAULT_STD) + .map(|x| x as f32); let pixel_values = samples .iter() - .map(process_one_image) + .map(|x| { + LLaVANextImageProcessor::process_one_image( + x, + config, + resized_size as u32, + filter, + dtype, + device, + &image_mean, + &image_std, + ) + }) .collect::>>()?; let pixel_values = Tensor::stack(&pixel_values, 0)?; diff --git a/mistralrs-core/src/vision_models/llava/mod.rs b/mistralrs-core/src/vision_models/llava/mod.rs index 3fb82c5f9..ca77d7f03 100644 --- a/mistralrs-core/src/vision_models/llava/mod.rs +++ b/mistralrs-core/src/vision_models/llava/mod.rs @@ -1,5 +1,6 @@ pub mod llava_llm; pub mod llava_next; pub mod llava_next_inputs_processor; +mod utils; //pub mod llava; //pub mod llava_inputs_processor; \ No newline at end of file diff --git a/mistralrs-core/src/vision_models/llava/utils.rs b/mistralrs-core/src/vision_models/llava/utils.rs new file mode 100644 index 000000000..6f065a06d --- /dev/null +++ b/mistralrs-core/src/vision_models/llava/utils.rs @@ -0,0 +1,137 @@ +use std::cmp::min; + +use image::{imageops::overlay, DynamicImage, GenericImageView}; + +pub(crate) fn get_anyres_image_grid_shape( + image_size: (u32, u32), + grid_pinpoints: &[(u32, u32)], + patch_size: u32, +) -> (u32, u32) { + let (width, height) = select_best_resolution(image_size, grid_pinpoints); + (width / patch_size, height / patch_size) +} + +pub(crate) fn get_num_samples( + image_size: (u32, u32), + grid_pinpoints: &[(u32, u32)], + crop_size: (u32, u32), +) -> u32 { + let (width, height) = select_best_resolution(image_size, grid_pinpoints); + width / crop_size.0 * height / crop_size.1 + 1 +} + +pub(crate) fn select_best_resolution( + original_size: (u32, u32), + possible_resolutions: &[(u32, u32)], +) -> (u32, u32) { + let (original_width, original_height) = original_size; + let mut best_fit = (0, 0); + let original_width_f = original_width as f32; + let original_height_f = original_height as f32; + let mut max_effective_resolution = 0_u32; + let mut min_wasted_resolution = u32::MAX; + for (width, height) in possible_resolutions { + let width_f = *width as f32; + let height_f = *height as f32; + let scale = (width_f / original_width_f).min(height_f / original_height_f); + let (downscaled_width, downscaled_height) = ( + (original_width_f * scale) as u32, + (original_height_f * scale) as u32, + ); + let effective_resolution = + std::cmp::min((*width) * (*height), downscaled_width * downscaled_height); + let wasted_resolution = (*width) * (*height) - effective_resolution; + if effective_resolution > max_effective_resolution + || (effective_resolution == max_effective_resolution + && wasted_resolution < min_wasted_resolution) + { + best_fit = (*width, *height); + max_effective_resolution = effective_resolution; + min_wasted_resolution = wasted_resolution; + } + } + best_fit +} + +pub(crate) fn calculate_unpad(size: (u32, u32), original_size: (u32, u32)) -> (u32, u32) { + let (original_width, original_height) = original_size; + let (current_width, current_height) = size; + let original_aspect_ratio = (original_width as f32) / (original_height as f32); + let current_aspect_ratio = (current_width as f32) / (current_height as f32); + if original_aspect_ratio > current_aspect_ratio { + let scale_factor = (current_width as f32) / (original_width as f32); + let new_height = (original_height as f32 * scale_factor).floor() as u32; + let padding = (current_height - new_height) / 2; + (current_width, current_height - 2 * padding) // as it is in unpad_image + } else { + let scale_factor = (current_height as f32) / (original_height as f32); + let new_width = (original_width as f32 * scale_factor).floor() as u32; + let padding = (current_width - new_width) / 2; + (current_width - 2 * padding, current_height) + } +} + +pub(crate) fn resize_and_pad_image(image: &DynamicImage, target_resolution: (u32, u32)) -> DynamicImage { + let (original_width, original_height) = image.dimensions(); + let original_width_f = original_width as f32; + let original_height_f = original_height as f32; + let (target_width, target_height) = target_resolution; + let target_width_f = target_width as f32; + let target_height_f = target_height as f32; + let scale_w = target_width_f / original_width_f; + let scale_h = target_height_f / original_height_f; + let (new_width, new_height) = if scale_w < scale_h { + ( + target_width, + min((original_height_f * scale_w).ceil() as u32, target_height), + ) + } else { + ( + min((original_width_f * scale_h).ceil() as u32, target_width), + target_height, + ) + }; + let resized_image = image.resize_exact( + new_width, + new_height, + image::imageops::FilterType::CatmullRom, + ); + let mut new_image = DynamicImage::new_rgb8(target_width, target_height); + let (paste_x, paste_y) = + calculate_middle((target_width, target_height), (new_width, new_height)); + overlay( + &mut new_image, + &resized_image, + paste_x.into(), + paste_y.into(), + ); + new_image +} + +pub(crate) fn divide_to_samples(image: &DynamicImage, crop_size: (u32, u32)) -> Vec { + let (width, height) = image.dimensions(); + let mut samples = Vec::new(); + for y in (0..height).step_by(crop_size.1 as usize) { + for x in (0..width).step_by(crop_size.0 as usize) { + let patch = image.crop_imm(x, y, crop_size.0, crop_size.1); + samples.push(patch); + } + } + samples +} + +pub(crate) fn calculate_middle(image_size: (u32, u32), center_size: (u32, u32)) -> (u32, u32) { + let (width, height) = image_size; + let (center_width, center_height) = center_size; + let left = if width <= center_width { + 0 + } else { + ((width as f32 - center_width as f32) / 2.0).ceil() as u32 + }; + let top = if height <= center_height { + 0 + } else { + ((height as f32 - center_height as f32) / 2.0).ceil() as u32 + }; + (left, top) +} diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index 098393af0..6d62a24f8 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -41,9 +41,11 @@ fn main() -> anyhow::Result<()> { let mistralrs = setup()?; let (tx, mut rx) = channel(10_000); + let img = image::io::Reader::open("./cat.jpg")?.decode()?; let request = Request::Normal(NormalRequest { messages: RequestMessage::VisionChat { - images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], + images: vec![img], + //images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], messages: vec![IndexMap::from([ ("role".to_string(), Either::Left("user".to_string())), ( From da8441889257bc7ed856a9da6afcfa59e7e5b2e3 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Mon, 1 Jul 2024 17:51:35 +0800 Subject: [PATCH 17/34] update llava1.5 --- chat_templates/{llava.json => vicuna.json} | 0 examples/python/llava_next.py | 39 ++ mistralrs-core/src/layers_masker.rs | 2 +- mistralrs-core/src/pipeline/vision.rs | 5 +- mistralrs-core/src/pipeline/vision_loaders.rs | 51 ++- .../src/vision_models/llava/config.rs | 113 ++++++ .../src/vision_models/llava/llava15.rs | 292 +++++++++++++++ .../llava/llava_inputs_processor.rs | 334 ++++++++++++++++++ .../src/vision_models/llava/llava_llm/mod.rs | 4 +- .../src/vision_models/llava/llava_next.rs | 134 +------ .../llava/llava_next_inputs_processor.rs | 142 +------- mistralrs-core/src/vision_models/llava/mod.rs | 5 +- .../src/vision_models/llava/utils.rs | 131 ++++++- mistralrs-core/src/vision_models/mod.rs | 3 + mistralrs-pyo3/src/which.rs | 2 + mistralrs/examples/llava/main.rs | 16 +- mistralrs/examples/llava_next/main.rs | 78 ++++ 17 files changed, 1083 insertions(+), 268 deletions(-) rename chat_templates/{llava.json => vicuna.json} (100%) create mode 100644 examples/python/llava_next.py create mode 100644 mistralrs-core/src/vision_models/llava/config.rs create mode 100644 mistralrs-core/src/vision_models/llava/llava15.rs create mode 100644 mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs create mode 100644 mistralrs/examples/llava_next/main.rs diff --git a/chat_templates/llava.json b/chat_templates/vicuna.json similarity index 100% rename from chat_templates/llava.json rename to chat_templates/vicuna.json diff --git a/examples/python/llava_next.py b/examples/python/llava_next.py new file mode 100644 index 000000000..d3eebfaa4 --- /dev/null +++ b/examples/python/llava_next.py @@ -0,0 +1,39 @@ +from mistralrs import Runner, Which, ChatCompletionRequest, VisionArchitecture + +runner = Runner( + which=Which.VisionPlain( + model_id="/root/autodl-tmp/llava-v1.6-mistral-7b-hf", + tokenizer_json=None, + repeat_last_n=64, + arch=VisionArchitecture.LLaVANext, + ), +) + +res = runner.send_chat_completion_request( + ChatCompletionRequest( + model="llava_next", + messages=[ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": { + "url": "https://upload.wikimedia.org/wikipedia/commons/e/e7/Everest_North_Face_toward_Base_Camp_Tibet_Luca_Galuzzi_2006.jpg" + }, + }, + { + "type": "text", + "text": "<|image_1|>\nWhat is shown in this image? Write a detailed response analyzing the scene.", + }, + ], + } + ], + max_tokens=256, + presence_penalty=1.0, + top_p=0.1, + temperature=0.1, + ) +) +print(res.choices[0].message.content) +print(res.usage) diff --git a/mistralrs-core/src/layers_masker.rs b/mistralrs-core/src/layers_masker.rs index 6f2a88b91..586d67b9f 100644 --- a/mistralrs-core/src/layers_masker.rs +++ b/mistralrs-core/src/layers_masker.rs @@ -246,4 +246,4 @@ impl CausalMasker { } } } -} \ No newline at end of file +} diff --git a/mistralrs-core/src/pipeline/vision.rs b/mistralrs-core/src/pipeline/vision.rs index 0c62ce68c..5db1bc940 100644 --- a/mistralrs-core/src/pipeline/vision.rs +++ b/mistralrs-core/src/pipeline/vision.rs @@ -1,5 +1,7 @@ use super::cache_manager::DefaultCacheManager; -use super::vision_loaders::{Idefics2Loader, LLaVANextLoader, Phi3VLoader, VisionLoaderType}; +use super::vision_loaders::{ + Idefics2Loader, LLaVALoader, LLaVANextLoader, Phi3VLoader, VisionLoaderType, +}; use super::{ get_model_paths, get_xlora_paths, AdapterActivationMixin, Cache, CacheManager, CacheManagerMixin, GeneralMetadata, IsqPipelineMixin, Loader, MetadataMixin, ModelCategory, @@ -97,6 +99,7 @@ impl VisionLoaderBuilder { VisionLoaderType::Phi3V => Box::new(Phi3VLoader), VisionLoaderType::Idefics2 => Box::new(Idefics2Loader), VisionLoaderType::LLaVANext => Box::new(LLaVANextLoader), + VisionLoaderType::LLaVA => Box::new(LLaVALoader), }; Box::new(VisionLoader { inner: loader, diff --git a/mistralrs-core/src/pipeline/vision_loaders.rs b/mistralrs-core/src/pipeline/vision_loaders.rs index 997bed0d3..dab171418 100644 --- a/mistralrs-core/src/pipeline/vision_loaders.rs +++ b/mistralrs-core/src/pipeline/vision_loaders.rs @@ -12,7 +12,10 @@ use serde::Deserialize; use super::{NormalLoadingMetadata, Processor, ProcessorCreator, VisionModel}; use crate::vision_models::idefics2::{Config as Idefics2Config, Idefics2}; use crate::vision_models::idefics2_input_processor::Idefics2Processor; -use crate::vision_models::llava_next::{Config as LLaVANextConfig, Model as LLaVANext}; +use crate::vision_models::llava::config::Config as LLaVAConfig; +use crate::vision_models::llava15::Model as LLaVA; +use crate::vision_models::llava_inputs_processor::LLaVAProcessor; +use crate::vision_models::llava_next::Model as LLaVANext; use crate::vision_models::llava_next_inputs_processor::LLaVANextProcessor; use crate::vision_models::phi3::{Config as Phi3Config, Model as Phi3}; use crate::vision_models::phi3_inputs_processor::Phi3Processor; @@ -47,6 +50,8 @@ pub enum VisionLoaderType { Idefics2, #[serde(rename = "llava_next")] LLaVANext, + #[serde(rename = "llava")] + LLaVA, } impl FromStr for VisionLoaderType { @@ -160,7 +165,7 @@ impl VisionModelLoader for LLaVANextLoader { vb: VarBuilder, normal_loading_metadata: NormalLoadingMetadata, ) -> Result> { - let mut config: LLaVANextConfig = serde_json::from_str(config)?; + let mut config: LLaVAConfig = serde_json::from_str(config)?; config.use_flash_attn = use_flash_attn; Ok(Box::new(LLaVANext::new( &config, @@ -173,7 +178,7 @@ impl VisionModelLoader for LLaVANextLoader { false } fn get_config_repr(&self, config: &str, use_flash_attn: bool) -> Result> { - let mut config: LLaVANextConfig = serde_json::from_str(config)?; + let mut config: LLaVAConfig = serde_json::from_str(config)?; config.use_flash_attn = use_flash_attn; Ok(Box::new(config)) } @@ -186,3 +191,43 @@ impl VisionModelLoader for LLaVANextLoader { Arc::new(LLaVANextProcessor::new(model_config)) } } + +// ======================== LLaVA Loader + +/// [`VisionLoader`] for an LLaVA Vision model. +pub struct LLaVALoader; + +impl VisionModelLoader for LLaVALoader { + fn load( + &self, + config: &str, + use_flash_attn: bool, + vb: VarBuilder, + normal_loading_metadata: NormalLoadingMetadata, + ) -> Result> { + let mut config: LLaVAConfig = serde_json::from_str(config)?; + config.use_flash_attn = use_flash_attn; + Ok(Box::new(LLaVA::new( + &config, + vb, + self.is_gptx(), + normal_loading_metadata, + )?)) + } + fn is_gptx(&self) -> bool { + false + } + fn get_config_repr(&self, config: &str, use_flash_attn: bool) -> Result> { + let mut config: LLaVAConfig = serde_json::from_str(config)?; + config.use_flash_attn = use_flash_attn; + Ok(Box::new(config)) + } + fn get_processor( + &self, + model_config: &str, + _processor_config: Option, + _preprocessor_config: PreProcessorConfig, + ) -> Arc { + Arc::new(LLaVAProcessor::new(model_config)) + } +} diff --git a/mistralrs-core/src/vision_models/llava/config.rs b/mistralrs-core/src/vision_models/llava/config.rs new file mode 100644 index 000000000..5b12853e3 --- /dev/null +++ b/mistralrs-core/src/vision_models/llava/config.rs @@ -0,0 +1,113 @@ +use candle_nn::Activation; +use serde::Deserialize; + +use crate::serde_default_fn; + +use crate::models::llama::Config as LLaMAConfig; +use crate::models::mistral::Config as MistralConfig; +use crate::vision_models::clip::{Activation as ClipActivation, ClipConfig}; + +#[derive(Debug, Clone, Deserialize)] +pub struct Config { + pub image_grid_pinpoints: Option>, + pub projector_hidden_act: String, + pub text_config: LLaVATextConfig, + pub torch_dtype: String, + pub vision_config: LLaVAVisionConfig, + pub vision_feature_layer: isize, + pub vision_feature_select_strategy: String, + #[serde(default = "default_use_flash_attn")] + pub use_flash_attn: bool, +} + +serde_default_fn!(bool, default_use_flash_attn, false); + +#[derive(Deserialize, Debug, Clone)] +pub struct LLaVATextConfig { + #[serde(default = "default_hidden_size")] + pub hidden_size: usize, + #[serde(default = "default_intermediate_size")] + pub intermediate_size: usize, + #[serde(default = "default_max_length")] + pub max_length: usize, + pub max_position_embeddings: usize, + pub model_type: String, + #[serde(default = "default_num_attention_heads")] + pub num_attention_heads: usize, + #[serde(default = "default_num_hidden_layers")] + pub num_hidden_layers: usize, + #[serde(default = "default_num_key_value_heads")] + pub num_key_value_heads: usize, + pub rms_norm_eps: f64, + #[serde(default = "default_rope_theta")] + pub rope_theta: f32, + #[serde(default = "default_vocab_size")] + pub vocab_size: usize, + pub sliding_window: Option, +} + +serde_default_fn!(usize, default_num_hidden_layers, 32); +serde_default_fn!(usize, default_hidden_size, 4096); +serde_default_fn!(usize, default_intermediate_size, 11008); +serde_default_fn!(usize, default_max_length, 4096); +serde_default_fn!(usize, default_num_attention_heads, 32); +serde_default_fn!(usize, default_num_key_value_heads, 32); +serde_default_fn!(f32, default_rope_theta, 10000.0); +serde_default_fn!(usize, default_vocab_size, 32064); + +#[derive(Deserialize, Debug, Clone)] +pub struct LLaVAVisionConfig { + pub hidden_size: usize, + pub image_size: usize, + pub intermediate_size: usize, + pub num_attention_heads: usize, + pub num_hidden_layers: usize, + pub patch_size: usize, +} + +impl Config { + pub fn to_llama_config(&self) -> LLaMAConfig { + LLaMAConfig { + hidden_size: self.text_config.hidden_size, + intermediate_size: self.text_config.intermediate_size, + vocab_size: self.text_config.vocab_size, + num_hidden_layers: self.text_config.num_hidden_layers, + num_attention_heads: self.text_config.num_attention_heads, + num_key_value_heads: self.text_config.num_key_value_heads, + use_flash_attn: self.use_flash_attn, + rms_norm_eps: self.text_config.rms_norm_eps, + rope_theta: self.text_config.rope_theta, + max_position_embeddings: self.text_config.max_position_embeddings, + } + } + + pub fn to_mistral_config(&self) -> MistralConfig { + MistralConfig { + vocab_size: self.text_config.vocab_size, + hidden_size: self.text_config.hidden_size, + intermediate_size: self.text_config.intermediate_size, + num_hidden_layers: self.text_config.num_hidden_layers, + num_attention_heads: self.text_config.num_attention_heads, + num_key_value_heads: self.text_config.num_key_value_heads, + hidden_act: Activation::Silu, // as it is in mistralai/Mistral-7B-Instruct-v0.2 + max_position_embeddings: self.text_config.max_position_embeddings, + rms_norm_eps: self.text_config.rms_norm_eps, + rope_theta: self.text_config.rope_theta as f64, + sliding_window: self.text_config.sliding_window, + use_flash_attn: self.use_flash_attn, + } + } + + pub fn to_clip_config(&self) -> ClipConfig { + ClipConfig { + hidden_size: self.vision_config.hidden_size, + intermediate_size: self.vision_config.intermediate_size, + num_hidden_layers: self.vision_config.num_hidden_layers, + num_attention_heads: self.vision_config.num_attention_heads, + num_channels: 3, + image_size: self.vision_config.image_size, + patch_size: self.vision_config.patch_size, + hidden_act: ClipActivation::QuickGelu, + } + } +} diff --git a/mistralrs-core/src/vision_models/llava/llava15.rs b/mistralrs-core/src/vision_models/llava/llava15.rs new file mode 100644 index 000000000..aed3e2490 --- /dev/null +++ b/mistralrs-core/src/vision_models/llava/llava15.rs @@ -0,0 +1,292 @@ +#![allow( + clippy::cast_possible_truncation, + clippy::cast_precision_loss, + clippy::too_many_arguments +)] +use super::llava_llm::{LLaVALLM, Llama, Mistral}; +use crate::device_map::DeviceMapper; +use crate::ops::NonZeroOp; +use crate::pipeline::IsqModel; +use crate::pipeline::NormalLoadingMetadata; +use crate::pipeline::VisionModel; +use crate::vision_models::clip::{ClipConfig, ClipVisionTransformer}; +use crate::vision_models::llava::config::Config; +use candle_core::quantized::QMatMul; +use candle_core::{bail, DType, Device, IndexOp, Result, Tensor}; +use candle_nn::{linear, Activation, Linear, VarBuilder}; + +pub(crate) struct LLaVAVisionSpecificArgs; // only a dumb struct to satisfy the trait + +pub struct MMProjector { + linear_1: Linear, + activation: Activation, + linear_2: Linear, +} + +impl MMProjector { + pub fn new(vb: &VarBuilder, config: &Config) -> Result { + let linear_1 = linear( + config.vision_config.hidden_size, + config.text_config.hidden_size, + vb.pp("multi_modal_projector.linear_1"), + )?; + let activation = match config.projector_hidden_act.as_str() { + "gelu" => Activation::Gelu, + _ => { + bail!( + "Unsupporg projector hidden act: {}", + config.projector_hidden_act + ); + } + }; + let linear_2 = linear( + config.text_config.hidden_size, + config.text_config.hidden_size, + vb.pp("multi_modal_projector.linear_2"), + )?; + Ok(Self { + linear_1, + activation, + linear_2, + }) + } + + pub fn forward(&self, x: &Tensor) -> Result { + x.apply(&self.linear_1)? + .apply(&self.activation)? + .apply(&self.linear_2) + } +} + +pub struct ClipVisionTower { + model: ClipVisionTransformer, + select_layer: isize, + select_feature_method: String, + config: ClipConfig, +} + +impl ClipVisionTower { + pub fn new( + vb: VarBuilder, + select_layer: isize, + select_feature_method: &str, + config: &ClipConfig, + ) -> Result { + let model = ClipVisionTransformer::new(vb, config)?; + Ok(Self { + model, + select_layer, + select_feature_method: select_feature_method.to_string(), + config: config.clone(), + }) + } + + pub fn forward(&self, x: &Tensor) -> Result { + let result = self.model.forward_get_hidden_states(x)?; + let index = result.len() as isize + self.select_layer; + let result = result[index as usize].clone(); + if self.select_feature_method == "cls_patch" || self.select_feature_method == "full" { + Ok(result) + } else { + result.i((.., 1..)) + } + } + + pub fn num_patches_per_side(&self) -> usize { + self.config.image_size / self.config.patch_size + } +} + +pub struct Model { + clip_vision_tower: ClipVisionTower, + mm_projector: MMProjector, + llm: Box, + config: Config, + device: Device, +} + +impl Model { + pub fn new( + config: &Config, + vb: VarBuilder, + is_gptx: bool, + normal_loading_metadata: NormalLoadingMetadata, + ) -> Result { + let device = normal_loading_metadata.real_device.clone(); + + let clip_config = config.to_clip_config(); + let mm_projector = MMProjector::new(&vb, config)?; + let clip_vision_tower = ClipVisionTower::new( + vb.pp("vision_tower.vision_model"), + config.vision_feature_layer, + &config.vision_feature_select_strategy, + &clip_config, + )?; + + let llm: Box = match config.text_config.model_type.as_str() { + "llama" => { + let llama_config = config.to_llama_config(); + let llama = Llama::new( + &llama_config, + vb.pp("language_model"), + is_gptx, + normal_loading_metadata, + )?; + Box::new(llama) + } + "mistral" => { + let mistral_config = config.to_mistral_config(); + let mistral = Mistral::new( + &mistral_config, + vb.pp("language_model"), + is_gptx, + normal_loading_metadata, + )?; + Box::new(mistral) + } + _ => { + bail!("Unsupported model type: {}", config.text_config.model_type); + } + }; + Ok(Self { + clip_vision_tower, + mm_projector, + llm, + config: config.clone(), + device, + }) + } + + pub fn encode_images(&self, x: &Tensor) -> Result { + let mut image_features = self.clip_vision_tower.forward(x)?; + image_features = self.mm_projector.forward(&image_features)?; + Ok(image_features) + } + + pub fn prepare_inputs_labels_for_multimodal( + &self, + input_ids: &Tensor, //[1,seq_len] + images: &Tensor, //[sum of samples of all images,chanel,width,height] + num_image_tokens: usize, + ) -> Result { + let image_indexes = input_ids + .squeeze(0)? + .lt(0i64)? + .nonzero()? + .squeeze(1)? + .to_vec1::()?; + let image_ids = image_indexes + .iter() + .map(|x| Ok(-(input_ids.i((0, *x as usize))?.to_scalar::()?))) + .collect::>>()?; + let mut result = input_ids.clamp(0i64, i64::MAX)?.to_dtype(DType::U32)?; + result = self.llm.embed(&result)?; //[seq_len,hidden_size] + let image_features = self.encode_images(images)?; //[num of images,patch_size*patch_size,hidden_size] + let num_of_images = image_features.shape().dims()[0]; + let mut image_features_vec = Vec::new(); + for i in 0..num_of_images { + image_features_vec.push(image_features.get(i)?.flatten(0, 1)?); + } + for (i, image_index) in image_indexes.iter().enumerate() { + let image_id = image_ids[i]; + result = result.slice_assign( + &[ + &(0usize..1usize), + &(*image_index as usize..*image_index as usize + num_image_tokens), + &(..), + ], + &image_features_vec[(image_id - 1) as usize], + )?; + } + //truncate + let (_, seq_len) = input_ids.shape().dims2()?; + if seq_len > self.config.text_config.max_length { + result = result.i((.., ..self.config.text_config.max_length, ..))? + } + Ok(result) + } + + pub fn forward_inputs( + &self, + input_ids: &Tensor, + pixel_values: Option, + num_image_tokens: Option, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + position_ids: Vec, + ) -> Result { + if let Some(ref pixel_values) = pixel_values { + // we assume(as it should be) only prompt request contains image + let input_embeds = self.prepare_inputs_labels_for_multimodal( + input_ids, + pixel_values, + num_image_tokens.unwrap(), + )?; + self.llm.forward_input_embed( + input_ids, + input_embeds, + seqlen_offsets, + start_offsets_kernel, + context_lens, + ) + } else { + self.llm.forward( + input_ids, + seqlen_offsets, + start_offsets_kernel, + context_lens, + position_ids, + ) + } + } +} + +impl IsqModel for Model { + fn get_tensors(&mut self) -> (Vec<(&mut QMatMul, Option)>, &dyn DeviceMapper) { + // I don't really get this part + self.llm.get_tensors() + } +} + +impl VisionModel for Model { + fn forward( + &self, + input_ids: &Tensor, + pixel_values: Option, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + position_ids: Vec, + _model_specific_args: Box, // pixel attention mask, or image sizes, or anything else + ) -> candle_core::Result { + self.forward_inputs( + input_ids, + pixel_values, + Some( + self.clip_vision_tower.num_patches_per_side() + * self.clip_vision_tower.num_patches_per_side(), + ), + seqlen_offsets, + start_offsets_kernel, + context_lens, + position_ids, + ) + } + + fn device(&self) -> &Device { + &self.device + } + + fn cache(&self) -> &crate::pipeline::Cache { + self.llm.cache() + } + + fn max_seq_len(&self) -> usize { + self.config.text_config.max_length + } + + fn has_conv2d(&self) -> bool { + true + } +} diff --git a/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs b/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs new file mode 100644 index 000000000..885120a2e --- /dev/null +++ b/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs @@ -0,0 +1,334 @@ +#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] +use std::any::Any; +use std::sync::Arc; + +use candle_core::Result; +use candle_core::{DType, Device, Tensor}; +use image::GenericImageView; +use image::Rgb; +use itertools::Itertools; +use regex_automata::meta::Regex; +use tokenizers::Tokenizer; + +use super::llava15::LLaVAVisionSpecificArgs; +use super::utils::{expand2square, LLaVAImageProcessor}; +use crate::pipeline::text_models_inputs_processor::{get_completion_input, get_prompt_input}; +use crate::pipeline::{ + text_models_inputs_processor, InputsProcessor, InputsProcessorType, MessagesAction, Processor, +}; +use crate::sequence::Sequence; +use crate::vision_models::image_processor::{self, ImagePreProcessor, PreprocessedImages}; +use crate::vision_models::llava::config::Config as LLaVAConfig; +use crate::vision_models::preprocessor_config::{PreProcessorConfig, ToFilter}; +use crate::vision_models::{preprocessor_config, ModelInputs}; + +pub struct LLaVAProcessor { + inputs_processor: Arc, +} + +impl Processor for LLaVAProcessor { + fn inputs_processor(&self) -> Arc { + self.inputs_processor.clone() + } + fn get_special_tokens(&self) -> &[&'static str] { + &[] + } + fn template_action(&self) -> MessagesAction { + MessagesAction::FlattenOnlyText + } +} + +impl LLaVAProcessor { + pub fn new(config: &str) -> Self { + let model_config = + serde_json::from_str::(config).expect("Failed to parse model config."); + let image_tag_splitter = + Regex::new(r"<\|image_\d+\|>").expect("Failed to compile split regex."); + let inputs_processor = Arc::new(LLaVAInputProcessor { + image_tag_splitter, + model_config: model_config.clone(), + }); + Self { inputs_processor } + } +} + +pub struct LLaVAInputProcessor { + image_tag_splitter: Regex, + model_config: LLaVAConfig, +} + +impl LLaVAInputProcessor { + fn get_num_image_tokens(&self) -> usize { + let patch_size = self.model_config.vision_config.patch_size; + let patch_per_side = self.model_config.vision_config.image_size / patch_size; + patch_per_side * patch_per_side + } +} + +// Copy from phi3_inputs_processor. different is (1) calculate of num_image_token (2) process_anyres_image (3)image_ids_pad +impl InputsProcessor for LLaVAInputProcessor { + fn get_type(&self) -> InputsProcessorType { + InputsProcessorType::Vision + } + fn process_inputs( + &self, + tokenizer: Arc, + input_seqs: &mut [&mut Sequence], + is_prompt: bool, + is_xlora: bool, + device: &Device, + no_kv_cache: bool, + last_n_context_len: Option<(usize, usize)>, + other_config: Option>, + ) -> anyhow::Result> { + if is_xlora { + anyhow::bail!("Cannot make inputs for X-LoRA vision model."); + } + if no_kv_cache { + anyhow::bail!("Vision model must have kv cache."); + } + + let config = other_config + .clone() + .expect("Need a PreProcessorConfig config."); + let config: &PreProcessorConfig = config.downcast_ref().expect("Downcast failed."); + let (pixel_values, num_img_tokens, n_images) = if is_prompt + && input_seqs + .iter() + .map(|seq| seq.images().is_some()) + .all(|x| x) + { + let mut pixel_values_accum = Vec::new(); + let mut num_img_tokens_accum = Vec::new(); + let mut n_images = Vec::new(); + for seq in input_seqs.iter_mut() { + let imgs = seq + .take_images() + .expect("Need to have images by this point."); + let imgs_len = imgs.len(); + n_images.push(imgs_len); + let PreprocessedImages { + pixel_values, + pixel_attention_mask: _, + image_sizes: _, + num_img_tokens, + } = self.preprocess(imgs.clone(), config, device)?; + pixel_values_accum.push(pixel_values); + num_img_tokens_accum.push(num_img_tokens.unwrap()); + } + ( + Some(Tensor::cat(&pixel_values_accum, 0)?), + Some(num_img_tokens_accum), + n_images, + ) + } else { + let text_models_inputs_processor::ModelInputs { + input_ids, + input_ids_full: _, + seqlen_offsets, + seqlen_offsets_full: _, + seqlen_offsets_kernel, + seqlen_offsets_kernel_full: _, + context_lens, + position_ids, + } = *text_models_inputs_processor::TextInputsProcessor + .process_inputs( + tokenizer, + input_seqs, + is_prompt, + is_xlora, + device, + no_kv_cache, + last_n_context_len, + other_config, + )? + .downcast::() + .expect("Downcast failed."); + return Ok(Box::new(ModelInputs { + input_ids, + seqlen_offsets, + seqlen_offsets_kernel, + context_lens, + position_ids, + pixel_values: None, + model_specific_args: Box::new(LLaVAVisionSpecificArgs {}), + })); + }; + + let mut toks = Vec::new(); + let detokenized = tokenizer + .decode_batch( + &input_seqs + .iter() + .map(|seq| seq.get_toks()) + .collect::>(), + false, + ) + .map_err(anyhow::Error::msg)?; + + for (detokenized, (seq, (num_img_tokens, n_images))) in detokenized.into_iter().zip( + input_seqs + .iter_mut() + .zip(num_img_tokens.unwrap().into_iter().zip(n_images)), + ) { + let splits = self + .image_tag_splitter + .split(&detokenized) + .map(|span| &detokenized[span.range()]) + .collect::>(); + let prompt_chunks = splits + .iter() + .map(|s| { + // we don't use encode_batch here, because encode_batch will pad 0 to the end of the shor sequences, which will cause the image_ids_pad to be wrong. + tokenizer + .encode(*s, true) + .unwrap() + .get_ids() + .to_vec() + .iter() + .map(|x| *x as i64) + .collect() + }) + .collect::>>(); + let image_tags = self.image_tag_splitter.find_iter(&detokenized); + let image_ids = image_tags + .into_iter() + .map(|s| { + let s = &detokenized[s.range()]; + s.split('|') + .nth(1) + .unwrap() + .split('_') + .nth(1) + .unwrap() + .parse::() + .expect("Failed to parse image id to u32") + }) + .collect::>(); + let unique_image_ids = image_ids + .iter() + .copied() + .unique() + .sorted() + .collect::>(); + // `image_ids` must start from 1, and must be continuous int, e.g. [1, 2, 3], cannot be [1, 4, 5] + if unique_image_ids != (1u32..unique_image_ids.len() as u32 + 1).collect::>() { + anyhow::bail!("`image_ids` must start from 1, and must be continuous, e.g. [1, 2, 3], cannot be [1, 4, 5]."); + } + // Total images must be the same as the number of image tags + if unique_image_ids.len() != n_images { + anyhow::bail!("Total images must be the same as the number of image tags."); + } + //only start position is -id, other positions are 0. This is for targeting image positions. + let mut image_ids_pad = Vec::new(); + for image_id in image_ids.iter() { + let mut image_id_pad = vec![0; num_img_tokens[*image_id as usize - 1]]; + image_id_pad[0] = -(*image_id as i64); + image_ids_pad.push(image_id_pad); + } + let mut input_ids: Vec = Vec::new(); + for item in prompt_chunks + .iter() + .map(|x| x.to_vec()) + .interleave(image_ids_pad) + { + input_ids.extend(item); + } + + // NOTE(EricLBuehler): Casting to u32 is fine, we don't care about the other toks + seq.set_toks( + input_ids + .iter() + .map(|x| if *x < 0 { 0u32 } else { *x as u32 }) + .collect::>(), + ); + + toks.push(input_ids); + } + + let text_models_inputs_processor::InputMetadata { + input, + positions, + positions_kernel, + context_lens, + position_ids, + } = if is_prompt { + get_prompt_input(toks, input_seqs, device, last_n_context_len)? + } else { + get_completion_input(toks, input_seqs, device, no_kv_cache, last_n_context_len)? + }; + Ok(Box::new(ModelInputs { + input_ids: input, + seqlen_offsets: positions, + seqlen_offsets_kernel: positions_kernel, + context_lens, + position_ids, + pixel_values, + model_specific_args: Box::new(LLaVAVisionSpecificArgs {}), + })) + } +} + +impl ImagePreProcessor for LLaVAInputProcessor { + #[allow(clippy::excessive_precision)] + const DEFAULT_MEAN: [f64; 3] = [0.48145466, 0.4578275, 0.40821073]; + #[allow(clippy::excessive_precision)] + const DEFAULT_STD: [f64; 3] = [0.26862954, 0.26130258, 0.27577711]; + fn preprocess( + &self, + images: Vec, + config: &preprocessor_config::PreProcessorConfig, + device: &candle_core::Device, + ) -> candle_core::Result { + if images.len() > 1 { + candle_core::bail!("Can only process one image per batch"); // This is no different from phi3_input_processor + }; + let resized_size = *config.size.as_ref().unwrap().get("shortest_edge").unwrap() as usize; + + let original_size = images[0].dimensions(); + let filter = config.resampling.to_filter()?; + let dtype = match self.model_config.torch_dtype.as_str() { + "float16" => DType::F16, + "bfloat16" => DType::BF16, + "float32" => DType::F32, + _ => candle_core::bail!("unsupported dtype"), + }; + let image_mean = config + .image_mean + .unwrap_or(Self::DEFAULT_MEAN) + .map(|x| x as f32); + let mean_color = image_mean + .iter() + .map(|x| ((*x) * 255.0) as u8) + .collect::>(); + let mean_color = Rgb::from([mean_color[0], mean_color[1], mean_color[2]]); + let image = expand2square(&images[0], mean_color); + let image_std = config + .image_std + .unwrap_or(Self::DEFAULT_STD) + .map(|x| x as f32); + let pixel_values = [image] + .iter() + .map(|x| { + LLaVAImageProcessor::process_one_image( + x, + config, + resized_size as u32, + filter, + dtype, + device, + &image_mean, + &image_std, + ) + }) + .collect::>>()?; + let pixel_values = Tensor::stack(&pixel_values, 0)?; + + Ok(image_processor::PreprocessedImages { + pixel_values, + pixel_attention_mask: None, + image_sizes: Some((original_size.0 as usize, original_size.1 as usize)), + num_img_tokens: Some(vec![self.get_num_image_tokens()]), + }) + } +} diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs index 35167986d..467c3a600 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs @@ -7,7 +7,7 @@ pub(crate) trait LLaVALLM: IsqModel + NormalModel + Sync + Send { fn embed(&self, input_ids: &Tensor) -> Result; fn forward_input_embed( &self, - input_ids: &Tensor, // only for masking + input_ids: &Tensor, // only for masking input_embed: Tensor, // we don't want to clone, so we pass it in seqlen_offsets: &[usize], start_offsets_kernel: Tensor, @@ -50,4 +50,4 @@ pub(crate) mod llama; pub(crate) mod mistral; pub use llama::Llama; -pub use mistral::Model as Mistral; \ No newline at end of file +pub use mistral::Model as Mistral; diff --git a/mistralrs-core/src/vision_models/llava/llava_next.rs b/mistralrs-core/src/vision_models/llava/llava_next.rs index aa5766ce2..edaad695e 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next.rs @@ -6,125 +6,23 @@ use candle_core::quantized::QMatMul; use candle_core::{bail, DType, Device, IndexOp, Result, Tensor}; use candle_nn::{linear, Activation, Linear, VarBuilder}; -use serde::Deserialize; use crate::device_map::DeviceMapper; use crate::ops::NonZeroOp; use crate::pipeline::IsqModel; use crate::pipeline::NormalLoadingMetadata; use crate::pipeline::VisionModel; -use crate::serde_default_fn; -use crate::models::llama::Config as LLaMAConfig; -use crate::models::mistral::Config as MistralConfig; -use crate::vision_models::clip::{Activation as ClipActivation, ClipConfig, ClipVisionTransformer}; +use crate::vision_models::clip::{ClipConfig, ClipVisionTransformer}; +use crate::vision_models::llava::config::Config; use crate::vision_models::llava::utils::get_anyres_image_grid_shape; use super::llava_llm::{LLaVALLM, Llama, Mistral}; -#[derive(Debug, Clone, Deserialize)] -pub struct Config { - pub image_grid_pinpoints: Vec<(u32, u32)>, - pub projector_hidden_act: String, - pub text_config: LLaVATextConfig, - pub torch_dtype: String, - pub vision_config: LLaVAVisionConfig, - pub vision_feature_layer: isize, - pub vision_feature_select_strategy: String, - #[serde(default = "default_use_flash_attn")] - pub use_flash_attn: bool, -} - -serde_default_fn!(bool, default_use_flash_attn, false); - -#[derive(Deserialize, Debug, Clone)] -pub struct LLaVATextConfig { - #[serde(default = "default_hidden_size")] - pub hidden_size: usize, - #[serde(default = "default_intermediate_size")] - pub intermediate_size: usize, - #[serde(default = "default_max_length")] - pub max_length: usize, - pub max_position_embeddings: usize, - pub model_type: String, - #[serde(default = "default_num_attention_heads")] - pub num_attention_heads: usize, - #[serde(default = "default_num_hidden_layers")] - pub num_hidden_layers: usize, - #[serde(default = "default_num_key_value_heads")] - pub num_key_value_heads: usize, - pub rms_norm_eps: f64, - #[serde(default = "default_rope_theta")] - pub rope_theta: f32, - #[serde(default = "default_vocab_size")] - pub vocab_size: usize, - pub sliding_window: Option, -} - -serde_default_fn!(usize, default_num_hidden_layers, 32); -serde_default_fn!(usize, default_hidden_size, 4096); -serde_default_fn!(usize, default_intermediate_size, 11008); -serde_default_fn!(usize, default_max_length, 4096); -serde_default_fn!(usize, default_num_attention_heads, 32); -serde_default_fn!(usize, default_num_key_value_heads, 32); -serde_default_fn!(f32, default_rope_theta, 10000.0); -serde_default_fn!(usize, default_vocab_size, 32064); - -#[derive(Deserialize, Debug, Clone)] -pub struct LLaVAVisionConfig { - pub hidden_size: usize, - pub image_size: usize, - pub intermediate_size: usize, - pub num_attention_heads: usize, - pub num_hidden_layers: usize, - pub patch_size: usize, -} - -impl Config { - fn to_llama_config(&self) -> LLaMAConfig { - LLaMAConfig { - hidden_size: self.text_config.hidden_size, - intermediate_size: self.text_config.intermediate_size, - vocab_size: self.text_config.vocab_size, - num_hidden_layers: self.text_config.num_hidden_layers, - num_attention_heads: self.text_config.num_attention_heads, - num_key_value_heads: self.text_config.num_key_value_heads, - use_flash_attn: self.use_flash_attn, - rms_norm_eps: self.text_config.rms_norm_eps, - rope_theta: self.text_config.rope_theta, - max_position_embeddings: self.text_config.max_position_embeddings, - } - } - - fn to_mistral_config(&self) -> MistralConfig { - MistralConfig { - vocab_size: self.text_config.vocab_size, - hidden_size: self.text_config.hidden_size, - intermediate_size: self.text_config.hidden_size, - num_hidden_layers: self.text_config.num_hidden_layers, - num_attention_heads: self.text_config.num_attention_heads, - num_key_value_heads: self.text_config.num_key_value_heads, - hidden_act: Activation::Silu, // as it is in mistralai/Mistral-7B-Instruct-v0.2 - max_position_embeddings: self.text_config.max_position_embeddings, - rms_norm_eps: self.text_config.rms_norm_eps, - rope_theta: self.text_config.rope_theta as f64, - sliding_window: self.text_config.sliding_window, - use_flash_attn: self.use_flash_attn, - } - } - - fn to_clip_config(&self) -> ClipConfig { - ClipConfig { - hidden_size: self.vision_config.hidden_size, - intermediate_size: self.vision_config.intermediate_size, - num_hidden_layers: self.vision_config.num_hidden_layers, - num_attention_heads: self.vision_config.num_attention_heads, - num_channels: 3, - image_size: self.vision_config.image_size, - patch_size: self.vision_config.patch_size, - hidden_act: ClipActivation::QuickGelu, - } - } +pub(crate) struct LLaVANextVisionSpecificArgs { + pub image_sizes: Option>, // width, height + pub num_image_tokens: Option>, // number of image tokens for each image + pub num_image_samples: Option>, // number of image samples for each image } pub struct MMProjector { @@ -299,8 +197,6 @@ impl Model { } } - - pub fn prepare_inputs_labels_for_multimodal( &self, input_ids: &Tensor, //[1,seq_len] @@ -321,12 +217,13 @@ impl Model { .collect::>>()?; let mut result = input_ids.clamp(0i64, i64::MAX)?.to_dtype(DType::U32)?; result = self.llm.embed(&result)?; //[seq_len,hidden_size] - let image_features = self.encode_images(images)?; //[sum of samples of all images,hidden_size] + let image_features = self.encode_images(images)?; //[sum of samples of all images,patch_size*patch_size,hidden_size] + println!("image_features.shape = {:?}", image_features.shape()); let mut image_features_vec = Vec::new(); let mut index = 0; - for i in 0..num_image_samples.len() { - image_features_vec.push(image_features.i(index..index + num_image_samples[i])?); - index += num_image_samples[i]; + for num_image_sample in num_image_samples { + image_features_vec.push(image_features.i(index..index + num_image_sample)?); + index += num_image_sample; } let image_features_vec = image_features_vec .iter() @@ -338,9 +235,10 @@ impl Model { let width = height; assert_eq!(height * width, base_image_feature.dims()[0]); let image_size = image_sizes[image_idx]; + let image_grid_pinpoints = self.config.image_grid_pinpoints.clone().unwrap(); let (num_patch_width, num_patch_height) = get_anyres_image_grid_shape( image_size, - &self.config.image_grid_pinpoints, + &image_grid_pinpoints, self.clip_vision_tower.config.image_size as u32, ); let mut new_image_feature = patch_image_feature.reshape(( @@ -428,12 +326,6 @@ impl Model { } } -pub(crate) struct LLaVANextVisionSpecificArgs { - pub image_sizes: Option>, // width, height - pub num_image_tokens: Option>, // number of image tokens for each image - pub num_image_samples: Option>, // number of image samples for each image -} - impl IsqModel for Model { fn get_tensors(&mut self) -> (Vec<(&mut QMatMul, Option)>, &dyn DeviceMapper) { // I don't really get this part diff --git a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs index 8bd8a00a8..ef6facf58 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs @@ -1,12 +1,10 @@ #![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] use std::any::Any; -use std::cmp::min; use std::sync::Arc; use candle_core::Result; use candle_core::{DType, Device, Tensor}; -use image::imageops::overlay; -use image::{imageops::FilterType, DynamicImage, GenericImageView}; +use image::GenericImageView; use itertools::Itertools; use regex_automata::meta::Regex; use tokenizers::Tokenizer; @@ -17,14 +15,14 @@ use crate::pipeline::{ }; use crate::sequence::Sequence; use crate::vision_models::image_processor::{self, ImagePreProcessor, PreprocessedImages}; -use crate::vision_models::llava_next::Config as LLaVANextConfig; -use crate::vision_models::llava_next::LLaVANextVisionSpecificArgs; +use crate::vision_models::llava::config::Config as LLaVANextConfig; use crate::vision_models::preprocessor_config::{PreProcessorConfig, ToFilter}; use crate::vision_models::{preprocessor_config, ModelInputs}; +use super::llava_next::LLaVANextVisionSpecificArgs; use super::utils::{ - calculate_middle, calculate_unpad, divide_to_samples, get_anyres_image_grid_shape, - get_num_samples, resize_and_pad_image, select_best_resolution, + calculate_unpad, divide_to_samples, get_anyres_image_grid_shape, get_num_samples, + resize_and_pad_image, select_best_resolution, LLaVAImageProcessor, }; pub struct LLaVANextProcessor { @@ -59,18 +57,16 @@ impl LLaVANextProcessor { pub struct LLaVANextInputProcessor { image_tag_splitter: Regex, - model_config: crate::vision_models::llava_next::Config, + model_config: LLaVANextConfig, } impl LLaVANextInputProcessor { - fn get_num_image_tokens( - &self, - image_size: (u32, u32), - grid_pinpoints: &[(u32, u32)], - patch_size: u32, - ) -> usize { - let anyres_grid_shape = get_anyres_image_grid_shape(image_size, grid_pinpoints, patch_size); - let patch_per_side = self.model_config.vision_config.image_size / patch_size as usize; + fn get_num_image_tokens(&self, image_size: (u32, u32)) -> usize { + let patch_size = self.model_config.vision_config.patch_size; + let image_grid_pinpoints = self.model_config.image_grid_pinpoints.clone().unwrap(); + let anyres_grid_shape = + get_anyres_image_grid_shape(image_size, &image_grid_pinpoints, patch_size as u32); + let patch_per_side = self.model_config.vision_config.image_size / patch_size; let unpad_shape = calculate_unpad(anyres_grid_shape, image_size); patch_per_side * patch_per_side + (unpad_shape.0 as usize + 1) * (unpad_shape.1 as usize) } @@ -134,15 +130,12 @@ impl InputsProcessor for LLaVANextInputProcessor { pixel_values_accum.push(pixel_values); image_sizes_accum.push(image_sizes); num_img_tokens_accum.push(num_img_tokens.unwrap()); + let image_grid_pinpoints = self.model_config.image_grid_pinpoints.clone().unwrap(); let num_img_samples = imgs .iter() .map(|img| { let original_size = img.dimensions(); - get_num_samples( - original_size, - &self.model_config.image_grid_pinpoints, - crop_size, - ) as usize + get_num_samples(original_size, &image_grid_pinpoints, crop_size) as usize }) .collect::>(); num_image_samples_accum.push(num_img_samples); @@ -324,101 +317,6 @@ impl InputsProcessor for LLaVANextInputProcessor { } } -struct LLaVANextImageProcessor; - -impl LLaVANextImageProcessor { - fn resize(image: &DynamicImage, size: u32, filter: FilterType) -> DynamicImage { - let (width, height) = image.dimensions(); - if width == size && height == size { - image.clone() - } else { - let (new_width, new_height) = if width < height { - ( - size, - (((size * height) as f32) / width as f32).ceil() as u32, - ) - } else { - ( - (((size * width) as f32) / height as f32).ceil() as u32, - size, - ) - }; - image.resize(new_width, new_height, filter) - } - } - - fn center_crop(image: &DynamicImage, crop_size: (u32, u32)) -> DynamicImage { - let (width, height) = image.dimensions(); - let (left, top) = calculate_middle((width, height), crop_size); - image.crop_imm(left, top, crop_size.0, crop_size.1) - } - - fn rescale(tensor: &Tensor, rescale_factor: f64) -> Result { - tensor.affine(rescale_factor, 0.0) - } - - fn to_tensor(image: &DynamicImage, device: &Device) -> Result { - let img = image.to_rgb8().into_raw(); - let (width, height) = image.dimensions(); - Tensor::from_vec(img, (height as usize, width as usize, 3), device)?.to_dtype(DType::F32) - } - - fn normalize(tensor: &Tensor, image_mean: &[f32], image_std: &[f32]) -> Result { - let mean = Tensor::from_slice(image_mean, (3,), &Device::Cpu)?; - let std = Tensor::from_slice(image_std, (3,), &Device::Cpu)?; - tensor.broadcast_sub(&mean)?.broadcast_div(&std) - } - - fn to_channel_dimension_format(tensor: &Tensor) -> Result { - tensor.permute((2, 0, 1)) - } - pub fn process_one_image( - image: &DynamicImage, - preprocessor_config: &PreProcessorConfig, - resize_size: u32, - filter: FilterType, - dtype: DType, - device: &Device, - image_mean: &[f32], - image_std: &[f32], - ) -> Result { - let mut image = if preprocessor_config.do_resize.unwrap_or(true) { - Self::resize(image, resize_size as u32, filter) - } else { - image.clone() - }; - image = if preprocessor_config.do_center_crop.unwrap_or(true) { - let crop_width = *preprocessor_config - .crop_size - .as_ref() - .unwrap() - .get("width") - .unwrap(); - let crop_height = *preprocessor_config - .crop_size - .as_ref() - .unwrap() - .get("height") - .unwrap(); - Self::center_crop(&image, (crop_width, crop_height)) - } else { - image - }; - let mut pixel_value = Self::to_tensor(&image, &Device::Cpu)?; - if preprocessor_config.do_rescale.unwrap_or(true) { - let rescale_factor = preprocessor_config.rescale_factor.unwrap(); - pixel_value = Self::rescale(&pixel_value, rescale_factor)?; - } - if preprocessor_config.do_normalize.unwrap_or(true) { - pixel_value = Self::normalize(&pixel_value, &image_mean, &image_std)?; - pixel_value = Self::to_channel_dimension_format(&pixel_value)? - .to_dtype(dtype)? - .to_device(device)?; - } - Ok(pixel_value) - } -} - impl ImagePreProcessor for LLaVANextInputProcessor { #[allow(clippy::excessive_precision)] const DEFAULT_MEAN: [f64; 3] = [0.48145466, 0.4578275, 0.40821073]; @@ -436,8 +334,8 @@ impl ImagePreProcessor for LLaVANextInputProcessor { let resized_size = *config.size.as_ref().unwrap().get("shortest_edge").unwrap() as usize; let image = images[0].clone(); let original_size = image.dimensions(); - let best_resolution = - select_best_resolution(original_size, &self.model_config.image_grid_pinpoints); + let image_grid_pinpoints = self.model_config.image_grid_pinpoints.clone().unwrap(); + let best_resolution = select_best_resolution(original_size, &image_grid_pinpoints); // Here I didn't use mistral_vision::Transform, because a lot transformations are before turning the image into a tensor let image_padded = resize_and_pad_image(&image, best_resolution); let filter = config.resampling.to_filter()?; @@ -469,7 +367,7 @@ impl ImagePreProcessor for LLaVANextInputProcessor { let pixel_values = samples .iter() .map(|x| { - LLaVANextImageProcessor::process_one_image( + LLaVAImageProcessor::process_one_image( x, config, resized_size as u32, @@ -487,11 +385,7 @@ impl ImagePreProcessor for LLaVANextInputProcessor { pixel_values, pixel_attention_mask: None, image_sizes: Some((original_size.0 as usize, original_size.1 as usize)), - num_img_tokens: Some(vec![self.get_num_image_tokens( - original_size, - &self.model_config.image_grid_pinpoints, - self.model_config.vision_config.patch_size as u32, - )]), + num_img_tokens: Some(vec![self.get_num_image_tokens(original_size)]), }) } } diff --git a/mistralrs-core/src/vision_models/llava/mod.rs b/mistralrs-core/src/vision_models/llava/mod.rs index ca77d7f03..0301a55be 100644 --- a/mistralrs-core/src/vision_models/llava/mod.rs +++ b/mistralrs-core/src/vision_models/llava/mod.rs @@ -1,6 +1,7 @@ +pub mod config; +pub mod llava15; +pub mod llava_inputs_processor; pub mod llava_llm; pub mod llava_next; pub mod llava_next_inputs_processor; mod utils; -//pub mod llava; -//pub mod llava_inputs_processor; \ No newline at end of file diff --git a/mistralrs-core/src/vision_models/llava/utils.rs b/mistralrs-core/src/vision_models/llava/utils.rs index 6f065a06d..bb384fa1c 100644 --- a/mistralrs-core/src/vision_models/llava/utils.rs +++ b/mistralrs-core/src/vision_models/llava/utils.rs @@ -1,7 +1,16 @@ +#![allow( + clippy::cast_possible_truncation, + clippy::cast_precision_loss, + clippy::too_many_arguments +)] +use crate::vision_models::preprocessor_config::PreProcessorConfig; +use candle_core::{DType, Device, Result, Tensor}; +use image::{ + imageops::{overlay, FilterType}, + DynamicImage, GenericImageView, Rgb, RgbImage, +}; use std::cmp::min; -use image::{imageops::overlay, DynamicImage, GenericImageView}; - pub(crate) fn get_anyres_image_grid_shape( image_size: (u32, u32), grid_pinpoints: &[(u32, u32)], @@ -71,7 +80,10 @@ pub(crate) fn calculate_unpad(size: (u32, u32), original_size: (u32, u32)) -> (u } } -pub(crate) fn resize_and_pad_image(image: &DynamicImage, target_resolution: (u32, u32)) -> DynamicImage { +pub(crate) fn resize_and_pad_image( + image: &DynamicImage, + target_resolution: (u32, u32), +) -> DynamicImage { let (original_width, original_height) = image.dimensions(); let original_width_f = original_width as f32; let original_height_f = original_height as f32; @@ -135,3 +147,116 @@ pub(crate) fn calculate_middle(image_size: (u32, u32), center_size: (u32, u32)) }; (left, top) } + +pub(crate) fn expand2square(image: &DynamicImage, background_color: Rgb) -> DynamicImage { + let (width, height) = image.dimensions(); + match width.cmp(&height) { + std::cmp::Ordering::Less => { + let mut new_image = + DynamicImage::from(RgbImage::from_pixel(height, height, background_color)); + overlay(&mut new_image, image, ((height - width) / 2) as i64, 0); + new_image + } + std::cmp::Ordering::Equal => image.clone(), + std::cmp::Ordering::Greater => { + let mut new_image = + DynamicImage::from(RgbImage::from_pixel(width, width, background_color)); + overlay(&mut new_image, image, 0, ((width - height) / 2) as i64); + new_image + } + } +} + +pub struct LLaVAImageProcessor; + +impl LLaVAImageProcessor { + fn resize(image: &DynamicImage, size: u32, filter: FilterType) -> DynamicImage { + let (width, height) = image.dimensions(); + if width == size && height == size { + image.clone() + } else { + let (new_width, new_height) = if width < height { + ( + size, + (((size * height) as f32) / width as f32).ceil() as u32, + ) + } else { + ( + (((size * width) as f32) / height as f32).ceil() as u32, + size, + ) + }; + image.resize(new_width, new_height, filter) + } + } + + fn center_crop(image: &DynamicImage, crop_size: (u32, u32)) -> DynamicImage { + let (width, height) = image.dimensions(); + let (left, top) = calculate_middle((width, height), crop_size); + image.crop_imm(left, top, crop_size.0, crop_size.1) + } + + fn rescale(tensor: &Tensor, rescale_factor: f64) -> Result { + tensor.affine(rescale_factor, 0.0) + } + + fn to_tensor(image: &DynamicImage, device: &Device) -> Result { + let img = image.to_rgb8().into_raw(); + let (width, height) = image.dimensions(); + Tensor::from_vec(img, (height as usize, width as usize, 3), device)?.to_dtype(DType::F32) + } + + fn normalize(tensor: &Tensor, image_mean: &[f32], image_std: &[f32]) -> Result { + let mean = Tensor::from_slice(image_mean, (3,), &Device::Cpu)?; + let std = Tensor::from_slice(image_std, (3,), &Device::Cpu)?; + tensor.broadcast_sub(&mean)?.broadcast_div(&std) + } + + fn to_channel_dimension_format(tensor: &Tensor) -> Result { + tensor.permute((2, 0, 1)) + } + pub fn process_one_image( + image: &DynamicImage, + preprocessor_config: &PreProcessorConfig, + resize_size: u32, + filter: FilterType, + dtype: DType, + device: &Device, + image_mean: &[f32], + image_std: &[f32], + ) -> Result { + let mut image = if preprocessor_config.do_resize.unwrap_or(true) { + Self::resize(image, resize_size, filter) + } else { + image.clone() + }; + image = if preprocessor_config.do_center_crop.unwrap_or(true) { + let crop_width = *preprocessor_config + .crop_size + .as_ref() + .unwrap() + .get("width") + .unwrap(); + let crop_height = *preprocessor_config + .crop_size + .as_ref() + .unwrap() + .get("height") + .unwrap(); + Self::center_crop(&image, (crop_width, crop_height)) + } else { + image + }; + let mut pixel_value = Self::to_tensor(&image, &Device::Cpu)?; + if preprocessor_config.do_rescale.unwrap_or(true) { + let rescale_factor = preprocessor_config.rescale_factor.unwrap(); + pixel_value = Self::rescale(&pixel_value, rescale_factor)?; + } + if preprocessor_config.do_normalize.unwrap_or(true) { + pixel_value = Self::normalize(&pixel_value, image_mean, image_std)?; + } + Self::to_channel_dimension_format(&pixel_value)? + .to_dtype(dtype)? + .to_device(device) + } +} diff --git a/mistralrs-core/src/vision_models/mod.rs b/mistralrs-core/src/vision_models/mod.rs index 33bfb1ccc..3a0ec3a00 100644 --- a/mistralrs-core/src/vision_models/mod.rs +++ b/mistralrs-core/src/vision_models/mod.rs @@ -6,11 +6,14 @@ pub(crate) mod clip; pub(crate) mod idefics2; pub(crate) mod idefics2_input_processor; pub(crate) mod image_processor; + pub(crate) mod llava; pub(crate) mod phi3; pub(crate) mod phi3_inputs_processor; pub(crate) mod preprocessor_config; pub(crate) mod processor_config; +pub(crate) use llava::llava15; +pub(crate) use llava::llava_inputs_processor; pub(crate) use llava::llava_next; pub(crate) use llava::llava_next_inputs_processor; diff --git a/mistralrs-pyo3/src/which.rs b/mistralrs-pyo3/src/which.rs index 059febfde..b728f2a97 100644 --- a/mistralrs-pyo3/src/which.rs +++ b/mistralrs-pyo3/src/which.rs @@ -33,6 +33,7 @@ pub enum VisionArchitecture { Phi3V, Idefics2, LLaVANext, + LLaVA, } impl From for VisionLoaderType { @@ -41,6 +42,7 @@ impl From for VisionLoaderType { VisionArchitecture::Phi3V => VisionLoaderType::Phi3V, VisionArchitecture::Idefics2 => VisionLoaderType::Idefics2, VisionArchitecture::LLaVANext => VisionLoaderType::LLaVANext, + VisionArchitecture::LLaVA => VisionLoaderType::LLaVA, } } } diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index 6d62a24f8..bf9e8c4b2 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -17,17 +17,18 @@ fn setup() -> anyhow::Result> { use_flash_attn: false, repeat_last_n: 64, }, - Some("chat_templates/llava.json".to_string()), + Some("chat_templates/vicuna.json".to_string()), None, - Some("/root/autodl-tmp/cache/huggingface/hub/models--llava-hf--llava-v1.6-vicuna-7b-hf/snapshots/0524afe4453163103dcefe78eb0a58b3f6424eac".to_string()), + Some("/root/autodl-tmp/llava-1.5-7b-hf".to_string()), ) - .build(VisionLoaderType::LLaVANext); + .build(VisionLoaderType::LLaVA); // Load, into a Pipeline let pipeline = loader.load_model_from_hf( None, TokenSource::CacheToken, - &ModelDType::F16, // how can we load from config? + //&ModelDType::F16, // how can we load from config? + &ModelDType::Auto, &Device::cuda_if_available(0)?, false, DeviceMapMetadata::dummy(), @@ -54,13 +55,6 @@ fn main() -> anyhow::Result<()> { ), ])], }, - /* - messages: RequestMessage::Completion { - text: "Hello! My name is ".to_string(), - echo_prompt: false, - best_of: 1, - }, - */ sampling_params: SamplingParams::default(), response: tx, return_logprobs: false, diff --git a/mistralrs/examples/llava_next/main.rs b/mistralrs/examples/llava_next/main.rs new file mode 100644 index 000000000..ce2ec9e0f --- /dev/null +++ b/mistralrs/examples/llava_next/main.rs @@ -0,0 +1,78 @@ +use either::Either; +use image::{ColorType, DynamicImage}; +use indexmap::IndexMap; +use std::sync::Arc; +use tokio::sync::mpsc::channel; + +use mistralrs::{ + Constraint, Device, DeviceMapMetadata, MistralRs, MistralRsBuilder, ModelDType, NormalRequest, + Request, RequestMessage, Response, SamplingParams, SchedulerMethod, TokenSource, + VisionLoaderBuilder, VisionLoaderType, VisionSpecificConfig, +}; + +fn setup() -> anyhow::Result> { + // Select a Mistral model + let loader = VisionLoaderBuilder::new( + VisionSpecificConfig { + use_flash_attn: false, + repeat_last_n: 64, + }, + Some("chat_templates/mistral.json".to_string()), + None, + Some("/root/autodl-tmp/llava-v1.6-mistral-7b-hf".to_string()), + ) + .build(VisionLoaderType::LLaVANext); + // Load, into a Pipeline + + let pipeline = loader.load_model_from_hf( + None, + TokenSource::CacheToken, + &ModelDType::F16, // how can we load from config? + &Device::cuda_if_available(0)?, + false, + DeviceMapMetadata::dummy(), + None, + )?; + // Create the MistralRs, which is a runner + Ok(MistralRsBuilder::new(pipeline, SchedulerMethod::Fixed(5.try_into().unwrap())).build()) +} + +fn main() -> anyhow::Result<()> { + let mistralrs = setup()?; + + let (tx, mut rx) = channel(10_000); + let img = image::io::Reader::open("./cat.jpg")?.decode()?; + let request = Request::Normal(NormalRequest { + messages: RequestMessage::VisionChat { + images: vec![img], + //images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], + messages: vec![IndexMap::from([ + ("role".to_string(), Either::Left("user".to_string())), + ( + "content".to_string(), + Either::Left("<|image_1|>what is this image show?".to_string()), + ), + ])], + }, + sampling_params: SamplingParams::default(), + response: tx, + return_logprobs: false, + is_streaming: false, + id: 0, + constraint: Constraint::None, + suffix: None, + adapters: None, + }); + mistralrs.get_sender()?.blocking_send(request)?; + let response = rx.blocking_recv().unwrap(); + match response { + Response::Done(c) => println!("Text: {}", c.choices[0].message.content), + Response::InternalError(e) => println!("Internal error: {:?}", e), + Response::ValidationError(e) => println!("Validation error: {:?}", e), + Response::ModelError(s, r) => println!("Model error: {:?} {:?}", s, r), + Response::Chunk(_) => println!("Chunk"), + Response::CompletionModelError(_, _) => println!("Completion model error"), + Response::CompletionDone(c) => println!("Text: {}", c.choices[0].text), + } + Ok(()) +} From 376343b06c7efae070cb711aefe9c299440502d6 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Mon, 1 Jul 2024 18:57:20 +0800 Subject: [PATCH 18/34] add some examples and docs --- cat.jpg | Bin 11187 -> 0 bytes docs/LLaVA.md | 216 ++++++++++++++++++ docs/VISION_MODELS.md | 1 + examples/python/llava_next.py | 4 +- examples/server/llava_next.py | 63 +++++ .../src/vision_models/llava/config.rs | 1 - .../src/vision_models/llava/llava15.rs | 8 +- .../llava/llava_inputs_processor.rs | 8 +- .../src/vision_models/llava/llava_next.rs | 7 +- .../llava/llava_next_inputs_processor.rs | 7 +- mistralrs-pyo3/mistralrs.pyi | 2 + mistralrs/Cargo.toml | 8 + mistralrs/examples/llava/main.rs | 7 +- mistralrs/examples/llava_next/main.rs | 10 +- 14 files changed, 309 insertions(+), 33 deletions(-) delete mode 100644 cat.jpg create mode 100644 docs/LLaVA.md create mode 100644 examples/server/llava_next.py diff --git a/cat.jpg b/cat.jpg deleted file mode 100644 index 02ceafc74fae645edb96510a5fdafcba23c28da6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11187 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 lL9iSn%R$QrPC?M}y*HPhJs Note: The image_url may be either a path, URL, or a base64 encoded string. + +--- + +**Image:** + + +**Prompt:** +``` +What is shown in this image? +``` + +**Output:** +``` +The image depicts a group of orange ants climbing over a black pole. The ants are moving in the same direction, forming a line as they ascend the pole. +``` + +--- + +1) Start the server +``` +cargo run --release --features ... -- --port 1234 --isq Q4K vision-plain -m llava-hf/llava-v1.6-mistral-7b-hf -a llava_next +``` + +2) Send a request + +```py +import openai + +completion = openai.chat.completions.create( + model="llava_next", + messages=[ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": { + "url": "https://d2r55xnwy6nx47.cloudfront.net/uploads/2018/02/Ants_Lede1300.jpg" + }, + }, + { + "type": "text", + "text": "What is shown in this image?", + }, + ], + }, + ], + max_tokens=256, + frequency_penalty=1.0, + top_p=0.1, + temperature=0, +) +resp = completion.choices[0].message.content +print(resp) +``` + +- You can find an example of encoding the [image via base64 here](../examples/server/phi3v_base64.py). +- You can find an example of loading an [image locally here](../examples/server/phi3v_local_img.py). + +--- + +## Rust +You can find this example [here](../mistralrs/examples/llava_next/main.rs). + +This is a minimal example of running the LLaVA and LLaVANext model with a dummy image. + +```rust +use either::Either; +use image::{ColorType, DynamicImage}; +use indexmap::IndexMap; +use std::sync::Arc; +use tokio::sync::mpsc::channel; + +use mistralrs::{ + Constraint, Device, DeviceMapMetadata, MistralRs, MistralRsBuilder, NormalRequest, Request, + RequestMessage, Response, SamplingParams, SchedulerMethod, TokenSource, VisionLoaderBuilder, + VisionLoaderType, VisionSpecificConfig, +}; + +fn setup() -> anyhow::Result> { + // Select a Mistral model + let loader = VisionLoaderBuilder::new( + VisionSpecificConfig { + use_flash_attn: false, + repeat_last_n: 64, + }, + None, + None, + Some("llava-hf/llava-v1.6-mistral-7b-hf".to_string()), + ) + .build(VisionLoaderType::Idefics2); + // Load, into a Pipeline + let pipeline = loader.load_model_from_hf( + None, + TokenSource::CacheToken, + None, + &Device::cuda_if_available(0)?, + false, + DeviceMapMetadata::dummy(), + None, + )?; + // Create the MistralRs, which is a runner + Ok(MistralRsBuilder::new(pipeline, SchedulerMethod::Fixed(5.try_into().unwrap())).build()) +} + +fn main() -> anyhow::Result<()> { + let mistralrs = setup()?; + + let (tx, mut rx) = channel(10_000); + let request = Request::Normal(NormalRequest { + messages: RequestMessage::VisionChat { + images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], + messages: vec![IndexMap::from([ + ("role".to_string(), Either::Left("user".to_string())), + ( + "content".to_string(), + Either::Left("What is shown in this image?".to_string()), + ), + ])], + }, + sampling_params: SamplingParams::default(), + response: tx, + return_logprobs: false, + is_streaming: false, + id: 0, + constraint: Constraint::None, + suffix: None, + adapters: None, + }); + mistralrs.get_sender()?.blocking_send(request)?; + + let response = rx.blocking_recv().unwrap(); + match response { + Response::Done(c) => println!("Text: {}", c.choices[0].message.content), + _ => unreachable!(), + } + Ok(()) +} +``` + +## Python +You can find this example [here](../examples/python/llava_next.py). + +This example demonstrates loading and sending a chat completion request with an image. + +> Note: the image_url may be either a path, URL, or a base64 encoded string. + +```py +from mistralrs import Runner, Which, ChatCompletionRequest, VisionArchitecture + +runner = Runner( + which=Which.VisionPlain( + model_id="llava-hf/llava-v1.6-mistral-7b-hf", + tokenizer_json=None, + repeat_last_n=64, + arch=VisionArchitecture.Idefics2, + ), +) + +res = runner.send_chat_completion_request( + ChatCompletionRequest( + model="llava_next", + messages=[ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": { + "url": "https://d2r55xnwy6nx47.cloudfront.net/uploads/2018/02/Ants_Lede1300.jpg" + }, + }, + { + "type": "text", + "text": "What is shown in this image?", + }, + ], + }, + ], + max_tokens=256, + presence_penalty=1.0, + top_p=0.1, + temperature=0.1, + ) +) +print(res.choices[0].message.content) +print(res.usage) +``` + +- You can find an example of encoding the [image via base64 here](../examples/python/phi3v_base64.py). +- You can find an example of loading an [image locally here](../examples/python/phi3v_local_img.py). \ No newline at end of file diff --git a/docs/VISION_MODELS.md b/docs/VISION_MODELS.md index dd7bb4f10..c95b9988e 100644 --- a/docs/VISION_MODELS.md +++ b/docs/VISION_MODELS.md @@ -6,6 +6,7 @@ Please see docs for the following model types: - Phi 3 Vision: [PHI3V.md](PHI3V.md) - Idefics2: [IDEFICS2.md](IDEFICS2.md) +- LLaVA and LLaVANext [LLAVA.md](LLAVA.md) > Note for the Python and HTTP APIs: > We follow the OpenAI specification for structuring the image messages and allow both base64 encoded images as well as a URL/path to the image. There are many examples of this, see [this Python example](../examples/python/phi3v.py). \ No newline at end of file diff --git a/examples/python/llava_next.py b/examples/python/llava_next.py index d3eebfaa4..e93b6f59b 100644 --- a/examples/python/llava_next.py +++ b/examples/python/llava_next.py @@ -2,7 +2,7 @@ runner = Runner( which=Which.VisionPlain( - model_id="/root/autodl-tmp/llava-v1.6-mistral-7b-hf", + model_id="llava-hf/llava-v1.6-mistral-7b-hf", tokenizer_json=None, repeat_last_n=64, arch=VisionArchitecture.LLaVANext, @@ -19,7 +19,7 @@ { "type": "image_url", "image_url": { - "url": "https://upload.wikimedia.org/wikipedia/commons/e/e7/Everest_North_Face_toward_Base_Camp_Tibet_Luca_Galuzzi_2006.jpg" + "url": "https://www.nhmagazine.com/content/uploads/2019/05/mtwashingtonFranconia-2-19-18-108-Edit-Edit.jpg" }, }, { diff --git a/examples/server/llava_next.py b/examples/server/llava_next.py new file mode 100644 index 000000000..92e7e6f44 --- /dev/null +++ b/examples/server/llava_next.py @@ -0,0 +1,63 @@ +import openai +import httpx +import textwrap, json + + +def log_response(response: httpx.Response): + request = response.request + print(f"Request: {request.method} {request.url}") + print(" Headers:") + for key, value in request.headers.items(): + if key.lower() == "authorization": + value = "[...]" + if key.lower() == "cookie": + value = value.split("=")[0] + "=..." + print(f" {key}: {value}") + print(" Body:") + try: + request_body = json.loads(request.content) + print(textwrap.indent(json.dumps(request_body, indent=2), " ")) + except json.JSONDecodeError: + print(textwrap.indent(request.content.decode(), " ")) + print(f"Response: status_code={response.status_code}") + print(" Headers:") + for key, value in response.headers.items(): + if key.lower() == "set-cookie": + value = value.split("=")[0] + "=..." + print(f" {key}: {value}") + + +openai.api_key = "EMPTY" +openai.base_url = "http://localhost:1234/v1/" + +# Enable this to log requests and responses +# openai.http_client = httpx.Client( +# event_hooks={"request": [print], "response": [log_response]} +# ) + +completion = openai.chat.completions.create( + model="llava_next", + messages=[ + { + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": { + "url": "https://www.nhmagazine.com/content/uploads/2019/05/mtwashingtonFranconia-2-19-18-108-Edit-Edit.jpg" + }, + }, + { + "type": "text", + "text": "<|image_1|>\nWhat is shown in this image? Write a detailed response analyzing the scene.", + }, + ], + }, + ], + max_tokens=256, + frequency_penalty=1.0, + top_p=0.1, + temperature=0, +) +resp = completion.choices[0].message.content +print(resp) diff --git a/mistralrs-core/src/vision_models/llava/config.rs b/mistralrs-core/src/vision_models/llava/config.rs index 5b12853e3..87deb1667 100644 --- a/mistralrs-core/src/vision_models/llava/config.rs +++ b/mistralrs-core/src/vision_models/llava/config.rs @@ -12,7 +12,6 @@ pub struct Config { pub image_grid_pinpoints: Option>, pub projector_hidden_act: String, pub text_config: LLaVATextConfig, - pub torch_dtype: String, pub vision_config: LLaVAVisionConfig, pub vision_feature_layer: isize, pub vision_feature_select_strategy: String, diff --git a/mistralrs-core/src/vision_models/llava/llava15.rs b/mistralrs-core/src/vision_models/llava/llava15.rs index aed3e2490..d331361c3 100644 --- a/mistralrs-core/src/vision_models/llava/llava15.rs +++ b/mistralrs-core/src/vision_models/llava/llava15.rs @@ -103,6 +103,7 @@ pub struct Model { llm: Box, config: Config, device: Device, + dtype: DType, } impl Model { @@ -113,7 +114,7 @@ impl Model { normal_loading_metadata: NormalLoadingMetadata, ) -> Result { let device = normal_loading_metadata.real_device.clone(); - + let dtype = vb.dtype(); let clip_config = config.to_clip_config(); let mm_projector = MMProjector::new(&vb, config)?; let clip_vision_tower = ClipVisionTower::new( @@ -154,6 +155,7 @@ impl Model { llm, config: config.clone(), device, + dtype, }) } @@ -181,11 +183,11 @@ impl Model { .collect::>>()?; let mut result = input_ids.clamp(0i64, i64::MAX)?.to_dtype(DType::U32)?; result = self.llm.embed(&result)?; //[seq_len,hidden_size] - let image_features = self.encode_images(images)?; //[num of images,patch_size*patch_size,hidden_size] + let image_features = self.encode_images(&images.to_dtype(self.dtype)?)?; //[num of images,patch_size*patch_size,hidden_size] let num_of_images = image_features.shape().dims()[0]; let mut image_features_vec = Vec::new(); for i in 0..num_of_images { - image_features_vec.push(image_features.get(i)?.flatten(0, 1)?); + image_features_vec.push(image_features.get(i)?.unsqueeze(0)?); } for (i, image_index) in image_indexes.iter().enumerate() { let image_id = image_ids[i]; diff --git a/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs b/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs index 885120a2e..14c80f59a 100644 --- a/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs @@ -287,12 +287,6 @@ impl ImagePreProcessor for LLaVAInputProcessor { let original_size = images[0].dimensions(); let filter = config.resampling.to_filter()?; - let dtype = match self.model_config.torch_dtype.as_str() { - "float16" => DType::F16, - "bfloat16" => DType::BF16, - "float32" => DType::F32, - _ => candle_core::bail!("unsupported dtype"), - }; let image_mean = config .image_mean .unwrap_or(Self::DEFAULT_MEAN) @@ -315,7 +309,7 @@ impl ImagePreProcessor for LLaVAInputProcessor { config, resized_size as u32, filter, - dtype, + DType::BF16, device, &image_mean, &image_std, diff --git a/mistralrs-core/src/vision_models/llava/llava_next.rs b/mistralrs-core/src/vision_models/llava/llava_next.rs index edaad695e..94fa5622b 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next.rs @@ -112,6 +112,7 @@ pub struct Model { llm: Box, config: Config, device: Device, + dtype: DType, } impl Model { @@ -122,7 +123,7 @@ impl Model { normal_loading_metadata: NormalLoadingMetadata, ) -> Result { let device = normal_loading_metadata.real_device.clone(); - + let dtype = vb.dtype(); let clip_config = config.to_clip_config(); let mm_projector = MMProjector::new(&vb, config)?; let clip_vision_tower = ClipVisionTower::new( @@ -167,6 +168,7 @@ impl Model { llm, config: config.clone(), device, + dtype, }) } @@ -217,8 +219,7 @@ impl Model { .collect::>>()?; let mut result = input_ids.clamp(0i64, i64::MAX)?.to_dtype(DType::U32)?; result = self.llm.embed(&result)?; //[seq_len,hidden_size] - let image_features = self.encode_images(images)?; //[sum of samples of all images,patch_size*patch_size,hidden_size] - println!("image_features.shape = {:?}", image_features.shape()); + let image_features = self.encode_images(&images.to_dtype(self.dtype)?)?; //[sum of samples of all images,patch_size*patch_size,hidden_size] let mut image_features_vec = Vec::new(); let mut index = 0; for num_image_sample in num_image_samples { diff --git a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs index ef6facf58..763828c44 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs @@ -351,11 +351,6 @@ impl ImagePreProcessor for LLaVANextInputProcessor { ) { samples.push(patch); } - let dtype = match self.model_config.torch_dtype.as_str() { - "float16" => DType::F16, - "bfloat16" => DType::BF16, - _ => candle_core::bail!("unsupported dtype"), - }; let image_mean = config .image_mean .unwrap_or(Self::DEFAULT_MEAN) @@ -372,7 +367,7 @@ impl ImagePreProcessor for LLaVANextInputProcessor { config, resized_size as u32, filter, - dtype, + DType::BF16, device, &image_mean, &image_std, diff --git a/mistralrs-pyo3/mistralrs.pyi b/mistralrs-pyo3/mistralrs.pyi index a0a10e32d..00da6c861 100644 --- a/mistralrs-pyo3/mistralrs.pyi +++ b/mistralrs-pyo3/mistralrs.pyi @@ -68,6 +68,8 @@ class Architecture(Enum): class VisionArchitecture(Enum): Phi3V = "phi3v" Idefics2 = "idefics2" + LLaVANext = "LLaVANext" + LLaVA = "LLaVA" class Which(Enum): """ diff --git a/mistralrs/Cargo.toml b/mistralrs/Cargo.toml index f8a2d6dbb..86bc7e7c6 100644 --- a/mistralrs/Cargo.toml +++ b/mistralrs/Cargo.toml @@ -68,3 +68,11 @@ required-features = [] [[example]] name = "idefics2" required-features = [] + +[[example]] +name = "llava" +required-features = [] + +[[example]] +name = "llava_next" +required-features = [] diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index bf9e8c4b2..c5795ca06 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -19,7 +19,7 @@ fn setup() -> anyhow::Result> { }, Some("chat_templates/vicuna.json".to_string()), None, - Some("/root/autodl-tmp/llava-1.5-7b-hf".to_string()), + Some("llava-hf/llava-1.5-7b-hf".to_string()), ) .build(VisionLoaderType::LLaVA); // Load, into a Pipeline @@ -27,7 +27,6 @@ fn setup() -> anyhow::Result> { let pipeline = loader.load_model_from_hf( None, TokenSource::CacheToken, - //&ModelDType::F16, // how can we load from config? &ModelDType::Auto, &Device::cuda_if_available(0)?, false, @@ -42,11 +41,9 @@ fn main() -> anyhow::Result<()> { let mistralrs = setup()?; let (tx, mut rx) = channel(10_000); - let img = image::io::Reader::open("./cat.jpg")?.decode()?; let request = Request::Normal(NormalRequest { messages: RequestMessage::VisionChat { - images: vec![img], - //images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], + images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], messages: vec![IndexMap::from([ ("role".to_string(), Either::Left("user".to_string())), ( diff --git a/mistralrs/examples/llava_next/main.rs b/mistralrs/examples/llava_next/main.rs index ce2ec9e0f..ee4473a0e 100644 --- a/mistralrs/examples/llava_next/main.rs +++ b/mistralrs/examples/llava_next/main.rs @@ -17,9 +17,9 @@ fn setup() -> anyhow::Result> { use_flash_attn: false, repeat_last_n: 64, }, - Some("chat_templates/mistral.json".to_string()), None, - Some("/root/autodl-tmp/llava-v1.6-mistral-7b-hf".to_string()), + None, + Some("llava-hf/llava-v1.6-mistral-7b-hf".to_string()), ) .build(VisionLoaderType::LLaVANext); // Load, into a Pipeline @@ -27,7 +27,7 @@ fn setup() -> anyhow::Result> { let pipeline = loader.load_model_from_hf( None, TokenSource::CacheToken, - &ModelDType::F16, // how can we load from config? + &ModelDType::Auto, &Device::cuda_if_available(0)?, false, DeviceMapMetadata::dummy(), @@ -41,11 +41,9 @@ fn main() -> anyhow::Result<()> { let mistralrs = setup()?; let (tx, mut rx) = channel(10_000); - let img = image::io::Reader::open("./cat.jpg")?.decode()?; let request = Request::Normal(NormalRequest { messages: RequestMessage::VisionChat { - images: vec![img], - //images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], + images: vec![DynamicImage::new(1280, 720, ColorType::Rgb8)], messages: vec![IndexMap::from([ ("role".to_string(), Either::Left("user".to_string())), ( From 3768c5bb498330e16b71e9cc63c4f908ad930479 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Mon, 1 Jul 2024 23:01:47 +0800 Subject: [PATCH 19/34] Update main.rs. remove a redundant comment --- mistralrs/examples/llava/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index c5795ca06..8efd50d59 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -11,7 +11,6 @@ use mistralrs::{ }; fn setup() -> anyhow::Result> { - // Select a Mistral model let loader = VisionLoaderBuilder::new( VisionSpecificConfig { use_flash_attn: false, From 86219a708222ac3c74f92afc500492dd9b477d19 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Mon, 1 Jul 2024 23:08:25 +0800 Subject: [PATCH 20/34] update some deps --- mistralrs-core/src/lib.rs | 10 +++++----- mistralrs-core/src/pipeline/mod.rs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mistralrs-core/src/lib.rs b/mistralrs-core/src/lib.rs index da1b044cc..7e1517677 100644 --- a/mistralrs-core/src/lib.rs +++ b/mistralrs-core/src/lib.rs @@ -53,11 +53,11 @@ pub use device_map::{DeviceLayerMapMetadata, DeviceMapMetadata, LayerDeviceMappe pub use pipeline::{ chat_template::ChatTemplate, GGMLLoader, GGMLLoaderBuilder, GGMLSpecificConfig, GGUFArchitecture, GGUFLoader, GGUFLoaderBuilder, GGUFSpecificConfig, GemmaLoader, - Idefics2Loader, LLaVANextLoader, LlamaLoader, Loader, LocalModelPaths, MistralLoader, - MixtralLoader, ModelKind, ModelPaths, NormalLoader, NormalLoaderBuilder, NormalLoaderType, - NormalSpecificConfig, Phi2Loader, Phi3Loader, Phi3VLoader, Qwen2Loader, SpeculativeConfig, - SpeculativeLoader, SpeculativePipeline, TokenSource, VisionLoader, VisionLoaderBuilder, - VisionLoaderType, VisionModelLoader, VisionSpecificConfig, + Idefics2Loader, LLaVALoader, LLaVANextLoader, LlamaLoader, Loader, LocalModelPaths, + MistralLoader, MixtralLoader, ModelKind, ModelPaths, NormalLoader, NormalLoaderBuilder, + NormalLoaderType, NormalSpecificConfig, Phi2Loader, Phi3Loader, Phi3VLoader, Qwen2Loader, + SpeculativeConfig, SpeculativeLoader, SpeculativePipeline, TokenSource, VisionLoader, + VisionLoaderBuilder, VisionLoaderType, VisionModelLoader, VisionSpecificConfig, }; pub use request::{Constraint, MessageContent, NormalRequest, Request, RequestMessage}; pub use response::Response; diff --git a/mistralrs-core/src/pipeline/mod.rs b/mistralrs-core/src/pipeline/mod.rs index 6f76ac546..bb4819d62 100644 --- a/mistralrs-core/src/pipeline/mod.rs +++ b/mistralrs-core/src/pipeline/mod.rs @@ -43,7 +43,7 @@ use tokenizers::Tokenizer; use tokio::sync::Mutex; pub use vision::{VisionLoader, VisionLoaderBuilder, VisionSpecificConfig}; pub use vision_loaders::{ - Idefics2Loader, LLaVANextLoader, Phi3VLoader, VisionLoaderType, VisionModelLoader, + Idefics2Loader, LLaVALoader, LLaVANextLoader, Phi3VLoader, VisionLoaderType, VisionModelLoader, }; use anyhow::Result; From 6c8126c43bd81a74f5c4c85fc0fb4dc496228403 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Mon, 1 Jul 2024 23:28:25 +0800 Subject: [PATCH 21/34] fmt --- mistralrs-core/src/lib.rs | 16 +-- .../src/vision_models/llava/llava15.rs | 2 +- .../vision_models/llava/llava_llm/llama.rs | 122 +++++++++++++++++- .../src/vision_models/llava/llava_next.rs | 2 +- 4 files changed, 127 insertions(+), 15 deletions(-) diff --git a/mistralrs-core/src/lib.rs b/mistralrs-core/src/lib.rs index 519fa0e61..b0c60dd44 100644 --- a/mistralrs-core/src/lib.rs +++ b/mistralrs-core/src/lib.rs @@ -53,14 +53,14 @@ mod xlora_models; pub use amoe::{AnyMoeConfig, AnyMoeExpertType}; pub use device_map::{DeviceLayerMapMetadata, DeviceMapMetadata, LayerDeviceMapper}; pub use pipeline::{ - chat_template::ChatTemplate, GGMLLoader, GGMLLoaderBuilder, GGMLSpecificConfig, - GGUFArchitecture, GGUFLoader, GGUFLoaderBuilder, GGUFSpecificConfig, GemmaLoader, - Idefics2Loader, LLaVALoader, LLaVANextLoader, LlamaLoader, Loader, LocalModelPaths, - MistralLoader, MixtralLoader, ModelKind, ModelPaths, NormalLoader, NormalLoaderBuilder, - NormalLoaderType, NormalSpecificConfig, Phi2Loader, Phi3Loader, Phi3VLoader, Qwen2Loader, - SpeculativeConfig, SpeculativeLoader, SpeculativePipeline, TokenSource, VisionLoader, - VisionLoaderBuilder, VisionLoaderType, VisionModelLoader, VisionSpecificConfig, - AnyMoeLoader, AnyMoePipeline, + chat_template::ChatTemplate, AnyMoeLoader, AnyMoePipeline, GGMLLoader, GGMLLoaderBuilder, + GGMLSpecificConfig, GGUFArchitecture, GGUFLoader, GGUFLoaderBuilder, GGUFSpecificConfig, + GemmaLoader, Idefics2Loader, LLaVALoader, LLaVANextLoader, LlamaLoader, Loader, + LocalModelPaths, MistralLoader, MixtralLoader, ModelKind, ModelPaths, NormalLoader, + NormalLoaderBuilder, NormalLoaderType, NormalSpecificConfig, Phi2Loader, Phi3Loader, + Phi3VLoader, Qwen2Loader, SpeculativeConfig, SpeculativeLoader, SpeculativePipeline, + TokenSource, VisionLoader, VisionLoaderBuilder, VisionLoaderType, VisionModelLoader, + VisionSpecificConfig, }; pub use request::{Constraint, MessageContent, NormalRequest, Request, RequestMessage}; pub use response::Response; diff --git a/mistralrs-core/src/vision_models/llava/llava15.rs b/mistralrs-core/src/vision_models/llava/llava15.rs index d331361c3..c6cd3d0ae 100644 --- a/mistralrs-core/src/vision_models/llava/llava15.rs +++ b/mistralrs-core/src/vision_models/llava/llava15.rs @@ -168,7 +168,7 @@ impl Model { pub fn prepare_inputs_labels_for_multimodal( &self, input_ids: &Tensor, //[1,seq_len] - images: &Tensor, //[sum of samples of all images,chanel,width,height] + images: &Tensor, //[sum of samples of all images,channel,width,height] num_image_tokens: usize, ) -> Result { let image_indexes = input_ids diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs index 03185bb9c..b5a3d15c2 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs @@ -9,11 +9,7 @@ use candle_core::{quantized::QMatMul, DType, Device, Result, Tensor}; use candle_nn::{embedding, linear_no_bias as linear, Embedding, Module, VarBuilder}; use crate::{ - device_map::DeviceMapper, - layers::{repeat_kv, CausalMasker, MatMul, RmsNorm, ScaledDotProductAttention}, - models::llama::Config, - pipeline::{extract_logits, IsqModel, NormalLoadingMetadata, NormalModel}, - utils::progress::NiceProgressBar, + amoe::{AnyMoeBaseModelMixin, MlpLayer}, device_map::DeviceMapper, layers::{repeat_kv, CausalMasker, MatMul, RmsNorm, ScaledDotProductAttention}, models::llama::Config, pipeline::{extract_logits, IsqModel, NormalLoadingMetadata, NormalModel}, utils::progress::NiceProgressBar, AnyMoeConfig, AnyMoeExpertType }; use super::{LLaVALLM, OrdinaryRoPE}; @@ -438,3 +434,119 @@ impl LLaVALLM for Llama { extract_logits(&logits, context_lens) } } + + +impl AnyMoeBaseModelMixin for Llama { + fn get_mlps(&self) -> Vec<&dyn MlpLayer> { + let mut mlps = Vec::new(); + for layer in &self.blocks { + mlps.push(&*layer.mlp); + } + mlps + } + fn get_mlps_mut(&mut self) -> Vec<&mut Box> { + let mut mlps = Vec::new(); + for layer in &mut self.blocks { + mlps.push(&mut layer.mlp); + } + mlps + } + fn create_anymoe_layers( + &mut self, + additional_vbs: Vec, + config: AnyMoeConfig, + dtype: DType, + dev: &Device, + (prefix, mlp): (String, String), + mut layers: Vec, + expert_type: AnyMoeExpertType, + ) -> Result<()> { + let mut experts: Vec>> = Vec::new(); + if layers.is_empty() { + layers = (0..self.blocks.len()).collect::>(); + } + for _ in 0..layers.len() { + experts.push(Vec::new()); + } + for vb in additional_vbs { + let vb = vb.pp(&prefix); + for (layer, row) in experts.iter_mut().enumerate() { + if !layers.contains(&layer) { + continue; + } + + let intermediate_size = self.blocks[layer].mlp.get_params()[1]; + let hidden_size = self.blocks[layer].mlp.get_params()[0]; + match expert_type { + AnyMoeExpertType::FineTuned => { + row.push(Box::new(Mlp::load( + vb.pp(layer).pp(&mlp), + &Config { + intermediate_size: self.blocks[layer].mlp.get_params()[1], + hidden_size: self.blocks[layer].mlp.get_params()[0], + ..Default::default() + }, + )?)); + } + AnyMoeExpertType::LoraAdapter { + rank, + alpha, + ref target_modules, + } => { + let vb_mlp = vb.pp(layer).pp(&mlp); + + let c_fc1_delta = if target_modules.contains(&"c_fc1".to_string()) { + Some(get_delta_from_lora_ab!( + vb_mlp, + rank, + alpha, + (hidden_size, intermediate_size), + "c_fc1" + )) + } else { + None + }; + let c_fc2_delta = if target_modules.contains(&"c_fc2".to_string()) { + Some(get_delta_from_lora_ab!( + vb_mlp, + rank, + alpha, + (hidden_size, intermediate_size), + "c_fc2" + )) + } else { + None + }; + let c_proj_delta = if target_modules.contains(&"c_proj".to_string()) { + Some(get_delta_from_lora_ab!( + vb_mlp, + rank, + alpha, + (intermediate_size, hidden_size), + "c_proj" + )) + } else { + None + }; + + row.push(self.blocks[layer].mlp.new_added_delta(vec![ + c_fc1_delta, + c_fc2_delta, + c_proj_delta, + ])?); + } + } + } + } + for (layer, expert) in layers.into_iter().zip(experts) { + let mut experts_all = vec![self.blocks[layer].mlp.clone()]; + experts_all.extend(expert); + self.blocks[layer].mlp = + Box::new(MoeMlp::new(experts_all, config.clone(), dtype, dev)?); + } + Ok(()) + } + fn amoe_supported(&self) -> bool { + true + } +} diff --git a/mistralrs-core/src/vision_models/llava/llava_next.rs b/mistralrs-core/src/vision_models/llava/llava_next.rs index 94fa5622b..f51290193 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next.rs @@ -202,7 +202,7 @@ impl Model { pub fn prepare_inputs_labels_for_multimodal( &self, input_ids: &Tensor, //[1,seq_len] - images: &Tensor, //[sum of samples of all images,chanel,width,height] + images: &Tensor, //[sum of samples of all images,channel,width,height] num_image_tokens: Vec, num_image_samples: Vec, image_sizes: &[(u32, u32)], From 106b23c2e4d03f5e524c9d4d729efba87f057c30 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Mon, 1 Jul 2024 23:57:39 +0800 Subject: [PATCH 22/34] modify llavallm. not support anymoe yet --- .../vision_models/llava/llava_llm/llama.rs | 210 +++--------------- .../vision_models/llava/llava_llm/mistral.rs | 64 ++---- .../src/vision_models/llava/llava_llm/mod.rs | 14 +- mistralrs/examples/llava/main.rs | 1 + mistralrs/examples/llava_next/main.rs | 1 + 5 files changed, 68 insertions(+), 222 deletions(-) diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs index b5a3d15c2..09a25767b 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs @@ -9,7 +9,11 @@ use candle_core::{quantized::QMatMul, DType, Device, Result, Tensor}; use candle_nn::{embedding, linear_no_bias as linear, Embedding, Module, VarBuilder}; use crate::{ - amoe::{AnyMoeBaseModelMixin, MlpLayer}, device_map::DeviceMapper, layers::{repeat_kv, CausalMasker, MatMul, RmsNorm, ScaledDotProductAttention}, models::llama::Config, pipeline::{extract_logits, IsqModel, NormalLoadingMetadata, NormalModel}, utils::progress::NiceProgressBar, AnyMoeConfig, AnyMoeExpertType + device_map::DeviceMapper, + layers::{repeat_kv, CausalMasker, MatMul, RmsNorm, ScaledDotProductAttention}, + models::llama::Config, + pipeline::{extract_logits, IsqModel, NormalLoadingMetadata}, + utils::progress::NiceProgressBar, }; use super::{LLaVALLM, OrdinaryRoPE}; @@ -24,7 +28,6 @@ struct CausalSelfAttention { num_key_value_heads: usize, head_dim: usize, use_flash_attn: bool, - max_seq_len: usize, } impl CausalSelfAttention { @@ -113,7 +116,6 @@ impl CausalSelfAttention { num_key_value_heads: cfg.num_key_value_heads, head_dim: cfg.hidden_size / cfg.num_attention_heads, use_flash_attn: cfg.use_flash_attn, - max_seq_len: cfg.max_position_embeddings, }) } } @@ -298,19 +300,20 @@ impl Llama { )?; let head_dim = cfg.hidden_size / cfg.num_attention_heads; - let blocks: Vec<_> = NiceProgressBar(0..cfg.num_hidden_layers, "Loading repeating layers") - .into_iter() - .map(|i| { - Block::load( - vb.pp(&format!("model.layers.{i}")), - cfg, - &*mapper, - i, - normal_loading_metadata.loading_isq, - ) - .expect("Failed to load block.") - }) - .collect(); + let blocks: Vec<_> = + NiceProgressBar::<_, 'b'>(0..cfg.num_hidden_layers, "Loading repeating layers") + .into_iter() + .map(|i| { + Block::load( + vb.pp(&format!("model.layers.{i}")), + cfg, + &*mapper, + i, + normal_loading_metadata.loading_isq, + ) + .expect("Failed to load block.") + }) + .collect(); let rope_parameters = OrdinaryRoPE::create_parameters( head_dim, cfg.max_position_embeddings, @@ -348,51 +351,6 @@ impl IsqModel for Llama { } } -impl NormalModel for Llama { - fn forward( - &self, - input_ids: &Tensor, - seqlen_offsets: &[usize], - start_offsets_kernel: Tensor, - context_lens: Vec<(usize, usize)>, - _position_ids: Vec, - ) -> Result { - self.forward_input( - input_ids, - seqlen_offsets, - start_offsets_kernel, - context_lens, - ) - } - fn xlora_forward( - &self, - _input_ids: &Tensor, - _input_ids_full: &Tensor, - _seqlen_offsets: &[usize], - _seqlen_offsets_full: &[usize], - _start_offsets_kernel: Tensor, - _start_offsets_kernel_full: Tensor, - _no_kv_cache: bool, - _non_granular_state: &Option, - _context_lens: Vec<(usize, usize)>, - _position_ids: Vec, - ) -> Result { - unimplemented!() - } - fn cache(&self) -> &crate::pipeline::Cache { - &self.kv_cache - } - fn device(&self) -> &Device { - &self.device - } - fn is_xlora(&self) -> bool { - false - } - fn max_seq_len(&self) -> usize { - self.blocks[0].attn.max_seq_len - } -} - impl LLaVALLM for Llama { fn embed(&self, input_ids: &Tensor) -> Result { self.wte.forward(input_ids) @@ -433,120 +391,22 @@ impl LLaVALLM for Llama { let logits = MatMul.qmatmul(&x, &self.lm_head)?; extract_logits(&logits, context_lens) } -} - - -impl AnyMoeBaseModelMixin for Llama { - fn get_mlps(&self) -> Vec<&dyn MlpLayer> { - let mut mlps = Vec::new(); - for layer in &self.blocks { - mlps.push(&*layer.mlp); - } - mlps - } - fn get_mlps_mut(&mut self) -> Vec<&mut Box> { - let mut mlps = Vec::new(); - for layer in &mut self.blocks { - mlps.push(&mut layer.mlp); - } - mlps - } - fn create_anymoe_layers( - &mut self, - additional_vbs: Vec, - config: AnyMoeConfig, - dtype: DType, - dev: &Device, - (prefix, mlp): (String, String), - mut layers: Vec, - expert_type: AnyMoeExpertType, - ) -> Result<()> { - let mut experts: Vec>> = Vec::new(); - if layers.is_empty() { - layers = (0..self.blocks.len()).collect::>(); - } - for _ in 0..layers.len() { - experts.push(Vec::new()); - } - for vb in additional_vbs { - let vb = vb.pp(&prefix); - for (layer, row) in experts.iter_mut().enumerate() { - if !layers.contains(&layer) { - continue; - } - - let intermediate_size = self.blocks[layer].mlp.get_params()[1]; - let hidden_size = self.blocks[layer].mlp.get_params()[0]; - match expert_type { - AnyMoeExpertType::FineTuned => { - row.push(Box::new(Mlp::load( - vb.pp(layer).pp(&mlp), - &Config { - intermediate_size: self.blocks[layer].mlp.get_params()[1], - hidden_size: self.blocks[layer].mlp.get_params()[0], - ..Default::default() - }, - )?)); - } - AnyMoeExpertType::LoraAdapter { - rank, - alpha, - ref target_modules, - } => { - let vb_mlp = vb.pp(layer).pp(&mlp); - - let c_fc1_delta = if target_modules.contains(&"c_fc1".to_string()) { - Some(get_delta_from_lora_ab!( - vb_mlp, - rank, - alpha, - (hidden_size, intermediate_size), - "c_fc1" - )) - } else { - None - }; - let c_fc2_delta = if target_modules.contains(&"c_fc2".to_string()) { - Some(get_delta_from_lora_ab!( - vb_mlp, - rank, - alpha, - (hidden_size, intermediate_size), - "c_fc2" - )) - } else { - None - }; - let c_proj_delta = if target_modules.contains(&"c_proj".to_string()) { - Some(get_delta_from_lora_ab!( - vb_mlp, - rank, - alpha, - (intermediate_size, hidden_size), - "c_proj" - )) - } else { - None - }; - - row.push(self.blocks[layer].mlp.new_added_delta(vec![ - c_fc1_delta, - c_fc2_delta, - c_proj_delta, - ])?); - } - } - } - } - for (layer, expert) in layers.into_iter().zip(experts) { - let mut experts_all = vec![self.blocks[layer].mlp.clone()]; - experts_all.extend(expert); - self.blocks[layer].mlp = - Box::new(MoeMlp::new(experts_all, config.clone(), dtype, dev)?); - } - Ok(()) + fn forward( + &self, + input_ids: &Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + _position_ids: Vec, + ) -> Result { + self.forward_input( + input_ids, + seqlen_offsets, + start_offsets_kernel, + context_lens, + ) } - fn amoe_supported(&self) -> bool { - true + fn cache(&self) -> &crate::pipeline::Cache { + &self.kv_cache } } diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs b/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs index 7ed92dbe1..26d0afebf 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs @@ -7,7 +7,7 @@ use candle_nn::{linear_no_bias, Activation, VarBuilder}; use crate::{ device_map::DeviceMapper, layers::{repeat_kv, CausalMasker, MatMul, RmsNorm, ScaledDotProductAttention}, - pipeline::{extract_logits, Cache, IsqModel, NormalLoadingMetadata, NormalModel}, + pipeline::{extract_logits, Cache, IsqModel, NormalLoadingMetadata}, utils::progress::NiceProgressBar, }; @@ -249,7 +249,6 @@ pub struct Model { sliding_window: Option, pub device: Device, pub cache: Cache, - pub max_seq_len: usize, mapper: Box, rope_parameters: (Tensor, Tensor), } @@ -294,7 +293,9 @@ impl Model { vb_m.dtype(), &normal_loading_metadata.real_device, )?; - for layer_idx in NiceProgressBar(0..cfg.num_hidden_layers, "Loading repeating layers") { + for layer_idx in + NiceProgressBar::<_, 'b'>(0..cfg.num_hidden_layers, "Loading repeating layers") + { let layer = DecoderLayer::new( cfg, vb_l.pp(layer_idx), @@ -322,7 +323,6 @@ impl Model { sliding_window: cfg.sliding_window, device: normal_loading_metadata.real_device, cache: Cache::new(cfg.num_hidden_layers, false), - max_seq_len: cfg.max_position_embeddings, mapper, rope_parameters, }) @@ -405,70 +405,44 @@ impl IsqModel for Model { } } -impl NormalModel for Model { - fn forward( +impl LLaVALLM for Model { + fn embed(&self, input_ids: &Tensor) -> Result { + self.get_input_embeddings(input_ids) + } + + fn forward_input_embed( &self, input_ids: &Tensor, + input_embed: Tensor, seqlen_offsets: &[usize], start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, - _position_ids: Vec, ) -> Result { - self.forward( + self.forward_embeds( input_ids, + input_embed, seqlen_offsets, start_offsets_kernel, context_lens, ) } - fn xlora_forward( - &self, - _input_ids: &Tensor, - _input_ids_full: &Tensor, - _seqlen_offsets: &[usize], - _seqlen_offsets_full: &[usize], - _start_offsets_kernel: Tensor, - _start_offsets_kernel_full: Tensor, - _no_kv_cache: bool, - _non_granular_state: &Option, - _context_lens: Vec<(usize, usize)>, - _position_ids: Vec, - ) -> Result { - unimplemented!() - } - fn cache(&self) -> &Cache { - &self.cache - } - fn device(&self) -> &Device { - &self.device - } - fn is_xlora(&self) -> bool { - false - } - fn max_seq_len(&self) -> usize { - self.max_seq_len - } -} - -impl LLaVALLM for Model { - fn embed(&self, input_ids: &Tensor) -> Result { - self.get_input_embeddings(input_ids) - } - fn forward_input_embed( + fn forward( &self, input_ids: &Tensor, - input_embed: Tensor, seqlen_offsets: &[usize], start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, + _position_ids: Vec, ) -> Result { - self.forward_embeds( + self.forward( input_ids, - input_embed, seqlen_offsets, start_offsets_kernel, context_lens, ) } + fn cache(&self) -> &Cache { + &self.cache + } } diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs index 467c3a600..1a6ed80b3 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs @@ -1,9 +1,10 @@ #![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] use candle_core::{DType, Device, Result, Tensor}; -use crate::pipeline::{IsqModel, NormalModel}; +use crate::pipeline::{Cache, IsqModel}; -pub(crate) trait LLaVALLM: IsqModel + NormalModel + Sync + Send { +pub(crate) trait LLaVALLM: IsqModel + Sync + Send { + //Normal model without anymoe, but add embed and forward_input_embed. This is only a temporary solution. Finally when the rope problem solved for normal LLM models, we should refactor this. fn embed(&self, input_ids: &Tensor) -> Result; fn forward_input_embed( &self, @@ -13,6 +14,15 @@ pub(crate) trait LLaVALLM: IsqModel + NormalModel + Sync + Send { start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, ) -> Result; + fn forward( + &self, + input_ids: &Tensor, + seqlen_offsets: &[usize], + start_offsets_kernel: Tensor, + context_lens: Vec<(usize, usize)>, + position_ids: Vec, + ) -> candle_core::Result; + fn cache(&self) -> &Cache; } #[derive(Debug)] diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index 8efd50d59..bc87d9e8e 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -70,6 +70,7 @@ fn main() -> anyhow::Result<()> { Response::Chunk(_) => println!("Chunk"), Response::CompletionModelError(_, _) => println!("Completion model error"), Response::CompletionDone(c) => println!("Text: {}", c.choices[0].text), + _ => unreachable!("Unexpected response"), } Ok(()) } diff --git a/mistralrs/examples/llava_next/main.rs b/mistralrs/examples/llava_next/main.rs index ee4473a0e..629d3019a 100644 --- a/mistralrs/examples/llava_next/main.rs +++ b/mistralrs/examples/llava_next/main.rs @@ -71,6 +71,7 @@ fn main() -> anyhow::Result<()> { Response::Chunk(_) => println!("Chunk"), Response::CompletionModelError(_, _) => println!("Completion model error"), Response::CompletionDone(c) => println!("Text: {}", c.choices[0].text), + _ => unreachable!("Unexpected response"), } Ok(()) } From 6b3fb78c5be7d8948dd926c1978657766fd0dbe3 Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Tue, 2 Jul 2024 10:50:48 +0800 Subject: [PATCH 23/34] add moe support --- .../src/vision_models/llava/llava15.rs | 39 +++ .../vision_models/llava/llava_llm/llama.rs | 237 ++++++++++++++++-- .../vision_models/llava/llava_llm/mistral.rs | 220 +++++++++++++++- .../src/vision_models/llava/llava_llm/mod.rs | 13 +- .../src/vision_models/llava/llava_next.rs | 37 +++ 5 files changed, 504 insertions(+), 42 deletions(-) diff --git a/mistralrs-core/src/vision_models/llava/llava15.rs b/mistralrs-core/src/vision_models/llava/llava15.rs index c6cd3d0ae..94564f177 100644 --- a/mistralrs-core/src/vision_models/llava/llava15.rs +++ b/mistralrs-core/src/vision_models/llava/llava15.rs @@ -4,6 +4,8 @@ clippy::too_many_arguments )] use super::llava_llm::{LLaVALLM, Llama, Mistral}; +use crate::amoe::AnyMoeBaseModelMixin; +use crate::amoe::MlpLayer; use crate::device_map::DeviceMapper; use crate::ops::NonZeroOp; use crate::pipeline::IsqModel; @@ -11,6 +13,8 @@ use crate::pipeline::NormalLoadingMetadata; use crate::pipeline::VisionModel; use crate::vision_models::clip::{ClipConfig, ClipVisionTransformer}; use crate::vision_models::llava::config::Config; +use crate::AnyMoeConfig; +use crate::AnyMoeExpertType; use candle_core::quantized::QMatMul; use candle_core::{bail, DType, Device, IndexOp, Result, Tensor}; use candle_nn::{linear, Activation, Linear, VarBuilder}; @@ -292,3 +296,38 @@ impl VisionModel for Model { true } } + +impl AnyMoeBaseModelMixin for Model { + //untested + fn get_mlps(&self) -> Vec<&dyn MlpLayer> { + self.llm.get_mlps() + } + fn get_mlps_mut(&mut self) -> Vec<&mut Box> { + self.llm.get_mlps_mut() + } + fn create_anymoe_layers( + &mut self, + additional_vbs: Vec, + config: AnyMoeConfig, + dtype: DType, + dev: &Device, + (prefix, mlp): (String, String), + layers: Vec, + expert_type: AnyMoeExpertType, + gate_vb: Option, + ) -> Result<()> { + self.llm.create_anymoe_layers( + additional_vbs, + config, + dtype, + dev, + (prefix, mlp), + layers, + expert_type, + gate_vb, + ) + } + fn amoe_supported(&self) -> bool { + true + } +} diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs index 09a25767b..34aff365b 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/llama.rs @@ -9,11 +9,15 @@ use candle_core::{quantized::QMatMul, DType, Device, Result, Tensor}; use candle_nn::{embedding, linear_no_bias as linear, Embedding, Module, VarBuilder}; use crate::{ + amoe::{AnyMoeBaseModelMixin, AnyMoeTrainableLayer, MlpLayer, MoeMlp}, device_map::DeviceMapper, + get_delta_from_lora_ab, layers::{repeat_kv, CausalMasker, MatMul, RmsNorm, ScaledDotProductAttention}, + merge_delta, models::llama::Config, - pipeline::{extract_logits, IsqModel, NormalLoadingMetadata}, + pipeline::{extract_logits, IsqModel, NormalLoadingMetadata, NormalModel}, utils::progress::NiceProgressBar, + AnyMoeConfig, AnyMoeExpertType, }; use super::{LLaVALLM, OrdinaryRoPE}; @@ -28,6 +32,7 @@ struct CausalSelfAttention { num_key_value_heads: usize, head_dim: usize, use_flash_attn: bool, + max_seq_len: usize, } impl CausalSelfAttention { @@ -116,6 +121,7 @@ impl CausalSelfAttention { num_key_value_heads: cfg.num_key_value_heads, head_dim: cfg.hidden_size / cfg.num_attention_heads, use_flash_attn: cfg.use_flash_attn, + max_seq_len: cfg.max_position_embeddings, }) } } @@ -125,16 +131,35 @@ struct Mlp { c_fc1: QMatMul, c_fc2: QMatMul, c_proj: QMatMul, + params: Vec, } impl Mlp { + fn load(vb: VarBuilder, cfg: &Config) -> Result { + let h_size = cfg.hidden_size; + let i_size = cfg.intermediate_size; + let c_fc1 = linear(h_size, i_size, vb.pp("gate_proj"))?; + let c_fc2 = linear(h_size, i_size, vb.pp("up_proj"))?; + let c_proj = linear(i_size, h_size, vb.pp("down_proj"))?; + Ok(Self { + c_fc1: QMatMul::Tensor(c_fc1.weight().clone()), + c_fc2: QMatMul::Tensor(c_fc2.weight().clone()), + c_proj: QMatMul::Tensor(c_proj.weight().clone()), + params: vec![h_size, i_size], + }) + } +} + +impl AnyMoeTrainableLayer for Mlp {} + +impl MlpLayer for Mlp { fn forward(&self, x: &Tensor) -> Result { let original_dtype = x.dtype(); let mut x = x.clone(); if matches!(self.c_fc1, QMatMul::QTensor(_)) { x = x.to_dtype(DType::F32)?; } - x = (candle_nn::ops::silu(&MatMul.qmatmul(&x, &self.c_fc1)?)? + let x = (candle_nn::ops::silu(&MatMul.qmatmul(&x, &self.c_fc1)?)? * MatMul.qmatmul(&x, &self.c_fc2)?)?; let mut res = MatMul.qmatmul(&x, &self.c_proj)?; if matches!(self.c_fc1, QMatMul::QTensor(_)) { @@ -142,27 +167,47 @@ impl Mlp { } Ok(res) } + fn get_isq_tensors(&mut self) -> Vec<&mut QMatMul> { + vec![&mut self.c_fc1, &mut self.c_fc2, &mut self.c_proj] + } + fn clone(&self) -> Box { + Box::new(Clone::clone(self)) + } + fn get_params(&self) -> &[usize] { + &self.params + } + // c_fc1, c_fc2, c_proj + fn new_added_delta(&self, deltas: Vec>) -> Result> { + let new_c_fc1 = if let Some(ref delta) = deltas[0] { + merge_delta!(self.c_fc1, delta) + } else { + self.c_fc1.clone() + }; + let new_c_fc2 = if let Some(ref delta) = deltas[1] { + merge_delta!(self.c_fc2, delta) + } else { + self.c_fc2.clone() + }; + let new_c_proj = if let Some(ref delta) = deltas[2] { + merge_delta!(self.c_proj, delta) + } else { + self.c_proj.clone() + }; - fn load(vb: VarBuilder, cfg: &Config) -> Result { - let h_size = cfg.hidden_size; - let i_size = cfg.intermediate_size; - let c_fc1 = linear(h_size, i_size, vb.pp("gate_proj"))?; - let c_fc2 = linear(h_size, i_size, vb.pp("up_proj"))?; - let c_proj = linear(i_size, h_size, vb.pp("down_proj"))?; - Ok(Self { - c_fc1: QMatMul::Tensor(c_fc1.weight().clone()), - c_fc2: QMatMul::Tensor(c_fc2.weight().clone()), - c_proj: QMatMul::Tensor(c_proj.weight().clone()), - }) + Ok(Box::new(Self { + c_fc1: new_c_fc1, + c_fc2: new_c_fc2, + c_proj: new_c_proj, + params: self.params.clone(), + })) } } -#[derive(Debug, Clone)] struct Block { rms_1: RmsNorm, attn: CausalSelfAttention, rms_2: RmsNorm, - mlp: Mlp, + mlp: Box, } impl Block { @@ -218,12 +263,11 @@ impl Block { rms_1, attn, rms_2, - mlp, + mlp: Box::new(mlp), }) } } -#[derive(Debug)] pub struct Llama { wte: Embedding, blocks: Vec, @@ -343,9 +387,14 @@ impl IsqModel for Llama { tensors.push((&mut layer.attn.k_proj, Some(i))); tensors.push((&mut layer.attn.v_proj, Some(i))); tensors.push((&mut layer.attn.o_proj, Some(i))); - tensors.push((&mut layer.mlp.c_fc1, Some(i))); - tensors.push((&mut layer.mlp.c_fc2, Some(i))); - tensors.push((&mut layer.mlp.c_proj, Some(i))); + tensors.extend( + layer + .mlp + .get_isq_tensors() + .into_iter() + .map(|m| (m, Some(i))) + .collect::>(), + ); } (tensors, &*self.mapper) } @@ -391,6 +440,8 @@ impl LLaVALLM for Llama { let logits = MatMul.qmatmul(&x, &self.lm_head)?; extract_logits(&logits, context_lens) } +} +impl NormalModel for Llama { fn forward( &self, input_ids: &Tensor, @@ -406,7 +457,153 @@ impl LLaVALLM for Llama { context_lens, ) } + fn xlora_forward( + &self, + _input_ids: &Tensor, + _input_ids_full: &Tensor, + _seqlen_offsets: &[usize], + _seqlen_offsets_full: &[usize], + _start_offsets_kernel: Tensor, + _start_offsets_kernel_full: Tensor, + _no_kv_cache: bool, + _non_granular_state: &Option, + _context_lens: Vec<(usize, usize)>, + _position_ids: Vec, + ) -> Result { + unimplemented!() + } fn cache(&self) -> &crate::pipeline::Cache { &self.kv_cache } + fn device(&self) -> &Device { + &self.device + } + fn is_xlora(&self) -> bool { + false + } + fn max_seq_len(&self) -> usize { + self.blocks[0].attn.max_seq_len + } +} + +impl AnyMoeBaseModelMixin for Llama { + fn get_mlps(&self) -> Vec<&dyn MlpLayer> { + let mut mlps = Vec::new(); + for layer in &self.blocks { + mlps.push(&*layer.mlp); + } + mlps + } + fn get_mlps_mut(&mut self) -> Vec<&mut Box> { + let mut mlps = Vec::new(); + for layer in &mut self.blocks { + mlps.push(&mut layer.mlp); + } + mlps + } + fn create_anymoe_layers( + &mut self, + additional_vbs: Vec, + config: AnyMoeConfig, + dtype: DType, + dev: &Device, + (prefix, mlp): (String, String), + mut layers: Vec, + expert_type: AnyMoeExpertType, + gate_vb: Option, + ) -> Result<()> { + let mut experts: Vec>> = Vec::new(); + if layers.is_empty() { + layers = (0..self.blocks.len()).collect::>(); + } + for _ in 0..layers.len() { + experts.push(Vec::new()); + } + for vb in additional_vbs { + let vb = vb.pp(&prefix); + for (layer, row) in experts.iter_mut().enumerate() { + if !layers.contains(&layer) { + continue; + } + + let intermediate_size = self.blocks[layer].mlp.get_params()[1]; + let hidden_size = self.blocks[layer].mlp.get_params()[0]; + match expert_type { + AnyMoeExpertType::FineTuned => { + row.push(Box::new(Mlp::load( + vb.pp(layer).pp(&mlp), + &Config { + intermediate_size: self.blocks[layer].mlp.get_params()[1], + hidden_size: self.blocks[layer].mlp.get_params()[0], + ..Default::default() + }, + )?)); + } + AnyMoeExpertType::LoraAdapter { + rank, + alpha, + ref target_modules, + } => { + let vb_mlp = vb.pp(layer).pp(&mlp); + + let c_fc1_delta = if target_modules.contains(&"c_fc1".to_string()) { + Some(get_delta_from_lora_ab!( + vb_mlp, + rank, + alpha, + (hidden_size, intermediate_size), + "c_fc1" + )) + } else { + None + }; + let c_fc2_delta = if target_modules.contains(&"c_fc2".to_string()) { + Some(get_delta_from_lora_ab!( + vb_mlp, + rank, + alpha, + (hidden_size, intermediate_size), + "c_fc2" + )) + } else { + None + }; + let c_proj_delta = if target_modules.contains(&"c_proj".to_string()) { + Some(get_delta_from_lora_ab!( + vb_mlp, + rank, + alpha, + (intermediate_size, hidden_size), + "c_proj" + )) + } else { + None + }; + + row.push(self.blocks[layer].mlp.new_added_delta(vec![ + c_fc1_delta, + c_fc2_delta, + c_proj_delta, + ])?); + } + } + } + } + for (layer, expert) in layers.into_iter().zip(experts) { + let mut experts_all = vec![self.blocks[layer].mlp.clone()]; + experts_all.extend(expert); + self.blocks[layer].mlp = Box::new(MoeMlp::new( + experts_all, + config.clone(), + dtype, + dev, + layer, + gate_vb.as_ref(), + )?); + } + Ok(()) + } + fn amoe_supported(&self) -> bool { + true + } } diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs b/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs index 26d0afebf..ef3d18ac0 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/mistral.rs @@ -5,10 +5,14 @@ use candle_core::{quantized::QMatMul, DType, Device, Module, Result, Tensor}; use candle_nn::{linear_no_bias, Activation, VarBuilder}; use crate::{ + amoe::{AnyMoeBaseModelMixin, AnyMoeTrainableLayer, MlpLayer, MoeMlp}, device_map::DeviceMapper, + get_delta_from_lora_ab, layers::{repeat_kv, CausalMasker, MatMul, RmsNorm, ScaledDotProductAttention}, - pipeline::{extract_logits, Cache, IsqModel, NormalLoadingMetadata}, + merge_delta, + pipeline::{extract_logits, Cache, IsqModel, NormalLoadingMetadata, NormalModel}, utils::progress::NiceProgressBar, + AnyMoeConfig, AnyMoeExpertType, }; use super::{LLaVALLM, OrdinaryRoPE}; @@ -21,6 +25,7 @@ struct MLP { up_proj: QMatMul, down_proj: QMatMul, act_fn: Activation, + params: Vec, } impl MLP { @@ -35,11 +40,14 @@ impl MLP { up_proj: QMatMul::Tensor(up_proj.weight().clone()), down_proj: QMatMul::Tensor(down_proj.weight().clone()), act_fn: cfg.hidden_act, + params: vec![hidden_sz, intermediate_sz], }) } } -impl Module for MLP { +impl AnyMoeTrainableLayer for MLP {} + +impl MlpLayer for MLP { fn forward(&self, xs: &Tensor) -> Result { let original_dtype = xs.dtype(); let mut xs = xs.clone(); @@ -54,6 +62,41 @@ impl Module for MLP { } Ok(res) } + fn get_isq_tensors(&mut self) -> Vec<&mut QMatMul> { + vec![&mut self.gate_proj, &mut self.up_proj, &mut self.down_proj] + } + fn clone(&self) -> Box { + Box::new(Clone::clone(self)) + } + fn get_params(&self) -> &[usize] { + &self.params + } + // gate, up, down + fn new_added_delta(&self, deltas: Vec>) -> Result> { + let new_gate = if let Some(ref delta) = deltas[0] { + merge_delta!(self.gate_proj, delta) + } else { + self.gate_proj.clone() + }; + let new_up = if let Some(ref delta) = deltas[1] { + merge_delta!(self.up_proj, delta) + } else { + self.up_proj.clone() + }; + let new_down = if let Some(ref delta) = deltas[2] { + merge_delta!(self.down_proj, delta) + } else { + self.down_proj.clone() + }; + + Ok(Box::new(Self { + gate_proj: new_gate, + up_proj: new_up, + down_proj: new_down, + act_fn: self.act_fn, + params: self.params.clone(), + })) + } } #[derive(Debug, Clone)] @@ -175,10 +218,9 @@ impl Attention { } } -#[derive(Debug, Clone)] struct DecoderLayer { self_attn: Attention, - mlp: MLP, + mlp: Box, input_layernorm: RmsNorm, post_attention_layernorm: RmsNorm, } @@ -208,7 +250,7 @@ impl DecoderLayer { )?; Ok(Self { self_attn, - mlp, + mlp: Box::new(mlp), input_layernorm, post_attention_layernorm, }) @@ -235,12 +277,13 @@ impl DecoderLayer { )?; xs = (xs + residual)?; let residual = &xs; - let xs = xs.apply(&self.post_attention_layernorm)?.apply(&self.mlp)?; - xs + residual + let xs = self + .mlp + .forward(&xs.apply(&self.post_attention_layernorm)?)?; + residual + xs } } -#[derive(Debug)] pub struct Model { embed_tokens: candle_nn::Embedding, layers: Vec, @@ -249,6 +292,7 @@ pub struct Model { sliding_window: Option, pub device: Device, pub cache: Cache, + pub max_seq_len: usize, mapper: Box, rope_parameters: (Tensor, Tensor), } @@ -323,6 +367,7 @@ impl Model { sliding_window: cfg.sliding_window, device: normal_loading_metadata.real_device, cache: Cache::new(cfg.num_hidden_layers, false), + max_seq_len: cfg.max_position_embeddings, mapper, rope_parameters, }) @@ -397,9 +442,14 @@ impl IsqModel for Model { tensors.push((&mut layer.self_attn.k_proj, Some(i))); tensors.push((&mut layer.self_attn.v_proj, Some(i))); tensors.push((&mut layer.self_attn.o_proj, Some(i))); - tensors.push((&mut layer.mlp.down_proj, Some(i))); - tensors.push((&mut layer.mlp.up_proj, Some(i))); - tensors.push((&mut layer.mlp.gate_proj, Some(i))); + tensors.extend( + layer + .mlp + .get_isq_tensors() + .into_iter() + .map(|m| (m, Some(i))) + .collect::>(), + ); } (tensors, &*self.mapper) } @@ -426,7 +476,9 @@ impl LLaVALLM for Model { context_lens, ) } +} +impl NormalModel for Model { fn forward( &self, input_ids: &Tensor, @@ -442,7 +494,153 @@ impl LLaVALLM for Model { context_lens, ) } + fn xlora_forward( + &self, + _input_ids: &Tensor, + _input_ids_full: &Tensor, + _seqlen_offsets: &[usize], + _seqlen_offsets_full: &[usize], + _start_offsets_kernel: Tensor, + _start_offsets_kernel_full: Tensor, + _no_kv_cache: bool, + _non_granular_state: &Option, + _context_lens: Vec<(usize, usize)>, + _position_ids: Vec, + ) -> Result { + unimplemented!() + } fn cache(&self) -> &Cache { &self.cache } + fn device(&self) -> &Device { + &self.device + } + fn is_xlora(&self) -> bool { + false + } + fn max_seq_len(&self) -> usize { + self.max_seq_len + } +} + +impl AnyMoeBaseModelMixin for Model { + fn get_mlps(&self) -> Vec<&dyn MlpLayer> { + let mut mlps = Vec::new(); + for layer in &self.layers { + mlps.push(&*layer.mlp); + } + mlps + } + fn get_mlps_mut(&mut self) -> Vec<&mut Box> { + let mut mlps = Vec::new(); + for layer in &mut self.layers { + mlps.push(&mut layer.mlp); + } + mlps + } + fn create_anymoe_layers( + &mut self, + additional_vbs: Vec, + config: AnyMoeConfig, + dtype: DType, + dev: &Device, + (prefix, mlp): (String, String), + mut layers: Vec, + expert_type: AnyMoeExpertType, + gate_vb: Option, + ) -> Result<()> { + let mut experts: Vec>> = Vec::new(); + if layers.is_empty() { + layers = (0..self.layers.len()).collect::>(); + } + for _ in 0..layers.len() { + experts.push(Vec::new()); + } + for vb in additional_vbs { + let vb = vb.pp(&prefix); + for (layer, row) in experts.iter_mut().enumerate() { + if !layers.contains(&layer) { + continue; + } + + let intermediate_size = self.layers[layer].mlp.get_params()[1]; + let hidden_size = self.layers[layer].mlp.get_params()[0]; + match expert_type { + AnyMoeExpertType::FineTuned => { + row.push(Box::new(MLP::new( + &Config { + intermediate_size: self.layers[layer].mlp.get_params()[1], + hidden_size: self.layers[layer].mlp.get_params()[0], + ..Default::default() + }, + vb.pp(layer).pp(&mlp), + )?)); + } + AnyMoeExpertType::LoraAdapter { + rank, + alpha, + ref target_modules, + } => { + let vb_mlp = vb.pp(layer).pp(&mlp); + + let gate_proj_delta = if target_modules.contains(&"gate_proj".to_string()) { + Some(get_delta_from_lora_ab!( + vb_mlp, + rank, + alpha, + (hidden_size, intermediate_size), + "gate_proj" + )) + } else { + None + }; + let up_proj_delta = if target_modules.contains(&"up_proj".to_string()) { + Some(get_delta_from_lora_ab!( + vb_mlp, + rank, + alpha, + (hidden_size, intermediate_size), + "up_proj" + )) + } else { + None + }; + let down_proj_delta = if target_modules.contains(&"down_proj".to_string()) { + Some(get_delta_from_lora_ab!( + vb_mlp, + rank, + alpha, + (intermediate_size, hidden_size), + "down_proj" + )) + } else { + None + }; + + row.push(self.layers[layer].mlp.new_added_delta(vec![ + gate_proj_delta, + up_proj_delta, + down_proj_delta, + ])?); + } + } + } + } + for (layer, expert) in layers.into_iter().zip(experts) { + let mut experts_all = vec![self.layers[layer].mlp.clone()]; + experts_all.extend(expert); + self.layers[layer].mlp = Box::new(MoeMlp::new( + experts_all, + config.clone(), + dtype, + dev, + layer, + gate_vb.as_ref(), + )?); + } + Ok(()) + } + fn amoe_supported(&self) -> bool { + true + } } diff --git a/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs index 1a6ed80b3..e33f29d75 100644 --- a/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs +++ b/mistralrs-core/src/vision_models/llava/llava_llm/mod.rs @@ -1,9 +1,9 @@ #![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss)] use candle_core::{DType, Device, Result, Tensor}; -use crate::pipeline::{Cache, IsqModel}; +use crate::pipeline::{IsqModel, NormalModel}; -pub(crate) trait LLaVALLM: IsqModel + Sync + Send { +pub(crate) trait LLaVALLM: IsqModel + NormalModel + Sync + Send { //Normal model without anymoe, but add embed and forward_input_embed. This is only a temporary solution. Finally when the rope problem solved for normal LLM models, we should refactor this. fn embed(&self, input_ids: &Tensor) -> Result; fn forward_input_embed( @@ -14,15 +14,6 @@ pub(crate) trait LLaVALLM: IsqModel + Sync + Send { start_offsets_kernel: Tensor, context_lens: Vec<(usize, usize)>, ) -> Result; - fn forward( - &self, - input_ids: &Tensor, - seqlen_offsets: &[usize], - start_offsets_kernel: Tensor, - context_lens: Vec<(usize, usize)>, - position_ids: Vec, - ) -> candle_core::Result; - fn cache(&self) -> &Cache; } #[derive(Debug)] diff --git a/mistralrs-core/src/vision_models/llava/llava_next.rs b/mistralrs-core/src/vision_models/llava/llava_next.rs index f51290193..dc7be0679 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next.rs @@ -7,6 +7,7 @@ use candle_core::quantized::QMatMul; use candle_core::{bail, DType, Device, IndexOp, Result, Tensor}; use candle_nn::{linear, Activation, Linear, VarBuilder}; +use crate::amoe::{AnyMoeBaseModelMixin, MlpLayer}; use crate::device_map::DeviceMapper; use crate::ops::NonZeroOp; use crate::pipeline::IsqModel; @@ -16,6 +17,7 @@ use crate::pipeline::VisionModel; use crate::vision_models::clip::{ClipConfig, ClipVisionTransformer}; use crate::vision_models::llava::config::Config; use crate::vision_models::llava::utils::get_anyres_image_grid_shape; +use crate::{AnyMoeConfig, AnyMoeExpertType}; use super::llava_llm::{LLaVALLM, Llama, Mistral}; @@ -387,3 +389,38 @@ impl VisionModel for Model { true } } + +impl AnyMoeBaseModelMixin for Model { + //untested + fn get_mlps(&self) -> Vec<&dyn MlpLayer> { + self.llm.get_mlps() + } + fn get_mlps_mut(&mut self) -> Vec<&mut Box> { + self.llm.get_mlps_mut() + } + fn create_anymoe_layers( + &mut self, + additional_vbs: Vec, + config: AnyMoeConfig, + dtype: DType, + dev: &Device, + (prefix, mlp): (String, String), + layers: Vec, + expert_type: AnyMoeExpertType, + gate_vb: Option, + ) -> Result<()> { + self.llm.create_anymoe_layers( + additional_vbs, + config, + dtype, + dev, + (prefix, mlp), + layers, + expert_type, + gate_vb, + ) + } + fn amoe_supported(&self) -> bool { + true + } +} From 754331975478cbe81d859c576e066df22d9237fb Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Wed, 3 Jul 2024 17:18:55 +0800 Subject: [PATCH 24/34] rust fmt --- mistralrs-core/src/lib.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mistralrs-core/src/lib.rs b/mistralrs-core/src/lib.rs index 9980a9fb3..ee025594e 100644 --- a/mistralrs-core/src/lib.rs +++ b/mistralrs-core/src/lib.rs @@ -55,12 +55,12 @@ pub use device_map::{DeviceLayerMapMetadata, DeviceMapMetadata, LayerDeviceMappe pub use pipeline::{ chat_template::ChatTemplate, AnyMoeLoader, AnyMoePipeline, GGMLLoader, GGMLLoaderBuilder, GGMLSpecificConfig, GGUFArchitecture, GGUFLoader, GGUFLoaderBuilder, GGUFSpecificConfig, - GemmaLoader, Idefics2Loader, LlamaLoader, Loader, LocalModelPaths, MistralLoader, - MixtralLoader, ModelKind, ModelPaths, NormalLoader, NormalLoaderBuilder, NormalLoaderType, - NormalSpecificConfig, Phi2Loader, Phi3Loader, Phi3VLoader, Qwen2Loader, SpeculativeConfig, - SpeculativeLoader, SpeculativePipeline, Starcoder2Loader, TokenSource, VisionLoader, - VisionLoaderBuilder, VisionLoaderType, VisionModelLoader, VisionSpecificConfig, - LLaVALoader, LLaVANextLoader, + GemmaLoader, Idefics2Loader, LLaVALoader, LLaVANextLoader, LlamaLoader, Loader, + LocalModelPaths, MistralLoader, MixtralLoader, ModelKind, ModelPaths, NormalLoader, + NormalLoaderBuilder, NormalLoaderType, NormalSpecificConfig, Phi2Loader, Phi3Loader, + Phi3VLoader, Qwen2Loader, SpeculativeConfig, SpeculativeLoader, SpeculativePipeline, + Starcoder2Loader, TokenSource, VisionLoader, VisionLoaderBuilder, VisionLoaderType, + VisionModelLoader, VisionSpecificConfig, }; pub use request::{Constraint, MessageContent, NormalRequest, Request, RequestMessage}; pub use response::Response; From d5bd3f89bc86338956fcf56cd9e14b7d106e042a Mon Sep 17 00:00:00 2001 From: chenwanqq Date: Thu, 4 Jul 2024 16:34:26 +0800 Subject: [PATCH 25/34] update image tag --- docs/LLaVA.md | 17 +++--- mistralrs-core/src/pipeline/vision.rs | 1 - .../src/vision_models/llava/llava15.rs | 9 +--- .../llava/llava_inputs_processor.rs | 50 +++--------------- .../src/vision_models/llava/llava_next.rs | 12 +---- .../llava/llava_next_inputs_processor.rs | 50 +++--------------- mistralrs/Cargo.toml | 4 ++ mistralrs/examples/llava/main.rs | 2 +- mistralrs/examples/llava_next/main.rs | 2 +- moutain.png | Bin 0 -> 2979708 bytes 10 files changed, 32 insertions(+), 115 deletions(-) create mode 100644 moutain.png diff --git a/docs/LLaVA.md b/docs/LLaVA.md index 051749af7..4a96611ad 100644 --- a/docs/LLaVA.md +++ b/docs/LLaVA.md @@ -27,16 +27,17 @@ We support an OpenAI compatible HTTP API for vision models. This example demonst --- **Image:** - +Mount Washington +
Credit
**Prompt:** ``` -What is shown in this image? +What is shown in this image? ``` **Output:** ``` -The image depicts a group of orange ants climbing over a black pole. The ants are moving in the same direction, forming a line as they ascend the pole. +Text: The image shows a steep, snow-covered hillside with a pine tree on the right side, close to the top. The landscape appears to be a mountainous area with winter conditions. There are no visible humans or permanent structures in the immediate vicinity that suggest this is a summer or recreational location. It's likely a cold, snowy day or season, and the slopes might be part of a mountainous region. ``` --- @@ -60,12 +61,12 @@ completion = openai.chat.completions.create( { "type": "image_url", "image_url": { - "url": "https://d2r55xnwy6nx47.cloudfront.net/uploads/2018/02/Ants_Lede1300.jpg" + "url": "https://www.nhmagazine.com/content/uploads/2019/05/mtwashingtonFranconia-2-19-18-108-Edit-Edit.jpg" }, }, { "type": "text", - "text": "What is shown in this image?", + "text": "What is shown in this image?", }, ], }, @@ -139,7 +140,7 @@ fn main() -> anyhow::Result<()> { ("role".to_string(), Either::Left("user".to_string())), ( "content".to_string(), - Either::Left("What is shown in this image?".to_string()), + Either::Left("What is shown in this image?".to_string()), ), ])], }, @@ -192,12 +193,12 @@ res = runner.send_chat_completion_request( { "type": "image_url", "image_url": { - "url": "https://d2r55xnwy6nx47.cloudfront.net/uploads/2018/02/Ants_Lede1300.jpg" + "url": "https://www.nhmagazine.com/content/uploads/2019/05/mtwashingtonFranconia-2-19-18-108-Edit-Edit.jpg" }, }, { "type": "text", - "text": "What is shown in this image?", + "text": "What is shown in this image?", }, ], }, diff --git a/mistralrs-core/src/pipeline/vision.rs b/mistralrs-core/src/pipeline/vision.rs index 81c91876a..5f0be38ec 100644 --- a/mistralrs-core/src/pipeline/vision.rs +++ b/mistralrs-core/src/pipeline/vision.rs @@ -216,7 +216,6 @@ impl Loader for VisionLoader { .get_gen_conf_filename() .map(|f| serde_json::from_str(&fs::read_to_string(f).unwrap()).unwrap()); let chat_template = get_chat_template(paths, &self.chat_template, None); - println!("Chat template: {:?}", chat_template); if let Some(in_situ_quant) = in_situ_quant { model.quantize(in_situ_quant, device.clone())?; diff --git a/mistralrs-core/src/vision_models/llava/llava15.rs b/mistralrs-core/src/vision_models/llava/llava15.rs index 94564f177..8fb2edb51 100644 --- a/mistralrs-core/src/vision_models/llava/llava15.rs +++ b/mistralrs-core/src/vision_models/llava/llava15.rs @@ -181,10 +181,6 @@ impl Model { .nonzero()? .squeeze(1)? .to_vec1::()?; - let image_ids = image_indexes - .iter() - .map(|x| Ok(-(input_ids.i((0, *x as usize))?.to_scalar::()?))) - .collect::>>()?; let mut result = input_ids.clamp(0i64, i64::MAX)?.to_dtype(DType::U32)?; result = self.llm.embed(&result)?; //[seq_len,hidden_size] let image_features = self.encode_images(&images.to_dtype(self.dtype)?)?; //[num of images,patch_size*patch_size,hidden_size] @@ -194,14 +190,13 @@ impl Model { image_features_vec.push(image_features.get(i)?.unsqueeze(0)?); } for (i, image_index) in image_indexes.iter().enumerate() { - let image_id = image_ids[i]; result = result.slice_assign( &[ &(0usize..1usize), &(*image_index as usize..*image_index as usize + num_image_tokens), &(..), ], - &image_features_vec[(image_id - 1) as usize], + &image_features_vec[i], )?; } //truncate @@ -250,7 +245,6 @@ impl Model { impl IsqModel for Model { fn get_tensors(&mut self) -> (Vec<(&mut QMatMul, Option)>, &dyn DeviceMapper) { - // I don't really get this part self.llm.get_tensors() } } @@ -298,7 +292,6 @@ impl VisionModel for Model { } impl AnyMoeBaseModelMixin for Model { - //untested fn get_mlps(&self) -> Vec<&dyn MlpLayer> { self.llm.get_mlps() } diff --git a/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs b/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs index 14c80f59a..f200d36fc 100644 --- a/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava/llava_inputs_processor.rs @@ -42,8 +42,7 @@ impl LLaVAProcessor { pub fn new(config: &str) -> Self { let model_config = serde_json::from_str::(config).expect("Failed to parse model config."); - let image_tag_splitter = - Regex::new(r"<\|image_\d+\|>").expect("Failed to compile split regex."); + let image_tag_splitter = Regex::new(r"").expect("Failed to compile split regex."); let inputs_processor = Arc::new(LLaVAInputProcessor { image_tag_splitter, model_config: model_config.clone(), @@ -92,7 +91,7 @@ impl InputsProcessor for LLaVAInputProcessor { .clone() .expect("Need a PreProcessorConfig config."); let config: &PreProcessorConfig = config.downcast_ref().expect("Downcast failed."); - let (pixel_values, num_img_tokens, n_images) = if is_prompt + let (pixel_values, num_img_tokens) = if is_prompt && input_seqs .iter() .map(|seq| seq.images().is_some()) @@ -100,13 +99,10 @@ impl InputsProcessor for LLaVAInputProcessor { { let mut pixel_values_accum = Vec::new(); let mut num_img_tokens_accum = Vec::new(); - let mut n_images = Vec::new(); for seq in input_seqs.iter_mut() { let imgs = seq .take_images() .expect("Need to have images by this point."); - let imgs_len = imgs.len(); - n_images.push(imgs_len); let PreprocessedImages { pixel_values, pixel_attention_mask: _, @@ -119,7 +115,6 @@ impl InputsProcessor for LLaVAInputProcessor { ( Some(Tensor::cat(&pixel_values_accum, 0)?), Some(num_img_tokens_accum), - n_images, ) } else { let text_models_inputs_processor::ModelInputs { @@ -166,10 +161,10 @@ impl InputsProcessor for LLaVAInputProcessor { ) .map_err(anyhow::Error::msg)?; - for (detokenized, (seq, (num_img_tokens, n_images))) in detokenized.into_iter().zip( + for (detokenized, (seq, num_img_tokens)) in detokenized.into_iter().zip( input_seqs .iter_mut() - .zip(num_img_tokens.unwrap().into_iter().zip(n_images)), + .zip(num_img_tokens.unwrap().into_iter()), ) { let splits = self .image_tag_splitter @@ -190,40 +185,10 @@ impl InputsProcessor for LLaVAInputProcessor { .collect() }) .collect::>>(); - let image_tags = self.image_tag_splitter.find_iter(&detokenized); - let image_ids = image_tags - .into_iter() - .map(|s| { - let s = &detokenized[s.range()]; - s.split('|') - .nth(1) - .unwrap() - .split('_') - .nth(1) - .unwrap() - .parse::() - .expect("Failed to parse image id to u32") - }) - .collect::>(); - let unique_image_ids = image_ids - .iter() - .copied() - .unique() - .sorted() - .collect::>(); - // `image_ids` must start from 1, and must be continuous int, e.g. [1, 2, 3], cannot be [1, 4, 5] - if unique_image_ids != (1u32..unique_image_ids.len() as u32 + 1).collect::>() { - anyhow::bail!("`image_ids` must start from 1, and must be continuous, e.g. [1, 2, 3], cannot be [1, 4, 5]."); - } - // Total images must be the same as the number of image tags - if unique_image_ids.len() != n_images { - anyhow::bail!("Total images must be the same as the number of image tags."); - } - //only start position is -id, other positions are 0. This is for targeting image positions. let mut image_ids_pad = Vec::new(); - for image_id in image_ids.iter() { - let mut image_id_pad = vec![0; num_img_tokens[*image_id as usize - 1]]; - image_id_pad[0] = -(*image_id as i64); + for (i, num_img_token) in num_img_tokens.iter().enumerate() { + let mut image_id_pad = vec![0; *num_img_token]; + image_id_pad[0] = -(i as i64 + 1); image_ids_pad.push(image_id_pad); } let mut input_ids: Vec = Vec::new(); @@ -234,7 +199,6 @@ impl InputsProcessor for LLaVAInputProcessor { { input_ids.extend(item); } - // NOTE(EricLBuehler): Casting to u32 is fine, we don't care about the other toks seq.set_toks( input_ids diff --git a/mistralrs-core/src/vision_models/llava/llava_next.rs b/mistralrs-core/src/vision_models/llava/llava_next.rs index dc7be0679..deb85fd32 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next.rs @@ -215,10 +215,6 @@ impl Model { .nonzero()? .squeeze(1)? .to_vec1::()?; - let image_ids = image_indexes - .iter() - .map(|x| Ok(-(input_ids.i((0, *x as usize))?.to_scalar::()?))) - .collect::>>()?; let mut result = input_ids.clamp(0i64, i64::MAX)?.to_dtype(DType::U32)?; result = self.llm.embed(&result)?; //[seq_len,hidden_size] let image_features = self.encode_images(&images.to_dtype(self.dtype)?)?; //[sum of samples of all images,patch_size*patch_size,hidden_size] @@ -270,15 +266,13 @@ impl Model { }) .collect::>>()?; for (i, image_index) in image_indexes.iter().enumerate() { - let image_id = image_ids[i]; result = result.slice_assign( &[ &(0usize..1usize), - &(*image_index as usize - ..*image_index as usize + num_image_tokens[(image_id - 1) as usize]), + &(*image_index as usize..*image_index as usize + num_image_tokens[i]), &(..), ], - &image_features_vec[(image_id - 1) as usize], + &image_features_vec[i], )?; } //truncate @@ -331,7 +325,6 @@ impl Model { impl IsqModel for Model { fn get_tensors(&mut self) -> (Vec<(&mut QMatMul, Option)>, &dyn DeviceMapper) { - // I don't really get this part self.llm.get_tensors() } } @@ -391,7 +384,6 @@ impl VisionModel for Model { } impl AnyMoeBaseModelMixin for Model { - //untested fn get_mlps(&self) -> Vec<&dyn MlpLayer> { self.llm.get_mlps() } diff --git a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs index 763828c44..d3a08e3b6 100644 --- a/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs +++ b/mistralrs-core/src/vision_models/llava/llava_next_inputs_processor.rs @@ -45,8 +45,7 @@ impl LLaVANextProcessor { pub fn new(config: &str) -> Self { let model_config = serde_json::from_str::(config).expect("Failed to parse model config."); - let image_tag_splitter = - Regex::new(r"<\|image_\d+\|>").expect("Failed to compile split regex."); + let image_tag_splitter = Regex::new(r"").expect("Failed to compile split regex."); let inputs_processor = Arc::new(LLaVANextInputProcessor { image_tag_splitter, model_config: model_config.clone(), @@ -103,7 +102,7 @@ impl InputsProcessor for LLaVANextInputProcessor { *config.crop_size.as_ref().unwrap().get("width").unwrap(), *config.crop_size.as_ref().unwrap().get("height").unwrap(), ); - let (pixel_values, image_sizes, num_img_tokens, num_image_samples, n_images) = if is_prompt + let (pixel_values, image_sizes, num_img_tokens, num_image_samples) = if is_prompt && input_seqs .iter() .map(|seq| seq.images().is_some()) @@ -113,13 +112,10 @@ impl InputsProcessor for LLaVANextInputProcessor { let mut image_sizes_accum = Vec::new(); let mut num_img_tokens_accum = Vec::new(); let mut num_image_samples_accum = Vec::new(); - let mut n_images = Vec::new(); for seq in input_seqs.iter_mut() { let imgs = seq .take_images() .expect("Need to have images by this point."); - let imgs_len = imgs.len(); - n_images.push(imgs_len); let PreprocessedImages { pixel_values, pixel_attention_mask: _, @@ -145,7 +141,6 @@ impl InputsProcessor for LLaVANextInputProcessor { Some(image_sizes_accum), Some(num_img_tokens_accum), Some(num_image_samples_accum), - n_images, ) } else { let text_models_inputs_processor::ModelInputs { @@ -210,10 +205,10 @@ impl InputsProcessor for LLaVANextInputProcessor { ) .map_err(anyhow::Error::msg)?; - for (detokenized, (seq, (num_img_tokens, n_images))) in detokenized.into_iter().zip( + for (detokenized, (seq, num_img_tokens)) in detokenized.into_iter().zip( input_seqs .iter_mut() - .zip(num_img_tokens.unwrap().into_iter().zip(n_images)), + .zip(num_img_tokens.unwrap().into_iter()), ) { let splits = self .image_tag_splitter @@ -234,40 +229,10 @@ impl InputsProcessor for LLaVANextInputProcessor { .collect() }) .collect::>>(); - let image_tags = self.image_tag_splitter.find_iter(&detokenized); - let image_ids = image_tags - .into_iter() - .map(|s| { - let s = &detokenized[s.range()]; - s.split('|') - .nth(1) - .unwrap() - .split('_') - .nth(1) - .unwrap() - .parse::() - .expect("Failed to parse image id to u32") - }) - .collect::>(); - let unique_image_ids = image_ids - .iter() - .copied() - .unique() - .sorted() - .collect::>(); - // `image_ids` must start from 1, and must be continuous int, e.g. [1, 2, 3], cannot be [1, 4, 5] - if unique_image_ids != (1u32..unique_image_ids.len() as u32 + 1).collect::>() { - anyhow::bail!("`image_ids` must start from 1, and must be continuous, e.g. [1, 2, 3], cannot be [1, 4, 5]."); - } - // Total images must be the same as the number of image tags - if unique_image_ids.len() != n_images { - anyhow::bail!("Total images must be the same as the number of image tags."); - } - //only start position is -id, other positions are 0. This is for targeting image positions. let mut image_ids_pad = Vec::new(); - for image_id in image_ids.iter() { - let mut image_id_pad = vec![0; num_img_tokens[*image_id as usize - 1]]; - image_id_pad[0] = -(*image_id as i64); + for (i, num_img_token) in num_img_tokens.iter().enumerate() { + let mut image_id_pad = vec![0; *num_img_token]; + image_id_pad[0] = -(i as i64 + 1); image_ids_pad.push(image_id_pad); } let mut input_ids: Vec = Vec::new(); @@ -278,7 +243,6 @@ impl InputsProcessor for LLaVANextInputProcessor { { input_ids.extend(item); } - // NOTE(EricLBuehler): Casting to u32 is fine, we don't care about the other toks seq.set_toks( input_ids diff --git a/mistralrs/Cargo.toml b/mistralrs/Cargo.toml index c2ccf3c42..d91400116 100644 --- a/mistralrs/Cargo.toml +++ b/mistralrs/Cargo.toml @@ -77,6 +77,10 @@ required-features = [] name = "llava_next" required-features = [] +[[example]] +name = "anymoe" +required-features = [] + [[example]] name = "anymoe_lora" required-features = [] diff --git a/mistralrs/examples/llava/main.rs b/mistralrs/examples/llava/main.rs index bc87d9e8e..34d61287a 100644 --- a/mistralrs/examples/llava/main.rs +++ b/mistralrs/examples/llava/main.rs @@ -47,7 +47,7 @@ fn main() -> anyhow::Result<()> { ("role".to_string(), Either::Left("user".to_string())), ( "content".to_string(), - Either::Left("<|image_1|>what is this image show?".to_string()), + Either::Left("what is this image show?".to_string()), ), ])], }, diff --git a/mistralrs/examples/llava_next/main.rs b/mistralrs/examples/llava_next/main.rs index 629d3019a..0ad8704d6 100644 --- a/mistralrs/examples/llava_next/main.rs +++ b/mistralrs/examples/llava_next/main.rs @@ -48,7 +48,7 @@ fn main() -> anyhow::Result<()> { ("role".to_string(), Either::Left("user".to_string())), ( "content".to_string(), - Either::Left("<|image_1|>what is this image show?".to_string()), + Either::Left("what is this image show?".to_string()), ), ])], }, diff --git a/moutain.png b/moutain.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e27e6e91688a40ef3b4b7bd4e2dda968d27357 GIT binary patch literal 2979708 zcmWJsdpr}07pKK;SGYH~yiNHI1V|`hS(66%mpL5vjlFcPCv6@sV!9xi#v4h6ze_#4H+>In; zz1F-jTnY?vxJxXt`YNd`E%>7-uKmIVE5p2&PT8XXqnX}<_OO9#oKRZnW)GOqYw>Pt z*-h`!B=Sl;drHF~NPcI;9)6H|Fm)hg4i68@Z)|Q3f(2AOvG@7!Iv@H zY@7U!`-^G)lVXLWy2ZB-4{rO2K5T5Tuaxznp8JcIE2YtM<-RY)LseVF(3F^%fbpK5 z8$C0xtVJXN3E8%%C?%lKGD^iMAAOmI^+s4K@6Um5!xKRfXwPLSlK6^jTPmvmx#h7_ zK6VJ)dy5kpl{Us3wdQ`1bKkyW##b-IUvnm7>aW83 zXNG~Bz{EDZnOtj}6~P{P!x0!-BsQ5^HJU|{8asvxocHhk;m zkrsvgu7;o4?V4)~5|*gBT0kC4BKU6OBCkMuz~nog^06sP+Yo4QEy|}WdBO4wjbb@A zDB7)O!&{^GM@b=4_&i&XUJi*RaSbo?Io zwQO5`s-oPN3bt@(Ee#MgASY$EwzgK~Ik0G=X<4Vv0C4y4Ou?!*PYJ|%Xj@H{ZHFL2 zgr4;iVjiS8`Czp}Nrn0le3z2Foq8O$Ym2-HrFE*8veQjo>BR_x^ySGrkA62#gskJ{H zb`^>LbhdP14G4$rZH1(?>;}}1UZU&kqL>PoI6a^ze!by3+7pE|$pK}%T;8veA6I1Q zW#pt)YKYK#ifSmY?-OvG-sl~2`eWqklG8o=GVtD~@&(j%2d4I!WeW|YgzPXQ$GFRy zgAiO^Xy-`Exl1V}w~>EBiv2D_{h+)`myTY2oA)?o>Ly+(&C6wLcsNHpg7~}&zPrKq zppK1*`v{8ga003d?pW7HGskv$cfPe=H|FIueY5mR#yOS(`5gz9j5qqNZM4m^Y9!3~ z+x=a^9WysAHA+=P{%$UigaO+plH}*b!pw`MIhm+415EB$HQBaIa5u6|W1&g9d9$6c zCzR$D>PhEUth>a=ea2KXBV(YHxc<;N%d*hup#;*tBdu51dNhZYjw*~ms=4l(6v0<8 zqf%E>qy^_8l&xOlVnXZ}4*eAssHa)GzVf3y<$#OSBLr%xiAH)096N?1;F5*)lSzPs z{}LEqtuUv@dU39!&W7LQAT_MAn z0&;Dk(KznZ$SJ9pd!m04>MlAYHH0dW{rz=Yb8B;3-(<+-;{b}vlht#QfX=B&1^M?> zGYjX`z@PiAf>5p+?_Yr7y`F5a{ui=X`25f~iW+K%APyp52f5&0(Dr=lwdL&`0qmm1oxO^AhpX?ih6vNjq7V~c=FSwWgO$`nNX zOCDXk{QE=OlQXk1tn`n4n_SA&h$}0>?cQ15mu&PXVmMHf zBHrDtYbcHl=?2~~uR)?_ESbOp&Z8f>@m z0ic`qns+1%DeeL79Oa~_#Tf+5uWU_;x)m@r_eM(St>zF|?9+4NJ`ok+&pmdqZJ}Q~ zRBb4~8QwJuv~efeStwtCcI7PnqDt>^z7h1QvoasX-Bbu$&3Yo9ix^{^0j^9x78>+# zTM_W~Sv3azG$!ikid;WbM9-C4LNu$2#AbC(!^`Qv((QUVCtoc}Zo5YJ5kb|8hJKk7 znLY>?%4JBAjzC-aj~*a8CI8;%h_PX1duQIru;?6VLBXrJlHtI0C2X74NxQ|Mi&VLF zqjvNop6xjnL-Jh{3Z~I1@_CYd`rYW*_|`aHvNTt`GmY|q-gCl3=8k4H(8%fK|gL=_zJrr2}ox&E=OrC#J@ii5EMwfood z!bFT}&y9+IF7-?3z^}>(nnyiU)wFpn5TC8YL;;phMK`t@GjVZ4Chlj;j-a>cXMyqX zWJPl(Cdx|}hi}utxF1h7daJO&Bl2dJ|k1qmKA2 z{P4nGbH?#d>-MI~5-zDspn*|{Rnzt0QOr*`v-f;TZFFnn53&nN_imE0_1~cYr5p|Y z2F)4gfR#JQ?<<0bZKL%Z-9BM@EuPj$SVLfzsFJ~{HFM~yBJ?Ehf=w$UMD)?h0@L2v zRgqWsD=I4HUH|xbk!W*Bxe&j&nG+Y$ru`?%XPP!Q{$51I%cGo{;4)%79bFD^|7lyoj<&e!c^J=2UG6D@^^JC{4#TCP6{*Y71CTD zrX_T^dC>rqlD|tAU+S;FS6dTSU0OKYQ5M0f>sQe>GU*2x?EBxn%108DVVK^I*GOQd z#lhGk74N)O@-e@r-8=(-zU9+h*5}v2ZL68U$KR1i8?(^IGpMiH9rw=kgp&_-0{Xqk zG|B(1sYnHLSK#R~X1BCl;JH@d=ADZD<53Q_6Klt!emtDM0Y;v8?0{dPm$sRODvqV5 z)?wY;_LENPkp84E*%^WuzQO|@Tm+rC0Z5aAIcg#)bDY`yYYNoO@}@-K5Y(^u2a0R~ z#I85!wnyvxFE97BHD4I(#6TYqLj5LXLQzA zwiLv+yOOhO*IHAHpi4^Ke)aL}zLK|nM=B-M%#=4)#uWS}g3KS61688T-IA1_Y{p{# zH4Ta`s_h_WZ9NObdc3RwGTQO#@M4Td(iDWyySd3Df_$;%i<_J0b z$g=3@z;JJ}BmJ^-$4~$HLl_S&y&+v1oIHxRj*Pa~oq@hTr*4lAnYt9S@wvYbOhD05 zceMVBU@T15HFr(Hjo`G$JL-NDZFxIxTPH|Y2&q8>jplpy{==;)+nd;<)6AON2y{#G^$8!TbzhY@lxFCRm+pP>9WqG^7h*9}VAv}U^UnbC zyBL&aB|r=3P=Khjus0`6d7wSK`N1#}Fk~B%`jBloEpAq8VcLF?znM^9ptl|}x+wg4 zG2Z4RzRjL?e9%{LzgdZ*y(51E0D(O02>G_N9==W4RiM5euhjD-$4d@%$8L^e zr$gG6#BSdSpk6$P%H0RnO(L&`k*(Hw(l%{WVT?*KW^MYUo{TNZ`a@&^lo2W$-*egN7MOF-nhOGjfdX6T~E-N!zbiIBB_!_NWAn? zImg8zfJj5q1Kq&;y^+&xZdoa)jJD7QebU+e9*o zGJ|O^*Yg%iXCmq+RzC@yKJ<&qQ=mKf*=E3jexf<{JbKO>IO|-WBAXmIJc6`Bt%u$R zi3E}#Yr;=lwk|9Hks}YAZdA#`%J7Y@R~b<-P1z5CJb~cF-OKq&5<^hND(BD$yIrj} zHy|d@2slimhGt zTgL)(9tq3kw<6(xp3^n{bKkc+2Y!=M;8a@w1Bs9Dp0^AJnUn3U%Jf?dThk|GnpTAG zFYc)2-xjj5@aM;SsSxX}go3!Kc(d&>b<-5cWt=}v`eiO2hQf5k3VX-vBf6GC#$xHg zrLma%=gY_^aFj11AK_PE^oDh2Y-8(_do1b3f4*F`q&!lM&(e#ejn3v-tr{$$Z#z>+ z5k8CUcGgQ)Da?qX*f3W%MK-sJr<{wONhKQms_~zBJ#4X5H8o!}Co$f?+$~16D!pnB(sb2gR-$^b$62 z#xVmOyBW0J=?1!n$=)gbD@tfBJ!0_bHGy7hw`zIe(NI{kL3@o@*VeRz9b4f!r_L%e zB0p%qKuaADiQJ!^)XwjBYPP|(LM7m&=x)B~lgD^kIVCh(%cf_Hyc#(?be3l42#vXL z(<$AA(6aMS;EyVzNRgRtv(=PLs>vMAOu(@t9D5q%!?qiA`0p^^;6gjcf`?X0%;bKX+L_?~uDkvQ*-VNqtnbAkE~kCp zYiOP?1FhIbZ9fPuD_RtFv6M=<}0obj`qz*z6@fu`#J2#K0|0~@v;QNm89eld9fk}>Wb&!skgC0Sg z{`ZQS(yyz}-A8}jJffGzB;w;%eX69UM`d$lpVR z_(tJL*BzO@)muW{w(U#!*^A)?Q0i&qB@pcj;cR+nf@>%<|60qQH#X{DRP>OolSrRH z=?>E`N;;x6RgiK2!smVR^~D|x{k1B}oM!9+iUPnSI8e*|7W_d<;%~KoO;LXp$RAeW z)%dtgj!8cUAu~wskC%^D0LL79zjNOB6Yo05NLVjKR?(DAG9o{>+TN_>r#S2iJ?@~* zFAIm^M5`ozcCv+gXq7g6|1WLVgS}euf=`|f#y2}+ikfeue_h%gziP7Eihr8>?&XeH zi{zYO*XeIxo&^bR?1LNxEgk&JrkwqJ#2bJ661^^_bCNN*dU&y!Tj{5uWsU3QTeWhn$NWCowONy3 zS(NzcMZv3))1m0C&i`;!pwHPE)NX!qmQkQ(VXG#+b`2&{U!}(S4PJXo}^vT>? zYpp8qwMH$(R~}!Lg!X7-nlFY}^O(2T?KVm?{x@FWu?D-CW^m}rr6G$);6jS#!(QJp zzT7`(e);2-OPYnPb0snD1`&Ftt(hwfg$b$}-ZP*oa;=Xu^GROlTQ`v3i~KNF{7>ZQ zsX%Y?f@XBhS0dewGHbr>tL`()TOIpKTxAE73Zy(OLYp#=L{t337rOYGj$o!4IItHj zuO;;P{7VMv=N4{3#_$TLB+1UZiy+DAsU$6KYAj9&S@+CrMuCsF_j4IjK z70#~?Ur6w@L|Fdh{wygp>0T`v#?|d(2k~{6EmGv5v;Ue>)}t;C*+rB87!zZOjpbUY zc{7xLG=|1Rt{z)C95s3tjK~j%38%$Ee@KOMkcb0^B2}RVh;`bZjG52)RK8XKivASa z^u>r0T9&~S>?&BrS#Nrq!HtS^25c3ad4#qMFU-SM(*AMM1ft}onQ>75oh(RI;^eXg zqRH)mvrL%kICqE!uN1NC0aBM$u8)irLG1r}v~=xS~F+G zlcirDQ!&p`3!9qhAyz2@H~*QT7FFm5^XE~XCJ$suW%@v`{#f$|QTgU*|Bdb|K6?87 zqNM1h$kj5oRwZ|_n&wp&c7~2Ovz`3W{{?cODLQ9ImA&|$SoQt6Vg^kz_!P4?y3wwY z?*v4vx)*#7G!}{O<$rjY-Ef!@=GX0LKYORAp&5Ef`Eg!j|NSFKTnL8#eyU$fZ5guw z2o?HAQlOufV`3Ok`;e5)&VrfLjd4+@S$$i4XzHrH9YVEqE$S67&(0YiqV^TlU$d$_ zASdTq%g4KDI3mA1$#(byv7+j9JpW^tb3NoOflVFSbWXL-ylvV_s4Ea&nmldtE!}wBb$JDDQm7qLJ3h8JBGB6r(U_tjoeWJqWr~0@`Ipe`&BOkHtGj!K zVI@ozS-n=Z80~++>L7L@>F#1)8|vt!SEhJ~&u3PO(yMj-<9D)P(~Tui?$f#rd&Z7h zTIkSrHuB#cq3<9(Hs~i3Kmw3EWZtU|&_+Y^lS*}Fg$2eAc@0?xS>}5E(!bKFF$f6pI_L~`+rnO~&0-t7={%JU~e{9K{e5-9jNlu+wu+|2-kOdj4 zEN;=nf{e_4Le!THmTdE<>T>Kh=N;vjt!_NXW{BfgwS~GpSzj{j!DuY%B*`K|l&C=3 z6u5M#hPH6h`kb(#O?`!{wzzBPm4X?I!ZGAO`PPsw^E&v~K(GG=ojSJRwsih-KI!>A zywrUfFY5mR&1|cqqA?vH3}}$dxX(P~OG?=1Of`{sK^b&%1?^PbI4ROg#2Z zLp6&Tw7&Z(CCw;}r=;YA1RBA;-SKdW4yN9&!T2m-(Najh>IQm3uiP9Sjk^xwM7UgD zRJjG!tALyrPdUH)Y)5}pWshs7Hn%}Ba=zE+WH9Z04_pyub7cJllHg3W6Qw)P`u@zxzL`oX`iKN*TK>wVLca`7m*EtY|qzXE+{$P}Sn- zVPzTmTB3nS+sIg)-7JeKcx;NAuK}-JA|GFRPC}h|nE+pWW~vu7sQ0!4**Voru;dZxkf%ieuV1d6D-YhBiONL??O>qW&tf?xrJ9L^jdrM~M1$Tq| zybiP2B_IRn=JNgTXfMH{se;q%^JB`+?TI5^khD$An~cTHDW;=P6XLrp&OR7@fI)0l z{Fs#5H6u}L#PNXMsj8cOr)L`oe^TI{_XvKh$G-hgbvQ=WdymC`1M^aejx{p(B{47` zT6W&DHb=nq!d4tq#if+dglVsYcBkW6TN}=yIkwP<$R~>zLtt*XC~6ce@~Dp@0#Y2+ zuYHECt=AWDql()d6z6T-(+%`!wy+%97hF*G0Z_(+7qX!qmry!~%RjU0aC&b*jB_GF zsXd##(R&*CV6Wsf*gCu~tOOaI&^r~_O=k6~h1q;Zum0X|N3ry<8t%#!C=?(?VGneI z@gfPN$hERVH!Uz!@DEU=1`q$lR-^Z!)@xgvxZPuEJK^iMvKUu1@j**7KVqZ0JInKv zonUsuI9%V5=$}^|7(#xfKIV(QaUGhqT4p0m>9CWN3c)7R`r#Z$hi_RnNrt5ZlrJBa zc>i7q+1b-3dMWserIfGrr0&?Ukdu5dKyn-Kp)cNor)(=%_VmD#syw});5?WYFcC6c zqZc#pAzD%U_QkD2v-L8g#UskNEA?ECwD)RFp@QeF-4QE@`zgKb1Xtcm;k})m`_7Q= zT{vnQiFTD$Bu6f_2Gx61|%@uXYVlKxy68*~|TAea;pYG}F zK^Eu7CRMbde#7f8h{LPqT2gA_5?wou;fs9L>hE@|wPM~ZakEG0+j$-GX0^k}xc+cC zPJu=m8Vf)9E*bqRS9VULV=)Px{EqFa=D~leV&6T~e{sN0k7?0074;sBwT)@}2bhaa zvPMJ^&`LEvT|TR_o|Zmh0XF0t(X18AsTvB(a=-{7-gY_u{yw+%I7IG$AK0bc_k9~+qT4!;d^z`aWy6Yy{LI0qd{%*$dF+bJAym+zfK{qAAp z|Gs_Gn?*)OeC%OkG5d}FuX@xj+R`Z#JH!X?Pz13p>m@VCnTOelvm<@dS3Ve~nusZR zYixLls_bALJk^FsOF>$bxO56MMPB|ntBc;jOH8uCMkWT{AVG~z9h0fDS!h9pTgwO76!7a#A1!<~p4 zT(1)hP2bDX0i3NT)Hs@@$k*m-=S8Gp;uNJq#R_*LquR^9$A*?$T~&#QF6sLqNES;!MXkTDP_vp#5W>oWHl;wj|?LsE}+vdi%G)T*wLyLMy zcSg*sY^CVK#zDfB)|4X=@33Cw^}1rJ~J@3j%+YTpHpXeSmCjyYV@SCiU4IwkAk^ zsv4;l+iQ1DYA&?xF>q*`U{<6O;wMU4CoAB;TTudS@^=U{4=az%7i4YmKAxOBgn znxu-VIt|RlS^~);dSqDAt}^q1LuBPmfODdelO zQ^R1xdm;7x*}DsJmH$&8ZM-KY`fawe0I6zZrfjV4gJXXI?t(z)^Jx*&(K=J95ml7M zs?0TK1m1k2iqW5Q73iv66Y?fxJd2QRyYZ%p^@4zY;2)3kieLfdVz#$PYSgWFXUkMW zEB4~gt!%V(jHT%Mb!C_%uRD9foas1D-HQ;Rc(4Q z&riGk^#ZX#7cEB%$c9^!;Z>g##*oedc@LE|Hg)eJ2wL$u) zc(YMd;WY~-R3-;7go`X~rbsU_^s8S?nZ#fLLn)z@#FX2=k{VdCnDXIPM%Fdge&Q!f z2=CmxB$iB9&XEO+Pz&x(^fIcC-(4>?4m@Z1^1uxW;_p20(0b?EBm! ziW7I?TDCMwOwWJl?`LmVx?aRezB!EIY;tA$QTnGF+Qtx4YVEn7r}I*|Zs)g4zD~5K zBWh2#jt!JaR|C&R{!e~@QtDWQy8GEyyfAR(1Ua+D`x`r85 zHJK@D8PEg4JH8^IVXf-t)xxg!PF(9+cOSh9-g}?eXy>O>WUc=Jo*M$wh@mdLSuFwq--kMDYG1QtE)Kb#k#1|?3~`3)GMHQ z?r*C;^qImL_w26|^9iS`RF=wm6}mr}oroTy^1}*u5vC^S^+A=2wr-?yuN7w`rhC~i zHTp_JS9t|94OK?%d0cR&cC^;e4cevyot@M`iCnBiV#gaGJk>Yjm0w-l>)*Zk)#<#M z%Df&$+ezSzG-pIcK^{jX)i8s2yHV%)EdF6QbL9g~X~66e;x|+=?ZkU%+sVvkNRjZ> z-@5dacQqb->6n%>nU=?JgW{u`1i94t|3=nWOKS8Xsb_@8#n+`69#i9Tqdc+fhO=PH zXfh~ix{>r#bGfEs)H-gk?9V#B>pe+DWMI`H@SwCrvuMDKqP>Xpkg->XEV zzG<7Av*DkijHpG>;GAt8Ab(01eGdJ8<{fBjg)`=fcPm?crNZPLKi8RWY?O?C7vR}Z zu&eHA0bb*1zVn;6@3{L&kgl)kNtd2-eYcP(S?0>?wyOEnQu@3vVb2uVj+sBQ0-dkD zr?uXB;{v{Aw_>y3+KS8*r?;B2vhY(*2hn|mZ`BAHfyXKTrNV48e`er<_J)FWYE^rA z7tMVGD5uDB=Kbnv7@Kj3a-mW=F#=jh$z^73uietIcdU=-mDZqU2ZL$p1VF0gAR@5f zN`9(-8YKrdHI3qJxc&R>@rJSFqI6STUe0)2%56)7h55K$^V69nI->6RVfpEv8+`G# z5BUWH1c`yh#{#kT@X;4jo>PArgkFx^A%D6D(<2^T4X%Hfak)mClh?evKg`gR zkM!O>{TBhUZ6es8ara*PoZ^t$vYM{wkVXx$k|T@j;H?IC6B2DMK^KPB?TlMi#wfq% zG23i*1wn+CI!BxLs{}K7Bg$jt1GDv#RwL&AL{I&ST?~Iy87I~Ca#3N~iybncV4)KL zhDFz9CN3WE+Jy11^nr4*T5(XtIk}v!)Ei#XSyDmYin!v5H5aRU1V12~naO=+I%hPC3^ESGngZcoRr@oV-<#6m{9A!T8q%`h!=0 zb(SjsBaORF9@eC6a+U=NdnxI7`6PRj3pj8U;+~yMG)7|WIm8-{__4`J_}Tki>#w5P z|A>d^)j9M0R*<$T_e4b+A3rdeSaUxYChAjF1N*hV5gFIF~q)tmlJoc z5pDVfevjMYuf!|&1e&id534z;2ws2nig8alm~FGL}p41iCtS?WNSw+rK?_%@9_i#R{u$1eEa)g$r_zrkx_ z4yg|8jXhm=`RUSOM9F8^JwTCj-9YX4dCCg8J(_Mbt%6wd)da)ZW)<`>HLs-apteI_7vj|W526uEY6>;1VmAJML5E$WtTE*WCIX}=vB{CEn z>WU)W-ey%9kbnPlq9_?g(K6z2-?t#IEd@lSnQ)yz(q@#up%M8}i#Hn7CC$<#mn9S41`Kbbl%s4_7S&B#uQVN9QT2=F<+wES2sBqtkzw2xx2wHxX zwREA4@iZNdbPI=>^FG!RHBx&Xrv~d`SWWD}(1+YWWDUCji&b~tYQ%<5v|j{EJmu0g zkjbXcl8QC?53d3a|7-D3DA(LJ1U885;15fV2Ub@2WJI{7v9U7qWtwc?n&Hvfe+{GO zH-YELPx`P~*%jt##-%D<`JXui4tv%aidZ|rx@S>CvGX9Th6&E8H8KR}l)%yaGr(L_ zy?EFrJ8i2VGR=J67_9T|E8BS0EVi+j+K0E8*HU1wKGKLtL*DI**;USkq(*#f?yQoa z@pt-fO>R`Rk^Q5S?W)JSS0r8R6ZY35!;2Vi{OO9Ump|_M^qmZu=U;*DrF~v+F5@2c ze0Rzh2KK2>&VN0b&;2`);!0CP#O@OL>Erw-+mXF0OguFviWeTezqQNQ>7gidb{BeP zrl*^J4&R`9?d$8V(jV#$X+}=I?^n-9bQRQJr^L~9f@jP8V7hPQj z6utpTp#HbbsmFf!Q3FUd3#CMnC)MM51plzAFtJX%`P{`PG8*CLsDU8Bn}xJdBe8J;2;fKM~UZyzYnGgh~|QM$8RCFo)pq5d!}%~41AZacr% zGkM?g6pbwH?M=Rf+&6FS92!;V4j-_~k#9tu?MZn#*wk^@ademATuMvKZ{|1dJE1@kS_~CobsPX^TmlcYAa`oFV3+wx1Mv zsSv+>qbGbfVZK-uMc0lGTNCr1CuIVbGfSp$)>AUuhm>QhT90s(@=401fi-#B=P5T> zK5HQr8lg&x0*61bv9j|USe`Jums%kIx0p=_1+D&q6(2$%hAzRg+{~n>xdO{1x0Zpr zdw~og$2y1!FjjAbq&iRr&4ehXcGF7@JduDz4ZI{ifo2Q zUcXndqF(ra1=B9|f6Q&nH4Sp-#M!J3)uc}t|0_sw%r2=*{!i<&sM}Ox3IVHNOlL7f zcx9NyeE_JA%>wp*HX&ccJaIxTsc_Fr$!@;``oVR4{4%AG8@xZwqrFFt^>CCByzFYn zXdhKt-Z|I=xP9GAE(ILxmW#AIW2#wwV)o0xpYhU8o{LwQoJWov1+T!XoN5f_r~gD&(^v@+)qtxN0%+?;S~9{^1{q@AYL zc8wVC$3qTH?}ugS4B54)_erH~khi8q#$qRKupXSg$Nb?PYon)nVSM@y#qQbCei3%; z=$ss`UFsoaQTO(f;<(Afr)_1nzkDHn`4%`kAy^R}QN5)(KZw+@v0`iW9%F&4i*=s# zrT`A=cf|ZG(}b9(YYop#7H>Eybcn**v!zqOS<^a1wFZ6J{DltD%hnd$w-im;JHSHo z>K+$4a$k;7@C=S9dp{xTXPgxuuE+GWU*63TYpfY9lRu_+D*F8m3V{A+WYw?~-@}~s zE*qC!&nq{^M8O}BYkc(5^h+HBPzZGyA?B#yaHsvkQ2b6Ly|?2UUjY!|p6aHoUTEM~ zM)+m7)_&21aKtNVUpdz3LOi&9WMa}=Y$S+o>v{@d{>X{W0nO&9(^4dFl#3VC_9%;BC_ zSkGaDeIMrLA8Jxh7TYfK6unlf6ftB&bB|>W!QsHm7JPyDs|%py4%8N{LE`SAgE|%E z$H#hSrnHJA3?N@W>gh02C-n>Uh7y{gjiSnvG!1oJUsTBRh9&H-nE8ME>of8`b{vS< znr!CuG#3!bY><9^V(hV&jjuP)V)8qkB{?>jBvqxl%^Butr}ZCi$1TR`AV%QePp34k zd2g*3OAU91y@uh{7lJd{B)M+( zhIZivH*$S|8FlPR4`9uH_csDjwd;;<+XRG;JwZS!?fe!V;)Aficc2pGGJ3T>O~ht7 zEk6pJ63_bC-LP%xFi5*e5G7roF*#oE_CQ8NPqJW!9ct-9%yPjd;Jx_P(a4Z^zXRt% zZM)Q#JdD4Si7VA%Y3z?hcDV}Gu;;@;*MlED9}qDku21ct2jS7gFwnH#e+O?2eQ1w7 zu2Glw^7gMUdYrhy--iuMikeb>f4&PFp{c)&_0FT{1~)HkhqBUInKFJXTc< zhFhGFE##C*C)X4MHi{TmRnSToUYMK({y<^Y)k`rD{HyKf{Du|D(Q@dM!nh<2bKB+G zhK@qF@pP}{&sov7u@Pyc2*%=O@tXeq__K09>M_w+>;Fj$#ECVP#mBOeM%C%L52>?WgY;9#Vn{y!RC?3>o$Jcpj0zgr+`d)A)54GA;1Z;=Lau9yo7oIeJ+NF}6~7x4 z`27)8pP#Yl4oHF4eHqxyhHoYR)9W}e|A^xa;43jXd~E4xg8tU9m)n=`d)-sJC67KI zgSyR|!S@%u5`QI=xe)c>q}QjbnGbKYcteBpiK5Ye;M)9I$|Fn>Ro~+P1A<&)6LE`MeLUf?j?G67`FFN6(jtuU6XakHpsC872KV zV{PuUU#k5VnUaQmQH#KGs`-mhOJ-Ukm3eYdlv2J>pv(%64kk#fl9>F;n+>-l4K#0wnjr}i znI)iut-?YzkSPE*^O+UAftDh%`{lGvwiKjVI3J`R(Z?pb3WFj;%Cob8TjQM?IC9HH z^ootT20qxt^9Y)A6M*qBQsPbG$^hr4%MxaEKYM1n@ z=+8>MhNG~dNt^7W2Z+{J_hy*83yyQIG}tTb)mAmA`bA1?UyUxJe}}3tv^W+E;T-(# zqdjW~4Bnd4HQ~DuQ&-th--*H4#eXaiK(f53ge_)k){8G`W|BSwKEn3WW~&a zXM;zX?8Rw|$l(wZTr8{bYEo)WjL5B0n~go{qt z(!Q`Wl*peE@p(C%ogA=C5Wz+zcsI%z2nDpKuw8UNFIIfqa1D@`?`J40Nt5}+!RuzwU?u+evAykZQ703eICbDF#qImZATcX=-L-`j&+L? zDu{WQa|~8{+iXQAa%-s`1Q;#b3w?YTW8R2gbAtq=dD%S3MoPt?dcKU5v1>5$dLJy- z#7Sn)crfyA{1Ny1;xNMV8pB1I=mGZbGGnr|k66_D7E}ZJiJkmUFUtcquAiD>n-ryn z721E6u>(a6Y?+tASUr6^8N2EXmTVG}A4fILq0kf_q^36}EohP0TZbNB^*_4QlC@2< zbLNxc$-q302IbWDJ1@~PC;TIO@=ZTeCgc!YQ2FO9Flc(dYB+C5Q`iSs3!g1%NcrmJ zrtW7OuGCy-#JXm&`6Js7#z?x{aTF`#k%l83|4rz6**gy&n`V~tWO>h>q;(v;*&FXC zlX4Uh3ErRswvEz)iUdonL+4xK%T<9*@Ky6miwkf5gt8kxBEhkb?I|cDUQ$+tiL0CC7@6 zz3a*h{AQnFDSOSuTTGu+tF~GNF#G&Wb-<*U*yski`!~(K_sxv7_k~6(QxPvVMk&ML z$d>o_JJl4|V$d;QwPRdyY5bQ{>`g1&&#2H(k9q0Rx=d}95Hen*DFc!OmRB7?MiFyN!7aI#KtXJ*vg=rGK-A*o z9ZeDnpz|;)4{7DLgpWu!>f%No4M$w+sR+X;)>Eu3g34|#$!^OJ@jHg+wfd8ev@1`z z%~CeX#b>~{h>ayk++@u!*(C9_;tZ;irU)%-Q^+|q@XlVAc>bYEBsST2VD@KZ@)+YK z>GTUr8@zREq%^E;{=1rks%3Eh$&HHR+-DykW?n_nD_jAOiD%hUQKBRLJp~6h1aE!% z(+#|xw>n=-k{3+R6vZ~wij)7?7+=AUnzlSyDysNzKStj}Elo6(PN+rfVEbO;%0e=% zWb8f@hU=RWYVt1nLH5ib)f9<=FdNrXJD5Y}|MeKANBwn3WPbjql}`N^wc=AR`=)0u z#qfP~5^cmi)qP+#1f2)TIE$iTYr#31|GtIgs}@GOrObiOu2KTZ zVNWABXgO1w(7f$qLF;y*_y9)m5Hyi`zjF4pvvQyCxDiEGpIm2|ngfEe_%8NkQ1fZC z9AFB#J1c-EJ01a9AM4p2&@rp=rD&yPPf_o86b6Xry>MCTpvkOsglT8oxD`3^W`cXC zXQbovseR9!4$d2uC<*KRH?k;-0@D#)A{Wl~)(hSK-C2V+Lk zE*@_~o@qU{6U95??Y!?`_$Wb%3{Zqp?IKc3nq&SaeP%`sE!dv#u_OF#q3V7?>M zAK*ekSBfJxE)Ex=08Y@g*k+R<#Wteq0;|@8^6PT|Y#2EZtn*|E*SR9T%NJYNg3+bD z!%x`16`pIAqm(ILBFB}o6TFvS9S6LTTr?(6Nt{FLrMcG|<6vx;VAtZ&QT&`cq8Uth z0=T-$i<-TLCSUf~fjRL~T(fo+t*#kTdf!Bm%k~st%2Ig~t(G>*t3Ck%OwifGyGK06 zhW5FzPX&It+M3`H1|(F;&|OzGLJaAJy#>KEH%CIcrd^2^g27*tu}UV zj;HbT!5&bx{@li^cYV33=8x8YO?4v9Z$yiqcVOO$5kJ^A;2ic-?%iyxoN0CJYgWDY zCNZLUY|%1Q@S*UkE@cdjU!;9~gA4--#Y{%^x2P1cmcUr_`$9P%x;pC%KgkyhZgbCV z8!tPc50e=7P~phS<~1a54X^Um7T?6j)`7{! zZVzm~Hg@G10x$A7me*8cp8cWT^W~}C8a4?D2tWdUKhrb4c@{9R#ie7-!=pIb4~DGg zwMcsx;~J(51V8aCxLRC-{+@ypW)9@NB0UW{ss!a=8L8aNNz{FeZwtnsRf;W;?ss8# zxd6yr#t#e0C%x!M;JUlGU#QyTU~jQ;UMd+RHicNbwbpLnJOhYXG6d}f4AlH%ZG~f8YtZ)=gVfMutMB3h z#q`o9^OI@$zrD$SF)#bVsg4`BEy1n#oxo17NqYI`BL;!*`ys`4^og0;zq^-M-fls0 zNi7<}uT#w~{IP#++W<(^jR_U)PtmKV7NRRpw8fl~Zb%L{@uZ*0KB(wY2vc6-y}^>% zwJmqlsR9cj334(gt&BPOzJBe)QX+jZ=4T@ans4CVo!Dfl9$lryvmRp{v_N8h`cna) z$j%cXf@ckx!gHp#@S$fXe9#xRf5efLg)Z8DN47`GtC-j6bkx+auIW>sBPQlg^d*%E zjQ@BlAJ~fBVZC}@Rb#Nr+7D41|6t=xuq*3tZTiZWZWAg=LO%_M3%ptYs||RK0M!QM z`HX|4?>Uc}9z~U0f*1mj4w8kOMwai!5$194 z$a2rM#Gi^mn|(QAu4-BcQb1=25 zHSp#=`|lS!CBpQB{i6xgk$I!FOmX2-0$PwxHpe+ugo-(JE>vHN=Es6%5p+iTuz_wU zb`LPWG6WwvAA;ZfKS$@{$n^gBf3vbwsNNLWt&vG zV3cy-6j8a%W$uik&3zL#cWP`HhHco~zWe?Dh`slEJ)h6VJ7ZPSGfy7PE#}XnYwL1gf)AiDB zifHa1lddHK1&_5SWtzU(jw_AuuN1~W>rK%1d7O4X*1G(Km;+i3fzvR zUI59-93#ml*-eR2x~$9yaX?dlcSp0IEMPvs+?SOlajyTcU>$aAOHqIims@B8T0ht%L>+XcRV^## z;B?zstFIO9eK%3x8FLkg`VPOqG=AQ#xv}Ljc8Rcuq6nV0OhqTT@$z(iNJs8u?2^cw zM$b6ZR0HCGZ{wfrchGkt)7zVo5i}Q7@-b7pp>ug8>0@R-GrU1t1MeM*9@sGdcV0U; zFbaEFJ#}0}xY0!}-Y!pG`^!fdIveIAp6u=@^^e)@upF9&YYxbR-sVsLX<l;Z5@!Azfy$Z1^Pim%EGK#ZG$%h)Ga(qhBetD zp5BjI99=Tq8bRIrKtI`8rRBZIxG(Id#=RyE>|j8Mx|nCRO`|Br=5ppIjOJNX;{ zhmA6ru$FASDhBp(P{U347gws=@KwpRx!mVx;B z_*{rRmxOLibnrHebDy3j?0n(>kpitx7;}Qkq%VCYa@yw>I|kRcZ?o9E<>e}X?LH5N zQCcy~uMEsd;q$?7Em8?X_1*ln=v~PN47pThg{FK%RC7kYb#d9|;m8@CL9sU0o49i5 z<5#tg?UqtW8DS`HgrB9HASuoKy8Jv7aC6$K?t5m;#kK1z6Z1B)OiAUqloRv7ia|!( zScEf9%(^rQFtY}?`MLl<|dp0d6>NMtg~A*uG^Iu;uZJl3+2McR{enU8EEiFp@GB|~q^z1xzL z8k0G_?5y&x-v&%!>UjqI)sfH3bnjOPAzEsG!ErvgjY<5#$2@B>go#Ho+d$w*w0MQX z3uW_G7pARQ@T(TpWV_bp{J}xl0vSv1=%pRI-dYPx`nhu3Th4W#hJPpCv5s$ zj2Xvx=vS;Yo1#YdC|x_toXylp_M0unfnyJX!lQcC*;~~?GdWr=p$Dm`W}SEo1&U=( zDG&oYn4f&1VgPZe_Em=IhKQNUQm;e^T_?D^=p0chU+D>Hs5cf%a3nu$j#gs3jD`krz)#OHR?j%(JS+ z@Yi3+^wU#Q2)uH>HKz4pB}pu-$OvmdKLXjTWr^WUzpv@I5k*EsBjKv{DHnZ~Ds%|o z3pRNh9VnWcMF?3NkXOqU4-*}eznVg-^pvb1UB%f7C`ktkyQ0+Tb#2^_r+NgGxtf;} z^J^S%Fa`^Q5Y~w&{4A%3OKc&(|MmxG8xjvtuV0imWnDUXU4i;p9GMS~u}f+X~e z6e!wZ+LV+03rJ4S(pPLuU)Vcd&k~C%+uo|WlCRw}l zh1s0)8CSK5rAa7v4@jPgQ+&5VhEKx3k~69xa3p`7gsoOCcE$CHn80gj0v86;p#Eg zn7}K3=i!N$SH!r|?r~S*)=ns*FivAdf7D)JGSz1rz-t$-KTulS3X*r0==PR|ulqA1ySk@78m0D~ zIeHJ51;yGSq=Jdu=bSAC(scxWhkB>Aw z!v;b_el`)ZxV*5xS-bSooDV3n)S-dZ>hJca@z*UL?4H$Ly-JdLk1}MKRHQ&M`I+!r z&X3n4_IlrJ#_~j>#y=e1-!;EX<=^jpjwyMs#%z}|u4%>v!f^fpE`x=a$IDxY+#cAR z`WNX%M~xKMePye(t@Gp&(QIP(VrKB~VT#-@(&H-<@xAJ2QrZ(qp;=wWO}M`Cc3gemi^?)od?=tazk+G*cxy z(r;nS%5aCZK>G%JVAvhi*$NPm%Jk`S)UpL+(rH__d#qJ$uB7?1t68v8SGEeGx7 zs6d|Xm$-K+xPJ`-A+OOg+$=dW<-M{aK0Rw0<;W&z4C^h(-x-`li!!D_{+B5`qR8^+ zKc#9aI9-{-$f73V%aQWX96`*S2gfrWWH?*Aev}I*m?kM;(!)^FCWB9+)}$#OtLY7yi6cxqpB>zMRNjA zBnrwDRH89Jk?Hu+SiUKC6;H+Kth5ExwY)hcWo|dr{w9{Df>muvs9ZwBTqEv~MDt(0 znKI~-x)bF%=hPM$wRZHm63yK*HzR{H7N~Y@{DiskIs@i{$DMF!WI0LTp#%O7h|Z6F zX|-)5b9h0zYjAgQqETXtK^j@mcLPZLNV?{xaDO*K>5`VI!Y!%vSF_3QH-1Da+N@vl z5^cU`gTvYwKp+V)tKgmqlfM`a{tdsyL! zTh_<)0bQ}y%NZMO(bnO^XC)rg+_gp$r>6sbZIweuwaxbCT&{Lla6s(y!w_UCbKx$i z4|*wq%^Fp_Z&Y{9pOq9Cbw$a5@ct^R=c`fWbmYCvt=Pu$Da1KM*N97=%Kg87n&k3q zaw7PS?O$H5S+`&t%kmG+hFGQy-@B zP=zS3WA6ZtO)W>?{_14cD>NhR445a!n5+kQ*p$J0$vVc@ykq{%8nhu&d(iGr8z4lc6Od|xo|^O3vtfRk`ZlW8|}oF&n~8bbV}P)@#LdlU*fp%UeD!TATW9> zEibHKO7GR~l05#fD&Si1*v%UoBiaAPiMOr{fNWCw*Qnz;qc!e=qK&uxo4v zOF_4U4fHAz_)9>k2sS62_bEmS*&}g*w3Ct4jeKnj7T{;B6!{KEoS=N-^Zj(4iZ z_=;Sg0&MU(cQii9*hCp2mO+>uMymXV^H+l3WiX6mw2r;=bbB1NlzyW)Pj}vIFCE&a z-Y*+t9%8Rj^=xM(kET&EzH%#&EulQyb4gHXf}WG)_Dj%31;?fH6ey>C{mplSzfPVb zAX)^Q4Yw%jXsPSd7;@Mi5C&N{2&X9-oHo+ZH_fh0Ix+DN`Rz)&*HDwc;MznKdkWC6{5WsiFptFkks}A`x!o*kf}|lAKjp z);!E{c54AxWK@eaW<(#`bYcgS>#1WKzKTk9^8sPV^}QnS^6ImQmAss!Q@wicB}|E@ zTHEJW{&+2KI4XdB0)fSoUaqHwmNcC^5ukN5sjV-!;l z4v40Kz?2B%KONV~I$hBD$ttq($iKbV@pwXn@e>#Q@O4T9LTiLL6#Tl((dq5FcGXccrD8HpO6v_{om`}SPBh*aLUeexAo;=UW4oF?MHhi#uIcm() zZH{bHriJdpF#C}p!xY;6v8ioxY}@otuGEOQU$e64o>-@3*dUg_e7U=P*(HYC+!~y+ zPAYw0`MX;kJBr$iR4@^abVqG-Kl%C%X^%y?#yF#qqs%STUayVC|MwvK z!PyEs>W%`b?8!q-Rb(Ii`pWRu;WP|6+Ipv7EOKsHhh~19`FSd6e^E@oL15%Wm%XH- ztiix!r$uNsYY$~+LL&W$Bz97H!zawy;xvagAUDO@Qkpa^lGg}DF1$6w5lr7C3JuzeL_j&<4 zL&{%X%@g>7QX&PIZ$PD{Ui^vGrX@+A41;r;?5L^GE$?^D6y+~XB@Pehe2op+rMNkr z>l1UptUxU3|H0xqgpoKo_syKVEy1)vPhK1~&ex79Q^8eKm3gXCV)r66e> zLWI6-+sf71h(x_R*~UB~*M@mf&ePEk6H%gfSIWA#d0ng^Ra_vyOT@gxA|PLvrm4jz zDa)3%G;LwIoR}M|+5=s;CBW@ZJXQ{Pz!%ls@RFQye+bQ#4$??G2MTKLC=v@bykvmD z*a*^92qi8gU}*!V6eR7JX20C;yT3tHPiAVINMaV9&<6|dKxQ5umbU=^!DGinuzwS= zCYIL-2TVQ1Aru|z+FzX_y1vgofG(7Lxh$102k(&ybg|5BSI&7d^r7K%o|(V5-(hK> z;H7;VX^h)`EvWh$8n-9DE8Q~cT2OHg9-iWq<7WBZcIl(fGk7zRmZE%2x*^OF7@cy~ zdo=ofyO^v-PDpS^$@5%8M!NPR!IkkcH}g+fUeqju%W8Uo{TUJ_5(>PwXyvsLthPb{ zSr*Uj8nKjDxD>9QM|lBWP~sdbXGalo5zMvb_60NF+pS;AQjoU30u7nw-ohju^__<@ zA@swHe%4X_5l#mEDgl^9kaLa+UGPPh=~o0S4ZAYKQ!9II*jwi8&)ZU!S}~72Vm%&Z zbRF6KwX!1pr%kp$@QQPG_^TwfJYAGZ^4jFjTb`260SFTZncY8m_Irnx+(%JG3rt1! z2+1;b?`0av?u>1^VuES(oY|d1Z1@61R>=T}b|6m1#ls52c?)XwGG{7om~oyCd6YNR z&us)5vpSPJtU((jN6^ZEF#J}PDYO^293i%`YA?MdhluHO51dx)da!rO|Mr`2o- zOSQF|@594}!3%xLg+~>mUe$ODChZCpvD10T*zOaT$YVhNIY5r_{$Q2>>Z{ z#vI-DaggIt>_%&*2BEtbfK;(`FZ%#;)8C2a9*0hJL?E^Ddj@!@`VaI# zL`hZ5(iAw=W2ep^efptfn!!u6F}`T5L}edTi+t&InCVK+2DT}*x*E1o8uwk998O9`}QbdBgo5kKzzRhJt6fR-Sv z)baxX&n-S|32^&?`wgv6>3@00c#AF^U5?*$IKT4LC>?U%@=JA{u#`MzKBOF*Hv_)K z4o^01qkgj+JBVjCCsbCR#q5dGJr!XIy>L9Q?JHF9^fS1E)-7R7B8i1!(myYorU87f zLFf?a8MKQ#H`XEIN*>nFDu$SyZ2c#b)NC0|R#TL2`@o1eFD>&RAs3;n$T;=4p6{wU zVs+=RkuKw`?^7bg_pgzHVxJPlw&~$-QkLWwq5C4mXC3m{kt_}SzdDOOiP7u+?iAXX zJ!rP+p!QqOzgJUUWv)_C4PiHbu#;yQKXLsZjXa5#5UEea{UCSv>P(Saro!qi=i`zw z@}Xpt0%zJkFgu&QY?ZO7chhqzB-Y_J;+q!VKvqw)sQk9lg7ZE92!Sj4AdJmVFYe!at%qDx-xQCci$5<_-w}w#ah;P4EyPUPJeNJI;5&b>tnJ3Lua;esF5dr zvT{%$Vu&6djPYBtNW6^P6{C@}tq=-NZL|~y^2QZcul`|5SqzM#c!T*qD0BUh1qfOC zx=JOH8sV^fW{l&-bFGq!TDLU0sG6`hH&=rk9f`&#F@8{s~u@7Dz# z1f9v-ApV!98|_muzS*#CsG@rv$#hay;ST{q`(t93ou zI<98z2?GLMmi}bQGLM@Vee#vWP9m9utt>}@8YB99xNB5z&8}-K&8>UTh-cj|f@}x! zF=)gSH1GIwX?2rWNDS{K_eSB(=nR0-*2wDBYZHyxq0>9tj?;H#2+vbwbOh2rhBxbd zlku_1b0c5MHvYHPK(2TtxJTCIAzSTrv|BE0cPADWeJ~xfm^OUWio>=2G1(v2Tb}Ew zJ3K9@Vy-$H>G<(HjcCPHbH}r`WmHf^oUi6VVHS#V8mserQ=0wlyx8^zPJ{TZ#D-buwDT zUZ5_d3Z~U$d)B-zJ}6E4YD@hi7BYC&#&sN0f6|xDbIxno>lnNjwS9N+nztIIveprl zi@k!(W{#%}6bqb4%*^*`2E$$?&9#A$R`;?UdlXH=IX7I$yqD_ZVr8Pe! z4E?9>4|v5|O2%?+Or%aaCYYvHqD_icJ{wRy;sg9-mAXpB?B?2wW;sUe3god(DY$ zh+@1aaTAVj49n#n87>xmv(Vjr7Bw}Jzd?49={Fywx2sFz>p=5D1E^WW)&9maDgKXc z`oDuQF5}(T=8dm8BD*Wih|ZS%eYQaojYe>;5WQBymny{2-!$4qjIAW5xZhq%6!NqwdZ zpYggVub-blBr02Mes&v=P4vuD+ZCVh+gGQh{qrtbaF7rk#zhl7Y%P?_KiYh#{gtQA z?bubiG>|eSrVE-+PAP|lh%eQ|EyWNI{&L_iB=k1iSc-Z^zuUSgVgX+W)_XztQF$S8 zGn0KCqT1S1tvm)suKHOH4(g`hdETw8w*H)AKJRJSiuA}ar_M-d0kcTVDL{jey z;_+76732Ps`h!*$8NVmP6QkBAD2d7@w2Sji_o-N(Jn4QDSSJ|T0y9uaW=XBTgZQh5 zSC@@%S7KQOI)A}nOKH4wXJaRg@Da&vo0!M0QcYARg)yF(57QWi!X%D#e0x2fqSCvu z3ykZEvh%54e0A44i0E`>X(W~*O~kR^d!6_fgXWRA=cc2iI6sfMKW-kB6rP+W#Ljm{QWxm{%bCjdNxS;fWV5}hJS zWw0@8r#^6aUFt#V+b1gO424#lqZa&l_o(I#d9_LEY2ai7DWR4@A^NeQ zM?{$UYe4$hJKE_3OhJ7+4asNk|7ISKJkkDXL|r<+`V{LxO~w1Ol2eG$1pM4(#>c?# z<|6!y<<&(9RB3|9SZ(xDz8r9~%OzFL#w;~%%#wXX-lP*)zr9@l4zQ;PphTdBv#5lm z=edH?co}X&`IP(dd!F`0_p~BtC(L1AUm|}<3GAzX4XKm>zJc>dl$~*xgqM zx;cSNvel+YXGk1czYoOfCU{Pr6VoB{^U2Yr_9j(?HO+A@KtKV82!<89MGR+1Xg)AO z#5pCAUqNtC$|M{=N=%8_n za>H$e1CM2Rce z&6Iv=%I2fipG`!9pjZVJ5la-~GC*8B{e{o|LFf9oELy0lNlh(H&FLg?_?; z=GxVJUhTuw$QGY(KdNY^d zSgJeWXIXH*@xRkAl4GeydnaoGV0qLM6O0gY+^joq` zx0^ojBl2aMCf({_(AiwZ#DEP8?(imj{$7uJz=9cJyZ7edBQa zU_@Jk_(~|s*zDH}_wUJPgOZrCgVBIg8Eb-eEb0+PJqJBPNpe@(byE=%&+kTz@^_PI zO|ebd^YZsn4%G6StG4B3_;%{8*!@SLw6%W<;uV`%LGC$Q#bg5`+Wr6wXBS(h)32!2 zRIl=$RHf zLJBl#-F!6d-ph&kV&1v+=sncA;;^j}o}U5SC0lD!F=G^UZN*_oB<}LBAvFkGFWTGa zr9IS>*P90xe~j;iKUgk4@RiGGBLgM87j}KJ0&0 zN{m99CmBEy=L+H{4by}GK zqG&%|EF z>a5XUnE?e(hg#}g?v0pB{KD0i&2 zB`6%FSh%8R03{;n359Qc_g~@+Nb!A~4v?cNT+GSh=GIhuR8-=Nd@^eF=jbs?tRcda zZ#mC}_;S5jh3|OH?axWPL#cf_?#P1;`@=YeK0rhcMugo+u%PXr zJj*M=7nwzSBv#b!LCR1>cRz36AqFt5oyW4rFg^>(O6@7NoE`DG5gj8ueC6B+Q=e#N z<#ywTwPPgsUyz%*nGQ<&qoiS%)$uG`l>9q8en4j2wrMd* zQ#WO1r|I31KTDJk2*doZ+vb~!(D5=~vXayO;Pj>D))YMiU-8KGz2kijg@DB0FOHM1 zw5=^yDuGs=PH9p!kO#QLD)ISUv#HBtJ-`r+f@$B|>N7~09*OyuR}&~Pw(pN8*NW8b z(k9g3eDl4^-?WZZCtxeWIa#$EhEg{PjzT3fLuD4ur>srwIBDNRjAcYvVYIi-1PA7S zIF8jXV%E~IgcYbM)Q=YNYWAZE9)hq0*hdJl>yQqz5t+2h+ zFvikC&n9i{cUW?6(r($_?``bp_O26f!@hpmVW4ScovkyRX>l(Beo_AsZ&N43|0(;0 zGWNgvsT1Fi*TL>#qFYh!i8Z|CI!5F)>fSVXj(d;eulZ^BUf;y#z~uyd0s84SSbk%%tpqCwM{h4 z=7$H_R>Dy$D8>h6yT15-a`aa?#1}6aHdgGv4R)WC%OUQZ!Aelzx#?>TugV^7Wx(vE zG49KsjmS1FGrlqXY!S=|H&Kh*N8908pZVv?0PooC4KnZVUr6JxZvE3Nz;|O+=A2fs z?vh!=!Oxx^+^An`_MDxrD9F&oNFZ0dL*&W%L^N#Y54_}<;fqdSW!`Ko^ zK~uYG$c`EG0|2=_WA7EuCDSvuGn3A0Kjxna2gjST_*;%L^>5ic9f#7IN0Otv#{FAk zUle+EGIjcluNl%0Y@w<$_x?ae_|nY!4IDhk?JweO!TIu#Con&1Ci4aBeEdX1c+1>` zdeUWRZkGY+SX<1^%K|UuIb~qb*c6kRp*SBdyxeIqC};^opD;li{OC36r`loVApbPN z)iRt#(WP=-|M{-85MO$x%hI>5k{*W6M0|?kuMVR`-B@_D;Jm|!#-YJYE5D94H=saJ zkjwkZi2 z*pct0Rgsg)Nzjbqp$N>f**M%eyWuwVo_+~$CTyjWVRTNDbVVvZ-n4R1DQ0vFb)m3N z9Zwe9I(+fV>yb@Q1=ww()svnsn^(QB8U<)%r8T6g+qykG53B#=FNQ-#^RAuQ$}{-J zp|9l3woEs*YVgP16)$84#J>d$^yA1{=~++81lntJ2W1LdLYUTI*vp{-E?=Y8Od{M= zfrXZh2$mcT?#ndXh*H4_qAj$d|E6c~tl0GLp!4wwOl2NZ5s$BH*s!tjRj`CT4U%Ph{@}IoH|1)3CZ5W6(~E~2O#-AG4rFX(Sg5QK|C#P zk*Yyy!}UDUr&iHI!Cw2z4wn%6J81&*ljwO6x3_^@l<#l0(oql|ig?=y`{3r3gS`vl z6ev0xZ9M_0*j{JT4CsJJx+q-bkaMcR&f!HzI)g$pi4Whuenw&@B5R&M{->xc3J*a4 zxnL7Vnp>D9T01J$IOoM-OWufe^fuk_&tfwVaZv{SPWp%nU$=iMLHy{QI7}Y}&z*P( z#8+GQbHtfTKXIzljRk*5BfAGf)(4omMM5X9t_YjcL^~1brv%iWTP9e_#W7BH%#Xdc z8&`7QpKIkOVt0SocZUm1rHOH8-wZU|2@4d3JQNoWSJS@7i1?XNmYK(_d6u09fJyM&zXA%_5i2t!(jqPHLaC zAoHePTZDHW(8lGjpkdC2#6)tmCC6{$tow-YbgC!8&1?uNrAH3nj+9zL&Hk))+`6O^ zvSTji_QY-yMLoxiMA$y@w(Q<03lsL<76o2fA}~wqo64&5&hEC(ZBc8xX2|Ol1B`DN zI5_$1+B5x1;>H-t!cd<%T=~%`!_dqY*4*u#^xUmtp`~XPFiV&2P-3$DP{!d)ed^O? z-m|?2gNM)Bnz3>khQ+ctKX=w{h^3nPDK%kNuN5gtG!M6PRkW-7<4y2C-G!+DOgvNu zOE3wjIyjevcA*xPGDFJ9R12v*_>M+C2|beX+-)9e&iUq0e9`}7C5ZT8#Z>KNjt8|z z=dvVDv&tOHEm%mHs+abCBC;_eLhZ=f&OYLuVfY{f)8NxK9r~b5goMIm=91=9KT6Mc z^+{dQ167<{<;^v_sgmv~w`tUA2|w7%mlg8eMO%1FYcs<(ISx^egiI^D?N**q|6LI@ zTXBGPIG(`wOF59Nnik83T8B)qlL=~i&1t|Ktx@GyaTdQDu`f{hxo z-)7to?mZswHXfJq+hm{JuYz(z%GXk_K;cV_Yht?0J@MxCmA!Je)b;*WjC7h+v2vqs zD46an-7rvnJ7U%?Ob%V7MRyCf*h@BVeR5C%DC_(CdA#{0F;u|h1^K2h^XII~)48x&zl)s?&!8s8MT+geM>}&HYv3(~SWBV`-~j*b z`Kg%3_tD%Q-J`iqB_t&*d3&@g7c#APTOakg^jd^J zT1N=)iDI0tFvGf?GumMvz35pu-25@t)WTXfR8miGW_)nxIB)8bW|aH>e-v6;tt|Ic zd88tA&l3QNoSjI-s9eTyTuM9)+e=z%zY%X$?r&{OAX4J@dYqM7tA3mO-e#e-A@w*J zG{j(A%g;|$YHvemOrD^->keS|JP%&_dW4cIZEmECBmTWgs{F3aNX5`UN=2V%`5+eN zKMMuMYXy?KUr6Tq^nc!gs4ER$wc^-B5dJd~7w!cI?HYp_!TzEiGo7sntM@v}dsk!f z=0-j%b}B&TI&*P&V8_42HG@R3VVq_6FFOTq&R}Z$paxI?gvlndV#WZWB5r~|)k~|e zi*Xp8j1sPmVmUgje>Ut&BRg(<_f*_?tK>P(|Wsfoa3|ZWw3z=c` z6mB!Y@P)6H3jAD!mm6YdYwd!ej`xFpN>!^%pIv=xp+#`A4wGtfZP8K-C)Fb1&XOB7 z0C&oBG;~wF_P~-Q2>%q0XO4ylv|21G|LFPRG^oNyrTo}PQh-aOH^X3Ay0dkUh1|p< z?wm^VRZ;Z^;;Is^8C9a{R}k*OFJ6x1qk`mphZ& zX6BAko)sNDiF~q#iV>-o1;$-w+#--X0VYOI6-*FQp*}8_iU~U3f7dBTQf!l%<}Wws zSMXZ@6G8qVl)W*~mvB;s#LR52eFJ4NCERUVPh!4QWhN#zF@Tw6QXKAf)Ty6t z*F~wb?Ms9osTY}xr0971rLCP1r?A=ZQ#*7tL=y2N8#Y-flkYQ9ViPB75q{eDc`X1| zSo)v$Qmse~I8RHH>$4^DbMYVd<=j9)Z_ikQx>z$0R-CK}U$Ha_?%(P^L0Au1I<%xM z;7Q+sk8Ml{MiM4h`iT|r)xH1K^>~VTqSDy47 zi>k}GMt10sop#bAy88c`$A7H5J4^MohDt6~*?C9%Jm?e1!j_2W4^{8LED_=38eTp$ zLtmgK0H>)y;Xc6K7MkU(cTQNF`j?%p92emysil5bu#q=rbgXR0)Ssh@tvw|)Tk=^e zoyM-#%*q^jU2WRwPaE0uDyq4x^zFa*7zzS-Ugs+FmdhiVIHnqQJzcKdq=$C}yBYWR zs|+z8D(`H_j^e){>`{XLjHjz(Z5vcu{Tc0ixMV*(P_Z8_X`%xi|4}US;p*QTJFfN( zT|yNS1}z*RfaN*gu!1C5@}puCBoD|C%}bEMi>#r*0kx+#9VPMXs)mjuauRMWyTZKx zew*1z*gtiXr{;XL^W#zqO^{<0uc=&eQ)GlCTC)<(q#T?bm3Ei6EVgCH_>f;@@;C;5 zi|L>JsmaZBn#&=cbV=7?eNONQE;_$*dw)|5PiCVZ#0F((v;xii0pZ)xo6_)AeYGxN z|AnBfQrVdb$I3bFJzuxz<+7t?&df(toWJ08np|rWFi|MHIh$BI9YSlSzOS2GtSX+{ zz8YXI)oW|9FYJz2{gSqo;5>oc`~dhAQF1{Pzkix1HH)BQvbn)w{|t zcX&PV$HTVbmC}}n6FFmnOu>$$ukhI>8tt`%>7yu2()W=cDvfV-B9f}73QfTe+$z_k zb9XMg=Z)Z|Jsw6_ou6N=T)&wJ~s1|96LhnzWX?-5$=W6r0)9G!kHFe$TD3OvwQaeatd3qm>eHk^oj3lX8 zm@XQz=gUdDoNQ89htBFdL5Gf1(A3B(h$wQS`p56Q0;P_IK?S<3bH{;o7E`uw{NEH! z`s0$hu=z#5#(AgOxj^h$U_ZpRbrMu~GbZkRu?07H!l=QVkWurODGDQt@y$AtwErGM z59-S?6!)vXmTlfPr6WZCFiFi_Y9z2HF>z8Exp;9m`ui{CGs~QUJ*uex(T`aEP ziwqEMx=)qiY@K}s9mh)=!@63x#CNM8^uC66M$rr=D6z?SgV=K~o0{<3ce08z_#nAF z7;gQI?knymB1MgIr8%wmlyck#4IU7a{*!ZW_zu@~=UZyJ++GVy$leB_810gNxw>`% zW=hh^N{+0SLrQGpsf;dmvnRTo7wEFNs92gi;Xb-^VxnZ~Yu47^E&Z22ghtgukeR7$ zpOwhF|G<{mE=7dbVSdjX{J_00l!7Mw-t&yV?eA>}=19JMN9Y>U1OjO~azN&i_111% z2LGG<7TB>naT53KhNzjxm2I{CyOZ@>ioP2{g8+8zAC+c4g4aU9K4yUq*=n~KPSQBfcgksGlYgPr z%JE9NOb;|rJLw=d=CKqOAFT>aat(m8)C*sy8DvT=85~)D?_9jCJ?5DUcF)dg^a*5R zA*Yh^bQ-Rih=p?XJuc8x3SHznWpm%SsCO3R*(w-jS`^R33(Ua_YWWdL__qB4F?|XY z+ax=7*dMj`OMH&&1DbjN73!uyk{UWCJz@-rxKtau{(yNfi^(Ly?ypFr|^5- zLdiAcbAJ2+>zupPKhV#ld+yQl`Nej0lf*LIkyBN>>i_$ZX)gEM%0`xj&Tvde(q8&+UXmf13D-s*l72*5-=a$1fRX5Q93Km0jK*)7XZR8FGMZhNT9w^;Jb?xEJ| zQ^Kb?S!FBMt6SgUdCRiC_CF&h>hiFo&xFsVmT&*AX-MIWpxnSuwtvP3?*=X;+nRB3 ztX~2^!YWt;5g|EXoh-X%1!igbUoKa260{d&Onvm<81qm}ZHB)^#7I+9L!xJEC#?nLCp}b`lYZCyn~flU zlvo{2x|Ww~b=QBK+w$HOr!e2%(mBEaXui4NAc+qgby8Uzlr(?4|Cg}CRe4AZ&Kn16 zP)(-3=b;VtSuMR`$#+{Gypud{j}4E|y^Kk3iVEu;509IwB!yYsa}2N~_pBQz2M9zt z|IiVq8D?Ls1ISMjFv-&#CsN~;J;KR>kqm!yM2HBa26}RK*`9{PywBRMi=c)4EU9TT zcxe@)n9)cG-)l6l({6OykNwpU_mBJLXS(l3Zs3QzSQ;yf>wVWV47A^yIf^R(--O2N zl572UY2>Iq)4ls=`?(&Zs4e_nrz5guC|V{qE)Ewwe4X0zkvwj2mhR4W3uIUS?#=A^ zuzADqvycpZH@FuZx7S%vGj^Z>v5K+opF&|8P9_;ZP|vjK|3}fe_%q$Vf1HHdEmZDu zrt*!u19EN-Go9#GR4Rv@NrAvxN)d60fz7V(X67l(DrH%$$v6ZqyiAZzOyamT!?}J^<;9&ea-9W=k%NLb% zW%f^RZ65C9G}nm+y-+6}RsJejpWpM4T>AHV36EHOI%v4mEuRB;bMaVFN=K)lt6Sgf z+#vuJtQ!ZApF{2_OI|8lwEC8X`d1I3{I1b~JFsZF)e4G3r#tMP8Myq0l5L^ymcLnK zSFqk)KxZL zKD(Ga+qL!Q{-2^6TMWs`KH?uLqseMVCEcDpJWslXh>0djC(#Xq7^8DzzVpRu-Ez74 z-d5Oi0heCW3hX;P)5X3jr-D&RG`ueI`L_74igA`C^Z zbbIQyj%-u+VhmpHE5NA@>@C4|7tjCnNRY|4bM>QpI1FOBliYLI%(>}Fx6#Imvd38# zm$KMv{o=O=ArDacAl&0$Lfd0doZ0H+PwmN#0^bO!)P!&~G_lw}3KFkxJs=7+TJ`0V zhmRJqTx}+_*FaEgEi|z*uD*k@?3RJ9MPpD`*uvU(NzU9?g&|8yJ}S^6PXuKx0tob* z(_KB3o15=YJHI?Q_zhjRTM`eb!Rj&pi!LWO2f*NEkyq3`rw7$!Q7k~UTK&CJy|gkX z2}W_DyKdS9T3DMBE-xg#x9()pwUNf^VH;@qzA#lr>T`SZ)E@Vt!@!y2da;(714CIb z#JBG;$~Z&@0*N5$iSZ(n3G9SR*4&X}6n*01QQTOtSV6Rs|V+SS9mTe2M7$48{OaP@D76io&b?tU#<`g4F!1mdSZ z_F2ditA`;xK4c&{ujTR$IK?R^fvkf;NgCmJGg+WUs%gP8J#L)Ji zePtQuAyvJNHFeaXe#xvEx2k%-BMQxh42{=S`9_GV=#kt_Uv8xm5-~x}`3R`~=fX43 z}+n*>t z5x9Rh@n4p)$$v=`dERxPz6{G~XaW0)SSzVy{hCI}b9WX8Dj&kMKXe&eoRTQpU52te z1w^-FkAF_76V7QLP|fOA+lPB?GL1!Q3i7-9Iy{s#TsW~KZMDcjN?K@#gR(g_$rC@r zQ?ArwQX0ep8lAGJr5!gQdd%pfrm5ni+TMTeC)b1w>^VbKpPnPNk88m3B%Y^v5zt3T za(9DQS;r(V00Pgq!)LCvMP@f;k=O%cj4>dTen+pPZYFLz%caaFxOYTRgeMzVc}}I} zav6*H_##&^0sP14W8YZL3!WJ547S99SR&+3`I}k*rw_}0P?G;DHrl3V>#DLjCR^A( zI%y3{*O%iTiAs_g2gV-nqdfhWtj*j8f5G7qOyT2h!(9$2@!6W34cZa=#{+bG>-u$d zTa6?I2bkP{1s!=FD^b&7n+_V@kF0DvKwpNd39$_y384)gn3p5+ZtG&rNm_bZ9_*jm z*yMU_LR7s=c<{+*YUfUV#*SUqz1LMD9Xr2&L2Bxz5LnzbuGG}B z#cVtZMEdmy%3u4o1^rpD|KnS*<7@DlPY!0@gJmfzH&Lg5UvZ^39*C-AvT+nbmmUwY z_0D`r*|XB)1O@_R2^3q;ZmcCNeYAx+X-QD%s2y z=-esOiTm<};o!QSmxhZ@LjDY((tZZ7mkWP`W}oae(u6y1G8p24d=+_U$>d)^Bmdil zAop>V_7CJ#WJ}tO9qlG=%9+A|=1#Sloi3=MY)9m%5GtG%d#J5tFGUaU5wo0o2-ABq zZ^ftUsR?hr1{^w)J`67DBhnYfw5+)~y5n{Yvd zCq*M!Y@whFnQpP_Bp0cS*lPQ@ogDlBqhVYPU@v=aY|w6gnK`8{9P{Qz5Aw6V#}5DR zwq{wMw`gP=THGJUT?jh5-JNKbw3aQ`s^y+TmyuguJmvUsoZs{#g{$ehCq=hi$yynN zm&N1X3Kfn%Gx1aa<+kLsaT)cUj31X}{D*EMnSI}O!gSI2{-Pbm*jdGkTOJYKH}@rQ zRzze|Bqmkc)_uGPxvcHd`ImWD>IO|PT6XoOs*xqgxp}50B1^_Yta~byH%h0p!@#&Y^MJ>dNj7z8 z$xW?29`jmuUOUP71ttw3G_L-9&-+Wk!V-l$%}|oh)?Vv+S6&H)=icp$DIFt873P ze91?&nf82K~)77l?N%jHo5iD_vCqyChg#!URjpjQR)-6U@1QkW?7!#GHutQ&lDdHdhD?Aes5A zt*={iN>xD<)uAJ%m zy7EDAj6CvXM{o1%3Dn;FmNl^vZvyes+sob^3Zl&>Bxi-6p~!5y)Q>YbBXySK2aTFO zN}g`(|2(s(ozFD~Yi&zxA$z}6%gwkrhOA=_Z2Ysht~TSyd2n&;gBs>zi&H7QMK)yG z0PfWU2<;GykT7h3$r zXooEE@Qp`;L-cUIen%<7=(aS97^+523bLYhV_kt@3vIoMCpMfvo{}WOM}8eH2<;kH zCOcR+H5bXTX2=++M917ha~Vr|pLT32#Eq=}z6I9dh8-dQN0{c0?|Z*I@d@$wZsY59 z>f?ei2k#MfvCMkAvF^y&w3QVzB!5pLyws{J7gAL>eOhO5NtG|)ZXaX`O6Ty#qi}JuRJs$ zL>tbro!=AhC3lTh$}H&blJ)T^0gE6Fq~B(`4>$RzqySjF<2l*QzD@YlV6xs~^~cIn z*a)OnLt`Y#BjkdXK`zr)419AXo%3Ty`!<}6vp9fF#KlC+0rswX61SWF83Xcm^{YXt zBbLV*qjBU9?V%#*cIulkc15XutPtfX(n9}Dy;Np=)&LmCY8Kf?7axOSOJAP>ACY># zESZWKo*~Ba%LH3pJR7wZM0inzBPHRL#i0`U!$Y2Te^&ckU$Luie%Zda?TBuV<2(Dt zg#}-e;su>rpXKvAnumIF?P zC1dlGeZ~Uy^8>=3GA1w4FN2dhLX*!@ETBh3JHm>p;3htp69Xcab@m$M%82i)>fqQ) z6r|;cZheyBMUtRcT2Wpt{0aBtZFQuT4mn#IREWY-CP|w>gO#~({t(YA z@Vhz_s=gNI;h_v&iB^B#dpUeYYHKnT*Vi&_AB1QBHeYTKUjY+Iw0}^5arLJbyXS6L ztF?Ddi;dgNYA&pareYq~XWF!`Hmvk-SMr27cp<3<-ymoXKBGC}#^My$^2Y=qOXev} zJkB79y};LKCqqba3!TbYXWk z8PPbtj0({(=B<;dI`jdJ^b<2VPN)zZNe*GXseHZH>bW<~IoN`3Z@xBp4xJ$}Bo~MK zVkK9Lxm~cE-5fb(hqv;rY>;i(zD#y`2)G^)A%m(y(H4)sBe|Wv{ z;m_Ke3xL;E*%@GyLT&7YKf`S|vx_JxUT?4LF=%U0fpu3-$Pb?7@J#4o@(k0m%#Yi0 z-{}Lg7ivK>o9A4$X^*1LmjoWidq>Yky+!sQKD=geZ}d!LX~1m2YtJO>=?_Z2@pGlM z5>kxaHa#=%5DXsr^CF3UE-(MZ0ppX6{ZjsGX0&_m0Dk|x)r#$-9YwEAfSS%b=!0>6q* z(r0mR3+A zRyZ8`7e?p>qIju$xsi*UGTRe=Yv<0|L84Y6=wSDvd2-J(6cMjiH5{;~;!hSMYc#uQ4}rfwgQ zxvMswsKvZ$;(~F|&gQT97R55owO5u!4xhg7UCrv|RjGTyz82^2R4lIC@^UAR;p(=F z9s;YDv*RK$@!pnk^oc_6R9K6#Eb4?N*s#z-?sJ`W7fEt-@`i(ITmg_aN@HLSv2`=` zg;z%;|1a{5k;~%}TU_Lj_}4-2BH314(s`vh2{K~3> zRwkm$1<)c(*8i3PGJ;Mb-r>6|iZ#$)D8?93(ecOHczgJ93Bjqg z;1%PHpX%(T#=&Vr`8#{N(;v4*(gjShi)j(J*6)BXHnU7R zFg?z`S6}Qa-)6zX7A_~1sLx?xHl=MPoet$ux|L!D-X$HAJV)0K3pC|hq3@6boowpa zA{eVL-X?~zDDo@V82Dz%IM^+cyeQSC@zW4)QZe6jF-Lw$>}Jvt3n!gP(CwBl?=}g_ zybPIj=IQ)<>hxVcc-X;GW48duz57FO<$zCJL-6?zX%zX==Z}$Z9yu84h;7L&kF@lf zQ^CgY3UL?mU<|)`c|NPFW7sK?`;|H-A7Ju%_9!Nph*YETIX_0CfMP}9b`e*#I|SqN zk7!pL*Y_@*H5}M47hZ+=8<-Q?bd9=9RrL0iP2$8Ns^&xhJCn;<_!m8L`p_$xvr z;9fA#foxjoHp3~QJK`EMAIwv2eJ}1hF^D(Uvs&AncSiub785waSNXn?6ZiOJ*K$3?*Ch%VGoxU#c9x_QN+Wl% zaI5*~yAq$Ll*FFe`vl4JcTaiqKYFL|+|_a%U5G`3})L)052Bv>!G@Q+UsS8`9;kB%Z$2Uc&tE`#d zZyo?5UucfXwc)5crbW1vo&!jKKE}8ahAn@8{-61}oR|616JgaV`*R;WdPq*?X-F#- zum4oLExMJv*Ky+a=6X{j8^jKz!aMJzY#TSi3%8PQTgH81Dmt%v;%ZJ=!!e2|6tn0_ z@F?e=Kk3y#vk5b9<-Wl5o)tYTw#OdrzV_q@M)RcHbH>?q72v1>>LpnWa`0E5c?=5C16>i1Hau#LM>%grCl3a3^i~#|$VPg|%V%{P_aRzC7ME{tom6sMK z9G{EA_VC)iS<@3-go1X^sJX)QCv~<>l?EhSRX)hjv{e|gw?VaOEQ|Qj-%_WvYRGDmyeaKtL2$!pa0zG$NVoXUBjk`;itvIn*;?RXfz z!+zBr;T81FWE$|dZlpAM9J&rS=3krR1&@eO&22hZjLUCFn0oCBZ+b(<5DHJY(~ox^ zKdW9&_pR!ew*f{ZcBZul41vpUK-Od766=P#U5Ic{%rYS8?E)pbv`3Hlj7>X&)0;_jAj2<6W|tjN32s;%zV>FQ@PguAS2>JlUIFG zJ2r$Ben4AGjd|@0o`Gx=(wynkl0rm`>^Bl*Lny1cPcaqHQ&aVXhK6dEAxLJircR_U z#ymUbyej2K2YW#yCKqa6<5Zc|#J|Q2w5ZP+AwRAueM^7H(!lIU7=_L@`_L0)Zaf_c zsi_xV#kPfsE=la>Xn5Qrvz;TajoQ@$w3nEiT}CRiCY zJU%4Zfp1%}c%-pnf=JTB=hUxVz@{TI=HGo+Bt(QfM@1YF1s7tEcNozst-Pa#{wtLG zYKYVqMFZV!*3t;x{|P>_OGbXUTPU|1q`{%V`0Wc_;_~e=X^`Z#gM2Ptz$fq$2PM#; zOeFtv%CspdGfXY-htaR=>0i3U{<NUxiq zIN-19x%OZCDd+~;Noyx?XSdC{oB$SC3j|e^Maf$3l&e$*EX0F>N&Z4mi!SlKX(LxH zIZ0;EMQ*rx8k&eMRiJ5_r*;{vIkiE*_MZG-SE^@=<@QQ1c^n`IcsSxzWYs)gh63K| z7yds^G(5E=Uj3qRTP!Xi;K`sQ>hwa3Howi5npa+lbA>=BG#Ob|$VO_Ju= zG5<{Dk_io|@_gT>;dB`U`KG`g7&__sJa9RwRP{(~_38b|1l(T2e7in>QUl)N;%Te0 zp5TeEw|uxauCBgsp`mJu_oY?fU#lyjcGqI%a&P+yW>gS=;2gBbb|G$g*u;lZ;ekt0 z=%}k15op|54xP=)SAl(nuBKWaQN}MPJ%AS+v_FLMPn)WTi5AdSMV-j2zHTc*t!Z?i z7MwlJ$n4jLuTJ7oFRCB?g#DBNXr*{#0^PJupRagQmYYMmd#xc{Te2vhnsiw1>c1{qi zDleN9D%o|^+}AbPoV8sEF>3!QVPv+sPu-gX?3>BPU=FE@fja3Xaj7b!!>lgtv6V!8BIzGR5&wa&ZC($8(49sE=X9%W_UoD;JV!cQUP2LmU`(v{lx&N@t*X@K5 z?SCNSw5XW0&@>YNo!52MNK=+7{l&s;+%p-U&X-{aylDOj=*HpinKjJYbV*wpx^18I z7DX3T$?KL~)eh97(^ORX$D#yiU6U664$K4J67j>?vKz?$(KP~`cZp<*8wCJ=mF%Mm(o1Qd*AnZeSOw0cQzxu^+6bEFuGQMhA%Y8o&i=yq z4ZBh*yh@-T*h4&*`=I#gvs0!uH{sI4-`uHhR)YN!AC8Fb+aLO4Nc3>K)G7#IQALL4 z~ z^F`oEzYwF7o`!}o$O*Fwvm1|b{&pU7bH(SXNU+&A8H9i?_>-fa98HJWfhIx>=shL$ zq6TIVa}J(B&R2HK&Vq=nlgd`7V~E9B655vDuTX4YP-OTm_0EcVt?B;>=|VE=te9v6 z6YA$WtW_#c?ak?3OS0-wY%^vOxkocX6)tPI z$6=5AwXv4(=65}z|1m?s`cjfILSIo^t^;hOn0<~>O-p+#=ZnAz-Ir9Zw5M~#)Qj*K_AR9j zw%@3#`KEPNMBfF&8v}9eb+ypH?B<;J)+2LN6#Y^9@=;{wn|jd}y<0RQ>ALwZtsIn> z2CiEufbd1kJfN`K z2E|n##6iX}nFhe`e>#w5eq5&~GRH}^q!#uv*{qhwBtis}-4QV(!A8X4jGq8AGg=ry}RE&HJUeYF8dTqK^ zar+Kj8;9gn`uiX(L=`Jf<2v~H?l&;?(aN`v5q%!#O;jKq)P>w{#ac)+4%ziQMm0g% ziCv#GjIqeuhT(*0;MgS=H0VKU;f!!2{tk$utjq7V4GkaU$dJNE^}j{ww3x`}B&vJl z66q}_<~y5*TSS9~&<}|9ae$rY?FlR$FN7EM#|n2Ae8`W^|5H6n4f7$FaW#hF$c`vkAc zlZKNvOrz%d+LXYXxX=rxl5(f6xT||cgNtpN1`Xhc_|f*?#P9a5?ZM74IHplbNHrvZG(*65rr&E!!MDhRcm2tQK3!PG?}RSdz@pCZHt=)OR&uYhCD>48opnn}zX> zfw-XGy03A^4&^QUAwCz4>$^OTlwNAYrCRXR6EOKV=Lce#B>lF$tI9OXGP5|OVzsqj z?B^c!tIis=zQLcx+e3Rwno;{fVlh@uX=9aQmfX7&t-$$fM7Oh${oThxDEf$fa#syoX!8dI zgj8}=%Q!nvlCRs7+6q*4FuC88UNa&~V=8h0T(>SIoMKdSA6|bVDx72owJZ$x+=3}L zTd~`IXDvb(J!jweOf*@EyZ;&uPmt8aMWba|CzX4nun;t_L%rH9LIeeW?r zf|#vTTbyV-&!u@_S2|1+TqGUok4}JsX&u$2uR9HN+rIg9e9p+22?jdF&1yKS6lru& zhqK>cUK^>5PIi}lB2~C8EiDPF!`FTgqkFus>ab5p8>W(6KRNW3sX_xAtOCD9#FpY( zMEm4v8+yAP8PaP?_4JePbg`1-g^eMg3kuUUGDQT+qjJ43ZAnoc;Bj>e<@u6kd5W?( zDeAL8mPTR*VfW$F!*^9-DTF)XqqH0$3DU-VsY;mtaBtLHX|ASS9$N;B<=!51OIQae ztX_xf>DMAFZ4TPaGERA` zD1h2B_uS?#Ayf_b7q!v>$A>m_<)J!K5V*Ja!cUN}nG$6}EGk>$Oc1D|KGiD73<5hj zmAxB};Cl-2LQ;!Sv$c$bUh`;q{m?XF2Jb&F=x@4m=qNiRE zCO|$OBbFQ+jNxr9FA&_<7bH1*HWU^19a0`Mhu^b1s=%q+uEG^-22o-}eSfWI)_{tr(JafCTX{XB2I> zt~r#^ypR3g`LY~&S7$L>bN@7xB+C)a1JAW)>`cIgFnA4vp^cNEtAcX_M3sh(i*Ij2 zLT9&GjR*g8nD-VYYY;-{gT915?dQcyOExcL+g+3f*_llW=SX^u3R4jVji1YHa)w(S zI{8(IYW=dpHm1%vP_$+%SoLNCy5$iREQ^AJfNSP@y5GB+*_H4)NIR>gWSd;_h{{WI zqvKiPj9A(HZGR@NfuCaC+XbzD7Y#6)CJuv6IGHUDl!!TMLyQ1*&;rZ5R$63luAuZ^2PZo8>A!VT z@xsTN&BRZ$jDyGGSBnwV_$R*w11Hn&DeVQ`no^lMZ3p!eBEdY)s^O$4Q=8M5YXCp0 z02~(sYCr0ims2bv?Bqf1V|v}2P610RkO}`(0Uom<-&@ZsEL6N*V-mSWzI=fgcpRsg z7T?eI*>bvim4K19BJ-~<9?6*Yc9tm|p4%vkoW9VYQeXH#R|3iePBPELb}p$u!fN~? z56`@x66Cu@s}h5A-v3}q_2qYkj{vkzNVlEnLd1>f zUobIQGq0lx!ICNcvwyYxYyWqXLX%a|212s0-DdIUlFzImw%jQbRD+CMPIKS>`MB$M zLbA`2nrb5EmxDd$r2W+;Mtj1$Mm>wS1+}v2bP=Hvv0o^VU+ky6Fhx8Cgqf+T3)6dx%nelGC7Fs-LRQRbbXaVMS3f(E54J6_P*_1^Og1PP8xXaM88iV zp@&0nI`PUZjrw^J#dg;v*C{pA+c@OruZ`c%NMgRgfjTMgwz=o z9h5@n>kSllLO|5epX|9Fl;(X(|3vJH3H7}{p(<>gqVOnwgrA=B;)N0TBzTvJ`>v{} zvM{#onC7687B+`dzBT<~tjc+0*0>QED!+-SS(a$_6bb5sbUl`LQ@VrgAC#Jo+%0`} zR|+}X*&WA>OTL+>?0i{0%dpUdBhv2}Y3YIMu)d@mWQP6ik`2;Gql;{bgTL9fp>GH1 zz4&1id}g)+nU_cp#YpsRL99bf#vBSGdYwBt!}@0A2eKpV!pn2j_fcC8d5&2!ixw97 z+VG?bw#c7`-jg=#4)UYOyykIEKiQD}0!e5TJ8*~py0BHCaSA@|C%e5-FX6Kn6;ph% zCUMV*=GvwY!sK!6I~u+ zo}>y(umvG7OO0SXS|`v^+8d)VyE|b&&uH3SDLLyo6-A&}OY4;VdUOtbf_6^KTy7yQ zxb?S7YDb&{Yl!-FarSmTxmnm3fNU`8&!WgJ5fve=TgUs3)8_0{5NAAj=!SFhE^R8K zP_;te*&n)yN%XMrkvUtTu!;lQdbAbr)oME$=4r~{8p(zJZq51NkN3<%Nn*hMrj_x! ztqOo#WAC#u04oVCI^G8JRM_mZ8zeoDs1PWv(DMzo)!)%B2RfiKOdf6?x5=NJ_*8xgL%0a7*>iFiE{=^TF1om1Ox>Z@yM$d^ zE`ZsrhD`ny+MakSU~$}0Q~?p2DzkF00nVH@wA_QGbmM|`Y6ScDFLrY7v(`#bIEb8U z)OTf5%ajxcp$l+`e@#bFHDh#%Kc!iLh*l>XV`Zf0)t40I%jgfuW);jYWEvTA-Z2Jv z{~8Yey!O|C(=G1buXAT!?xZYz@+_~xdo@JperFH;Dq%|2nwgt8N;?=={uNlkm6!u& zv4iG*SEk=y`$w==^{mr0)+zYuF7Knl)Kbi|!J35hY$`GLF%qYbOjh;Aw<6ueFa@Fa zL+gdDxAU^tshSW7sUuJEdIpOHn8#gg$i=A7Q)_(JODEyz)tWJl-h5~<%I-Qw zp^f4>EG4V)q}u4qVEb}kLU}k7T2ZoKwj32Gy#afD(=v=~x}^5iiC01@e;LE2nSz4) z<@FxTjlH2(j}kHg4e?(!y-*u*Rh7v-=~{1CpJ!1icf+@99l%}@7&TjRQU z@~a|yvD1GU_?txR<(R+QZnuX1XIVvwgF~TYg`!NIu9xs}A&&Ygr78q*B4HnWI1dYJ zoir2W%?vx(J8>`#|H?;o-O$@-mW3c-=Cn9=$uS%+!{1&xfShYbV4j?cU|hBI*tbs* zV*OUX4Nym%Uu(=DZjd$<6Q}^vr@Qagg58R?pF9Rg6yb)}q!`2&TD)x*$_txqx=OIY9?1uVxZXM9gL=j9C<$C z48t0p*waQG_=o!e&t10SDk2`ck^aj~nq6@>E7Fm17Q5X71m#$G!H45vthGax9brKq zX6?lM>4c4S%ju-a`T02Jq38Yj|Dt_(Ew5|Ea~x-r$S`WZT%0>n1w;W$CZp;m9M(%l zoZF6=<;9KEJ=GBb1}GK{>PJTPl;rnS2q^qanmE zv#%pv9QNc_=rI1DN_5%2pnp|O)>5A=^b>(pi2dUz$P>6?bd8`O|KXAjJ?GFVRwv&> zZ;c@p`;pXK?lP-NqMue%>Vp(J2v!@MIwwF@wJebivVs{|eiT#JF9yL(1P#kvLWahh zVRK|`SKi^P>&v$F4|i^NjR+=1x9h8IW@6=6XS@N#MLFR1RDj&QF6`aH?I^F_L)-^l zi}sHW@+sAN(b$?Qp02_$p>I#&x(K0FSb=J$2@_2Nr5~kvQBNx?|HWoldcF+U0xCWo z`P?(|&XB)9FJe5C<_AsnOtoUWYkyw6ytJL{Xybd+L1Pu=UC{b6^th09wwRero~o-p zAjC&XrD8foW1VAP4EHMJ{f20CCra~UOfPBWrS*DS8F3Lry`ao@O3!^bt}Mtq#ipp#-osz#NCJp0d_s`gm4_Yr&u5EPJVdg6~1rqWqexD(NBrCy^FgDyF_e> zK|oJ#>+k#~Y<85WTt{yOApU71RYk{`{Pg`|PJ7#1Z-q_KA8~p*WN|doFMNDPJ^M_| zt;O04Z`qWZC1T;(<7_XsIcYzFjdU0M}EJZJ*SiOj752q@gGW6RaYKGY{iV4bnTX{ zd8DR|%rqih()22j#mGYMGo5@of-VS_lUD{Y{#PSCbJ*>b!ZOboks$4vxsTL;62~Yh z#kn29iPhpo(c+^l<2x#OXVhvqSuwVwCdJ8SlS-1O5?BYw z#Lgu*%SOyNAsU3LQ|hp2jrrG4=@OD3v~%KVk1ELg#eU|TmBm#U+zb^7T5|S{#YdbS zRurYy#^V5ExMy6dxt?O1+HTt@sOszWf|Zs7O*4+e&g>m{Y-~^gV5Aj8h&}@exT&72 zh_u|6ADB{-K2?8GDARkr^e&}wGr9a$p_YM`Eh=HhW_D~FgelXlWpNusr<(|8CAU(h zsKPWFnuZ=^`s&rLoIQmDjBNZiF(x&4r*C?Qcz(mUFP<{}I&2z7 z`c(yXy*ein9dNS$k#xI`Xh<;R1@?m2zy^zZ2*MHB8b2A6nio^;LYq6L&{t+@+k$A0 zPJ~3qFY*E!+iW~E+mcgfl&oSk#;$mFs$^u#v(Up!(|am<%koj}-m}G3RO^AEdUE8d zzI|8MTXTZv&pW=B)#7!j@n2+&Vscwmvl!K7PKCBDdxvuAQ*;OSJriz9RiG9Aqo~g? zo<3WXhV`@pS=8ZDyhLSy$?505LYup!)6W}~zku;5jr zKYe3n4}Vi8Icdq2v(hd!W;7;ESFw`Oq?iSjw!yM18m+%wC3sXY{|~ni{==1w`b}rk zJ`jgqc`cAU)%d5Csew~)9>q!?yygMv_JN;Fo9$bxKW;>B!MX*vAMC0Y%i%U>lvKEt zEGyJ84}{kvJ}kRrWXr-TIjO+gzt!!Zh$4EH)x>q^H$==xz@3m9rkms8h`oXY4$4V~ zTKIvA8k92!g=Ex-OXW z$sLM+;Gc>w90;ibdAc4{8UOv+hDBXFAg|^{7_8Swx!@3(pVKpp@pe0?Te3`*r2!|C z)m0){F6KhgP1M#hf;8}`D>gVN{$6)=kex6MN62S&z0(5j%c%k$NEbz87Mi`9Hf{ zt&{2LEt+ls@a{NX7FfAY3lS^|VxW@YX3j?jR+Ek3b5mz`#?__`Fc#&APcQX{^)jf* zB=d0RzrDk#DF8aI?YbxB+Q*K@bSD!545`y~;wK$Lj$K{2Dbc!=LzAe%%d}ESJFO<_4~(>aliUY{ZuxMi{bwlRu6CalC2%S9CMQliCwqgc&N`-a zA;gO4W8^!3BerM8Df~D3kxeZRYQa$Wr=V_6Yc0gfQBE|~lU~vFVn7_GD>$p&z>jx0 zwA#1*=W1Png5Ejn_R(h{$r~tYS!xU$jIgs}gI_L?PA!}7e(Y)7=7BNga&p5|{eZ)e z)99vOEE(CfESTuEBkZBlj+qf}4S%t7WlQR>Vv6&<-(Rw_ZHt}D>Vq#kN^ae35!}67 zZ=4CW(%aF#{_ZHV>MsA<=7htxe-~!?w8o4(E%)jHCL4UnKXGXoyb%z!KI5jnjl8)T zc34~RPxX0A;ICvmzd@kq7(%)*4E8~#z*7IMHsUGrT+ke9|HJjULR%F0gX93otPn&3 zW*pda3J>nDoOb%Xz;|enpT*jA&hRTk&hXyE4rBoP#e8f&X*G`Y8n?4NZxtKhoCnB@ z_X651;@iOi79H^{cGO4)?s6#S?6?*Tn6(@uGROKFiaD^KYQe4K*0M7p;&ow{p5Z7Q zL4WVR*1&u~zv9RpbIF4r=vA%dg87CisH)16inGhrrKCOu3%UNX;Msvh zydT&2IpXCFHXDEq;RO>1dLlO#)*e|!$IUUYO%4Li-n3k>pu6k)G2F_M&>(OyP&qWE z;2rV|qug$FVgnD>1^arb+tfQer)be?ue^-bz z+$&%QJrB=as(TpHVB(nN9k}yo>G{q|8#EKE@Fa6nyAWOB6(9S9d`BHh+z5g)(PYMq zm5tWJ81bMS$%3%CsrVu2&l^fXr(&&}7iqr@>FTM;$M%Wj`ebH%+x?P^=WUzNLkEOI zv{BNmB!tHQbt2eOvfTW@h?ODZmjEK-oVSr@V!Qnn_BSr*CF3O+H?7iuyBepr9Uvkx z(Hk$Il1ONpWjCwNMU#X=7i0%4-k4Sw;4Kr%_TIF?G$j^C+GsjJUflaB93b1y<1;}A z5pUejIkOTEEF(y5@x_|~im2ZmUE<}Wx%xHe5$w#b-c(S3hteP%P{NqC|H6W2FHah0rbFDmZy$w zw~f1cPmHIqpViyrb>Vg6@UfJR=bdm-QyxcKqD*d`t-o6%7Y;sbKkuQKBoAN!FRun7@He{YZ zNYIUCHQv++^wx--Gt`*rWG$r8-`jU-j}!fn$>O`Pv#wF2CF>e{5Tt^<)~p6s;V_2vM+Y&o{L#A0E?7fi$)Spnr;v6%Ctk2I4^1iZ>Q z+gS&DNx?1s3@2eVD4yDuF7mn3jdRxuhF^7i8$J{>g5{>e)QWCNeL6vA{_&1Newe=dN#1ELdeRhkt2;ihv-@pBo()lT6bp4QwwEh>1VR5Z&p4IAnhK`Y>SNAm_fu zB}RZf&BjC$jNCTXtyH$T)l6h#( z@84be3jpmy&*#l&6_3MX%F5&Vb1=(Yu_0QK zncrzYBJW(|6Lab4H*1nd-`_|DE57_|EqOS0U|?X)aq3C$cdM8O_iEAieyt2RN1cYw z{Lc^GOfv>`9)I@vi2k;*a~)N%|5&E~tOZyP0=hrs+~Xv@R-r|{Q=JO_r`(y*ki|7h z@fa?KqNqLX935{|oissI5{Glwt{&U`*@v8T2T?ob5!CI)DvQz#*2&8UeUzWl!ryNB z>?|jSlOy#|CNHSWkqk)tjg7SZoh|S5`>~NK z=P%Z?ua^3vw)4#j<5}?p&~0}oMWnPbddE_H=r3X-wdZi&nrJ)m9*3@f@I37(k(E4n z?g#N_iEbe*-Uo*wp_l)p zOxMMJtyG_Q=p={&mS4amDMF8U&ykXLJR~CNW-CdYXt^xkM?Y;!*Ao{6|1~UKSoYJ5 zMQK3A+?^_er_J=ex)`P4}1x z?7e@(zxLhjCKN0Sm%-itE@~SLDHy2DHfFmSt?dEa zjLMQD?j59Ot2^}`w9P#iVZ-lWBRx*%8Q>qp2(X+`>tX~lddhu&{r57EbU%Wf3ogJ> z)=rryPmk06a9h>@3%VonnlQ1Odk75`<*pE4=Z7`5Td$2JULOMaZzSHFxXJT^HS=q5 zDNUb<2fHJ<;HQVl$()O!ZoCh3M(4x>X#o1W`(ewiV@G53KjpitO~0bu#No|O&QHxG z)9i9Bt$@$o8g@e#s4K$=hYKyE7@929?BA;CgP-fsyZY08Q|pbGpXm^rH~&fE2zG?c zJ1VnK9o#O;a9iLnSEahu41IBL5Qif53aT)C>1xiwhZnAX8dfmHd|KTflTKRSpTA7w zJNaFpXuucquY5|b34z;wf(}XpFKHoD`5&wq&b&IBV)$L`hn_VnjVOQ0o)I~A5|nJ5O0U1B}0 z82!rTJM0?!0M)X*6{xke+JqJJ2K4=}S;G2(o5vlY|KQJ(V;^cs z4Btmt{CSx9lPF*RTjkHkI3eOg3FaCkOzbQXJN-0sy@7h`rvQV@ugwdIkD*0R zCvL7z7|&u+AJS{MyARBMj4JR|jYQU#6(#HnYI?Ulvoknwk8f1h{-p(-g{xJ=>)Wk0 zxpBhUAHO_>FVM-2v{4TF#ufD&#PyMwExU*uSa{t%*HQ+Ih#dy`e%_6mkl`AUN}6O` zmbTO>3x5yaTtSF#^v-ksFT>E8HHACXW&|Uvxv1lA1n-h@_ew;J zDgL951i?hQmW1gEXpEtE{aI%lgpv8IKPJp+b+9A8&H>%S4YVlFVz0gVk6rVAXTHvS z?CZXH zU|V+A3D^m0pKA|xkamyUcbV?iaU`GfGSc^mwHnmCck`=VYMbe|6Wd3F;y>}Sg4UJ~mTh<;Ky1SiKghT-92@N1yUiY(qw)o}UVVMQc!~CiTJ5r$ zK>FMD6I52z&v~K###2m!d7=r6cqNX<##Blb`wk`IO?5=m5g-5P(%oJJ>iN#tQdxUU z^y*1K#dw0{c%N<~>sn*@n=4$nbNOoy#MScURPyv_4*r#6 zb9KIIp03taimuIJJ~`Y%HN=9eRCuTA`}-qbIF}ZLZF&t%9^uNb_kxEr^r^zp^)q!f ze)I8*ap`%@MTxql=QWJ!f2mEO;}Ioyea3nFygD$J(uP`Jrgyp`g@oP2Sm@RU+mC&9 z>u3^qo+hjpWY0B=UW;q_l1IwHv+xjF8)J+Qw3wRJ5w1lnZw|;W)jGoS>ipnpJsf@? zr1gsedX0T^1M(t2Y!8N>)cScr>UcA9X8*FPg!t0eDX`|NY#VD2atS6~vjB|luSdTv zBp)fFTymQOQfA5tjkjZFoa_V-r=t{&Xzn(&TM(wlE9=#WW)y?uN6VXT4jh5Z%sfHo zh0m8pT-ZM}!fZMocf0p!Eo%mPwNB72K3=Gd1p0Q69ks&b;7t7w?^vEZ+j1DElWy5ZT&9A6T{D#Tl5K)STeTvUHJZX>yIh0WL`8h?Yfxi@ z5oK{Qc#JfWgv&DS#rkgEW*L}-|DwzT%{<&t;5b*ctG~|?B1<8j^@kB7yq8rrh&(I6 z8mZpsLu>_4YH6Zey$BtXz_Lt=S0c4j^fxt;q%<(oSkb3t5z})Yy8g+W5yhutBqYp9 z|GG}w6xHXNuRQmHuI`&ZdcD-$ZD03;jl^PHzS-=?i=A5(4UZ(3W;MM6sk`dW98!V? z4n0|m<*L8GK8A_lEyx#@K{r(Y&NXIFwp_;O{xUhL`t7>A1bh*5+omVm9C?vWJVA_j zKn4LH&gzghJLE;Bz$FDU_lsVokEDlILT4$%VBl-tsh2+)U5}W15PcduIh%P_VV!yC z?g;tlT)>+);R>1*FJ|vu8>1HHs&5-CR;1YhWBlwNREEwbqI%^co|~fzSL5;R${EF2 z@f(D_6&R&ER@g38t79{aHJ}^AAR+JNt8*cV<8ji_FUh#3McvI?w7uKW?j;!kh0ySj@2Ke82F^XBhk`%dG22!&o~EdBvBS7$+kl+t=dqK-|F%wPozb(_0Xd_Z20z{EQIf0L@mh};P8*cIOmqD zB_X14jW9Al1lv;zK-;qPZa;beea>YwA`8Q2=w=eNk!4*);bQ-5#`vdfM2ggtwsS-% znVU@PLepygXZjE?#~&(FHC=2s_p>v);NjYf6%Nb?=7J5@{}`|?{2qT>u_DyDaz?WQ zeWTm;sXuVFxVLbVc*sB-Xqkhj548WSysnH`-;?3IR(c(2!ZA-J*RGvE=IQB=ysRa| z@~Ebyxk{qgKOMCaf2dZtF;0!01!PBDc>@Go^*tI!p8Lz_NLN&&;4k?(J*k70W%}O2 zL!1b!Wzy`sr%lbY9;lcAp70=@SRM!B1)#~ zA}x+4$Zjbe9|ZA_E`>GE?V5@bmezQPufRuYw@eAQyP8x)>Fr?#x}=dGz7LYZGz$;` zOP^l^C3en-3#!lo9}{J1KEUfuy@0o>3yI(~@KE_KZ_)<%P$qgOYlnyk0S&>4NMlw- zfLK|C9jSRGD*2%8zsbAzwO`hdlw!u*v0`P8Ip3zGEE`phkc+r`Wi&d~=VF&pa_u?N z2^dBjxv#9m`BCw(&7se+s%l6&AIv%WY!Ci^G>hxHV41Y+s*tQsBx}GBSG4Wi@Uvrz zN1Ns=u8-z{<_h(tn=t93zW>RE3~gCK?omj3hSaEg>OkP_C|YJ5JGO|^p)NnAwh!0) zJ#k=S$s|}_Im3K4{IG9eRdAI-s?p{8keXPcLP_Qn1K1l+B(=Z$Y4m`$+l_pv!#?X1 z(ZP}xI|3cARze-DSmE0TE}6`bn?>0U>yPElDN{vQE=#tWlOK6~`ege@BdHo-$OhR9 z`D5tbY}kzok+>e=rBztBI&aAEA)|>tY_HhT)%eUIo-GJ#I)5>Lxm2;--Ejt&3pzI9 zZC`k8MYLVfn1cViwy?Yt6Tf<0=vbJ$w-fHGf@l=^X0YW2vZ9SPQ1|yw zDFtG--8clN*9E!E2{A8HTr1zpU4Oj30TU*6ROm4o&qve|bre?Kw=cf>R5e3xsdtNv z%hn0ZAX<>iuZg9qEI~KO+)wHB|D1HA&w9cyTDPpeHB_{!m4b%4iaM8w43Qh*_@Q3;6IlazRNjH6{lS32}0`8M^?a}Z_t zxc&%E8Nz=9nq2e=+(~Bto}fjs!+Ygd9iz_+dR!P8*tM?*x=m5`6l_mGW=dqM&ul0K zU7Cdm&;(D^KKWBQR@)_rx(%QVTN>9%zE-44)>18f^wvJj)hwyxN>iA^!xNrSpn~H@ zWg%s(Qvv%xjYfLj{2okQOoYr!iR6Oljc1$AW%Ul)SL|e6XTwM5N?wl04x+)E2=0r! zj?sD%s!4NPVDXMbO=$@B_iB)<|iqZ5*SEHSZfP=y;+Dl zEuBjuJ>q^mhR#^FrbZO>@1n^r)8EF?=gtarjGd)rz}s`As$_Im!0!uWu5;K-N2|Q6 z)?Jc$JUu3aqHg3PDADK2Xw8S}YdU)Jz<}7k#<|GVpVoQN-5+iV|KW5+WxQAHoK_UP zjd;3?0-#SSSG-iP7zL0=&DdasD{D2b2M!glb9^t61$c=oaMMYBmKTexTM@?$+^|as zn+&HEY33645fWEgmaED@T88##Q~Z05puXiO?%OCp1JpRva zMAK0=zX)#`;3S=CQOHE?E{As(_BDws9$(63vA)MSJJM~JtUTZ*4~3ae=jCZ}Yrnq` z?_Cc06HhkbB#&up{kNpZmR%c+u(*v4x`0*bJldZYi7>RBhb87|=zxynEP8ptCJ#U1 z4#0m@#Wm-$!XpXWGf;7Qvld;;0N_eX(rjR`EPv=Xm|jh{>?Co+a0fnnO8e`hEsw96 zpp&#Cg3vE~WSxoHc^f2J*l&A4mdHSq_b_@EhC zv7G5hiv7Z?=e!re_J`a8Zulo|_LeYzx~yh*X)L&Ugn;uc!c#s0){F`UVq2OE=FTVA zvhtp-iFT$1X-7mAy-?O_O@V;NWPjI5H>#KtXM>}@OfCMCE^u0Ao+O-nX?5e%+z%$! zcyCYpGVx;mq2R`6dC!|&QU5G%f$WtM?L2tr4~k;#?vJh~2G;kkyip%j=$t9~Z}~K^ z)zeO!Ui+e7$-eoVSHUv(z=R_2L&x`rTh-w{&H-MOjvev1?qULAs?x(2VKz?uUKCI zjN=TOBp%efTbKgUDF=bjym@(V9`lofBA`1{KU}k|V+UVjW5;>I@RNXTaV^6_MpM+Nd6!Zj{piyTIeV}#{Y2gsP0_IY0wU)L z8PqjZyAx%fD}WkM}}w zfEpMk#?rqtzk5aUPb~WsAd)HlQ=bl4+O1T10Lyrj#yL5as`a;G%WMv>@ zS<6#(j?efvOM&WUpx3@u-Y%4br)$E1+IM==dpq~(Y1kg7k^zGC~SI)2lAf9<*?3z7Q@&*u&@pcUVwc zaji03$5P zG@-es0u)M4O@3MNyZu1b8)`6I&$YsM!Nsjw(qE!i)6JXV@`uAW8j==v!#oqodezn! z#+xQ86*sGWRYrKS)o3}WU;)18OkY68=WJu$xL-CBjZ3uO?;Fx#!INrquIhvltwT*d zU*tZ!R-+2fd}<%jt3PjSJDo>q09~UZc5j5fdRH?4Q@)l`v-M+ScsA=fs!5-eCR~$du@yb`;Zv&=N-D^2Pb+)bOE6Us?&!1gnCT)=9*6wd?e5NOVD>>h$>iOeV>zbd+eYL?_8tsA3wY#z5bbAft?$D2sz#EPS{n~U zllC_HXa3i)vUpF_o!32cUaE|o@6-AN=1atZm@q!qm67-y3VNRlY#4Wr)Ut}eFfHx4{jX*#G4YJI3R|6zK6rtvmlkj#Y1Xu9X4 zNMw27?z-!NeM9w<(TX~iY*1Zx&_oPakxTO3YQ8;)=suabBKS`$yJ=`W`s5WTc^Y)!Gz zQ$|rv#2}~EnFsw5o+_ZKh~k+}JQCFo^R!n+3$?Uwfy~6a3p--rYeamqPI=+LWx%SV zfOoI!fG2HJ607*_<6K_3#od3mNo$F`eOIy#jqI;MKP82~E>Spfonsa%P5TR%ngz-% zg+a)^m$-S7gRdX_LI8hS+zymR`p+^5K;OS;X>43^RB{j>CG|$JFO}J>^erP>Qi}%H z8ScMBpG%mMfLV0e%nC64wCXZ+OH|5$ODFI@D-NfpXh3om7Lxk>d7oDU zonXx2Aw3w%KXD>*Koxt&ge~^3RS6>g(zx!cS^D@iwJGe{jlJ+fH@Dv9TPcFiteX0e zfZCeX-aqevO}_6C>yoRLiZ=O9M@N(p_EF=rYC9QAX0l$<%G!u-Co+G5!n&urT>62e zE68$X$#y(T(FFoo4@k+dGg}DG(KrMQH$lfdIoWQ#3hkVxIaY?`;0*WHEIKR2!Zu&~?nGQ2?fpu8#l@hu9gu=3%lBjL%iH4!#u9k!SB=?c0 zSKOyICuEK&*$K>oWis!FF9%)N=EOKT<3M$p>hZ|8gPZ4X4G@&2Z1y}I`5J!ix%v^| z#jZ$idlZVkUy{0YB`*E$afzEFFR#GWAw2LLTb2ELva%nS68!PDxotF!;VYGwx&CnNmRwfxxfS?g_&FrzsZ2>tWWsJ zkVU1j_sJ96Ad$5Wvut_Xt`WX+$<{uCq`yn1VHBVL7M2^KG4B?KZ4>cfh6v4m1UGt> z{W9O9X)B>s8v=^5Bi52tSoEYr4Xf|)clx464~d2RMAGKG&G+1OZgz#>4I5ecOIN#Y z8`0Dj+oYUp*-MjKdKo+#o0|}_{CDSLlNr+;pDd6w)yQp+<+Y_b5g9=5bPCSjX@;+nsWhNZfQvP`6$f>r!V5b0N_8P1!3DG`OR)FK-U!rOa7)OYRC1e0MZdSjzgAqm*U+X(}jTscT4C zPyBqN9`FeHa+up&X9yKs4S6xMjMHZ}?H{WosT9pjz5Nk9?qW%% zWCH2Hczyah^eNmdc>Pa~i3ZO+OSfxq17{!M8I~jrf$?ko_X0-e*LxV3kuVS-aCRQEjIwpKXtk3;m)1|d-&4v*9!VI2}DcRQ2vFHms z53Dn3E?ZLq>xcW=mrW-;TViw>d$P-17JRgoGSNSuH#r*PjU{*YWY+vlSN>!fQD;{! zZ^~+Vn}mD}$Lq^Bl(vV?s_b~dkR>+t#JW~hXIqc+KkIcd^fQEXO=^SWIYe+^P4b+S z`*_Qd9kKJr6&Mll2<8q(87bUIU`!VqX6E$ywRjR_vis14~vn*^oVEx_tfJ4_D-` zPCV>eoffajig8NMv-PCXGx{qBfGZ#sVF!&s=1cE3`3>CB5PeXs^Pbria(T4s^_jC% z+d@Wq6)P``AGvGR2R3~9rh3_;IW#2!YS2*Z>tDd^V7l(?AWnI8gNljx z6xPCDiW+SGni=|FYL)iPg)VOut(CVv`eLwHwVsp(hlU468!FG_$OXzoTMBU3%5!6D z(|NOiL0>y9*Nr#OmDUeCQN%3V2W_OnMrxFxT~}Ragd$?xtF#fP{dG#vCtP~mCd#QL zLe}2-ue*SDB4NGm_Bo~zf^8iWjR=F38~W7-Ux3|XpcZOXeiZRiu0ggg;`K-ZGFdFA z@yO^4UbfHiQz9iBOMt$S?Zy!yI4uw4P)o0@Ar`&Rzx^0KWiWKsmRyw3dv3goIL*JB z$N0E%)Zcp{hzgonCZO8!mGl;h1H^WtKyi%-;DXQfkRoINy1G162R1W*Qw;WdWiUu z(vyDkvb0~fqzLH0tBM;X%3$*9IIkyaC5||3gstmeg$?j`c|DqmnFf;EeD&vEXFtTWR$iN5L$*HF|wkm72>v11rLTR$)mY(La!7Lz!eJTEo0+ zH(}W*qyT93uDf{$d0%)j{`AYzoQTvK*=NZ(Y*S6Vx_HX&{DSso(z;`2bGy2Ek%+@$ z8-PS7RS-17Bn58$B%KpkLmHA7kC9Z=0Hv|{7JGaJ-}E-wHc9WDr65;h$Hd^yR$pIX zrS||WGkmz@-#y;S8})ARzwfS#AKRdZnkk@s)On)%Cz1-b0e27jeD-a^P>Og9z32F} zGxv%Zg;7`gM%ZczQnKt`;lEXz6t*{9-O2^ZLVX|lUBJ$eGXsssK9a%~G9BQB%ECLK zE5N6c6a$+g26PJehzy4?zTj~O!$(bnCVcQM?U2C|Ex zBnulp1_?k|)K*Gxmc&*?56;FIlpcmKzYjvi`xY#++kGrNG$N5T${sI9#yuxDotr8$ zPj{xjFgUUTLoZD65Xuwqd1UX-aGC3tucK%k_>>i7gYWM0D2D8ZNLh2koe#0;sq`PS z1XD|vZN{0bAVJTwpYuy8HyFd{uASd0BP3$`D z=~+GA?o^?b|7b`WR@EQTPCECntiDyn#1NvtM5`N`IIa(7PKJf^epX{WxtX7c>z@); ze1KLMen&AT(5Kw)(KX4*-6^EC)B1VBhnNQ!9Hhmxf9KW`ImU5a9h<$x+`JO#kB7m& zae{l=`p2Wue=Suvl6GyFUbC=z-_e81wW64OYfQS_*$oo&e%vaTI%`(4_YUbV2F6G< zg?9eBgd<)0|2{hH=WEEB0Nh+$9~Ab=)z_kLIDQ??6M*v8_jMs=4KQr|H3z8|=6OW1 zZNC#^d4A`n-E1koG$lmvA(K!uQ;%9J@89xqK_gvXZC`HG0!6o#_sHu<|3WFCwllvLQCK<);VsycM$c?K~byyKm_M<8hH zx<-U=W2068m(2Ayy=OLq7nn_RLXKTMX})>lwA*A7bgu$?sV0Ie90y>E8Mh|uQ&T^^ zn(&>RVTRIx`#0|F#7p|(6o;bT8_9)?r|_yD5t>-#ie3Ek_ ze8L@g&h>-(IlhNK>&5imWr~46NoE5Ezj!6Swq^2$jzCmj=ZSYC za8?0w@vbYaXyLuAOZ z`c>vMe-*DbU<>hWbzX+ZFUg}!NUuk9!^ankPCa;ZP+kB&uZiYb)HwjaH#ihF`Lx))gZUO2Zu-PpGtS$Vq=q9MT2RnBQ9qIXE3V5DDCg^iSPqu-t zq7wC+Nv^4R>Z1B2d#9{82f`=2nT8G_zxjDBJKJ|@i}wQ^%x8c_%@XADl-Je3XJX|? z>9bD{yoIUBm6a&nhL`@pX*BFnUFEuE@QqTM))ODAz#2*({y8B3?q6^0N?jD_A$fn; zW4hcp=!y$PX+M+r<$B{ctYfIM>gt72)Iv;_jW&WN`yMTzD($-W%nx>aHL%XiTCI+m zAJ($t`=)T>2Zrwo+B8!%0EBYu?{{2o-Taf&T%*zTXhN+_b_AC!VuzFe8lh>ijtAN) zAu{9XeMl*|xYY+8op@S*B%)AJkfRfVi=ttZjBZe>p9xzM0voS1qvRrN=Kg$6d?#b@ zAIJBaSK=qhMIx_S$Jg<$5A%rUFz9~NkCs%K$0i4CQE&e!tS@^$qE;Vs-Fo`Bce8_* zVnVtL^Tfmu2kf(f$9!xz#|$;BkXqOzTS0ql&XD&K{c_T=i70?Ay`bZ&DU7L$ z@06KBoT`k#^6yDwk#yTQjez*D}&cmGNyG~-$Oe4A>)v3ZuuE;0L5Ts(~|dcwZ{j1*0luWHJ$R5n@O+1X?z_DB^gu-XUBEUiPg5W zWz6!F1EbeWv`XJ34&)jIKx>KY94XrbW*gHwX~c zs+EW$d0OdL5v==rz;AIp#=hgs)Chqad2opCe1UA9Z9d+20q&*Ok`C6nar3S?3Hcgjn2MW` z2;qlz@H951OvA2gjJ~$!KmF_0l1$|d(9pT>WYxyboB!sncNd#S^pyaoPpF~%qxN}F zIW?mA#XzR~X`=&+(s_!gy@g4Ne)UA9I^Dd?e&P6dRk_K~kjW1lOi*U1&gOGsUFcNT z=3DHu*8C?uf;t1D;wOOBm*kec8g78hsT1bt)dD#!Ggfhn7KC&C;y9xuY*2D4qkKL@ z)oWfSCGapd5Kd_&NIvBI*3-gXqHv)h6@bBnxvZh6~1}&7QbP_r@lKT zny>I)1&8^y7`f+X8Ns%gug`i@gT{`AWZ$}AGYv8~yr_&E9@U?CPfA1z6R4no*4pg? z-B=^VEY#nAlZ|YY<=>(-spt?j3rkh#zUGD)U%zD<{O`P)ihm> zAegSRu{VzV{<)RSK(2pgGL+Ina<6n(Z_BfY$yF*1F4v59+wLt}kqPsYT-uT%uivtD zCz&DAqiW{ibp$wLtIUcG&`oJ?N`7lPGaWj}9huyT@G7S|0V|(%2<$9Dxx}@m z9Bgw==-)|mtND3tHnSr_2HK4<7lkB0R*!s!oNi;EtF*YXbevKJV|1Mr$wz^v*LYKE z=_1n8gpz@jv9A+keFEKmqbaV2-lKIIEM@jb0pX+HlEC-ECVyky1tx?Q(i)IW# zcXgPtX(p0>2!^i_zr!xJK~66=?$wY z;~Q2^BsLAdkNXobRTF5-T4mb*Jc-s9K*wy) zlSv+<biO@zi51WCTZ%m?^U06TM^niA7lj*YX= zjcC2Ks&QV>iZ$p}V}vR)g2QdHrxa)%IjmFNq;G^}T_C?+!x@h`yzdeG+Vz^d3kM2w z#H#nVz|+JClzCHEB5KrWcf!8 zilXO=oEw((NQae#Y2?aTISYwe`*T+m5V4*2m6nyuo&o&hI77I9GXGcJyPR|*&<)4D za?7H#j3Ft%?&wCC)cZkF#dT;^v$@UL@ZZa>o^jTIEI7T6+gtqaaVFJ(tm~@Uy;M8D zhIK!eQpa7E)h^M=iR>&hp*QQ-P1>9zx5i~}7WExu$#5pDR(00=Fx38@1%q|A@=U+Y z7j8-ud&gjj%E@*dj7Hcr9CvwpMe?H7Q71YxniW^6A4IfS@GNb@{5+pqLB#Rr^=tHK zeX<3TfWX?|)ej3VIf;80DhU-Q%`dEaMw|LV=1q>^0o@*`!6p(~5l zTByU}1-a4}gWt_Vug$UtnnrVKqLPgz{pnY*>^}6Mi$3b6{##g)w7dMYuY7=q=5D%c zLW^+U8Jmb{uM^%LyXSG9ulHJ*gfEdIcx?1Fd|YDXYF=&gdKX zN%Mlr=_=I*`Donf#lW_DrbsP(TEPvmK82DwJ8kpXy=s}MRMX9^7fw&UhdUOORk`uV z;8R=HLB;Kf{w^6CHfzp^3)8onA_|Sp%^mfCjEq*Jgg3<1CD%0hsKz@|Mk>4pLssi>QMB1cS`wStiB-OGE5hW|_feUh* zDktaiQxJy)=6?+X78~y;L(uuH8pSy^u$#~jnA@n_q+;)qAZ7rzQazxdIDA*DoiX#} z_1`WYygaVrV+qQK9|MoDy7WlAHfI=VQp!NLl<>O*D#Euy!7uQ4yk`r4eKEy^ySSKg z=vb}4)^W%Dp|-H((XDD(`7Hv)F>o3#3!S-rU5d1$<&lOb3+8&WO?SHCP0nxMC;_S?G$wbhbRHiB zxAbEkkPCdoHugE;Z-EFPy7k`WhzD-B)-s@7IA{EW*7Si0+t1B@Zzu0Bhe>}mcXg~0 zrO1>h0(9?G-TIknlhq(-`#oA$lS^Hl^~1|uh!^Vz$4oZe<;fmTa>wdjzUQ}jLH^X} z1DXOQN}F<=AOAk{;X?*S>-b|ji36*4iYrks(;UfF72qs#j?7M1?| zI_A!|yuaKrmq4?C@aPXd+9Rk8Ixo5sl z%7#fRq&pAyOkMFY^zb;>(HVoK*gJ|Q?q$M^>GDIm^h58=%fkVN)a28-X5qGfvduc* zG&~?`zILeRzjj&PO_dY4*k!92FEsRxR#tmOxA=PM*%vGf0krE#Z(}T%+3yNh{+0PS z*=j6rp%tMrCSY#|(iFiT)Xl-UxV24a;p*~AkE)mE4lm{K%cFAI zjYO*)vz^q<Wip79rHj{$Q-a}0Z?vuUIJ{L=Z+?!C|g zzoe~vIbO=^Y_J)0uvl>?(RehoAPB%(=ww}nFGiA`&JJd&G}R4dC3 zAXW~5exq8Xzj%mlYfsI!$5^HKl!p8|hP7-3Lw-K5Sn+op9VKVT1Xoy%p{&9ro-LWQ)sk-U%TGZau}62H?}~qW=Ez z5rMI}ioydznvqB>STzGz4jN9Ia2fb1t?tiQ{Vj_E$wKs{(f{O?Vcs2#hNqm$PF(*mp>5b zoI6Ew)as~wb7xR-AOKk;-3e(p#*3vtiHniu7IJE##vt`T@V+FQe|Mdug#HFYCnj`y?Z3N>sNn&a^6lb4i&g9!LiixaeV{P{{Jr zA5j+Pp{YSu+0H~zTB!e0MhxOv%hepgEgO55nPW)rSV16#_AxRzf1KsKEW zxq`)*N{(uMm?wy)q=6k*-MjQZV_?)gPN5 z^#(0dXMgmbkI(-Tut^qT4WhT!BZg5_)_<~Zp=k!miwUJ=jMGjR6vee#+A(a!dV`vn zepVhPwy8ilD;ASGcfK^K$%s?=TkAuJ4BFo%s6L?8`0_a^H8)|O$?dhV7FU2rSkpHk zJFmpcb`9i}|LFYIG4mWaxuWH6BR4iTt0qA6a-$;24Z6U11Pp9xEp9F%$LJ z=&?SM0W%Y+hUYxfUWPz`ZJ^WvVU1p@oSGc1R`01>(h7L`7QCk1b>725ba-P&R5uoE z1C7`OnJ;83p-a;Y{$u>pe>hMt+=kBflJCf&M2>W>ifXQxO`Ch|w%R?j5}S+~ZlJcC zAWgUE^q?ZLG||CkxBmmd2LZfAg7ya>W>b9Rh;}tgM&de!mvB zV89h5Db-x~sMlpAahqw7EGY&B$o7Avj{@6_yPGyzL|I~Bz0}~|=lMbaAnz&P75pvD zt~dP2SH&gSe*xYWVJ5SePMK*HK->8I=)POmTfA^`juTSet<|E9 zI>ywud>$12!N={7fNIvpgBH6&!o!-~g@A4|88N*^3K{?4>_)GjgZ%z8=b0Qnmx@PK zM~kR)oLi_17?1p>_lZ%^_mue}@h=8aE?Wd8v~c8qgUkW9gdb0CW~HEm{PRCJKCa+E z?>CB=s4H$h>+FFOy>D2XcXr=BlpiMK8aVUl-5Ak2cacZI1mKxR zUjR;GMQOvTUg#a>AD;%upf^Ysjf8YxuOjI42a8DT3AZ1crT&4S<&&tFkaM;k!}$@5 z@tC0^3vyfdGoSK~fxGOldJ{&_a{>ndhM%cv0r=bhSby23ciDW|`bRijrX`d0J*oFJ!c$0t41!&Tw-_mX&$@0RgrdM?cJ zGUIA_O7IU;4&JLZ=-F?lP*J2?olCo=6-MD10?^vip>XEm-(NF1Z8j+SJ@cbV!M$p{ zHyF9lZuAh`ja+=l3d{Zp_+;quWO-0V{u8 zrnR55Up6bh3HhPWDeqUxj8Bdii4^vJQa+K6ubVX68zR{+AE67fqpy}ILrL|V@<~y8Y_mHx zCL;!P^f1#^rs3$;z^_twnLCADL3o7DoH@baPD(&)Ju88`K7zhX#Z|&k81aULb_E(- zU{3dHl4yHJ&Hq-(Y?eV0b4L}Q3SLlXT&>`*+B6BDLVIm zCjbABlS=Ytl}{mukxD0ooY{1g6qU-^6jC9v9A+mvshm?e8<8c4CFj#d<;>=kIg`W2 zhOr}?&3E7b;QHaZy{_l=dOjZa`#YkN#pQ1JPQLBz{K`w$#}`wf;tX_7lgohi+{3aI zpqlrv(&XynEr$P@AEQ^!knl;z&gTh-LuplQ)3;+FZ;)brQZOUmc&% zs=D8Uu=WIRzB2Y6)ZIRXYt8|!nY~veiJJ$MUe7Oqi(R^mUPpSXYYczX?`LJGUNBOe zYRI+VEHMzyLF6qNzIaEt>5fTUJEd3~AY>Wk(26P`C#Y?pbm-lp0j~vCxFBBFG2y_i02R9rfd$P$PVc_FA>)xOhGz7W^co$#%gc~AuN zW_#&+r(Wot+E&MMjua!v{`#4oRp6wHcVRpCyC7--I(piu{Zl;`0-D7WEJs(l3fL(` z)Y!s$nqWXjTwyK97?vxgCnHsI(hj>>8DFUUd+MBCw4;5N`6a(Ud7d7+c^gL{Q6!tI z8i zF|SAi(!9iy7EY&}9#}xAX5T_Dy)YT}*JP!lcL_e*yVLO@vWWgn;FSB=`0&801q_+% z2;lfv9_~EdXCcopHHFqeunxb-MvtA0Q~R`q0*=`nGiJc^v)wA}%-2^Q)w#C-r+UK-^EMp3`k9-}N9xf5 zTNBtZd$%rV%8$U@@YQ3a-%U44-L&@tZYJeh=6=44z#5$x!GH=9b z44d!kSA>7#Qenpy!GSF&L$)qP&d6p_PKlO-OJ^{FGzdiNmUpR$nlGWyK zQdp^&C^r!P2$zVmhBF7|p8@M|OD@1~HP!V_BAI2sAnVaA@iy*PPzLh-*c>1(1?`#$ z&DvxjGn1X6r)0gszu=gqR!e5OqEdL9A7E{)zlDe4={CSVou6vH`1ob`RFXMzK+#9t zcUBVrSc>+l5td9ktQ~j%+j3m)QpQ+Q(=vB!`XGo zdG02@(OFu34oA0lE<2dDkeIpfPm@{cDwYe&ma$}@Sz@eH2f_hAf{8SvONPd!^A4Ju z)cn&XZ{w6CzAjuA*gG*XD8$(7Bdl3?e{(pbu zKl%<-{A)t?Bw|LzOwX%7KJ;vjDr(D*NE?$EmgSTM4LL!z=79x_wPmRx<&52LlGgR# z^amb8+%E;xcE+IEEDPy2Kq;N|mtFMN+g95Nb={*W=4bsK=RVM{jntioe-g5=Fp0pC z`3#l~#LaGcJMA<58;||WXzdw0Rj&$pZ517P36JmFV!li4n*r_!Emb;3E&fo)&8ra6J1P)&E{TI$GmT)e4o7e z!_LuI;afIz$iYP^RviRHWZJlng+~VVI+@zYAFf_dy`1^Id1R3N*$>6sq6kEA;K zOVD&K77tZS#Fcj)5$_#Jy)nhN%mTF;D)f&EgVRX2><)7?hlqsntltXaKD*kvs_FKJ z*I~rk2lg8hcQW&>){i&D88`%ue;Lohzv8)iS2hiXKP(2_C6xTk~fOAVo8Z=@>x%K=y7=CC|;q2!o zX&_-U{By-1{9Htc?TjpXwrN%n z?Gle17{WE}R@UxG?*nv=MIEL^win%;<4Dr#u~K7&Z6JwgGxo{e!zOLUvT|-Qx4V~x z2#T6PA&qklLEj^ZDS}J15-CgD>mGtfgV9Yl1UsDZ z0Ws?k!Q(tVd;gWMS-^SQt1itLQ*(~JVO!4*%xU`_;?I%j{LA@3z{319t{c+%lPC-+P(Uxr-=`dTN3lgXlp z+ClT}Rj4(;){3&zIT)Skc1>crK$TI~lMH=}7w6u_z)U;j-Q^`C&D7G+R#IedWY*@# zrZ$Z6zq&);92)59=HlNQJzX~p_(^~!drwc%s>6i6?VK_0vgcnIm{DW|t|s_v7#!c6 z2(K1d)vahgAR0w>75#Uc47o2=vvDl8{A-zIB;gWx{Aax@-B@6E1RCvl2(I&R8TR>f zo#ZX(NUtnX-KQE5e7brwWZrcg_wrPAwKJXG<<=f%d)ZxkF)N0M+&nQ|)79C4QPzCc z+q6-~JD)~A!m^JHnX6&=E$?y{>NJZlAhf0#TGnk%FF8I_4Ndp-r7~fczai9FVCZFy&F$5Ta*R;jQ$J^ zG46V^yNTz#G#C;u+^>2V^Y#d=FW>G29q{v(y{aFA(r4nGlZ4X#>ggQgZSC2>S&};u z+v7N(8I;TOBC4(lbJO)H@`?7!AYbnk>du=NWflxq!qoe!@h$3*lhFYlzU|d!x(VpZ3-shz6f{geEvs$0;N3bJTl{IMj>CMo55WO81cv86ht{EwADX;y@& zIPdGzj>eE9E7qgQX$Aegn1-jYHg}#O?yA*R3T87WfVS2TIGX6t)odE*S7N|jh-}^C ztG*-6#)Ds|u0ejnxp=lY-d9jrIp6xy+|}-u5&!O0*SBsx7ls{n5M|~;MQR1$tDwB8 z{s~|!XyF3SQvh-pkfD4LRZ`2>r=`;ABua1SHbau-F~>3e6j%@cmGBYyP;XIlR&Y1W zt9?jlSHAU0(O)Jxzo>U(C2N*>GJ|f|E`4Z=VR;pOHH#l^rFt|= z-9QA+bUNa*E+Vrl;m%th&X3s_B#;BGvx6OefaaD+_46-}A$QfYT)CIDSL=DGAM-2l z&F}xLnoz3fm2+c8308RlS%|Vv)(rDS*^iFW_Q);@gPhrYd_a$0wUsMf_8Qdc9##|m z>c1*I*geD-&b*9>35oP_A1jchb09Q(Ot^kDBL4W=W$9q|tnx1L@x9Z0<)j^rqVWni z>;7j%fJ6%9J>Rl+>2u$dWh)vGP@jHmD)9GgYD1!?%*?T@S_vvb0sEhQuZ=#%o^7T# z!%b@R^nkr5bpF@-C38QfLVpY1>)!+FF{G{~|NV!>@dpbLV|pJQR$WqXvl)B4n;cRu zf2vAbaAX>gs&)%|{gTG-qKHku{Yby#Slost_wMj1_&HO;-DD9VB0$mI|Ap?s9pzVl%M} z=s89;f{xdT#f0DDLg#Bq(5%QnW>Vb@#}Rarv*sdwWJ>W7o8hiBN?e6IbgYCi+x+lN z>T_Bc;rv7x!@|TA>LW-0Ht3{sQ<^w;9vIw~Z8r2(Tp57NZOZ2C5=J2|^GK8jaI5{k zgz$+%kt_L)9s+S;{qOn2#@a7~tB39izsb9;O7C6-m|~Xi=0bbZuv83Gt=Z8MW%l0i zP~(TvU6KEpMay5?)?U=odzbhCqDc*J%LMzsj}s`{Pa6V5hHZ1l`Ak2I3<0b9SaB{! zR430BAr{6QEWx_J<6d`a$`z{5g;m9rTr7bNh5-#3eWxF35y9~$iZ}5~r>yiIxH$^X z9?4(2csAs4DvTL%;4vw*TYpJrj8@{AJp{5bY|8exCf^^_5Z9^wF)D9NW3I~=1r5eV zF7NG#c=?$Yi`i0Y3KN*;iJAf-FH;JM-|xPU%S7%al)`5%p4JBx03M|?y3x!RrF4v) zXT4{>Yx@4};(jxK-5zYw^9t@@C@7s_^(LhuO1P#mXXTBfOI z5kX}!Ak$^ul4}_+Jx5lf_)U=HXZ^Lh>3Ppu+xLW)eN}Lm9?W6yOweRyp?((CF^KUe)7iML z*JZagIvY5KyH8;43v}(3;|-;s$;W7`-}UUux1MAn{DHt}6@(^^eLO@rGIt_G zlt$7bMW6hK@3-D>3IF@!-V|XK)zVR6HL{zNGWSB5OGym{(#a!Zr>TAOClA>c{t%o5 z+B+Uyx@2)LgUp+M5dXe7&20Ob=sCs}-&(y#GapB0>gdL8i_LnEN;^w>cZ)#)o3#D+ z4SpWVPCYl`AMb9`0ixn_&smZ4+|hd)p4~Wne{oY+bP4Z&c)0HFO+cBPa8z+qDR~ly zt9`wiP=6y|iqZ3Zw$WXsKTSBHkPB!xL6V4BA2Sp37HM>(5FcIU_zwJ9h z8m9kRK-9*?b4iiq$;=o`wr|98*Ua%u@1?+zcw=3jet&r$*w-s)tR$H~cEIW(rdi2k z$bSNUwFj|UX9A|DtZVo95#Eif?(JB6Ycl?ix3_Nfon?!I$i?Q$gER=e`)NYsagA86 zTfu)l(#}El??JVfNbfQxHu6}K$1#9xV0`e7Y=6yxaGJ4OL=ITH4{vrtK}7i-ZvP|P zgYt&U#cTQdPQ8NKkEd_9tR&tr*6Orc&IPMvQN^!aTNgi{f(uozS|yvI>`)^ z3;Cr4&A#eJG1d)rIO|DZ6P^nV=MNuSa9XT-zct&l?zjF#&6+a6&_W0Elc;f|iLpHP z!7*JtHwEQY^_+4I7$thgS91zx{NN02vfq)C?*cl))))GC`(%f&<=#eSv~xj}glx!s z)+_TXM5{O`#)$r@09b&lSCu@-{?x3nU7&zlrm7A|Z%Dj~i39y7-NreIuRr6jz>Gwa zUtu;4^sJBH@DD1?;ruWf8BC9)!$i{=Zq1M?Rz4` z#+g2c>yxsFx^Zd}_x*7U%ledokn>b{7nyv2&V;mjUS6@yB;^hWL4g$W$d>i;)=b1!hy z&N>KmU79VXox<{h_)Q?F_NORv#h)4dx-bx$2Yiy=AI zcqDD3ZsRwW75H}{1;1g9&GFtrlV0-p8gP2@a%BVeV3P1h@=mdhWCa6& z9k%?Z3(*6lqnUDvx~!L7dHCoYUc0a9HKFq0{fXkaS1lKy z6|wP3K5u0|TQr|D8)?#3=V}&XpPhzWd1|Xf#kf7Y z_OBvY=d{ucIR?(T&ht=E3mZIz;xf=NmnlrLGT<}^C?n?TyL^em6|8A71{UM};GWEvu)%s8Ej z&?86#dnA+l71(^dQYHTe`pRadY(P<}4QWE27moL{{Gs0Q3`CSz1i#a;`v`mG`w|XNWP@e~%UZZ5@7NSExfq$itKH<=BRPoxF=d@*QYW_4@w!=54Cw$nH zyzCc2b2Q_m^XA=F1Dy@pVM`FsiG}qYw2m?$&uABA+m&qUJ$QU5x^!~pqyFlKK5(lR zrz}hqX}=d^5En-7fR}g8q81}>k-7ig?O#;uuNJm;n5|@0`0w1Rjir$H5Yxc2LPMf| zY<}dk-h=So4woF%?9k~;sZfXWe)Z+JO#Ffc2`h*EmlfMp23*8i56f zSwlrSs}kY~vRYOD)1hF3X@S)Lm8CweT|$xkC+s(sol0rFdp!S?jh7bPF&4dGyJJyO zc0h6~x+vJaTZ>fpC>DfXBB72;p;tEMRB*i;(y!vC!NT)E&dO%Fp01kNxIB~$!D-b$ zq(T~lCE?Ah$bFlu6!y5c%N^VT43% zLQEe7HBNX&m1OVXZ5}JpDbbv%a0pFcn&H@&iJ|8)u%S-vbUOp${>pgVVe;{&1#o*x ziO!HL@~0wK+UI^koRnLRKKY7DV|!(Nj})d#fmT@zkNHY>?LUnWb4G1y(v)SL2UaII zMwmay*#z|hy+(sNVqz}hMcwPh$b}wRae?(L0HXkkI>ZpJ3ig}@R$eo{4OpZKYFy_; z7xZ^dBiE~l{^=bNxply^1`k&=rV|dUHB((*qT-)TI~hfO>*}Q`6nH zp@L>sZ`7HM(SLu#3I5==-b5@#`R65={oI}Yo6mg>g8#IMi0s=v)BC&gL6ty$L~Y$r zzAwM-wNbktPFd?L2K8%7Q}DvCCn8t=S^-Ght{)FNxfgNfh4u|<3Tt8KiyX5GwHXiT zX1#mMAKHn-I;Fbj7YQS`_^^ zEWs6j)hd`GfrX5jfc?3pp8JkiXg>&FS-0{}123?xe3267v;rLeD5nJ19&3C)r=|ux zCM_H_iFp6g22-8P(<_m%G#j*O3K=_gc9U}Wf$CX%1E;p=p<_djx7`(;ukbfS$THv6 zlzl+`i*jd~#LOmgVsY4Z5xrjTnU#5UPn+jP;L0}L6gOH4SZ}89t9^288x~o+MBBls% zKT{$#0f;6anIFYc)81GDqRNFEY{590`n){a(VMK@` z@2*@-5yc@3E`##iYXCJ{&EB$G&K5HuVrnUWRXpN{9)UmaIXo(h;5Q@`p%2Rbcucay zCDk<-Ptedp)5*q;@21}Ij_rpe{M5dY84BAU;Q?_uQf7?f5jV%Zr&U&0Vx1JOMeiRl2%=e5$T6@f8QWgIo9{&AcmUa*Aym`8;%l6TCaP zboAS1c_HNmUdUWZ+`FY08YI94g(C1sKD!-={vV`bV}XUmZS&y}^IE``e^ZX||LG&Z zUP)9bCl6m|&GLW079hK+I{AkE4Uiue+@%3UZT=E2T^ZYn=yHh(%;HW+Ym|{U{5+Ap z-ts=`=M2Aiuh41m)*a7B(s*vAo9H5=szW|cy-+rR+_(QZsMFIg0==?eYtb=lgYtcn zLW9I+6^oC+gL@6|oJNo-2;V;@7dCuh)zBIU-!-<}dDy9Jmrx?B?tn#DwRG6rd{OC^ zPmDWwk5!U`@&P~H^?7MajE{X3msO7&{5<~IeQFwJ-c!G?j-&)*FQK`Gx=8y*rltv- zefW^lZ+=KgZTx|BMaxx1ORuv1nN&XFkxVvh$Y>gDLKN5zGfn~wYA5V)3H|Crm?kOc zdqQ~~8o6w!Q|0%#_U5kBjbSZjF;w8B-%{~FLtWo*1Pvz>AGmNPW z#msJa8D3F3P23JajoFHkb_Lsi?dT8ZS-0Ufa+z8}xa5vSws()x!o zb}Hsjk0jd=(%r~BIbU}rvnh||(WzF^7s*OJjCZJ}$)`1-G~z>AGBT>Sa-Ml1+#6*VHtftK06K zU@QmQOJNiBhLqMh6Bqw`E|7j4Tq4Qxui7q_>}NQyB?=R z)kVgiZX?tOAX^`GE0KJ&&L0@#d@VH3_4KN7VCwTTj!@;|UW+Hf=NB485_O50U*W|< z$>vOjM+`FEF12a~79-?DPUX$_+(#x`UY&Mo=AJ66jpa?Gi-<*3n`RJbpz>q8*A|rUg&~l`` zvs5iQGys!c2sVA*YaM5v){y$l4mNA^V1*7c@VW`aq^>PDM zjRv(zz8cVR`X1KlS?SGYVn3+60BUV$y~(pr_w^-rfs-*Qu_Z ze_J|Ep$iLG^ZDHOIoK?x;4f$_>OJhyw~^nBHPVJD({LgY;B+GUH&FBUq{+F_0C~Vq+!g_4xXK2iUz9&a8FNP0a;LQt$Qq0?I@bZMI-=B2@ zotc-XA7iC)3=K|$&8kEHdKr;f%0O{F1I}bLTG8QftU12Np z&M|{`v0Pg68z?u=0gl)ZzAp}2B?R)0%S6}%u^t09S^T5HG|*4*E&kDg_LcrS3LA^D zMq}O!b@+$E$UrAlyTvV8yC9vkcUWm-? zZ}Nwa-gB_q0dqfUZ`JPVP<7Vqhu}(V=eWO%&vK#A`sSn_29Jn5Jq@Or^5^2iZ$Pgf zEHCrKShO;m){f~Daf4fwUembf;g&wyvtK2%^O9&~| zKRw((#)nSPvIw<&3)&IvYKEaXTpP?}(#hMg=u}cUdudMUuREaR0DTf?)`yGKmWcpK z<_e01X=x%l@dyv>&D^NVyEB~gsg!dK#d-IXyU=g)$=z-Ja9wJIFxk-CZ>lo5>L*i* z|C?yu05Ua~PTrayXTHawjTWRBcs^zP`0jX8nK zL|n)Wj(g__YPo`XO>}{*ejD~mAWkb(hEbLV!kHNzH#YZSWcQCxrm*YkS-tUQ}$N2efUrd3)3x^*4{OVgdEPlVDf& z?|ao1FY%p^;mU_H(B}7kC7U8y)n``GS|j=@h(E6dW`+8RtL8DP+>g-fz|e~7@XQeL zYga5k27QdZLX?A-A&GiqP5t_E*cP$D&jn~%s2I?3ATqEEd!r#Azm!r=i@T*a`VvI@ zH0j`ZKGXkImZ&aFYWSmPo3Z~nrlW5A;PC;jq2+=UuyvaW+h$(<&tg1fec8mahoJMy>qrC6+2J&`q4*6qxuMkNY9&R_`&n`ct*)f5|$`MQ)b((@QfF{5>8rB^GGq zfxN-YzhV5!-u2u|;>Qq2LR=bMW1J$_D@+CAWF0oA+)e{&?~$;Co%jPHTMQ`BMiAu; z32`vKd+I2#%ma`?FaBR@6L)dA*C{=NzxYT#vHSg#rAiYN>BS@&;j&T-N zt7S<0+}ZC9zK?eYTJvltOlD=iu2L$N9fknS@9CD8$rfc_eN)xvVu=}T9)RI8ke^%Q zmk?d->^Q8=BJu3A8()WSRPisIEfhnjD~~bU)ts2S=3fXNu-LEN7(wC7^(n$HpBfrm zKv9E>>6ck|86%W;ylNUWIG6lG#xw?r;6HnQ7L^Sh1#fTos#_Dz2Vti0D0)nl! zB|2b493J>R3KyEaL27za(lY;CKTKz6c&m78hS6bV`bY5}4`ZjUW8K z;y_1`k|NtuSs)|3v!(6G^v#I(7gQ^?Bk=^TgxSoLrD_*&}PK zSag}2gw=^kfXd#nP9^0AKc?b4BYW{ z*DyG^_?8uWgxAslNGhk?jzRE^FB3YRreHk{)F1V(bQFiKof19Hj4dNP$ts`a({pxI zMe1-$*Ui3Pzd29fyHP8OJ=geGI}m4r!AWKHNYA4M-+aFv^^Yk1AkHcc5pLD*1euiN zWOx+1AtbDHT}#7Tai%_jV;sqlKt0Vs%04x>d~)2C4Yt%`*!Nxkq`GZqE?$xUF{M#_ z)cBD6vw>qpXKfPgrsc|RS^1>sNb9*myalC7{nbg}p7<-GIpQpglhInDqqwqyL2f zB^gKtOKPpp1}P4AO+urcuQr(|edv?#$+r@>-RoVv{jFNeDd$o*RXdX-eGr%1PHPW5 zl>bvYT^$Hi^S|w>W1*<`o!mRwl>)tt0S!lngWj56@wpFXNt_h48Uv2m)X<;k1tty~ zr!oy{dh~|-e7C(q=3-I9yS@Q4TvHhr_-pdPP^{;*EOS2myUvV@H-~!o7rfD-tYs-h z>*};ZS)QotQ{I9?I=Oa8a-ktG(mG7|EtDu_&UpuI$Z1BEshq_{vfK=lsY8_>?N?{w zgy~tKEgfqXI3&eVDbG-S5kTaa2@T~zzQO#XNw7UPT{vn2wIu3756gS#V*871@KT({DlV71%Dk=v!8OqYN4?8d@)^_aWNmG7ZG~dM((_^=WiFA zOf7()ps~?sYI7OpS{c+|q^MRm3mtz5WYn~dQ?q3R|0T`I#x%TtQ*+52uNIXGIF_Nkejmu4u^=Dl3zYrlqygm#&MT^>i z`!vo&O^wj=Z-A5Ph9rgdf@0?+vGG@g;!14);P4QVS56cK#~v) z6$WI9u>V8|Cep&HJYHZQ4q8^AbPD=rY|&RD!;X*e~r2{O9@{|HUnEv15*P>n-%a z&Ckvj0ZnS}GxR*vV{f*-fHnjytx9L;p+mQNgzwyOG_!|RNvJwq+Sa063n=k*IsD|5 zw{+c(aYoUhT6JqF;4st7A+_w=^y_Y?rRzh88>_#VCiW1{FXz74L8~d`(~$LS`T?gY zDcti$>qV)`2xEEHQs&<0$QeB3f5}Zdd=&Q^83*;*)t~U)C}4Lh9tx-*vkKzoP5yS& zE3*5>dl7#|l3Gr^h|44=V!Fh~w3Rj0&-x;_GOpCS-{x=nH4~^0`=K7k!3V)_F2<0O zo9M@e{=4xtNw1x+>l)c_rDv+01Umh@SF|@PqMq1wn&f&)ikW5nd?_ZNiEWoga)-w| znhb4ruXgsU-!42{zid0InmSQz)+f(SksfKswhku-KHZop#}HbiPv7mH%->tSW$k(9 zKx!EUopyK*OwVT=tXS@A?1m2SdgS1vS}Qm!{k%k4&^3kg8~~QYOhrXOe#B3TvleUzhDuo0EBRS=E=u%J8$MqCI!3RwcXqTJ!#y zk3cL(hGpSP8uN8&LA1I53A!Z9!-zx$1U0CEcI08>t>e4PzgOYX)Mxrk2ARV*O7bt274kLFqxVUGvFp zm*+}W2G6!eo_V*0xwHc$dwKTlo9NAt>U`!V87BRFTQ5CgKarGdRn zc|!lFY!o$A8~ryre73}QYAE(2?8XCo2qp`7%L`~rNd?n$9TsKHjXl9HE5iflXRD|k zto;zZ8uiH|lBprwe35F)UmJ>RqnQ$w(^As%u1D}k0Xo*~s4JcoFwbS?RX)KnU5EJ5 zP790DuvRYX2-{Bg;p_}V0?w7pZZuuV(o~|{@GFsyESYq^#b4c@h3I;*y>3M7ly=bh zwp~Ay=2B*5DNxcH3U5BxwDvRDd>(E>t~%gLP64_=#9`RFb#xrXtx*j;VaGl~Uq)G)~| z36J5XfY9<6FCSXjJnS(dgbXLO0{|39JTn6uC6Bk+tPVi8(Y5Rk4R8yj;a61n7a^iv zuqZ~P{mLr(_S)x=mM{I5TGfvOe;?J5^_65R5)R3n;6>jQbC`I)K2$J!JxzU+>b232 zXn_r!6sJRriYD~IZe!3=gV5Lj(}?O#?aaOg20oJv{bTK(glsNS_e|FZTE|w@#M#b} zwfSGBr1v8Cor!zO3rbLrU;i)6OR$RSJI06@tLnsntn1D(I%1CYxjV0RWVu|-gra_x zS>Q_uu!%z&!dFJtOb4&Pbu+r$N<^rb9HkKHRE8J9b z7z-<(+Uv;DHA(o|zmG`M7mV~3hXNKMj0{$_}v3~fs0_~uD6R39W5J;)hdgFVO`WQi3s+G z`jSt`hX_7abSVeyx%n1r36+15DJtqtvwC=)YougGm8|qTa~5;-BV@t$n+ke%F%$T(dHb=2cg_RM z^Brzu4iH}<@j4bgd$&x13QB6e;?B2Rr=S+3b7=J6X&)m7uvvT3%&|PwQ$qD}%PIyv2Uw2$Lcve@%QlzqoDoUN1zDB~mgT=6bXhb%$fys)UP)Za724tCHVvWH zC)B)C=tI6?p7VQY$S=^pX<=T#t;R^_#WaHn8XYnRLx4x8Z*82XZV}Zb_)eyC7(~DO zcsvli%xE20|@ss)A)DoDOJFzTP(5sH$%0!O=a$#wmQja3+LBeNHp~6r3Z$TLb z`|CvtpJqMQ&I~X>x>=E8w#WmU1GJ~{W%{8Kb#tdvt+i!VC^rN{<0jD>tQL4nG^z3D z)c>Lzgr2ees@w;nOh{Go&(lf5uU61gQvOH#z5)v%AF4lhhmXH!ELs7lB_lTVm^+6c z9lLCP2u7N`9X!$G6T$pn7nQLfUzp%4I>HOYg^RU(EpZJ`f2l_q``*WwytBWiA&_8x zau}{~@Mx-7FZ&zAEhLNAbAV=lTB+J6L?Es$OND#8MY{;>2pIJ)0#&z5yb4%wz0teCmA0}qzM^WODig9z}5 zIydTAj4V{OWTo=C20T(=+{D^Vm`mi)Hl#!UO!z)1r~Fy@ycc$ zA$!a49!4i2L9xy%tW0yEtdo-s_30&)cs#i>9~Q8UX_=_2uG1+wJ+#p1sIB+dVcyuT zV4LGd(i2m&SH_rJYq`J=pxK}0aixX0{=ed#ML?Ry{3hD4cGyZiY-1PF_O~pe{79K= zuZoIL0{#UBOe^)fM?3k4s=~b#rjFZqDA( zX1oWzYO4`)b_cxw_>lhbt158IGY)j(#>`8fpLjR#x49{XG+95FE&$qfCXRAtAaH0L% z3O{(YJ)@aMkxi)}n{TX;?V5Ro5%4xd#Ms6G|2Io{nPQG`^vy{T3MfDO+(Q4|P+Ht| z($I`Kn=Lng#f4N8bR*2WH5}3|v-;VulVWfM_<(>IRWaji=z}9Da*3;@L6;t``lpj~K%FZm&e{xp-CRjvIiQ--wP-T$T+cGvA>&Yrj zVPCzo(EQ4kHSPol^taQfy4;%y*J)W@hpsqpz0-ts$kg3%=B58eHfgXApl1`G&Rl-o z^nCbD%Iy2u+7)YL4w=>0qd`x123nn8fMdodMB4 z=uJRk=8TX6HQ(3$+XLta?{oxxM7f(p88riu6~Q%pB|D#TV(pj-Xch1w$`7dJG<8la znOvH-DmAM{sX<1i=7UWb){`Rd@%oIv1Bp)`wBhKfQ-K$B0yplX-Kf9g2B+#>yN04G zc@}$Q=bvooi=t1YWI8};F0!Z{;Hf;4s2`WreVc(Q z0xAMBpT`c9iKC&t-%km?A4GrQE~|%V=HG;+cBi3$(Cy;s*a8Md$v=WdHwhhe|%mD)&utSfx@a!Yw&%N+l_) zR4RulB+VhsY1pPHmBR=jhta_y=ks|}&ZkXI!<-~DYpU=nR zZQ_G(UJm%cCP9xko2P?+wd*mwg!In1D65CDYnUlGzX5n{`c!^C2e@>JH5*tM@a!-o zJpg&QuVtrt%KX^20_%A61Ga#SyxpHG(xDm$F8%B9?tQA@gTp{4Z+xXpswdfHpVUJqV+34*;j4b$Oew5d3}-BA~ReV4%n81}WBNUHtk1P_Y8pBc)Ki{BJf z*Fc>L@J)S!`|2cy??Y!Q?!lR=?BQ9F*getzeJ8Vsjr^rEDmrhrXVcRVh3MfT-eLcv@aFkQN3-TVeRb3tEm5k4D`ESX z&K-<4+)cIr6eN^p(qR$A;3j)44^gP%^BdMx?MBN;@n=2}Yb}w{| z#@YkpL%Mdm`V%ZoT-7CLTW;xPvF1*x2G?X%Q?UUO)4<=q-~92}|7r*Ut#LkmU4PW- zFc-lHW@!?eI*R1ney6X}WTtm04Vu3T zJ2qCHP?KCbAX8J|k*Gr+&)Re0t#Zu?5&paQ4;rrTL?E5nkfCwWrIpU`H8m)FHCG;d zBLgIXczLTY6B@e5D9#Y-p*BU|d@7@3U8F7ol7msQJ z$fgwASfpL)b8u{DchBP%V{@`C&|GvPOtg*nIeTaYD=tkoWze`L_t4y%+Y%l%I{s7V zS}K4A9XcTg&S0ja6%2LTvt6{g#_}aX!A0vr+qr+;Gv%yDAlny9K>XdQ7eMf)p2ws0 z8RAIS4MGrS5SoSlO7lj!ux?fq;D->UuRA#(Qy#!)ds;JEw-Clxldts|2TLL${#X#*>hy6K+$sHL*`U z&MG}nUtQ6Vgn7c zfk3S%9mbct*y94{Q;W41Uy?~jE<{4v}&D> zZ&ZU=7b@yX?VQyk(fCa4#Hm7(*L6?qy`h(rd0K<3<;SKyt;_%~j}FfoTl5^Fo(A6y zA33kA0J!}!DyDRznjPXd)#I|^79nyd)4baWy?R?mpT&9S6YEQ0PQqB$NAWLq{)+$V zy!=bKrBHMM5YO14fQ7ZJ+o2gcuiBC>7h9HLUQI`p+RJko6RxV47F&Oo{8b$!vS=7g z6ho)fdx?;;b~nXPU^Am}@*aBJCIu|`^^zD5zuYrsu{9MEl34@s2bmt^E@RC_e@{Dg zMO#_dy_c~+##tL=($$8*Ewd6*YoEqNE6i)EU56GOQm$?4vBL_rHKHZO9#<}~un#BC+h(pZC&@r^v6 z)$*JYAoMAC`iN*j#rl0=Jf#TGyJS9<=M`)=v(T+sAVmW$`jVV2YuGqP^j(~lxb*F#!9O^ix_{Y|{XK#P4C5l8c| zdt=am2Ad#~pj#bvflscr@Y_#=)mo1V?g66LYxQ)WRQT_l!`m@0`P2%nDD zaG^e>zcR5`YF_hUq`FWC16TXm+4iB&NZ3YC<;6)k5bv!_v~_yZr8yHGV<94N?Q7Ca zXtTJ!RMj5192#bv!mRv)TN-Cx@7P-jgMCtvy`h50n|2|M^CmlCz(+^L$ehl&MKPyf zsHX-!ecuGzm5QKRc1TpCN5ZthYh|E;6|h0BOwgOPAUekArD;5foLMJ+^c^@7;|9{L z(WuxKfdsEm7Z>r1^aEp58C9A56Oje|ykzYZ_Y>4_LkpYG)Ki~eOftd=cKf%Zwo)t= zSl>Wq?}V+kz$>C?B-R}Wy#nkyvY|2MSF5<)9VW!I+!#kK(BCohQr}S@H9%w3}0(N zxS&;P<-R`-=0B%_@2FkGoL^shieSu2i3#YuV~cZbWmZR)@SF#ky-9b(Drn9hMOPFp z|B1Z)l{(=2;bq~NZ|OCp)35xrgt*>tTIKuf2ZGptwb3K4i$QTq(vB0_Do9ib&o*-^ zDI5HHh8)~4czE_@@(Opt-E+|{njSE;9KZ4kH%~OP4;{ z7wvXgRI|n205XimXcXU7y>Yud=^_mVG35Zde=-WQ5MVI=jr? zmbf4|a}81~U7dK1)+3^+O-wFS|FW`N_-1heY zjETlRC;Qc$1_!O%%^JbyxfwN!Pg>7IDa8ktQ56tC_}ZZE`pmW!=lV}F`S@!m+<9$O zMDH;BnwI=)w9o5%C+(!zlfkn>*BiLd195V&XcoB z1ldfboz+0QXal-EnkWZ?Kli#&T=i!fkt@ZM23agCGipLjzIe@pUO{_W3wKY5p;hvA z$S*)zUM410d9tx3n2m&5v)V$4OKHKO{5^)Z^Z_rb1w(2ABr-T;sD>God*sd(P9NK) zD<0|odp@TZ8SKXLBiUv!`UF=)c%IDj^3jbEZ!aBczD#7%4 zQB#f#KwjASM4za9Go%TK6Vvj5seb|R&W}YOFg`PUuZe{pr^<@HK9AyF$cx9En@JaX zttaqhPi|SL`7)PA0W!z@1rpvbH=Rp?rx~wqPktL=l-BNYRTmN(0!?fOYfx-`p!|1sx71t$}3yj5p=m(CZcAtfj-+{%S++HTZ)dLhe zsx5urWGWQ43@HwFj+x@xw^cKx5y~-Nk(v3u0?2gj zGU)o+{I}7WpBpf3{m%!YDz5rgO5nC_hj`J`gevwWwX=tgS$I%g{4xR~gp2>_TDyl5 z=BGN|<7T=8&9Q4TdCAcaL9?PGFaAUWd^f9DNlhW0px!}Fs^v%Idfry|U(Lt+;POv1 zqTyx)gXK`m4C=hnta6G^Q;ucMbKzU}=XytLU>a2*{_nv?32uV;EG^~l>EiF!#Chu_ zT_Q%=l+6qsv+jOt5F`bHRBJ&NjL(pmJ^zmw;76$lf}1Pzz+m{6tioPFc29M0GDWDZ%hHyLzLNfbUllcIUPcF)|QBNUNeF&4d=Y)t_1SJ z;PSHmgm|Cvu%9qrhA``Biyp3&$E`JyUeLt<7@skExUe;kF+P<>RAsj;+z}$yGz7|Qu>;#GwiH-n$md} zLgRTE(bZ8x3df-=gQ%NrDhxrmW1ltpZQF@4F-qv ztiHi4advgQcWqHI6TC;M6QrS!sIsaJogw#qo4Zp5H%7^UTUShOGznK#*Qa^E6_hoG z9yfFh1WxyCL}d&MKaH6lEe3-0i;*KTbAn5S4Eg~Cz9OYE!eSzA(}v=+nP2dA-L?!J zDli6M?eX*r+G^OR0)fgFb@H#lL(AI_aL8PB_C+n)x3X+3^Oe(?!5%(+taeMM7-`1P zWn*3~DYpOA-pY{qQg{+RC!Cu}t*HOeLl`+7zh-zv<{;3_4SWDrNol{dVBBl@z0m9K znV_cTNAX@Vv1mm@5y2YBULOMHN(wT3-WN>Gtmr0{dH#K`Hrs5C7Hy}aUnn`)GUsmC}2 z-Uj`@>Xed{d$R)lyTN8$l6X#g`U>|lgb{K)+jDv)A+b8bc=ZZm8X<+RAjtlg>tw{F zmsC?MI}dXTMB|a>-W{5*5KT$OSNGS`HD_+9|G*oCm93HfJi3l~O8CC|qcvHFCX)G> z58Wmox zp!n3ajB`6=&&@yk-(v26`gUfMs^fqBQGhv0K$-i!>wVDCz$RYl+~ZJJ&kTAzEB4Q6 z*-`lSj2md)KklFl^(P$+&Gl{a&qL5Hn)zC=m^L*7^O6T4`-ybWm}6B!neBCFW{ngwB0V_)(v7BFJljf_-67X_HaLG zJ>SyaugeJQ2@QNTx!PETeiq4o_Ql})wzaEpWAPO6$!(m`2w^=J9eaoOcP`t#TnWFX zDT}xcJ4t)z0M3F8>`X8&=#}IK`QJ*5EM=s<@UvJom4ukWDtTsSs5f&3+sD%QKkZqn zzc;rpFezBjXQANKu=b?^{h(JQVZvA6XnQ}u}cWfpt z?;2zUqE3<~k9L{efcDq@66GSpaHoUa_(Gnum0@t}_4%XTS@7GJ%gzHts%b{z+CZ=L^S+KRdKWg_cNH2is<0RRZD4FY z)f7|fZRe;@w?SsTcy#ot3q8#HEgM{t3TtH?X~`*cT=kP11DbdNudJCTv|JASFE;e-JRo^K4c_SVgPFAC;gJK;;$-s7oKwa?b(xeVh+1F;$D-cXKa4 zJu}?bkWQIBg$q-9#!qsoW8awWw_n+cFJ#QipmD_7?LG*0xmH^rw?(-3+7VS?hGSrj=shF@TsWLc9t97`to^mk~Lagj`R zXq}TltjiNTNqO{I$Rhjjo;<8?1a5$i(u*_g16y`3PilN^=?EQvQ;vg_^(kflF2?va zZd`}A>z&dOqi5OwgK!A7+g7HW2KBJ9zg^0JX|-a|8?&gy7}1AaO!OWXQxSM^W&Hpg z@n@_;OxFtS{<(2RsXCf-T74ORrutfpdrWTCAEMVXH>@i#7c)|i{N(_4Ia`O-Fn|sW zB-`>n>a+PLf0hjAh^DlAK$H>5dUjA#&b$a$4fA7@Z)D6jc-3T5g9O&DIDPiV+$Vu* z)LCV$|K&)xh0o)p^)n0T^JajYp86WdyQ;>K_TZ)3gV0&X)$R>o-DFmxLN_epcG9F_i~J6zgYv<=k>*+IJ;;sSy)CGs9kEL3~;OcXyNUH8U&*s06%OG zFK{Ux)eH7l)>#;a>OsX-it`MHe{p`xM|_(c7lV5JAL-NV?+-M%MN;rnUikLzLNnfx z8P}e7A8@soH!vm34*HQMg%u<=xrU>|&Vv6_Y6WQ~@`n^V6I?nH{s`2h&S*MvS@qwC zydoVkqx(2#d#t-lR>1?tE3W5s-0#GEt>1n>y&Tl+zW>!?{R_W_ju7w?Md<-arv!K4 zzVMpo9Q5YK?WR1zmsmkhRXIjAcWL_~s72a!yj;nHe<~6w=XXVPwd0}7s`5pw|C0yv z+oww>VZ`co;=24wNP}dQIFtbL$~yks)RWXW9r>SMjc~hMc2wt*Wt_3qX*i!ZXUy!Y zSRZ-P^v83acX5|ptU)F@gfgM`0~^3;D2_}kF}-8sgtrBGwRgHimiw$Efn+N}3B&bM zi;LB&A0#-wS`&JbS@JsHoiLLGozsANm4r1R=h9!VNQJga26(N=O?Pa3`kRZI*jPE7 zL>5YTX?nnK9oH0<-cm7_k@PeDPqDqz@Bv!TR{J5Qy)o1r<`Bg{y=($J)7+3kk<@F@ zr`r#|!=Z|5QA#gQu18KrPcUZf%Bnw?5OJcNp3he4gcd&rYN_XV1ILu}!k}%t-nwQUz@GC2)SJqWe{%1GtznR<*Bt83YU&C9eSXd$C)dqo&1ox@=ZP_h&8Vq)68YJx&DWv? z-MA&cY@}TaNQvy>p%M?$v*CvVK6uHlxv&jWkVv+ySd_VAn`3hYm=7O$)az#Hj#*yO zaq0ayZ3{W>l1M~d<$knP|n$(qQ-eX&xng3IhQn2MM~QwkWZ|ZJO1((5*O=*RVyJn z3TrX{z79t;J9H4z?f0<$C+_>?Cy(S85-=6sb?=o+(zhc>AR1MZ!1*ilo&40Phjy5g zZWlWPN@nv&k2QR`sD%WayXxyhwIk&_E3bgSZ>GUNEP4NQBKu6@aG&c7mb$}jq9+AG zaYm<}la!YAucyNdwnF|fVXLk73F5J&m!X3|S0AX5gBC)Cf4=pdCtYHG`v;=|c)64< z_i@QP(X?WIRF6rXN@W?P{fKHmilBwzAO0m;R!nI=3pE%FsMv zK!LlC`P5zYWsO9p!pWuzgY&8WrNWQJWcv`(5OLH)lk_xH#hxK~f z%82&4h3jc$-=}?Z&)KMVgARF74ww85oew0YnW7r!cP-$o(~U9Ezm$0YyQ-otk6YjU z#=eIx;TOiigN7Xmxw~+!l0lzzzqT9>4RY^8NJ_ILQ|0pDs2Hojv4E2H^O5hou*OK7 zBT|a7X0)JlO|fF8Q9?LYkmqUFq*)5tKI|Xq<4+ipzo20dvjv?d8+_Sq+`?}$ZIVAICb7Y6DlC6U9?Ec@Ix3cuo6J^s9~KONkpr2&N4>nDItShbn2W=b-m`Q}==KsapOu3O zTj&EZUM3G~Fj?d4k**fxJ$U~#phKD4TZ)6X&E9PjO|6kk=0UjN*F0>IRHEkqh^PY` z%i;X{71pfcM}dD`dHV4CdsG&SC%&4l8L<15|9hg~srO*ot0nZKe_Zy1LdGM%9stax zXf|0?II%3S$i2ge%If{lNtKTs#D}wQsOM2j66KrvNiWc zpLfgM(}etObi3Z@d>3Hk>cS>~p5mMAzHbk}jW*0aww)7*ERrl+r) zl`*_I`2*6p3;%YHHwe27yWiDkgo~fYxsP5R7Zi1w%f8)r3lzg8=t}wSDz6)dem{Dx zX3~To{`zGDD%|;w#5tfPO?A^lf&{Vj+%- z0emZ33?~F#U$*bV7=D@LC;O~MaDNm6B>n%?f83Vowo;B5D|-UxK_h4>Y!nQ^N1#Tt3Z)4ja#eFTx?~<%gwP=j=^D~;K+q=(O;Zz*+(u-`-FR;fxk;BM+VS0-eo)gOC z@t~~RhdR|tTzY=&^Sz_tlBT-T=P^YVGZmPVADAq;j2qIu(5>@@_p{ zzGe#x-aIjLq<|Q2i4I`>5)(9ucDDMpovU2ZB$cp zUJI|eDVLKw)hiA7okof`um(P}2_8p%$Lf+C&BVJcGNtm(-}Sm2tSR-2kqwAPyz~ZO zo{W-E`}<=!l;_`J{SG$DRD;K8IsV*6{~IhhQ07JH=kj$fre0V#O~Wna>Dua~4qy!VncW zlGNr;`rJG#F)WnjgKIq>*eYT9#=*An6<0U&nSc0}|J(h)q0D-!n5nrQG>4!TL7{J)oUKjZ|UmQMM4 z3J&W1Aj*;y(i)jzx}Br(A);U6+79nmN_6;Cx6DlBn$EU_QC81G)A?Rl@VEDzGV!77 z&@yBhuqpQ5>MmXNQH#gXxuZbW{mV3wkQO2@m0{4&GrlP`S^@AK=@ia(MfL_8`ykUR z5N{BwC%q=Ax`tVRWz4SAP4G(ftH8yH;8)_;Uk#iGlTOu#NrjfNp+3oGPt`}NF&S?; zRjCTfK-UlH%d=%j4wDw_XZE`(*^V3kk?MbL3Sq3{3X`TkQd$j-Qd*K)x6}ClIlwt{ z@VR<$nND*M>(;sQx?QG%3IhFc(<~J%MSWAcF^u<__ogaNegHCMqR!F z_ov#A%*Gbt6Gy)>+6|zax8Fz;->qlrwYPHee3G+d(?$A@%Aw9WhqB$U;f>%5TXKeF zYSiDIwW=N=Z>g+(NpAF`M`F>w7Nu$+BIlwDX|}k*Jb!Op94r(6J4EW`helf$n!a*c z|^kaoX-E}!ubBS#u$hDBwDbf+_kQ{<} z#>bRAfvNiGTr5~Yf4v>(Qq_wFH&p|p)v*$s z-rvF`-Q9?i-G3f+bdPIfO*c8_*jUpSpQwAu2%LXj-|leR{#4ZYWm56DTf6@aQ*NF~ zh&9xA6?ICEnQKO}Z0z3J6@rpNlu`$&oHyW0>$pd^QuHym=kz0^bSI~9Ve)Zy4f<@Iij`&b<-(y<-EI!G;64b6{*vWa( zu(sKb>2gi|7AlN8d~{=%W_yy1&^olEXo6AT+nLW$Xk&g_Ok^FoRO z={PqgUifl%@U*8{mC1W#E~{y-$jqN+n&HGRKj@<~jUSF$@K;n`7HoMI0oMKJFIeqxp}4;)$B;Sst+F9YpI{6VJH*tdS!jpo%ws+&m9Ff)^Yi@BaT@eM5j#pUYGT@l<0SQ*h_G; z%h>35MEp49kq;<%1r)hW8Q(Po)8Au-Tsly9eI31U!zf#OowBzU^dp@d{Bo*B*_@U_ zPBc}hAeD;fInMjN8j=@i@VhpGGgwaCY^o)W!tth(&Xd zKvG5%`}gY7kS6qAo9_Wyq>jrKqVck!Knijsj!cTYcc^}&4pw_qn*bC{7PcM9V_y49xBOQL0?A#x zL&`l*z{lWkv0Zah)|&;)+)IAj-}|OAm)Hlj@c@3G?2PRxVPR5}xckPd*!h%9%dbVoujDNh8bn6ZEXJ(9Il19hOyeUU?q!NZU7i>B>OOm- zfk&m}ucYtZA*DW5LG#C^9@AQ$$pWk8Lfu~aiKeZIcXUmIHjqpio+SRpGvIf?+74s0 z9r+bB`uTZUne9XLJQ3q>vyh49h9;>Gw&r17is!o~LF;~78boQz(uV@(iDGoNZGax` zH~g0W$V$O9>ef?E zP@$DNV=lVpdb{~!MptHVd@v)|%y$*be?8fI{wYH(GhdoTm>8xe+%Q^?Ze18(2=2_4 zKeWmE92_SM=>ZJvSqwe2{FqFwgFl)XmRl?{_tV_!1oLW0(36FKB{tqKMu2 z@jjlV+*EasaClux<)L6ZDUzW2F*+eIb8eW`bLma!6=3IjaygH!9Odcd)t-SX={NeM zcgphgv|t~B^SY_|e-GI3_eJnxW9LS}qUqqNd&z9Y&*e=LE(1OAC6hwJ161;Iw})XzBx$&O8_4F>i4k5XSTXCw~U@QRa~Fz!3zRKFmRa7^75Wu zt4m{I@BwIJ-*~ogU+!-Iu*fO_Irnpuxedts`O@UE1r>G(T0#s^-RaW5xt(N!F_YwV zqEsPyH8txxM4N{U4~~s0avvPpUmrXg)#|dZ?@W|?$EL9^XZKrQjtsEn)z$W`qkMw z{4w{o5%vN8H=WbQ-W{jBmTLevn!Dz?`J{-LKR72b8&1HRlY@b)1+%uB zOE-XsY>>aXBkLS7CBkMot=<&e7hK6w)2WL|B&MISC_FenCU+RvJ_;CjdkKLgSf=RI z@Jyof#hYLUrT)6ngAMJh8avc)hQI{<#}NK*yrdS z`;*y``CIiF*Sw&lr}5>0lLa_CJ@gpi7g0o|kG|B`d-1 zTG7|TOZ=*h+`3%WtUph|vX4uD6KMI_GDPirG#@CRPLcF`kVoUR4TA#D`vVoC)kyzw zde01;Uuq+rUA#o|xwY^}f!0>kZW)^&~kS1_`Wg4m{1D`AQk zGg~&SM#WPr@;EWHU3=RK9gi}{4z<*v#%vm>KlZ0sxIfV*%*ovrjNHyPSfj&A?U%+tfpuIJ8{lCNghY-Z?S`P zeY>|W38lL6N}feVtk5>q1i#8&{~?0RUKgufh(s(ZoWc69$Q~|PPi)JF@I0*3QJQNS zHD#z+F=pn)?l9f(OMBzXEK*;b!Yj?5Xilj+24erTTpeof_s-1M2RZKvy}oC>Jom&? z8{h5`#r9k%yDlqM5+~}K8GuPom_uc5?5B-{rAJ$XND>PZ!hNr`+cOe5%5}0Z9J!7s zHN`o1C!2;guJc>??yVp*QtvF`iA?*5-YSl)ljLt#GWETk4srfal$=TnxvMs!C#lsY z>}@sI4M(LW?bfUwW(d|j=nPWruhqH|<9^_nqOZbY%s;k~h8>n=1S5Z|cGT5&d$7wM zBJXs0nLE<0qZiqJ3HJ@=`1VllMj}E&cE}c!P6@5Z9n!riCctf5AL@4J6PLFYQe_&; z;rxO?^z+avA02Ph`~61?ddfZ?#P24Di;mr|JoX`i$+W)I}FChOn3bKSLIH!(F}x?JBkSt z6{L)mP)*FMg=n3LmnAT~L8))3EYs-bj#a)wXDt1=mu7Fg%ZP+grcq+hW~)WfMIEeg zx8?6kFVw651;0O%`;e;0F(MR+2*M0X`to<+jc3Iv#`2?yrlx}g=`tuva1Z5r_}4YD z#)%qwon~73bE&mom;JN}K(b@)F6%>adJTM8TKqjH8BsLuOZ;k#%x*yxu+X5gx3jM5 z@ElKRG72pP(DCS&$=!Zp!S2EgDC(2)5v29b1E|GG_1^DQ4 zIjQeQpzxu6_A))3uKOmrC}*}l>oH^}UK4||n-F2E(6AA=u@Od=Z#v9+s&oAFh5!AT zDec>xU7@C^$d@_}<#ZSMw(G7Zf|~zf_UFe#hu~KwzBvxTL0F zthGEISs8zxY*bM$4@C|au&X;xF{TjBd37F8_hRlD3_bj?p;FW>JK{b@nAd@N)J@Ku z?1cap)pH0gk90A6KsL=aO-e8@1eMkhjj z?mBv8eQ+dYJ9OI@w=GyO;B_r1^U8k;?%qGNx`F&Y&iR)<@X%~0Fk@$+@QCU2FwSS^ zl{n_b(3mEqAuWL1A#6~cg3Fy)19xq$t9KbdBwQbYsaVubFoOynmZ~MI}#W0El?y==d2R08fhRUn2O%A@$NX|bBiit zLY;}eERIdriR~g9ZonC746qT;MWdI#px=UwYRu~daNG&X zz5&+Naf{=K%|xD}{u)N?EbKg4LfgYOe`X^W$pv z+xOV-?BKa`amuC^N?xA)jSA#qs zSRA&Mx%tI(%Qa#CUsm7kslxdc%%kV~M#A*g2}Yek5>4f9++wdKc*8S8L`NnL=hJ4) z3*(Pt&$E^yDJ>sfTiO4myWFZ&))x%m7hz+65_l_8zjjSJ2qdcO0)l8BOP!Anp!4KH zM0>M?agQ{>yV3)>OFx;+gPW9UNpE1B|A&cWg>BpGw?skrmJmeXj-=ij>;=VUoBGmf zk?pXlwdBa|`cec5nRkBxl-OCJ&cVm=;j<1~yd=c`twrF1UU-34Q z9Fe|k9GD)dzoZPb=d&-OSkl{N=+BzvXgZ-s{Pp#awi!bRvQ6jz7#6`K*~k3o2QHCq z0W^?-`45NR}+7Rf9&lyD3H;EicFq zqPPEI8pr(vx9!_QN_Fn{?QHIuS6EVXhaS)`8S$=h0+ObT)D(~( z*0rO3M<{&u4!-nHjyxs8cu97q`!N~r8UmIY88S@lYT%BZdYQbzXu>6No{QEy_)mjx zq;(l~c)dKvR%JXlb?yJ6d9-QF1Alf^X z2bFcQ`;@5>zWLKeCi5DW0bKWuL78;Dj%){z+g$Wz;5VD*#<%)8{pv5IRlkz~b*9EH z$G%@%+8K<+8RfUxU6OZz2PcwK`UhTrD<2wDADQjxVpg{i27W zMS_fMpO98o2~ynysXkB^w>a^}$)#_9rP7XRTjjerYgu09xD>4G(#)AX&Y>Rg<1Vsp z4&cS{zVrk1-1Rh8UF1lt?biNg}R!cqCEox6=F`Wq@*CK=U;o}yOyQ?j>!Dt+GX7m$+y%p{~ z90qfy_ft8-C;WX*tQ2(#qD&m{79hdg5Y` z`RX3>lz(BS!Xa|9S69HhJ26j$%p-sP<5_u#H;{n0S%GPGkLsV+#5C@@q%Q07Y1SRe zw#tG5^MOG+OWPLD`DN1``xhnfvo!eGk|IGuYm>lO+>)o3X>-sK|p9u3&abj+uv}xZpwW5j$j#T9n57R)?%M)Lc-fThAR9=D)X!TTeXIZo5uTZTbKfbMs^pQ(+&4W=oWgjFaCKi!nSw3n0wt!W;{}Lf(QSWIJVs+e+@z_ie%VA3&0t*25#{xU`JQ*`^*2U0pBT?9_-;dd0@M(7g5Ex?F!#d(ICd z%2`Zh8O9h*oZj8=ZuQS(8Z@A$E`!m@uCk44RAR_PM^$!F zZP^Mt>EVU5(J-f=lE=1tPWk{lVd&Tgom8x`?`p9zX8w37fa#+dA)hBrd3ZIGr{EP! zYK&cM6ebZlRl7Yb&mD)Q8IQwpQv+{?GD1guw6Hu#cLId}b#e?0hRUud{#`P?1Y#aV zWUW^z%G-DHbJhC;`B%~^%>;**djYRON$db8@=>ohlz-fEGZCG2I|e2Ui6G=`PK6>#yOMxW1s&X)Rc2= zK0|Zf&1^S=xDsOBuSs|fap_J16mdpy(q`^OzBbqkem z$yo=fgm62vDM}Kn+>zrdryNGCId7Co$}w_gl+5{T&YOyDj&mNH^Z7LA4LjIxkKe!h z^Yh0Z*LA(0ujlLhr}&UFn*nO2<6c4s=fM7XeaYJE@msBx{np@?5n4$0KlZnF-u?2l z5euP}Cs4*xBODZQI{}jHf=wB&lg9e8=l}LhaEw%1M9bVzzNcfe?>qeuLctYtvC@ZO z3`T7bWG{CZv6|WND2#_=%!6J3I@p^Uuj8Lx=X3^1E05K5G7rN)GANxJM?3BR&rFBl z>(1{5$^$?xx|tH^?XV*>-9V%^Je)QY_tnp~0}*>~++{zL;MZ+AcOS=FGE+mEQf+`g z6|pfgRZcTD6~o3mX*zzpn2{w4yo5yHx~R#TQk!a81nvKQ^?@nN5>ya4T;m2z9T>{{ zay(iE6q>{3q99MR{pDOfFKqvUdBxMCYRsENea7aGyYgj}0O8*R++^)3a=nVfo@1i6 zn>|$<0hUw>O@rb6XHTB_wPC)ty-tcdnYJ{p`WRXT=S9oc8PT;INxxYOqPDFnp$6H` z(cD<-Igo!FA9?dgD&mtY*1a-lQQ$9-c=QR{|9rdrh`*-pLg3>2AU}(5Tn+6pbV-IF z`HUcWZme;r{C3Qc8DDJi)7b<{MyBm}s0YLWgWWpzgjW2&f)wd%r6sV6?C`Y8x{8QZ z&JO!mc|z#3yHhW|qFisPop&HT6D>|9Z?G5KT~>qVOa~lEp3`i*z=gs7K#%jjE6Z9o zNsxC=3gs)yCAEgl+h6fpPWZtAZo|Oq7m6qKg73Ggc47c!QuF$m0k<@UPPQ*Hs;>XD;cf%E3x1HX*wISc zE#h^Ed&ZWiMwpIPW{)0K<8FG7X~bB{V#P0%qc380{I`z_&_AH!guO6t+0Lq!1&MOi zLVcDZ`1Ul(f>(pLaw1#jTM~8eu*5+N)W8TNHp~vct;2ce2S%?;UU37z6s-uOAH6{I znr7;7sW?P90=N(pg-!`g46obJmpv1Q3I2>p@(aAaT?+tS6v8Mh-s-Z{p&vR_DyeEZjZIW!W7u>yx;oBm-Ui&2=a54dOzj2VeLF*vTnY@ImgZL zp?-gdwRj$~jXZ4hjE__clS?SG0!eBl5HL8?> zVsU@wpH85>k51U0p>|Oe1T<}+e_>a1E1)suK?Rd zvk*wB^^<+95-f$y*_lFGze(zFIX07d@63l;=`+|y;pN2~Ii~_5X0&o&;Ixxyaj@cM zO186StEN^y0B4lVkCt&By*t9B+Bsw<38(oRI)=f6M*ob4?u#I?cQ2RRD^NJmthyW# zYuO5#+T$G!EVpZltyM<%X1*7EwC)W!FNnd{yt1{t*XYHgIf}Spv{)K8T>t(DidcT} zRoFto89F75?coOuvQkry_Ym_EpFZ}T@H|GB*G>P;aOcHw;p6xZu{2Y7ClCBBeWri# z8nInpe{V%l>$BTLYKk-|Q;yw#V@;>%d2jAoFGj%)UZ0v5myKS^R}QcIrE==kOh_ly zt)(@cxNRra+)%S{s>nUys77>^N7rx)lGB~e1DjX89iJiAtzUB7wr?|5TrhAXtO1wN zptXU0^+3?ZC#clFVu3#vjMIqA0d5|I?m$a7g7hIJf76qAxyx_1-wPt0sO|0s9yrm* zp+iPu4VScSkUFmL+~~*{{jk1=6WT4ko{vUiDRpqql3oqKXck`N#jV{3oyYZ6yHhIV zof&+AIrcJV1eyv%l*5s$X3hqQZpfwRa&t1@9*f-IFUNj;$r<;^;DNy##eb{+RrIuD2cBrhRCSl|eB1eMVL1*Sl{;GyC zTsRW0Q$uz~WEP8Rf(@Rd1Z00W+MWT0;fwj{_ONJ#8}zU(D0{aEf6l7|iI;yNn_5m{ ze2IxGS4b6z+1H3K@0#gqD@S6x*HlJjZLN%#tC&3?=0T*a)}<&F-@g?LA1Cn-ahN}} zYpU>%_laF`4I?WOHwDm+My7;tr8_g!46|-o8R-x|`)#w>lCnRx-luo|VT`_y&VcFv zhP=YWI{f|FGBSKQ)`#cl)cHcE2eWfKZW+M)LL-jXmM(T(bm$&ir`#|Nk2J>pT|^-f9@$Kx)&_ymg;8Qq#jut51Dzbs)t{fD`KO^? z3=e@DVO63?Pu40=`p}w_L7Q4OgXHj_N3a!blEDE7BvV@6)}wJ z!={8q&#-tCNFVFp4a55KHY&TGQ$%4AK?aQ`PZTIJ$#)fW?~io} zQga8vGFW+!0s->#2smWump<&SRSV$H9Nw-?bCeZ(rTJYr#R{dbNa@x6m6WsZd~_&pYb z%S0$Tn(OfBk-*EIgTkHEyhnB~Ldd5Aq3#inbg13LScRzlgF*k>OOgrO_vlTr?ZDqs zJ_&Qxo7(TH>T;Cf#tefP-epuB_T5jZqgvUjrrx~k5v#wqbUEM#?3%MiOYQ4hoY4;!BR*y($CPHSIlx?A72e+ZSSbViUzs z?g1SmD-#%P<_j;`S5iuZ^eH1pg=Fil=H5H#4Gj(CcDs%V*|hm*%E9D8yE25SAuzsN zoUEYE6lrPKu>SeapX9Z?ZCUtHe$<+HbPr+iV$<)@J`GSeXzjoj-o{W)JVDBV!||XS z^$BB$d9Xij-mmnJ8aWmuXS*}-N(*!_Ow-!YSc*}*9DPXfk0~E+vx{Fkui%Xxib$ZY znY<`L2>t!BmxUVRcFDv4gx2&Po|nUPY;f zwVD^A4%6M*v~(_R#Mj9$umIVLVpozE&A@PPKtSwekHQD1E6ANhmhw>%^r+M~+S@T# zb+@a>@s$x9ub%RZbN2UuQ8jQ&W@uB^5#!6>ydJ+jlU{LfCQ+gXEQeydTMOAQoj2>& ziNDQ(!Jm*g;oC3iX)51q?Jgj8|Ht%f2>iwieGcUA`iZBPnMredZuXSmGHT5Nh?Ud1VB{Mm~DhE;Q(ja(z@9V zC0`x-r6d=dq-kS~mJ51mFyai%%^bN1svJTIAGJsfM{Vq%N~eA>@Fzsd9vWmH?JTR8 z`N2A;zNnL~50|T*?WeoFQw|{xCYD!loSoJ(^`_kUt5i6~sBE%vr@ZXVtBR#gxx(I| zOQX>);Hx5grp_F6ez4sJ`&X>KwQMW0@ zcJ`14z!Zk~tnKl0zuc2&HBvx=LQV!)+2hv%KA4Jyw>F3fB;C@fBLvQ?q~4D{-=J->-zogz8{ zkVsN0yEQmxyLyClSSyK$vr8M*+}BKiBFbc!7hE`J)4P2ca@NV3H}oK%aG$hs=g6)x za&r-QpHz}>)K?+syZIES8`!hRV$pZUaVcrwu1G_C}{-nVpiI|CrWT(Fbx29jhp)AA{K#n#= za{2NY!3a;vnhW8hdzIUjkhAv+zt=8}4B|!(bnxdca%@pRK-j^E7Slhr!A%RgOYu>G zMRT@i+zRHU;s_LfI8`5i$@|y_@Q;=j0J|lydK0^*h8<3O}wk@nwqc@jGryH6$FW>Id1Lk>a{K9^qO~L3-?4=O{QY%KUeGK9|(oR zDs$OCRhZS)m+fU#tKkDYp#g)+V!?#}{BW|edl?*EyY|DCO&3}g#-c;UW~L4W+g!hl zIs&5o{$yme1NEP!=!o1%Ta`)x%!N?eW6Gl4y8TyvgsKVt#pnZp>3ri__{{T%7c?!}HJ*SH7Eo;YEE6)$gaOZ^*qFza;d zMJRJ*nyXDuq+ELWsMQ`hCniqR--#ML(K#M;RB8UWiKLCw%x_e8BfBeh=SI_SlpFfA z^p?~1nyoxzYmO6itdQH)KGK~f0^h8U{x_8#4!As*rw>=lZoR;bshY@K6xD;a{v=9W zX7^s?J~Bk6I+(3Qe>HeZR><~RM%G^9M>#k-MCypK7KI6;o5SH2c1*r(Yr+#^qV&Aj zhcgwzE=W%2)Ir@*y`cNHp^NZ;W7ov~Sg^<^$bzYWia6|4l|nvnd+{3BECcm@$n;Q2 zI0-<0WrPf{W>N*4{YSe)O2_&}{d2xquPP52=W&vLkZC!S!8U>EA4>p z$gB0gr$w)wVLe`Xh(zlU&tYE$_6&BK2`;p&`o6x$^xu#+OM(dyLZ(W=*T@4qCa+m% zAaDa=oTY00G&TK=$g8r~Ow)9_?RIiG9QQ_cf3b2+^*_DFsH;A*ttrFiBt$g2yJCJN z5;5BxNS@4Qy_oVp!%l!Tt!h})-9PFq9N&EWXj$YUB|1Q~Y~V)7DspH1!WG%)<*;k! z(&Y;gOu)l#N2cPExFrDzGSs6hnIW#z+9&4an3i1zpDrGi5m`K8B&1UZtpIrY69#>m zwmO-P?EcQUDu?u)rUJ+EvQaV9_qduLQ-D6Sl3J27$7f;|xMU_b_s1L2;=A;3zNQ-( zumn7n*$};b!JT8J{1QGbF=ymO8++eB;b|tjHH0_1`8y`XA|na7P3I1X@TtJS3QJu1 zi>#gX{fnRbp-M7o;?eGF8fVVJq5^e*$P- zBWI6Vv9oTc16@DLG9g{Ck&$A`BR30$+ij>gv;k5)*VRN(n(mOaCmA>HzC zjUf2E+3er-0KcCqm@vtlFYBmWJDj2hTDXYUpK|!60wz3DxCr2sR2O~|hK|anr_Ehn zO6P$R6@l^Mm5SmfW;dH=ln6XBllNj;LnAATa0+xsZt29_EF0pfLDjmau^$9j7b^^Pbd! z0wpoJ7+Y2IE}WHE$`I|<@%J`j8}H!G(=CsN6!3}m+2ak=nLS@f<^%C3Ql6q!9xWqW z-HGs9j+fD9N@uuLut@2zNe}G{;3GDNM_fZsd1*MP&MMR!aSzE^onleK^s~-CpSyRg zw8&hBTEw&Dbb*elqja9Y`=J5-JBTLAbt0Oh@;swLi&+rK*td;X7nXH0A> z_69o~y?QADzJCdNWq+JE?iMkwHKY26O^XM2dMQ`t| z-R;DZE~-8RUutYmzT8*ae1AyY5F)gi1wVz#cE}Von3^bs7afR`$eW+1Fl{&VLT@|z zcNec&t~O-%c}{B8fb0QZBMDbjP90h*BV;M!f07e6^{pt^M6x|BuhsYRuZkn}w@w%Y zR&CdR_k(<73>ow%ZnPDKblrD0-)Ygb;&8W|u$^y5xLOgB=!MLmDe;wDsqVv5E)3^e zmHQv5#3LTO>H{EDA!*LdD+;qV*Y@45)=<{g>89CoqCa^Vy7NbM8M->C0J||bbqMrj zWPQLsrnm8Xevq28bNcjwp-!@+iknSZbq0ScIi(A?$ZCj&@db@s@sXMtjZSRjVoouE z#1tvh*J|LAG(?UI+H5~L>#>UO#yqaNyv1B{Rh45$c(lS9dN1Qdv-H1f&;aDn!sd>I zUz-}ec&w_qQ++n!rNGH%0knen)wnpZ$EW5%7MkN2!q4x^W`)27Q$qfS{%wT8tdV2E zC>P(3z+AsEf54PqefINT>y=-T<(!81X$o#OCzcaNQVSx{fa}@;lO=mb=Z*6^+&0E! zCUb0NKl#sfeN>0)K~2hf!5oE^I9aj7omWu7(OU*k*kGNue*6 z=2jD04=f~wzULjcNC|T`8}GA_y#a?9JaJ@KERY^HIJVmdkyX(h*eHzg3$%~V-VcOC zXosg@Ojyh?{LewlgthRx)Yr$rxjRSc!5J#S14hf^b>H%(XqJ(ORj~)=vF<_BB@Z&3q z0Mtgq+jV0TDE=#XpfZspU(jw29h&mCSPa#Z}^p> zdo=@M$u2?RAA4LaE#nN=JwntPuWI5_SRryJnAW%?fz5Uum|L{8CoZTngR!`{1ud<* zgN@2CJs+|ACQaiv_&#~Y(7N!38Rj7^_%pUeLwr#o#cB^yXs!^K*eFW)U+p;vZp@00ZUuFD%B_}Rb7StJiwFcXJdfo>)#&T)ZETWOftQP_4%5vH1)n z8+Fx)iE@(8qjpbunIAQIEJGff5A_IH?irAZUAcVGczn*^|ERkO9yBw&J-x@KU_=Ep zwBIvITNm-)Tbr6!1TTgwd;@zh<#wyjYLXKpEM%dFh5FS(XMduo=WVN>(;h?5O1!2I zcG{rXCPI}TQ^V%xV=feh4R1&;Z$%dtLhdid_{+RWZ;;V*W-VLyXe2xKbd%C4-ZpWg zIi=L4pswu&*=LJJfW@{(biYR;xqReCn_jV{@U#kiI290X-=WZ}&5%?{K=X|$-Dlr+ z{T#GB^>0BYfw|&LO`Z~0cNt38&$$)^spTDBJ34CaYMiA1+OW#2vAY5P2Q0h& z<+B6Yfa8)uG2(cdFW{t52Wg2bfMB3_;upmhmw@a0ix{;ll|lySTo>)Q6N41u@X?)-i4<~f1D1@oxfxyDtq-9{oZP=Y5WzqJkw24BzqpD zzb$RnX(`aFyIiR`D(eG%;ulx9H)sN|iw}PDwJ!g7S}hNh2Y$#&PC*=8jov)^B|@kq zU+%)xdmAb~l+OX3Jpq$T_uam!+dG3Dcf4b#{5YG{SsBOf!}M-hLWGU$9+HBQ|feCbDM-brJ1O#NQ* zFQk}t_%D;=y`U30Q-E6d9hHO587)=o@$bOGg|Bs(8NBtG2s>1WzG8#BBN+OgPGZwLIwN^ED60J0Xbmh!SbPp7%*+a->={+tqU; z*U?ARQ6rzV$&8f!>z;+rCS@Ii+1-==SB|oRS{DNz*ZB$IwIKo9g{xjSwu z-{C6)1dpdhM4!sulXLpjQYGrXS+8ytOR+jC;q_|rR@Oh{hiZl`htoR~f!qJZJ+SFD zd%xRfm(v^V)9mF5`*R+sgEqkQ2x}h>4G&qi>;&EV-x%>gp)vV0yxo~|%eN=7Bbv`3tz@J-nq{S83t;_Jakmr^`|j8QChq2i0dKzBYjffbKZ6d z>|#u;4pZ!`uG`tj;s$Xot)81}E`q(IQPExY-JxS%_9^mJWMv+}x{$Akm)>$8-?LG*h_}iVPZy2e-BLY{i5$h1t(=Y@w*laPi#?!_J zDLzOTbzPv)K)3LAcHCO=`~Ev;pkrD;GBO%mEE`(1kG=)mkNnXtqw*mA^pm#F#! zh;ibt=&GF-IvF@EffgwTum^-?`ba18^z9NbhMXEAAY3b;>rgEC#gry=+0*-^<3v>F z03D;roo9@d3Og;T`WZ4B`fOjs>_a^k6 zsF`AfCLI|bm6QgPn&0n|X9_Ke7$;df$Or#FN8%*g*p{l{gKEWm{b%r4JG?e(DX|FIGsWv;5!m`*f6TJ4|+zOf}Nz3zyL z5O_=MdyjKimypt*?*U2069w9-p%%(FnLL#BP3@&)r1tx=f%JC^9}w94`}IxtXLqe{ z_Agy5QN_Z45*)8`D?vvX_4J6}hCz?F+c0A$9Pv2xa=2_9s0|yb+ z3%PR=W-^4q_e`Pe3-_?cy25UxD-fl=nGF@1Yz}r09GJ&M3-$Slk|pwYs+0kyfzSr0 zw=7;Y<;nVkM?kMkr`60_-P@?w6t2NP`jja!6xTizioDwlN8Uk6aV6XqvBVqIs4&gB!WDEz7&w zNmo|Mp%h#62ndbX(=jz598A0ZCB7_|nKkWFIgz=EM&v`EwSsRhJ@M(C`-uV)d zg%?colIk*btlw>P;_eOWMc%y$PU5jju=@%4JTRyVkbgmz?MjjjJ2ze$?a21GGi-W&AH~HuX_UA zr4jCAq(?_TDK9Cy;mSO({{2H%4v8)}PF_xJcgyxJ)>|Te{3XW7B4j>;*Ojjp0FsuJ zU1rzqkdILg-?mtno(e2yW7tD$?~i(wk|+a`&&f9g{!+B^DQy}Rb8d=Namc*T>~H^J z>gu$HMji%!R7WCS;I9yebnwPFonW87?f=}Cia3j|HJ(2LJ&J`9(`MAK8+ywMd(Zjj zpVE1KB}J-Mh!0Zo@&m@6@veLCN(jFldSJHmgNARrXEV&vQzrSe%D?j}i%5CFtFv-( zD%!V8TK%d&GIVQn{4f{2h|OkVwj0oQre4Isw2lEiU-?Zz|Dkf>jXenS*BZG|Zw=fD z{Bg@$Q_7HWf3^1%11CZoj$8Bh)=!Z}nBh_ku5PdhUlfiRhsGj$;>M1zVI9S*olEc| z-({)$wd|R(3)a*uWPLLhzPf=*{<^3oRG-`Jsp*&>yFj9#P6EFLRX0G!l%EONMSpP( z-A&5Z(bsw*Qh%yPO!!x(PH}oF|6&YpfcI&WdqbT-+L>aX(K&F=6zEQQ)Q?U6`{BvE zzexLiBo%NuBiwULb^9<0P|==zada^?Tp!)xB=B2OAdvkkbI%mprgXn;Kv>$hro%Ij z<@Ga$!Us6@=2k1Z&Zw49Dw+-Z@u-00*h(=;(O52bv~#+SQsLGti1Z0NhbF*rd10O0 zGvguhL5Ochkv-|lV}XRtp;PlE0fwhfhIqbh$`_G>hvu?EW0AMrC`qhLMW!JThT~_O z-1J1w)pg(aKG)Ck4}$2ewqagxlt(weuahp-B6J*YXz3B^c7vC_gHm{5j5mSV_Ct?V zi#}yP-5CPO$XcBFI@d8u)XtX|=2$D0O6j-1Y@7eHu3J7^#gI~2l8Ex1Q!UjO7~IZa zeXC3bE*w4RD%>zIv@-bp{eem1U43y5LI=@`@;JE&8iHY9Ma3&9Y z?_1yg4U;ZT7H12%@u2!&&E8|#&P34*cWN{$1^$;a$v4y=sr6~+mP|GlP!d!5LG`2N zWlx@Y9(R2G{P)E2B6lXSMP*!zNA^q7ol{hgu~=$cp{zDw@n09*yJZC(ljq<{63S{1 z37}Gcf3&lK$pWwYyn$sBzGCibcB`m7aFGp(XO|-*k*tu|`ZHWSw8QiVLvfNsTyr3> z(qB_z!1t(uTkCl)3ke$()2AtuA)Ux2^x&a7Qit>_3qC)+n)6h}tWPjkZ zEwo|))tEW-o%=6ZygY%1RCZe1$k%UHM`Yn8TO$&lL@FItmyH9sZ%;qIOO-1rE;ChB z%ocmD#mU3i)+A62LITP0mtzDATJTQZvwc8vsCB6LmzjN}<+JikKxXU^7|2 zu|1M$*j8Lh(cR!5KmyzDmsKuC^^T;#vFB!7RtxeMGJy*8vY1Q#RrD6CnzHh61E4yjfqPx&7mRprH z?*u@>9P4G$o)<5|*mu(qs{F*aZ-rFsv7sA5VKZDMS}U#l$eK{LE4)?ZmE2P9A)gZ30M!nSNQIuPn#`8p zO^1czvWZu+P*=O%i4J2dR_Uwq%Ds?$PfR^;Pa-*Mtsd}})yriBE9UNt6M~E^kj-1Y zEuKY7IXEpC=F`!8->Un29}$e5T9?tYTDt?^_$Cp!8j*qgHQTBWXmq%3aF$x#R}-I@ z8l0-K+U{$V2!Un8uenF-uqVu1%2A7>z$^&j`;b+Y?l!(ZJc46h*g*cX(bW`o|kvpg)Tz9 zn1LP;O&WYvE+TiI;i?be)tR6h>Umy`?OQaCyY%Wybeg7uNaf<4#r7%ooe*bnv1yTY zE`J9-r?n(IzkSQe8Mq`mS?_blVDHd}TkX0;|0h;dJbGGY{q&n_mdZ#7`44a=IzafO zBiMOa6y)zNGBl=z7b^HtfAXw#ro39Lb7uaIJfbp13A)6}qVt4!^2L@y$^{R;Sc=Iv zxq6a)y?8fY=q~KDu7J1?P1QSm>pmLi!Ap^=L&3{m(U*k-;oEw_NS;fD{c%obfRfQ}hEa3boUV|!*t-s+7_ zUi)Kb-J#jpIqZdiONTL#rn-rcdi-g9{h7CQ6Q1|i$FGESV(aX*%3pm(?5v#M(x7Ly zo?E;Y*}RRkJ;ih&m89J=sH>$8Rn1++g%RU47YTtJ$aXeR7ut7I9azf98?xR%J1Rdg zb#wsY$UwVxSn@;s%>&jCUvMv}q<(>wEAqXF%doAX-FaY@+r-CN;&xu#Tvp(|6U`Ib zwj9_loM>1*$92%1c?oFo};?xd0wdlWAElP(tLAh zW~z`522SQMwffnkn6kO6Gi1l%Ma4bCwaBzv5Ug{XrV6C1aK++^5{$j?1aIgAdJ4NG z#zOEmdo4w7=Dkyo3R&{rgR^5Ii|NsGD z`%|SFtH0L^BQtZB3d@*Sd#zgsTeh;U#q8}a6zodv&NF4#JJ?ETnO5eP)9?GLs1VwY}1}MmDS#W(7C3hyAI+6uMlIl3b5$?LJIyzyyT# z;yY7|H;7or088~7Z(CxfI?boQWYau6^U#DoU?CGI$`|5& zVbo1|G$o$jSs_(+PCH<_n|Fx!t((4!=?cG^jDGMsPbhbxQ1iblj)*oAhvWHv+Ziog z9~0fXWJNZ@om*`$>E@SX*~L~f}HL!gN=Z^cNNwpMF#MQ)$fDXqO<%0 z@nuqyQ>qi8L(WKP^N>YV8Uch9B|M!{6%*+>YR2#Xk7%VA6yD-TjvhuA9}N(96IlYyVvyBJCv&4JtPtSL%cnQqlFWyzbo-)vwa2YH|Km2iP z-avMEAac2QO{8NuxJpAttE+tou-hrLJc&W#y+d8IY8^8cv=|-3hZlA}A(&;&otc(2 z(;OA;pPQjsM|Yc|Jr$91!e}>Xp0PwwXZ@Lxr4B1?prIbQy7zb6DtRQ+r;$nN)Kdvh z#;Ey>qS!&*+8u{=M?+cgj?l+8CG@dm4f&F1txZCcSFMH;Llb1LXN2*uR<)qn!F*%X zV;gik<#_Bplnlq7-wv>qPw~vy817i1`F#G&jovj{CeMlf%t*W*${;X#`vJZ?cQs+4 z2UvwnE+n%JYDzL#;jM}eAV1?O+VZBg$i));fe@nu;$j&p* znl}eE9W+fS&Hh(5;b`0x^V9CKLm8ik=Sl;v`9PN$lPNgrVNe$}e{bnI^`w5-Q*|{@ zNxu8Jd6*>klIc{v;9l+^L$@u-4K4Ac5Ly1?AL@4odTTxQZ<62>*Q&x+d8*7h zedK5oKN0UmGv+4k>$dd!x?5x0IR^e;o{Su2*egEs1><{z&~LrUvf~Dv2GtlE0`1j0 zOXvSL{w7O&QBWXzK-qWdt(HGgX*eP7z?@~*z~D$2jY0n&rpO{Y-ChM?5&FP0M&0(H zaUXUYyDgnNxwWHDPo@1#wv=>*bf-LcOCVls;Elzc9IHYGd`c-frmoD&NBenaC4m5D zE#6;7{rtW`sw^)D{T}2u z){%ifUDVj0pW5ctcRHTvxpr>U^zKm-zl#E`xr|Z6zb9R+mXmcmHk<^qqhtzv1|;dc zQ?+yaz*>!zDKN`(KyRe1beaEL=Vv^oSWQWQT3DhrK@zf$L3|6SNqQA`X*hEQ+KF<^ zQ_@$08+Pf^V1g*wr4v9&wa659l{)hOZ`WIGSJO2M#cZs}SxFCqu!t+p9io)OAi-#x zB(dJVYk&3cMQ0+Dna3%7q2HjlELs}pMGNc9JBdCcX+xAo+e=|RAxOPVfE>Q?G(k}T z^*}Gjf-;1}7_!Is0&n;(0wMF3*$hva3j@M=#Kc}5v5p9+@cf;{PedJoJy4i)ha2Zu z)!K=-HvZ7}D2ayAi~wK1_yx(}Nzbm|Svgl*&v7m>`i>r}cAWD$|J{&y#{dF7cTpdU zj=C8oaczG{O{{p(+Mk?fk)DN`zXz!fM4%B~QTMuhjzOhA$7U2u85US}sxH-sJH0oI zJ+Jtv-&ZtXRjEyDv`(m(UO4XPl`8n~zkAXdU!7H2>7aJ|D5ity!3Yos3?)!X7y>a2 zCyuWC=Jn>qpU!hboMd*a?^p@Sk z@jQa+69~DFkatSnEhyeclh#MeYJ;~$Je{P6?f^;wRUHcP3#PZ1ykE&vbuV$FbiMSd zQ>)#P>rn&V+4LV^jo;k3;E~Ohn-m1{zgl*#ONT`Z>l&lH5U5S7e8B=UAx~4N3xlKQ z?5n7p;>i!YC(D9Dd3JPgE$Bq#rvp0Pdrt%7r02QIyzEI5Noy0;Cg zpd^coyh=Ae&F=?45`@Zhz%X8VHM$h3H|nF)8?EGT1eKvapITZxhW}}E#mR1D*kZEm z?D5d3`j`0rirthK6DEcqYsa< zC7G32t-+RjDq39V#ki*S=S#oV!)+gScc{uf1g)exlgp-9{w*n zc7ziUTkD#W3_4{!rR(?-?tS-XY5n0Vg|N2Yv61PSqUDfjYW0c6m{dNUHS%b@YK-Kf)W9XTC;XBkR4MXgP=NFyCg=c^>B4&50!R&!ol zU>Qj{)7(h{4x4BRAb;#AC=3ioF7F2wQnuIF#V$WLr5zTL+@9IH@22u20 z3C&4tphlUCPm6IxK}Thf*BM+=So!fSgQJrs`Bujwp9)V_oiE%ycn!{i z%Z15w#aFj1uO;e29OB}2!^=1)UkcjQyv%9n(6@-!+p{#hGc^xA+aQ{)4ad8kaLrU$ zPc2{L-MJxJ2<7KtC>en!pM8Bh_8(+KVS0P;g2Ax?H1#G*ml0A%ufMaI*=$hyC`4dA zRo-2aRgCji=p9ZLQhJMnu&X=|BT5!Vp1d8=gGEmsyqd4}KKS;2Y{9@9!0ypY=pIw8 zbO@cQ0sCeg{Jxe`1{W-gJ8J&l8w;lN-{DAIB3JCnKk*|jvoKLCmR)0-Ch#18yhJEZ z=`mMSxuiug05z#BZ<6Wy=Gf0j4}pEvK7r0E?-w$#orsXqm4Hs<@(?ysfqC^3$g@R9 ztW`Dt7E?hUVa{#KlO%5YNq>$GTSczBW$v?faAd^jWStw@XE-r%buC5L*{&Dx$MSON z4IO4zay8^?E|zKarykTwFT{b3$j;GTgD09%qC-U+g&X~l22I=$=|UdM;LKV}!@2Cu z_LY6BvbtH|81_8K(SRMTw`4MM+;2TT88nsE8i1Do*1L33vy#nk^;Rpz&G@rg)|Dy0 zw@9LWd8grc*A1(lC@E4Qzm5Pq_d4DL^N*ma|C+i5E{~dF^3_^cxi@Ilcf3xcPu|H- zz0fm!>4Xc;Adm#wEhY*Tq_dOZtnFX6==L~F+AmHU3N7ukxIpurj%pkK?}Odk>48Vg zJ@f4JjLqj)eqJavyH(^EiF18xpGj0LqUtWSsk+LN$Ynde>e-JIU#+Jmo)^`r9>cWf zFh6J3NMqNZi?;m)59Jm#`RzZwxjL0P7ujAt$*b&Ns&~zI6}z(kF?r|5@(yOc)A4U1 z8q)s+q%rg%NAQ)*7o|VmtFtWo|48ZTRwZ4Shb5D39$>>(1Fp$@SL~Bf>8l^Ftq^|O z#>!gG*zdfX!yAaRo0N@=7#HqL<8`WEtB53)D;=_M2>_j13x0w+J$nL9*@=MDP7pp# z2iexM-6>zvSVJI9%fX?0R7+x8kwlZXce2_w%yi*v4b&OXl3#?cUk}r?f!BPm!vSc3 zX7=dtfSQ8@biNhVHj+Z0K&Sf9U}JP<+&`*2WMO)7(|TXaTj{NNUy8cp1>xqkGuf+$ zzR^SMx9n@575l_x_b_z_ba{*I2lc)tf<3Gx@CO+c7Vb;UncA3S{ULu&xX5QGY}KU4 zL%r3Ez$>7;B*tIsH1_JFCWfh#UQpiPr{^_y4^O!i{v`!R6YVAbj@p!KjDlKp87s{B zpB6d~q?hX>v-FKiL+OyF_kK(pk-!1q;nzizVQuzImI~ADt7CR(`C>tA;c6Acp?33* z76NX}jW{B-+?0?idj0ns=ifq?=JLkHk_`|nQ%$&wO>{;1#xXSklp|;F<+iP? zv*VgsR^G;J$Ds8EC(cK3%Un?%$E{@0I$s2G4xw)@2aElZq4n&}h)A~Pt8XxI)Qz|H zLlf)F59)`X3qfRi-!F^s0YV|-Qh* zb6vYW@Av2VdcGcyusg9)L;Ay-R6)-HjJAV|#ab+PeE@%v9xYK1n`)dDAn9srO5=&j1ju{(STjBndVzEmZew9I~u#9DK=>TXJt{ZKRM_ zzg-&rs~@wr^Pmv%DngsmPp|j<-SMa8PUF*u>y)<bJ)H=8YebF{KF~5i7o%bP|iBna@x{sJ>ouAvcTYGv3 z%hmL1d|k;;W#QPxKc#-Y6FPOhS_FK?qhpVxK2mNLasA)0Z&~+5T228)>;p)F&k)b~jL8n-6Z}x=YhT$sUuPmgKEliQ zoGMuyfmc>KH5hion#kyh`V%HDWb05pp(uDmVbI3keh8z!gmO}IB=_I%8P`AlsC2dY zC2kDA(51WTE?wYxJ0{RSLSxZ?Q23GzwBgNUYAk`;VSew}t_SDRoSXCihVI#Xp?UqL zOngM*f3vWsZWNc~%1kDQ=heb{e(%2yM5sTdjEADt{FmS4{XLdqyqY*BRk}?&oGN1y z!_lhG{icrB(v!51sX1~jbaRZo_exi4-uDu0*tdGu$;q)FHG#ghfhIq84>aalMaGT} zq)}T|o)}$fceQ>|9(djMEr~4u?_>3OIQ);E7yljiSd77~@OWe~=%g9cW1b?Sxuai` zyq)B6_dIa(oe|^_#(_knJH{!F`}VF31{>7gJAJ}^;p{Cs_tCVrsG(^)`1j>9^|C{o zK;NZ$4^sLK^=&Jcp~cz}d8l{F2zMb*Bpg+*(*utes6HtR=+i&J8XY}){?phNBz$_;wI{L2 zp2ZdLL7vzF@HJ1ioEqqv5exB@<<&T!Jd;foZh``75%{c ze}|s^{Ml%{S_LChO91HHVcU0$QS#ppEc)*!v)5r&dW}ItHaik8Ix?N@2wC{wM`#P% zTesVNNGVOw#6ZG&+F~9 zO)j$sFcTu)@y3z%Xj$v)pXDz`i+LrBS#%2NTceGd9nHKn=x20FZBc{!pQ9C0M#*cwdd=-tNwIyZVO}vkuUntC&2r z<4%bDB`XUQsjNBQYJo7u+l8I|$?qO)&07O4qZdS3L=oM^F!aE+%@t*^(na#oCpp1E zteH;P+e?Rk19I!@eq{oU=EE%vl@7&FGPrbuEf1>}gx{ghy3TN1FHatnA0~(}J**!# zyaR<(l8YV3#{oS>A%_d+cuC3Mt#K~>;R7sakfYb+@lQwQ`E#Ce+bcsf(1NWh4L>do z7bG9;84T(?*jC*Mk%+1=^=0S#Da>Hw7#Ek`BisXj^n?gLvFiHAUD5!f%Y8Xs!tQ^X`ZyMBL_Pt6T!PYQIy0$pszKFW0c_DF%I7KCB7d0G z%0g{ccxY<&r`?~IKtOQOgUmA_<-5+1n+Nt^R=MWCX-_Wv-15sCI4uy;Hpy_tg%7G3 z$5h@7zK4)X1K#1@@c!)?u)|FkfcMAwxDE9@pCaRj3Y$nYA<%%&KbY;I275RWeej^) zhnD0@lE8B*$NXTN*NeV5CFwwI0 z`<}h}<#>xG&N&xQRp5H^OG&VwIjT5WpDgLY%>@j5amJ*_8x&m}?YjqAPg~H8;p#VR zrrsYh{nI;rFL~FaVe&wHPfr0NhSS=x=Nw-moZEj*V7$qac%}vj^qiDhEFNs?tzL>? z2^!VQgMtTog%O3m$Cn0_3w`xr_VtxeBP1WTqFGa4_P(#&wt&SJCVE}!e?L2*%$Fb_ zq^J$6`o#zS*s;ePj1^;l2rlhq>0h{VN556ygt6KxRux}^p7`q%{#4IY{|xlLRX*NMPP@T1wFDizK0BrGMPyU< zulF694crl+ftc|Ed+clu#^nt-BVJ(hq*7}2kfQ*;`|(+gRBYtfXT(w^<#n_APQ%|~ zJ)e*@HPnrio1hwE+y~)*uOtR7=%bP~7Ml)1dlGkP}qN=o>F&tbQGreqk#JPU>>Qf}vzU)VTR2+|T zLi(Cs?9vL68EkGk~Fs1`_|yEaN8`PVh>3TXqG{gF37gJ+Bu;Z5xea26TMy zb+SiG(hM9nKQ*9DREsePF)IUv>7x0=!l*cLHw&xba0=&rY)H_eKE1hpUNvcOsM|A3kqgr`ybLt!oK}W(S`f|6a;sYfZQ=}$I0Gl{ew8Zn zlh^Lu^1~dw2pW+b80j>w${y4Y3ze0wMh#bTjH&Kd_0*aj=v`%ZrqE$S@|WX<@<7q^ zW3CXgyB|F#nK=xysV=KW7s*FxE~}hn9oOUb7kPHs#bDKLFi{Oohh2cS1M~UF^wiIk znq|i$G*Q{3j4Z~U0NPg}QP%3v#<`bG$wm!@#eUr^N|l^aU|-1j3bA4jrF_fz5a_Hg zPW04c>^~f}TKjeS#7E9e?!rsH#p|o@@2lGNu1?BfilJ>spR|m=I93?+4ncHS=2o;0 zbsxjlH(39ebCn91qviZFnzWjX`Aa$EyL6!E?f<=|bjMZJ(1O0O_}*p|WZx-{Q#$7y zuVd+^(Fxc&QxQ34QfX&jC{9~EjjNI1T%x7keX{b?I>bd>wJ1>D0tG8Q|)UjZNaClAazN&D1~QV-=$LF!=$LNu{kNL!T&DGB?&^&S)d*t-As`zg?>%7ss&zlyGehE+7 zX~&0N+Jg&0O`x(JLubAO`cA@sdVwbD`k!<(4FlS6v(^Q9;&PFpfxYrT_ac6b6vY_~ zM22j!-OG}hapEWS5T?_Ps_38;eoW&T@AS3`YgK$1-r3a&`rQ1l$umn?3p87)CPX)gw``xB_I zzmaK(!F!aY5q2zfq;g``T9qXYkGPiB_36l7U*JAMoFuRV@N#xFn$-e;sC!B;w&KEf zuI@VAN9!&!_2iQ?o364vLDYzxQI8e>}H@kw8Ps(bDY?? zt$*6`TTj!o>Hte#Ptn`Sm_0)8HANTwq+*(jH(l}lUhG#0tiKOZ%&S{IxZo~1DhoQ3 z*JiS4A5MN<=owf36W8v1ze{9UOl5I&>-0{;H2iGITsfQ}D&Q`I&ercc*xa*_r#-`h zD7KGWb3ygF6V#mM*mYaIM@FmKDplF_FS8Yo3;(B5uO@xp4y`4~(~nT)BL-Mh9qInsusxf}BMdt$oVT}GXg?)=4Ipdi{#GTV1UVnwrZSA9e^o_{gu6{P*qvmc zS)!|_^m#iESTB+T%Z%yKO{VO87R;KNA^Z@vI}R#LN7oNvtx8`N#E&s{;u%w%|BV}v zmsQi{s8ozyJXy;42zp(ZAu{glz`p0mdWR5fT#y@OeTr{bp9I!@yAAbtdqt(&W4_BI z9C__auD78H6cRhb=NwxHNKQCHRjYE{$2KuQ9i@J7k0T!htuq7~Z<{bDSVGfzO8jKj zlY$QFDkXybZZ=UrK@8SZK*JlNd)MvIM%O|{t_MVTb{v?<-f{M*XewB1$1#7pGPZ@q z{G1umv>T*E+P$?TRYFJKZd@0Pm zhSg-~Fw6rj20BzJG=F|LvfH@n3Ho0ko^;5^dw&34KUap#Wk&kK$l`TV^Y%E~yNWc_ z;)A8mg?8}fXx-$2H^Tn!ZI!R9@ri)GuVgv$z<}U(4wxrh!H9P^xdm1kvmZ@~akCB- zl8eY>?YAzzHa&$$<|fKk{fUdk`Y8(HZ>&e1#w7=^u@Klazgf5tkVnxVtn6PT!HHp?Q}jsH%kO_gq&`RT-9ky-Tec8; z`YXXhZg;~vAKp-%4f}p=?~EF>_#-+zMaOyZ7W@|t%eksLKQ;@);eZ;4VMYQzAHlSn z=dHlxlfeuz()~pdOhtRppEGZf3{TRTaQ3k^<-*b10Bps66h~eE%KA89>>D+3ExAOp zNO+vq{1$Q4Fp}_#Ig0E%@bI5M-n##@H(oWGxfu%%!Q|I_`bEoRo|c^ly9Kl#j7E59 zEr#X0T8O&aWUXT$RZo$^XP|3SiWKG;iERQ*7o^UXwTZBQOT9E`o^pFArBp~gnX~cM zj6g1&Ib)p@7FXHeA)v3DRR*JcKbNBimTAW&xN!vcFp-pevI~TS`!o!i-H2QhqYwNU zb0)WUUk;WlXpg(AHp33H&;$FK$nBK_Ee7rdD!Y$Kv%?%{P*`( z7bu3#5vkV|WtVqbqr=Hw&pVt@(A%5GTM_mRc@qiX;8e5GB3LK=Y?UC!iG>sFaY_q& zB)iyU5SUR$w*~KIx3AH2UMR8;$h^f?VS|i>qc5yvX0y;8M_aux8nAgLpeM^(`i1kf zJ=693PD^42`9>1&7JhE$+uAE=e>mloru$Dwn0)8WmDvmI&d8M;tcAqSGuy*XPq?4g z*THb7e3q2DLvvlmX4nZ}ML{d~GuK}F&QMC$R#fWXsi^%A8T~BL5?O?Qd-mfA25NvN zn+SsqN%eeA7({DLZy)KiLa_eKlx?X{p-Zs_E9q+(x&zYqL0O>TjeEnZu=6TtK6Wg8 zuZ{c3A;q<9?Z%3-=QvoI{v&e@4Or$7W?m9L#c6+?wIVlqyNmPzWu2C1)y;X=+iw&O4Mp#@Y;4AtM=wDX>b0e5zY?HZxy3e<T`e%+A5^ zbZkyD@pjj5vRySn-+P2PL(Da~_ohdM&NAJz;7VY^r zmqz^?oUqL$MNdm>#AiNKZ%9h8)kvw(j1R-n@m2dB@7@3}PHEcf`32Vd9U`vNHWp0Z zUHOfb;UzqDck+Uj%Y~hi^2L^HT#lKYgNDVNv7R`%JgTD(m#T4AdokN?Lrm%a973lz zeLNJQs?;P9zP@um@^KbuTl;&D%=s(iQP5s++}8cuzbY{V2g?g9z)!86LI_Cd8h|3C->x=_4P#OIeP~cUed0?Oj8gtODVF&&I&8dk} zrsowbR|P|c-@cV<-%VQyUki58*!vzg>7rN*zt`=xG~(DDVx0l3ACOqM$Cm|tW{!}L z9$en<%FB)!0&e1DM*%$}R$iyE>fZGCp_h?n#J#auReLA`3yrJJx(euvW5y-5gw57{ z^s@-7TWR{n`=ko#inI=h{@FLv0_)j=!N)Vrb9p()Wu>ZB#XQjJ(Flqd!t&F>e2VD= zqh;;{8qao){=s;CgDapXQq8ds4s;aamp2`#nCXKZ1?l;*@`cgm%&;@xn`Z^1JnKvx zVp|`CZ$6})FBf*AcseKHSx_)hI{&Sfw;*qOwyt7e>a#?vF87E7cSriI4x%om9CTfc63Saho|M!EFQYyM-quX+&zTSHYc-v$4~N$)%SOTnlcb?fbnH4|6G zh%v(K@#o1*#bo&NRyf#abe|A~;onaiSL}Fa{W=%J)x&2in$yia1f=}j_+fjN;KESp z{Iv|T7}xxs$h90V1mT1tDsJ1K_M!K|WE_~5#=|Kbqqo;XmXIf^D*qoQ3?W<+Yj`KU zGu5b?RBPqP+5R;yyH0b0eUMm#$kINh&P;sYv zGVW61vhFHz`UH&NPLZ-{hnmy%J5!|h+fR$(@Rx-AM+t1EOxa6IP9|Vv#(hf;w%7$Z z`#$JK-|wHVGbREk&1aG6>iU}^<1zCB0nr@C4wuX@LGG`^XhrD=G5f|o!k57?H>j8IrE+-`m0nenDZ}LeQ8_4tT<#8sBiD+SJ7==?%SwR{`)H7<)Wef;HY@@(P)LU8|Y&; ze9#_pr5XpkD^Kki$3MO^@t6`-bP4#$TXYLBTqySDAY@pu=Gc!T|4H}g_r=`ZQH{z zFZO*#PZ>+OyU~;C5L6o1Y#w_$)L7=xAoZ%Y@5d5dnCR^^a95aCQ&q9e;)%`kij3W> zdfDx5JA0-xBI|iBH_?s7*HBM3y#nTTuT|jAR@w^~IYBQ83c@*m|4<%A-oA_{HuQXX zz^^KK*#)nh)4PUMp2$9v4GE`@Y;QF@g~jTo;2`4-Q^+ZQj&R7D%s_s5^P3MC{I5aw zObkl#W0=tiD2jH+8Gd~~slVO#j$HSV!a32fy=JU#ICRR7OJs|UI z!MfFj;r*u4vy8};9fpos!C6-mwZ8SrfeKgeu%|b<%NR5P`NIrQuvLpzudl;YoM$uN z9r46iZ7XpTQEkMfj|x>AGLzZdm$Nk^x9}6MUs^FP^t0`qgS63~xFZI!jol`Os2dSv zpUbXzYfHyxeR_KP3YuB zXzy%4h53r#7v6Iszi#oj>|+bo7_#=hl}6yJ?)J%-<^Wb?F^Kf~q){>VFT!lI^0r%J zCB_WRhhCD{+tZ!hhs+sH8q)Qo#nQJMh0x+y)mMgP-x5*A7fm2^0jVQsgr3QDzmpb0qKsAXm5!;aFtalPsL&b#HTQAZBBW zCFng4Ey`}bf5XE`KrR5xQ4_FDUhvDeF2p5`Rx9<6@U}Q-mjS?qC?C#Ew>|C)ohy>f z+02(Qy$utiRgqTr_ok4i+3#Izw+g5}S0 ze0DiX^uoQXit06Ms+vZ~8u}!Xy)bCaO#1u@lrJ0?LZ#)RBLSZ)@lz` zM(IzkDsqdqCWc7{^BGq)eE$x3qY847j5R`lwu0Kv-e{EAi@Qh6E8f1^$0CLXe6X|blu(nF$VTj~MYU_^7jGf2&^}~r=$9MgJt<;( z{Y*jawA|6)Wplz{e~GH(tkF2tp9hW@y9)xZ+eR+n2b$v|&CJ+^OENG0#QjiS_{clB zz-PZ`@fM;u;jV?WlPBY;j}9|B@pksCGB8x|+3%LwaH_2ZfOBoa519f2bKf^6-z-CG z@5-*M$=sxzU%4|nQT$lP@&F&BK1T>0bqACFyCS`L=BTXxzGOX3+h2F@p+_hT+B9#< zc$b}hfIsO*sH2^foi|fUTH`(;9}>KrLy!lj7Sv`|-pn_}t?e&Ic?yep#(n9jQ4E;h zpl+sCLntx3mD(y#Bm|>8@V@7vwK*4S??YbqyxBRj#A; ziMa1&9R5iwa#yIG^3Ew) zt51lEx2aYZ&lYVoeo5yeVzPc3fb7gxWFZFJDsncS3|R&y3l_SmTFyvWfjgV)^h26p zzmB?K)PoyxYeq#qo75fUu17l{M7EQAc|wIlR(p$EwswRb9A6;RA}CSgvZopLb2fG< z&&6GnCxYndT#L{0#Ea-2Z}J)B?*j!>_g$qKKP5Ir)!lL%@z0BI~ zsz^!}^i}4)vwmFw|3f%LA4wQIC_i(6X$M-Y_@q<}(ErJmx|j*c0Gm04Q~Yv<3A!}e z4!}ywbm%2l^;60)tM@QDgxykbqDiNIAAeyMNOE1JF+w`5`Z0z z3*oeeG4wMG=47wJ-ZhZ~qAoVTw^vG%C5FJd`6lnm`oYro#{|29x!?bsGu%3VH9M$~ z5V5fVlrTZT5CFTrnRxik?GB#9c79+-e!hM!TDqs_kJHtwELw6S^6`}Xj=ANd$_Q2gdoOHR zoA)xk08}W@3OYITVHQl5z%KvM_)eL0e@YuKBtAE`; zvYtm7vl_C?i_-D#>e%B#+tEhS@ToEGV-%xoD&#So#FpFd3O~eb0A&2xr4>imUXEu_ zp6D=%rxVwtTf*ZUQLv~&LYt>3X|78SjrP^(-(o|BPxjl2H}a$=V`VH- z>-+cZ$l>=FFZM4s;f2-J4*jCD#iRQwk4+qP#5GFzA*yUPJ84QmZ08~>YF*$-U@Q7dgO~HdU_OE zquNdr!J#P7$n)%smROZAhQB>Jx8TW30AA6ME@3W^P0o34d7^90z> zz|u=oc)9}@BR9Mv7#y~|J9A1~`U-k`Ac7<)%8d=SPkX#M)SwNEMHGn}E#K^3Nc+o% zPu4z7;k`<^?2b{4IcPcjhI&N9!$P-d-^>(ZAyO)r1?Jrz-9i&#+~(x<~Zkny=?&ohwy3w1kNO$5olIXjI$etWN5FYoZB#b-wb{C z^H?MohX$H(l!_3P*E_#8img`r>!_%4zvr1ChCqI_e}QmVr@TVo)^x0;Y@^4!2KSu4 zNZyI-?4@6trp91p^~x;~(a_kfl7k!F5)&fGOIOjXxd%fo(%OgEt-5W3xh(VkTSU6M z1-jNUoeF;gU|ZsoW>ELPP|mwVSDq*a?_yMqdNYhus9CPNB=)z{2JV+o&zncBm~uW> z!#P6jWO#pl0ciTxAqCASW73`shtaYB$Z&RoqMHV5d_6jW^e!ZDrQ(~TYBO@x(de0? zJ@4Pevk$Ui5ejnIL#^^x=@Tm4SCATILB^FBPt`hN)X4#biL}#lgpx^KW;=qyIQs7$ zUa77p0a+8|fI0+2pMAc^KU`~pYiUGhwZ&#y9+Ocn_i3Q%Cpe_{4S%D2lTeMgzA~R; z9+1vejgFO=KUg{!j&d7oxOsE|l>0YE{f=Tjcb9KEdka{DB#&^r8kY)y83yhp7JG?a zanR#p^r=8dFc}xCU;x8S=(BPf8>siU>Q-KrNd}7t`KssGyT73+?7@XU7>%rl-Gp=t z4D9mhYG;f?UdhTv``?SkD=QO)#rLF$7~@_GQAEra?qNw~tr2jxTc_HpM3*hP-mJ*k zYMa@ZIB2epcgp))Q}pvs$jREzb*7SJB>6aE>Gk86T?;T_eceuQSE3o*Bo8(J1!h3p zONk*`HRK#H!;67i#ZP8cea{{cU8Ytb+$4Iu7MSjTx$TeLIj+b71%O3(7?%!kY9aVX3R;11 z;i%SiW^6eoigEb%1Yl?KRFJSCaSCo$GV$SW`)+|WDEZ+k1U>v>6kU@EP{8P>2fZ{3 zC+`9TcX9?P9T*5c^)aWe`lyXs@a5ka1?4q|_EwYdKK^y%S*4UuPPL`SWL>;h%;dqr zJ`L?as8>oul@sYJI_Y{Xvs*t1loYgf5BD}FRf@H#G?A=4y^R6-2rnlpD!Jz`e}8{V zcOzMv{TD-!yKzmjNQ}fM=;Hdt+-Z9qP27$BFw0FdIv_954o zI}sH!kg!-17v!v81q_NA0nW*PlIVGVmSgdKti9)*G{r$Qf%o%vOA|0gs&&2lW`u(WKyaW_ zUc5QpS<4;Ncd%0UjG~f7V;}AL{l}^z@W&k|_IaRIqCm6@)c6|pFJ|DMNubs7G#R^* zBuu`o@nmd5vA5XmQo;D^m21J}EDILN#ql^><$ypN&0Rf60MxbatzlA(D&#VLEDZ)A zs%zX}F=zgAn{?j%Am%NGcqR9xW2}gdUl%_9Nnv;>JEm87(9mYo3K|_rMS?W~ev2)1 z9Lb9+R?v$M;e?oyaKHI?n?bh7bw$63Xv3pL?X8<`F?&uMH&4}22?k0HSc|*E4XG@_ z2Zr}8VfrYO0#<45ksd1t!Hq^-?=@9^+J9zEO%|j-y|pF!7u!de$o^EolTQyB*j@$# zXQv{RGFqvBvxP#3$;{UPlbJ|W!HFA$n9j^J6U-s@$KBQiGl*w9@Gw;PD5bj#@z$b% zqr#Cf(mOdS%xx2_kau7Pk#p5S6htdx081 zAhv{Nca;KIDOc&!8klK(h~&_FeQ+q287(2O)0H^SrwX2%>HebLLjDJ6sn{0toR?|w z1mJg@cY}~^W!LvDGv!*C0GMNS<@Ta^paEv1gguf^6_#qLT<#k>)+jiNpK*#GN!8RD$eARZBplN1 zIgV+=UK%|kWZY`LSaZTn6BKrty*zsCW%3&YVT|*5d?Z-W8{I7VkPHfF+@ECWoCJ%L z;GKEI$Hr;5tPakUQe6&W?U#f@jRsbv%!;}nEYK;t%ojUh2_fTrA3f1=;GVOvxC(UD zyc=-GR36gd5Y3o4KeyHz+q%^FZT-N6o5+;$TPP;7v~*dNps5+1n=!NSpFw}^3Zi2p z6h@B(@7j5FIubTzwzs!`;bJ!)*MXd|)!5MFUj|z_<)`#b7IUNq5`zovH}o&A!0gE* zH27P`$ynY)@eof5PHzn546WI&pyz`#Nm@QR15ce`=p`)+lS&P?W9;J-5(!?z>>4^z z`2sodG@LzlJ+%bpt2Jme$;DCQ(>20Q3fUXVTP&p}tp4UraEn~O?_T|as{^MKS`l*TXbOH7h~Du>A5 zr+vxdV@}h9-Mut2kc78h;)|A!H9AibuL3o8P7bRCk%|WwTIN1s!H9rTX2hcT#TlSJ4FD#)-jkKeoK(SU--U)! z@`RV5Cp4Vc1zNKivi(8Xx^5C{?r56BtaQ%A)3hV{RWms3sx+sg+HGU6!y3U@;E=om zGPvb&MsSUzJtG9U;Y)zNN`u!{9_koLnKz7=;j=L%r+Rn}+8ouzD8JR|ue<7vw_=;5 zAItJe9Zpz>O!#}Lm*%k@I1v=O8iy-@z?=&An;n2-GSOcNVQE^PVhm&^v zm+Ns!`5(PB(|?5fgd;h^uTYE0Rs)VJiw=j!_;xs_i%>Yev%6@z5_X|S9#;mj|)q77C$Y-PmKcV8>i zi0CW4kv3OADfIXtF7fX7t^x`nzSsX<&CrJO{@h51S#Rw<@*woS42IdLwmbEfm_MV>(c_ zeZIKOs7e#u4aiD1owN==O9L2<$7XpM58Dy#0_W-wuhrH@!25TRaYroC%Nz0av!DJ` zZ$09(|5Tm7xvCuA0)X7CA5T!`9s(wR|(ZRL5iTo zh?nn#{{Fc;+n9T4xp~@-=eyIi|FS+9@DcYcMF|-oYIGeuD2>_l@4KM7f2Jo@?Q*sr zs-XI;KclrdUU?qLc5)-q>{m^)2@=7CjrYUrxQdz8a74NvuW+X6LS4%a=9ig= zEbE!c)qU3cpG#q8$=~!r*TZ+drwuMf@3*~t=tq3703w6v6MAo1;Q)miHpKw+F|S_Z zus>l{+)ez?_tG$4$0WB=Y`z6L&%3Js^nV|)QyZM9Bk_#R7PuEQ&waHa@_7@pYmH~{ zRMUaiz8xMo9_{?aN@m(Z$>xIpSqQL)mH&>n!0Asx!b`)auKmbiy|&{9mefMDR1OCQ z<)P8|(_sY6xgBvo!JF9L#yEq#iBu>JV=1DtZE{ zP|@@-TckB^@Wm5BUG?A{3({KIb=4l2PrXwbEEC|WopVqKF9 zP|s*l@A;^J=oswcl{;yDVrd$Z613NtS|sLeR*n^6p%yZNY1fs#En9(bHQEm4XT!$S z`$PCo;#U+yGd;1c2xb3RM269Q6lKTACQl1jOy9$y(&Zfdgeh+Ec)tqL)+KjDl>*W= z|IeFbmV8cy%fVP|R(#%6{Ge%SFh2!xa@K3#2ax=7P|COc4eR%~YNd*B558sF*M z3Z75Q5?*j8|3{Gh$efa!C6gu8SY7ZoiKTc&!`r=jJDaRbTL8F1^IaVKd>C7lB-tf7 z7M4|r+}^7}@?(XwA*xGeguAjH1K`__EMqTks6LMRc#QpeSyP+$hfZ6z&JQ;LsE;?Co88Fig)c#vDx840aNSofp9QI4%!|m!N&L+^` z1)Aoqo|5lSntUI8R=a8#uR2Se+&mH^Czu}c;L2T=gmw}3BE4i+^i7hUmYrMYhgT^? z|H&=1qtry;&2sZB=Ah-piLf=WdeE$LB=tWIkLsW)r29A3Qf_Bv<*dTAuu2qNKzHPH zh0jWU*{Mx+&6m}NmQF9;f@B#&k^hrz(`k`B(Q#5_jR!<75MM#wsnQo3o_Lii7TSO*1l1_n}}70Aaq1xdduz+K;DM?MG8 zcdHbCSS$MD0OJuxd&>PV;a{q8pcm7S?XbQJGg{t{TQ;~sbA8vU-@M#BK^NM*+Z-SmWXKYE{ zD^e_K2-E$UM%;GN!GK~$&fKS^GV|0sbfIw~!x*|aEU>*Fg}73lyHxM4fbWq9J-a+x z(}LN6MW=l1QB`Hw=EXG~obq*bjLmO~0z!Ul9G9~e+K488=psc;U{xdv!)hvtnos-| z??B1#whj75_kI0Gq<8cea~vVS-<5yD*3Ryte)_?Gn0s&RW!VYKbfh>_CRkdh(#1z zO)|YmLwbBa*Wzz<{O>H~psBWUZhNbZd2g*#ar5>{m9ZAd9tk|U#j{bvS**JRSxcsWV0viL4d%3&f$fmM}=Q*cBjx-hfjWIYcReO zBfTaI&F!5}RZBG9`b-@33?;o9cv3ex-{foee$1VUJKq8F5D)N}Z`KAX4S^2+WqcVV zVdaw{YpUz1G>QI)b(PqRf3o#Pezuh}E)>0d518-BPmfwS3yTfk329NWQb+sdDYv*) zaC>>X21>lol3Is@=!3gxhI8ax%h0%gCKl>zSOHswi|cpH9K<%o4cS*guyWDdY-e;i z?bO%lLe+p5SrUu{AY+1B7MyO^FPjJsDV`Em|m+&HH@J_28tsNiOr?kqjiuzj0;F;kW z7N_}<3)EIiN78KDuOD+K20_* zS_A$F>o){A@WDigg&DKODot%{coL~%%G_ag%-)6^UpFc=37T4Lnyx(^Ip=XG5==A8 z4~q&Ev>VFdXsB~{PV|6zfxKyme@do+H`nEYC_H}g-1Ozsk(nt6_$wv^PAEsjQ0EIx z=!4Y2rfkR+oej}PUJB`QVtcCseaaEnFH%inMRks9N3JPFqHgy8=mA~$c{Eo{XbF(} zQJ1`VL3p#{tMNril|*LfL33)2h_s{+Q1{0hXyfI+qlc@4t%=aw5(p720iIQTE5L;owa72 z;KtU&PMlzC5uol%c`vN+eu4tWZ1)YOjeUY~@bT`fPyPs2ACK{Ky17059ikbK}+bQ*GpmWmI^;{y*Flmh=p;=S>x;6kTOw*)d zAk*VCVa@x5EkGzr;d08&yzk~~)RlqTXSob9r3@p~4Vfnm|9(^F{>g?)Zo=yg-%%f07u*J#yUxIFFcPnRdkUFQvvZfP6Nj1igS z4f`STu~#F3-Jls&ZqIb8R-_X|n*JR6O-d1Sa^6aNrgF6jFE$6`q^qe56GV zH z&z31;xJgxyd}empov$G>!yx+(O>K6Lr=Ze2feCqHUC7`Zw)<+@bF$&ilg&~t*4-J| z0(S7=_kY=4cP6Cn1fxH_QzhhBg&>AOkNy{+QCY?j9&Bhkd|Sr!+uSUoE_XA-ncUf9 zQG9p6`Y%^MBdQs}BJ{xfNd5hFJ=u@$$Qi3wE701YedOLYU!nn;0Uz{2c!!8RHlTff zb9ogsT3;YHEKhmj>~u)6Qg{RRZ?mb&9&&nNfpkaTP7(YTU$?MHVmvy#%h#uR(AaoF z9Q`#lr*!j?`@OLRM=jM+MCY}XnvMLMeYG2ERwpU{_RTzDUl?n*%w;|QUXp1Vx6bD-qSsdiky{f zX$I}v-S&YX{1peIuuKR&rG+|m*mJgLe+&GwdA`~mA*1H*PHpu$e32Y2BwPI|e#+Xy zvt!GLNU?I_=hGGYDe7=%7`~_=ihara3&b^5%7^m_&|{rwHIxzJaye~;-}}o24sYz4 zPr^w#R~60EUA=||$jzRb2F@qy)4LxaEJKH4n=Bm`NWuf}xFebwO;z#9%G;vuJn~Ru z-KcWiJvc#XQEMnuBJzWpe}>s~y8)Lza($o;@oXVwHCN#bTtMJ(=k5*DM-n z%uoD{uo`{ObRGR$MQ!1IGtWZ~P7k;nrR(hNGgmZ?y~o)H9*S;0ZziJ)ML86efa*6@ z@IY~VrdQupierOp1(T|H9>*Mv2GdhA^M zFFiOjX?cTd*l@~(0Jy=FqT-zkHB12pWIAlsC%17r^7u3F1MX= z_gdNs$cpe@s~i6(8A)c3B!X6#Rpw(~yV6J8#Ng$*G9SIBVo8gP=oUZBK&|MkW-(TjZ>3}rE$UA%{ zV$wLGngT$10R58G4s`D5d#zdeYO#19*!n6p&rdn+_EKa0E!A{GunQRc;^Db7&{8t` z=C$y0&5KIu?GM~IiaXI_#)*C$mCCVqScqy?3d3WdaF+-LA8gYbK)m^Ob~lJOiROfW zz`Pv*-_nAG_4CaJ+=iYz zDl$Z=waVMV3Eogm&?QK%MOan8+(M@ZQwz02{z)W)nrGGoe zKXD!W!Wp%z&+Zuk$$(_Dv;>UqV^EZ@0M?996ql|V?)kDxnEjck4_f)9vj1Xx;7?5c zm2e8b)LUb-cxZfBXXrPq+VE~dx;-TCBH+>ptuArREAo4&6Wgwc}Xt3(ct{{b9dAh{lBLL;0g1uZX_oK^diJ!47>(p}e69+wFUv>kNM;&$l zEJ?w@0BZ%D^tlkUoJ2z7%{JqkDIML1X=^>1FydKaTuZCd9O>oZ5w7nr1Quj!i!d&gQB$MC+vkkpJQ$3#8})-<-Aa@}ARMzVIMumycz4v7oR;XSjJmm-`=HECn(W06iYtEp z2Hh&3M!L5)=-ZSTc;QfBE|fXRN~py>Au9iLK-h%`d}ws!o6&Y-weyNNAO3g-Od@i> z*s3kXYi|qdEDSkarxyYNpR({#!VP&bzDDsUGeh;7xMql>@TtH4QVnh)7-gM1v-pr& z>}DT8g`a)lx;xzy%HG{*^W?08Y1_ugIb{UZjz~qZDc1OI&*(FPjkJ%Bp5Vt$=I(jY z?IFt=*-ie$c64CRGdGMw-0ztO2FINc)7WXRJBZaYuxcRz0`IFop9(n!uT~5w82ymn zf=Zd^1hi!4TcUbBe_L^}N#{*LM3L9Tg`c3x`rqWxH=P^xiu3Q}Km)bfHHL|CtP@%- zsRtA1brENJ2AjUpmOQ0)9a+AC-o;=y15?2%XrsDD5~U{0VqZ=4-x?7DGUUiT6B@c~ zoP(Z#j2C{F*?>6691O&>)Sx{VmKET#x+Fqn0dOcsJl#AKREGO4oK0EVAo+3sAfuTh zSW#Kz9<%DX2fM4$m()VApc}6 z4uV2LL(TXXr_4=f2PdC2S9bKb6c}gk)|B#vz@Tu$@geg=(VBD4LJavnqlB6$)f_Uv z-clvs3WNwPMk!{goawACYaf88x)rmq$U`7=i+=n+AsU&g{f5^2x;tFghfKbBOL8bi z?+@R8VgJ!^0O;(x5Fp>M_Y{T3Se8gff*zsFf?~}Pu<3{$LtJhaD2z092a&5ReXyu- zfsm3Yu8^X5H@y<;nP_Ia8@9jyI~4*Y&--w~k1cUEHjV$+IdI_jkVodH;?oU84)@%k z#r}kyFg$8i-SyFh3M`T>F#-RXZw+?W_jrI=5d9v zw2DNfcbtDj4vPvMmV14##KoKPjNk1k#JF{f3LgcVL-Agm)_^~fH^OjD5~-o|o-HXN zP*#LqaB4{2xU5`0)BX4By%bD{9aDCpJVC$*@hSHW{fs|hRTBsS2OBLdU6z!2>gig1 zP+o!#;vmO(#y+nScQ3+Zr?u|&+ISWDG1h(kXV}?p`d|2pc*iw8NSj&JpwU9xo53n0 zogI##-&$Vb>_tsy9$g2NxqzwUERZ~}rAY9c`uDE5$dCqNob+IJj`DNQigXy*^oAI^ zAQruzspPd3JXBbc(CT|)(rv$&bo50w$;sGv&`M52^bA3Q^4Ue}vDR?W#M~E&Elai2 z1(@~cFq%SFSpW9~4S0b~k8(wxh)i_cCylNFcFf4KzB@@Dd*+y1|PRbYarzO7FDU=gQrwVa<-g*WVUDF7KrW*uG(}Ac2SPR8&Qk zr~~y56nh^KZTG^oVRq!zjozU73bJi|Q~JHokwJ7;Mi|2Tg+dafNwKZ-e6n+ijlybd zR^Z%n3p;=orG;2pu>bDwld!v<_UsJt*o&i|gRgx9<@mrwWY@K->th3(x7Ib}RQXnt=Dq1DnJ2}u)l0jFH z=U3fx?3eWwHooie)^Sog7J(?&^gZ&Z9RYSOX~1T9EmUDK{1x01m+UW3f0Pi=n-B+7 z-LZDWy)2nbSaGS`pk34UOMuvZ?9$VAT1+>WZF^o{uj=%5$*WYkPvDm!Ed`u=&0EWf z3n^_58W@@Vd$LUIibx(4>JwhI|NKHbN0@PQ{QtCjYtt`N7mQObMT=CzNYlBQ# z?A0TOkeVIgUjlkyi?D{G^j$K5T7M0E;og}-=~T^uwhOS1LT$VRc1*MXB=%*(9^JNn z<^0dVtTqzbU{i2q|K1VLgzeF`3VXpjWXKfcLVTHdG*Y}?bHRANhPP+>1NTRJ-#W!DJ|~tB|+Q$gwuaaiBm1MsT6{fhx??TEMoSs zX``N}Ym9rJ=tn%UzuQR&8!WwCKXhFuTP?tob1!csZJy#~ zO(+T0LEFbLj@TVQtF@<$(d!Y9ibN>n1y~>PcY2SzN)HFskdvH3n-rM@E-#$hD71S) z(zpq=ZgQk2x_daCaM+(vYNdy_9KzRFyr!@4|5dI-y*pcMk}b*Ynd-~Fyo>Q8AAN{t z`2}a3KV$(0s3FDl&o6^_mT-Q(oSsSw26xWY#~yPcQwjilVFr-fW&Sj6!7^x}yh}el zCn!|6=aEkfMKmJRwp1WUL{F}^>vry4>vTmL!XWhtyH+=m( z9t}Eo_)Lc}ED0y^Vp?vs(~E8e9;!(jwTh|N;oq}A(|;#yiF+q_GqM!#>fd-5 z821ury^&lAvcs9R=D1}wqOEJQw7E5eK_wz?7lhK9{B^r52$w|GK06AWHg?Fm)!8be z?;yRR4KgGFRmP%)`vlP1Imi4yJI6b3OhiMpZ|NN&mx08{meumaMe6U-Mz=73ySTh* z(QFmE1#+=Bpp|{{0Cy8eETpd#7f*Ojl`m;Ca^a&p48_?9!OyhWCS?8yxdlB|IOAj2O2mE??j<3I5izi2NXu$jr`^Y^aY7vcI=IX5Bi2mZv4y6m5 z-^4B0kxp!Il>^$2e>0VFSa<(z%`BfoVMVp>biPE1J8#I>;5XM}KTAqVAgF4XyTKa< zyF3yB9}73*3QfNykTXArTQjL|yT;%8zGlg8#F3~oe-!aNlx1&@WqF=bn10)tpxUNRW0Sbzf-i|JieXz# z0N~GL_>C%2_tIzL#y-p@1Eqkfv#6gQ4x=!AFb;afcp!?m6%3D2o_y=+74qmOh%F2h z{)?9!D%Gu6n8C_H+>?%2M`D^YPhJ-)2H7=Fg?hndhE#=;0==EzOds6S4PcBrB5HQI zbWu-7qeX#XFiu{{cV0UAQ-kqnXY2Co2mNY>0%|S6hzTc;0Q-OJ3-q_Rj`u)%(s-up z2WoTmNLWA@K|UP*~cSxHBfTrTqAsACBG zE;eR#Fg`8($$-dpljXU+)MlvOT&euA^&JJKe1Lz+PQXpclB><(Y3uCq^BgJifDhKu z%-*F1$Gt%7DX%xbr(bXenP6_AA1*lr57+0j(|nBAVW4w*`e>`;e;d;OeRcr`A2aVw zZ1}YUs2BpQ`}b}6YIzlWKW<-WGYvkK*&shj+Q+|?Vy*NRy05jM?B^PxaOxFk(oyU1 zJ78_fsL>C}i5!91)zyz)yyXE`5+&V5X1)6NGSFwZl|xsnpVuY6s4ieznHGntI-w2< zk)?lHE?`yO5IvK~Sh_*?UFw@2&!ojqZEBs}!^pdeN=ZND7Bn!FXUxxsJC#TLRwu2y zVDfjCO)UZ9f^7LZpeIaS7PH}Vw1$#WCmhC5fe;=$6yvr7`9z(^kemFtflD$ zc^FjtR66U8n}JIMwKVEB&g0dAd;v>zE>A+%BhFa?%Yi&SFF%{LNv~rFAHro%rQFTS z#i}EPj${1e-Nn`CqyRZS+rkS;NP(4sEPD1Mr&#Go)WRRmdHZ(5oP}0*}vVx=x@^+?06dX>H>k*q|PlM37Y=Y2_h9E0lX7!Ys#Yr7o`8dt5F_ z5-?rQl`ytoeG$QAUfDgqznIOq-fp5@<)Qs9MW|&@QPKbvy)s%0a=(zvicwhZ5nRmn z-!J5t={Y)^4n_}Ts;rXGQF_J(1RYEd1eC|T)w77~7t>#)om~0UvMuq6mj6(4=QELp zGe(9X1|+{px2E{sjPI(rU6B1oF}o7d$U(~r$)U zVmi1Z27S3p9t3{W6fQ5U`MGi?zKs7ytc&}mNR(7o3 zZr)Ys{z|Y$UUbhMnsI)Aio8@ays5vY9oyn|XY|9VDfGw@p%}2j`o3}b4jzLp4a!xX zb^4+~FJx&Sr(ezg(_en@YhPpw)N%{&-_HNqT%r;2Q+gDaqp`o3innXNODmrUQ^Tj1g-l2vSjN~@O# zY2&}_Ovx)R7H>0;hNJhxp`+Sj)S+_%GYJ*pSv}W&N0&cC;{Wa6SJyGNr0@rY{93J| z7OcU;-SuIRhp{@HA3oi+R?#T&T6Vy4?6tP$L&$}J@FkIJ#u@Q&TJwodFMY}EaO zlXoNjR;ok`lPb9b2|o|eqXt=ZmG*whRB$%82}Adk`s?aK0;Td_H-w-*QoHCi2H)DD2#?dEs-kGO_uzJ9^eMH|Y`> zZpF6_k(n~h3Zj;l7mGa~k_!G%l&WsF9)RP!f$7nAD|0WZY==vQye3*=@{zymu4lNq zS1UglC~1s18@PAgIbQsuO*y6^~JlUTo;)7Q9lK?#mf4-Tw*MMZwt4 zlZzot0+%FvNl$60+xam6@+x2OP7h!6hL^fOD|HzL?9N73ro3r+rIOx?p zc3+nKpGMct#eB|xmq`ZTa68-Oo?kUmyzwSbp5^bJA+Ii0m+K=Ezl^VoPuV;Y+E=^t zsyBg4AbkdwL(GA{#-E42Tjf=faNh6Wr2tCM?pE{M3z-pZ#<;KL?V-y}L;Tvy`_GiK zoENuSE%qV7VF>y-lE*uNZ@Du^8!m~u(WAdb_8Kq9_Wfo{_-E-OalfS7qNlQ3RNTn! zTj|00+mYv8BR6r!9bvDd_3#Nv^5re{rb#2tA^Y*)QL5{UVt1OaPV*6XustL&=;uB?Un4Z`o*4KTzR4n z?Qd&Ni#QAUtw7Q%zi=-NNdSh7jTMwnE+znq8pobEpMdo}1RmAaZ5|j6WEgIyrE?LM z1#qq$ct4VKRd+$a{nzUU54>~hG~m}#v4sog`gm92W6xR>6W`y|9?B_P`ZB^lK{8sr zDmF4RV<30ZwE|VDSDvK3bZ^m*nV?I$E6D{|ADPdyUHf9Y6<`G;&J8}~ssM$3gPhS^ z%~=aCkqo$QxT#_yYwykqZ=OAGq*RmltPs%T_TK!=@57z4Nu(Y8-9|t1-B|gH8={Kd zZscF!BcO+@#}fs4cg9mT9XapcN8qR^NK!NSA_de!4FnfyKjQGb=87V?F8&9GrZB0& zLgf)nrP9jR>Aa-l>AO=DZeuOX6QoWD`D7o7*4#UdDX*xn9xMWD zXXnNpr`dgCFubKn_yUMgjrB$?J3Z$gOThpmb)k5*J)^9axw^X#$_$Z1c0)iggZ58h zoc*cIhqgNx`3(|6E3i1AM{INpa~zY-L;Wa{7OSErnp5*{$e^2I8o`LL*%s9C0Oxp} zt1zz6#SFjW=4PtD_R|(xgX=S&peLXLOX`sirzXi#%@2(2{v*Cw->>G(r8YYyHBQy+ zbkB$cPW~Z%u+1!65Y@5UsIHO1_FWAJegQLJ*0Ke@;bu^UDr>Ud0hdIz#a{)PAjAri z&aAyScD{H)v24YHLGY>`qY1BFCXIIKIF(iK;o2u>yt1INmvQZyO4w7a3JEI^Hll2K zoGXo=9v6jUwWRnGLrZ9mo8>#^h%V@_KpQkO`Nb;+mVJ4!B>%@tT-&59%BCx(BXm$K zlDdLd!O^2!m(d~Jvi4rr)AiK+=8p!Ut{t%!x1vYc!4rO`Jh*T^6-2)*$6nnC^V~`W zwEYb+w}Gkz72B#!!4@WU6l?F$416Y-Q$6m9jG5sYM(Nck0;WWQBuB;RTE7NpR6ptW zu6HTfk_=gU1*8K0($CQKW)I!ED0>xvUd5mSPc?vh{hOIm(h;nk2;i{595E2H1G8-m zWN&d2Ii%=8BxMlyF2f3hGd$Fl|G{U^6_^MkO%6pL;Vd84r33#OgO+mfJ@b658fixN z67#nJecikUg<<>9o-a=0N;XhnwvAgVnTH)ZAf-STNK34x1ae%VS&szp9~6vPZ>HEA z*t%=3`s-%@2L=+}WfQ6fcO-$>;{z~{slQj@G75|ik%-#;%yKxa0_G>ps;3g|JpWMR z3H5LoI%Lckk$cZbb*C1rr4~n@={aKWNl3#AtVpA4CSZ7DJ6L$MM)a$*WN%OXHmNky@ zUyGjKez0JP`I`bMJ0S8>W+?6sCnNFgPPf21Z-9HSo`Ps(x%UgyVb3d)#ox;+yNpTK z!nj~<2)mPypn=oAf1_>uF~E;{aw&n&dq!nhSse))ik@sLvh0Pr#kJoE1?roiKI09R z^u3am^;-x(BiKnREW#@P4lt6>&VW8d5OXHut6uULdg~mOWZyXQuo&AX4F_d_7 zeI*cc=!qGlf@y`j2&-8=$?%uN-8iUcdFR$MRqGrDi=*?|G<)Z zG6>8=ysa!7l<1ZD7ZT#?651br41}i@Vk_zGzEKzP*pP(64J!<)0@ulZW4lyvw2IJw ze*A_rF3C;u?{S|p&g{|pq8xm)$dIC5aJx+C8z_Rr|4=C5dTyNJmDY|cOo8E6>XVxi zJ8^=hjgj@0nrL9>7jtz-O|PJN%)mTKzII}^-LOe1WWMd4S8EG*GgiUW`UTjUR=8u^ z;LB53p3RC}V5#fTPH#!^@5a6Mu--mvvN9NL#5j4N{?Wv_sf1+Q4^J?caYcFvm)R;U zji4%zuoPh3IdrnQ&^~VuR}+6uWF;4|oOte&2DwZ5Mv@UBZi;=bbk$SWYb{)F?2nnk zXN}o)Ub3+~l1F>-w^A~D89Q*46_>H@6orV0>#*QDUFZ$@W`VS>6%P$FtM_PwlPxZ2#_KRo%6q+>*ee>G44W zUHR5KT0mhj7rP`o@{9C8Y9gf(`7#UFQI!(eOV5^46&JSBZo?9P?;KGRiJ{)5^XJu) z19Pn25QaEacF8X%Yr@Cb2K9;tgCZ!K8xN4nSzap~epGth+=##TSWxK``qeeu7@v=z zbk4@8%5&~jfg!m*e9iLN8_rz~1$HLSF1dM(bxFQ(fm~Vey(s1?<=!?hO#d)q9g2^Z zl2N_0mgZ~_8bCOF)5(?H#`@D?@dgF4_Anr2sK`7j0JKL74hIc*_6p6;&{E?rAG9I_ zC)dh-_4i~L2JW$H0K`BU%sg@`Bu^C!c_WCNx^bMkVIjiE@=y4(vXw{?EeBKk-&=s2a4Be+`O(hw--Pmu_(L1b9HPUZC5)CJ|Mz%3 zp1%YZb}D9vo>)|tY0$*}5m{pf%YR)x)bkCm1NForip-1vsB{@h<3=I* zV;RHzjQzsrs4)GP1HCdcXAaK4x;{o~`$m#^5rW97Gq2=X%NeS4weF6Ha|CfgS}2y0 zeGB+80P;$5)iioMlrt5LTuo%Jv_aWGrU{Up$SLIPMb9wn!H08$tfSq?QQDbaSPh%5 z2OS?6i&1POqg;EuUMiI9<;l1d#%aJS6PW^f51#U`f>|4b2$2lM&g3vy{9xS{_%PlA z)0G13pKqk>N_5PcOL#s-A!Ux1)6>Tq#_~Q;&9-byQ*VD4)2M z^J#(J)f677_zQjL`w;iA?bj>sga@`bZmp0&-t$^B`?Ze!2WSiUhbA{`x6@f(w@b%8 zszcq&Eqwj%N`wrYghOIsxX*gIfF~50LCS?h-|!mlBSD_u4!Ga+mDj~yno9z)KBlXI z238TO8~RlQSaS0=ctJion6(_rOU=N1`7|T^TV`VE5aDet2K>_3OMy($!bFp{Y{(7k zqXO`M7z7mJ&8IPXuJU8C(nD6$s={LY6f9~(+j8jLpt>FQCEi}?*}xa}gxI?7jKX!w zfSBJhU!dBUefZ7=ra@=Fcvf4bSEDR{XS?-8Oah#mWzl=6qA|M_&BZ`3H?NBVe5b!k z5D`kh8ywa^hX6v|gMEEZ156Z}6U>?8%uPuSamm~ix@zRf@o1E96R=ZW;Rd}1KzcRL zQ^sNzxe+UU$~A{=VHDW~iac^`8+h>G!gfws!sS?YWw6~Rk4_;et^Le888w+BA zQ{$sWjT_n_P27Swik;e4`4deb{BB>CW+xXxb3Jl5w#m>E*j^Joo9@YgnN=QHG@FJ@ zwCcJ7J49fl4~@yoq&pA5KkzCPjpH^_`y!XVAE8eEaMMF1V#>%df#UAEu8$AB_2()v z+Mr~wO_i;*oqnwvvX$rs-5KsIgYrJniI8p`tWd!z%YoimnQG;0t}5Fvu`ew@1@vsu zKGVJ`$4m^kv2p#^Ezp7xNXXntoB{n)qDokbx$1$8n7&_Qyewm7mp6z<_mN%o@t@Xe zIMtWzUcZN@Du;$s#gyC}rDXJ!9yA3Dd9p=JfUjH%*A<&=7=zQ8c=cMx7F#f|uL2td z(gQuhb!Am#+n9Nnbkp5;xSX#aOuw(XgPMQIy0DO#QByYQLZWJ`G-6sqA0q84AA>rt z&S#7gv^IMWgNi8MDKD{;^(nw1%Kch;+d!KBJ6UJxI`;#J_1aUvuW&ri4-QdOcbRv5 ztGgUF2?xjiScmG|$efL~R4^kN$X-Wo4Ic8tF;W`J6=jjCC+rwGSRIy=={*KIFuyZr zrbGTofuMt3-NYc6!<<9X%b5Uh2>Zyp%OQhV5R;uu9pgcqwl%8aa7c{FJL%8l&%hnT8v%d|&8)cHX zJ8R|qr;~V=lUKm;r(+Ox7rXh2Kjt+(;!a6@mgYbt${p;62Z;8=foDds@9UL>X4AWAos?!?=|z7_c}Av zb$l^|BDP6pXYGaSc{W@;Jby}Nc4ju{HH}Q9J-_bir}Tx}J#JNjP@{5`4s)?a5nXD> zor8HAM_2iif)$THk?)%DyS*Z9j4jdm@gGacmfISHoLnw`0YpIaOO(6$*qdTUMtkxN z5(#sZ9vI}Larp#S0WzSaQWq=rZdiCG)wacXcs|HEtCSA_kKMkD{dtSEe}jF@vSV*i zP2Ssn=%!8IporC}rp1HsCWb!0daLh9gMI2Z)~wiR8QReJHmB)Qx{ZRzW6re~q!N1Z zkvV=GmUe6AM_h*FQB>#$yLs8$xP{I#w3@jb;#T%SbHLt~Yz*8OgGM4(KaPuk z@VGw9D8;F+CAp0u75?oS>dpvJ)RJ0roqn%GO^g^b{ky)Rz2eorg@Rw=r^zu*Q~b?` z9r^hlYk}v%#}*GMULk{fDc=OQXHPbb9~;<9;OHn3i++)v(WHW7dp@*mude_NiyrZ`q~S&L-zV^2IoYUFstGNuGr{hhr`q)=JR{b@{~C`ID=CdQxXk zj>D5#uRqzXT}%kv^nY!RAvLXYDY_+~Ni_-N(tJIFj_44Dc|$Ww)mod3`I%^P(`iow z`29~Ir0N`;*;}@#=+;>I`eiFjVaJ#mbluS;))xY;?FwknturPmxyod!ZZ;i24~fVL zQAh>F7Nj3w`e*#?fnf9BN1AYOX^3$V;!R@x;g`RM}y_FYbdfmo&QtV zx&kITMwYM}zB)RJZ^_H_;xtb0MZbqe{9qyI#i z_->rzkqP!kkIpwjlUPuxYPsB@MH@(aPygx9X^on8XM__7EfAeQ=N$aXt$9%rvolA% zAHTRS&bLK=6JWg4p22J$ARu4$QDU;>9IaJn*#{(ovW*%2pnq;RZ;+NuyCARlW@bem z@pFb)9Qq6AjP&o5PPBhrt8cFU3ncm?F(I?CV+50+Dc#uXCXGL%4#J}-_OA)a*h0Fo@6Cl{8TxS9>bxi`-TJ?Q~7}HS;@}^x-d)Qtb{2K^LQ4V@*vSj#Y1* z?}<$2D2~0Qk1r-e%gIN=Q$Kr&QcX{2y(&|dAtCs62M0{`=H{o+P z>gZ$>udau?o&2UadzlWUnR9ldIXf7pGLnkqAlb2inO`qkt$q%IOY~K;k#4>x1Kd zCA9S$DvJ|2N4D$kzTQ5_M82|imp0G9u*gZqIoL<#iFW0w6J;>L*9#e3ECpsSsCy77 zHG{>p@ljN|0=uQopyDS|_9lE@ISI|YMBrWnVJ0ie)8fr{?uVZCi^7%lfAE?2`P{i~ zKYFq`=hAS4(6I`MboE+aj;01(#B;rPhFllw8Z1vJ*l=QVsjl_aCduY#-(o}}a6^=0 zrk<0hN0>C}+^k=gN+01E@9KYO`?;rrJgx%`)-NYy#`-rlu&k#io0Y5s zxn{5xlrk;#38`Ma&SBE_6>u!fYH5#4lKf%8fRRAO!oUh5)0dlt=hIh1$QzqHt!&4>|gg(JrH@F&Oc7^Sn1JHA5OM-EHwO{Q0aWd17a9%5uJ z!8KksjE6SVIZz*oc-K|?CG9BzlEuL)noY(U>T&uz^)6AU%>GN{4a|x3Z+%_*Y!|+A zVczDZnu(?T`tkak?zVSJi13g-M?PQA4zpB^u~pDV+Q)`x(uW_SIlK32X1=b=KfxWG zodH~O^B)&jZVlA34>~H+!1c*LDI0LRZ@~DhQ1_VrVbuDQAI`q_;V9S)g<#8b2%MER zhk+Rs_uMz5Fc2dh-ZrRk|a#qeMb3DYNIIkq1x?9?W#+Od#2F81~3a3fpaIsq=oe zZx4rzM_p@8bcDEA#$1uH&g%peaqEM?tgJZc%xG^j;RGvA{u32c>8LObCsTs!p?J?5A+GtnE^K;-9eSlRSN{L9o%Z<**Skc#I^qx3)+ebrp zTABaE8+d8kE|leVwS>e+kD`>LRHhC-SOTLmiaFrd$la2Ol$^tt3VS{iq-M=(5A(z4 z5jW30;xgnB=K9EW;>_o}gqPaiwp)1<|EuEg27gGt_^<2YiHU>?`J8bxfYi%wr}4;} zU#}RRz5V3a@YxJkkD0}O5F~Y#bl60mV6gmhB3HKIyZyB|V!2b@44YE-h0oeR$SL z{b>!q#OTBvr|7x?xpLzvB~S5TK3%iDj=#qrVY;P`!$;O-bm=DF6Sr> z5IG3?XJ}w&!k4-W^Q4|dhVvUNU*sE&8?sYVYX(XL#i%dgW!m7->i@~~Ih z^+H_K8IGoeu9}C!>$#=xlWaXsq1!uog80|WK93nwN1+9~hWc;hzb6jrXIFGtA>R!D z*evWnW2hO4vV-Uz)L3>2YocN>Yd0za1`M0rzj8i8ldIF^pFV?FB0g;1uKA)E+J>@y z{>+zpds}ubCCUX-Po^5&2%n)IU)3G&;X2sPi~IfD*+c=k0U0{zN)9YY*lLGlR$=*@ zo5zT2#r0IhpDN^C(7RD`%)44?+H++Xx<)DS`crF8nW@VR=A)g8+01vHd%4i&M7L&# zRfvmj%A-S(pM?znlMmh0l&}4P=vLL}VtTJuL%DvKy$kp$i1w6CG1(X|{?BXst#O1j z``h-fs3AyMk#dWzF$`v$!|P8dejqO$pDGZ&jb<+0xwpsn)GXsz`N2ct!@BIC)j1Q@ zneEwsk^j6h)4Zm2`kLL;&<^H2FP@7(;%{**&z6L<)Rz{ow}4?O=uG#}`Qe)tV#Nch zpXEQ+@QlvCwX~np{ggIWw}=SQsbYx*+g_Ml)YDyf`)+4o{O-S2LUzn<(N|J0M6l)I zk0j^M@e*PJWV${)n7Vu!{pRW0^WdKI@RRF+?R&peZRb_)EOs<$mBE}jNyJe0`^fpR zPg~R{GhN9Cj)Ow=i@<9@<-PvifT98F+$W0Z4^FAssnlEF_A|aFUaR)Y-4nB_*0^Sk zO;-GVGMIKpEVRoFzIJoK@|-*FQ(NqN?I+qBA8_KgC7_Y;oM+MNQ1{M%WYy}SUlKik z^#ajr*|7D0(%E|t?UpPmXVv`NLU6vYPxFCSg)0L-*NXNYhrO4~vV;EAedoQSajM&R zrz6R5e!L4dn9mzeFB-?P9@O>4$(-jXm^W+YI=6JxM^hfMWH+oY06$|B+JFC?^ zo>ui|-*r1=0`5!xi<$PbtDfR6Kg1%Qlv%SzgK4gI@d7Ok!28QvnVyqUTP=rd>TeXs zWipuRvJP$jss1}2y8K+@yofuZ^eY&%w@;f0pe+6l@Y?kWA+ze#L3r#)VIragtkv|S zrFNv=d#Q+7H0AlNU=w`*^pVEU-d*1FHOsTmmi4nGoElEI>gqrH;98lFW2#@yP^TE1 zObCc?V~hB3B#iG`haVipWni9;0)v__+n23t*%}qU>XS=uot^;JG+)jg5c&IWcy_t( zPQ0M^W7=YQz`@2;+)+s#q+R})c%eJTaIyPBQ!e@KO4J~ytkS8d&VmaX=vlKMBG9sK zwDYp1tbTjLGD~IKLjC1#kWAiye2Vr%(O(#N_pOwWh|-6Ib+O7?eU&TKDC4}}jnxtu zrtquDMu#cPCvQ<)Hz~+r$}?nNBgopWC&&7bKSeL2lsql^9BerFMQ1TI zCL8wj0VB7$vCJd~{7$GPChbSQi7E9`7W1J1!v>FQ7`QUrChs*Ai}W-Zf!cDmf;R}F zx*`3lEHx+J;D0SQ|3Iv6Z`U|l3|b4cq_-7ZT5Gv0 zKljmO`Ep>=j)roQhMav0+aF8|H#E3o+Dxlc3e8YtdbHhI4o%N2-Gtqx|C)u5o%x;F z-~o|QdG@zVy@1-~oPfwQO7IL=d<2RdJLq9>c$>>*MA)C7c8WgQ`mADgmjwKkyUc1~ zMA(io6bjru``;4(l371DUeV9k(hu3G95?6p-o}I$V&dccoPQ5|KKe;7PX6~fKU}C` z*jV!}zurAUeJ6%BAa9`bcA+}#X(v=!F;$sKk!tJ{FqvcUT;SigMQ!bwn1?(%fAM5qz z{GWcE0rLD?-2xJyx_I}|JHvcutu2elDeT@Iv#pig&(<>RKaljG`P-T+8=K0^ZByx;l(QBj!hvBH+GJZ6S@FOuJ5x~|k6)I>~Adql+cHx-eN^Muuf{5hdPYaUhB zz-!oz8y8Y7<(oG1JkDP#G`-h2_-yLMRq0-*M*D7kjlWYc^YyA?7G%oBm>)TL{i>z@ zYE1$_<|Aj`lispecuj!%1NgEiRQS`O`qE{M0(YzJ2us5p;l7!mBFPE$ zP8rP!dHm@Kqf2w&l32ge{ zBQ{x?df(K2EsXVZ;LKv|;R9Us8<3o@kh*ipX`Gx!R}}-94Jf( zEjJp?lbe|k>H_F189Y-<^y@6#<6%4!K?VBneAh;W9X^zoF&I#|8FIQNW(K~VD~
Z`WVNNrxr%-xxjv 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�Mgs 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 z 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 z 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%0DKHlCI9HJ7VYb#5pN97P#WcXI% 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

bdE)gsXMnX)jf8_7xVfOevLTs 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

!L8Xxf?7sGn|Lfg5G~izM%RzyCpghrICe*uo0x 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¨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 z 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