UNPKG

@huggingface/transformers

Version:

State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server!

74 lines (66 loc) • 2.18 kB
import { PreTrainedModel, decoder_forward } from '../modeling_utils.js'; import { sessionRun } from '../session.js'; import { Tensor } from '../../utils/tensor.js'; export class Phi3VPreTrainedModel extends PreTrainedModel { forward_params = [ 'input_ids', 'inputs_embeds', 'attention_mask', 'position_ids', 'pixel_values', 'image_sizes', 'past_key_values', ]; } export class Phi3VForCausalLM extends Phi3VPreTrainedModel { async forward({ // Produced by the tokenizer/processor: input_ids = null, attention_mask = null, pixel_values = null, image_sizes = null, // Used during generation: position_ids = null, inputs_embeds = null, past_key_values = null, // Generic generation parameters generation_config = null, logits_processor = null, // TODO: needed? ...kwargs }) { if (!inputs_embeds) { let image_features; if (pixel_values && input_ids.dims[1] !== 1) { if (!image_sizes) { throw new Error('`image_sizes` must be provided when `pixel_values` is provided.'); } // Encode the image ({ image_features } = await sessionRun(this.sessions['vision_encoder'], { pixel_values, image_sizes, })); } else { const hidden_size = this.config.normalized_config.hidden_size; image_features = new Tensor('float32', [], [0, hidden_size]); } ({ inputs_embeds } = await sessionRun(this.sessions['prepare_inputs_embeds'], { input_ids, image_features, })); } const outputs = await decoder_forward( this, { inputs_embeds, past_key_values, attention_mask, position_ids, generation_config, logits_processor, }, false, ); return outputs; } }