文号
942433
阅读
1945
回复
0
收藏
0
本文包含AI生成内容,并经过作者严格考据审查,作者对AI生成内容的品质和可靠性负责。
一种新的机器翻译与人工智能的实验
2025/03/02
原创
IP:美国
摘要:在大模型中放个小模型,让数据流经这个小模型,而小模型是在使用的时候边用边训练的,所以会储存以前输入的信息,从而让大模型有了记忆,可以叫“记忆力机制”。而清空历史时,可以让记忆清空,这种机制大幅提高了性能,未来理论上可以打破对话轮数限制),或许能有点用。


  最近,deepseek火了,deepseek有很强的逻辑能力,可以进行简单的编程。所以我就让deepseek写了个人工智能的代码(一方面python水平不好,一方面人工智能写人工智能很好玩),修改了一下通义千问(Qwen)2的代码(电脑显卡比较拉,所以只部署了Qwen2.5-1.5B,选择这个模型也是因为大小),在里面加入了一个新的结构,从而提高了性能。我的方法就是在大模型中放个小模型,让数据流经这个小模型,而小模型是在使用的时候边用边训练的,所以会储存以前输入的信息,从而让大模型有了记忆,可以叫“记忆力机制”。而清空历史时,可以让记忆清空,这种机制大幅提高了性能,未来理论上可以打破对话轮数限制(开发中),或许能有点用。


代码在这里:

# 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨

# This file was automatically generated from src/transformers/models/qwen2/modular_XXXXXXXXXXXXXXX.

# Do NOT edit this file manually as any edits will be overwritten by the generation of

# the file from the modular. If any change should be done, please apply the change to the

# modular_XXXXXXXXXXXXXXX file directly. One of our CI enforces this.

# 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨

from typing import Callable, List, Optional, Tuple, Union

import torch

from torch import nn

from ...activations import ACT2FN

from ...cache_utils import Cache, DynamicCache, SlidingWindowCache, StaticCache

from ...generation import GenerationMixin

from ...modeling_attn_mask_utils import AttentionMaskConverter

from ...modeling_flash_attention_utils import FlashAttentionKwargs

from ...modeling_outputs import (

BaseModelOutputWithPast,

CausalLMOutputWithPast,

QuestionAnsweringModelOutput,

SequenceClassifierOutputWithPast,

TokenClassifierOutput,

)

from ...modeling_rope_utils import ROPE_INIT_FUNCTIONS

from ...modeling_utils import ALL_ATTENTION_FUNCTIONS, PreTrainedModel

from ...processing_utils import Unpack

from ...utils import (

LossKwargs,

add_code_sample_docstrings,

add_start_docstrings,

add_start_docstrings_to_model_forward,

logging,

replace_return_docstrings,

)

from ...utils.deprecation import deprecate_kwarg

from .configuration_qwen2 import Qwen2Config

logger = logging.get_logger(__name__)

CHECKPOINTFOR_DOC = "meta-qwen2/Qwen2-2-7b-hf"

CONFIGFOR_DOC = "Qwen2Config"

class Qwen2MLP(nn.Module):

def init(self, config):

super().__init__()

self.config = config

self.hidden_size = config.hidden_size

self.intermediate_size = config.intermediate_size

self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False)

self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False)

self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False)

self.act_fn = ACT2FN[config.hidden_act]

def forward(self, x):

down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))

return down_proj

def rotate_half(x):

"""Rotates half the hidden dims of the input."""

x1 = x[..., : x.shape[-1] // 2]

x2 = x[..., x.shape[-1] // 2 :]

return XXXXXXXXXXXXXXXX((-x2, x1), dim=-1)

def apply_rotary_pos_emb(q, k, cos, sin, position_ids=None, unsqueeze_dim=1):

"""Applies Rotary Position Embedding to the query and key tensors.

Args:

q (`torch.Tensor`): The query tensor.

k (`torch.Tensor`): The key tensor.

cos (`torch.Tensor`): The cosine part of the rotary embedding.

sin (`torch.Tensor`): The sine part of the rotary embedding.

position_ids (`torch.Tensor`, optional):

Deprecated and unused.

unsqueeze_dim (`int`, optional, defaults to 1):

The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and

sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note

that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and

k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes

cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have

the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.

Returns:

tuple(torch.Tensor) comprising of the query and key tensors rotated using the Rotary Position Embedding.

"""

cos = cos.unsqueeze(unsqueeze_dim)

sin = sin.unsqueeze(unsqueeze_dim)

q_embed = (q cos) + (rotate_half(q) sin)

k_embed = (k cos) + (rotate_half(k) sin)

return q_embed, k_embed

def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor:

"""

This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,

num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)

"""

batch, num_key_value_heads, slen, head_dim = hidden_states.shape

if n_rep == 1:

return hidden_states

hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim)

return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim)

def eager_attention_forward(

module: nn.Module,

query: torch.Tensor,

key: torch.Tensor,

value: torch.Tensor,

attention_mask: Optional[torch.Tensor],

scaling: float,

dropout: float = 0.0,

**kwargs,

):

key_states = repeat_kv(key, module.num_key_value_groups)

value_states = repeat_kv(value, module.num_key_value_groups)

attn_weights = torch.matmul(query, key_states.transpose(2, 3)) * scaling

if attention_mask is not None:

causal_mask = attention_mask[:, :, :, : key_states.shape[-2]]

attn_weights = attn_weights + causal_mask

attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query.dtype)

attn_weights = nn.functional.dropout(attn_weights, p=dropout, training=XXXXXXXXXXXXXXXXXXXXXX)

attn_output = torch.matmul(attn_weights, value_states)

attn_output = attn_output.transpose(1, 2).contiguous()

return attn_output, attn_weights

class Qwen2Attention(nn.Module):

"""Multi-headed attention from 'Attention Is All You Need' paper"""

def init(self, config: Qwen2Config, layer_idx: int):

super().__init__()

self.config = config

self.layer_idx = layer_idx

self.head_dim = getattr(config, "head_dim", config.hidden_size // config.num_attention_heads)

self.num_key_value_groups = config.num_attention_heads // config.num_key_value_heads

self.scaling = self.head_dim**-0.5

self.attention_dropout = config.attention_dropout

XXXXXXXXXXXXXX_causal = True

self.q_proj = nn.Linear(config.hidden_size, config.num_attention_heads * self.head_dim, bias=True)

self.k_proj = nn.Linear(config.hidden_size, config.num_key_value_heads * self.head_dim, bias=True)

self.v_proj = nn.Linear(config.hidden_size, config.num_key_value_heads * self.head_dim, bias=True)

self.o_proj = nn.Linear(config.num_attention_heads * self.head_dim, config.hidden_size, bias=False)

def forward(

self,

hidden_states: torch.Tensor,

position_embeddings: Tuple[torch.Tensor, torch.Tensor],

attention_mask: Optional[torch.Tensor],

past_key_value: Optional[Cache] = None,

cache_position: Optional[torch.LongTensor] = None,

**kwargs: Unpack[FlashAttentionKwargs],

) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:

input_shape = hidden_states.shape[:-1]

hidden_shape = (*input_shape, -1, self.head_dim)

query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2)

key_states = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2)

value_states = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2)

cos, sin = position_embeddings

query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)

if past_key_value is not None:

# sin and cos are specific to RoPE models; cache_position needed for the static cache

cache_kwargs = {"sin": sin, "cos": cos, "cache_position": cache_position}

key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)

sliding_window = None

if (

self.config.use_sliding_window

and getattr(self.config, "sliding_window", None) is not None

and self.layer_idx >= self.config.max_window_layers

):

sliding_window = self.config.sliding_window

attention_interface: Callable = eager_attention_forward

if self.config._attn_implementation != "eager":

if self.config._attn_implementation == "sdpa" and kwargs.get("output_attentions", False):

logger.warning_once(

"`torch.nn.functional.scaled_dot_product_attention` does not support output_attentions=True. Falling back to "

'eager attention. This warning can be removed using the argument attn_implementation="eager" when loading the model.'

)

else:

attention_interface = ALL_ATTENTION_FUNCTIONS[self.config._attn_implementation]

attn_output, attn_weights = attention_interface(

self,

query_states,

key_states,

value_states,

attention_mask,

dropout=0.0 if not XXXXXXXXXXXXXXXXXXXX else self.attention_dropout,

scaling=self.scaling,

sliding_window=sliding_window, # main diff with Llama

**kwargs,

)

attn_output = attn_output.reshape(*input_shape, -1).contiguous()

attn_output = self.o_proj(attn_output)

return attn_output, attn_weights

class Qwen2RMSNorm(nn.Module):

def init(self, hidden_size, eps=1e-6):

"""

Qwen2RMSNorm is equivalent to T5LayerNorm

"""

super().__init__()

self.weight = nn.Parameter(torch.ones(hidden_size))

self.variance_epsilon = eps

def forward(self, hidden_states):

input_dtype = hidden_states.dtype

hidden_states = hidden_XXXXXXXXXXXXXXXX(torch.float32)

variance = hidden_states.pow(2).mean(-1, keepdim=True)

hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)

return self.weight * hidden_XXXXXXXXXXXXXXXX(input_dtype)

def extra_repr(self):

return f"{tuple(self.weight.shape)}, eps={self.variance_epsilon}"

class Qwen2DecoderLayer(nn.Module):

def init(self, config: Qwen2Config, layer_idx: int):

super().__init__()

self.hidden_size = config.hidden_size

self.self_attn = Qwen2Attention(config=config, layer_idx=layer_idx)

self.mlp = Qwen2MLP(config)

self.input_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)

XXXXXXXXXXXXXXXX_attention_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)

if config.sliding_window and config._attn_implementation != "flash_attention_2":

logger.warning_once(

f"Sliding Window Attention is enabled but not implemented for {config._attn_implementation}; "

"unexpected results may be encountered."

)

def forward(

self,

hidden_states: torch.Tensor,

attention_mask: Optional[torch.Tensor] = None,

position_ids: Optional[torch.LongTensor] = None,

past_key_value: Optional[Cache] = None,

output_attentions: Optional[bool] = False,

use_cache: Optional[bool] = False,

cache_position: Optional[torch.LongTensor] = None,

position_embeddings: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, # necessary, but kept here for BC

**kwargs: Unpack[FlashAttentionKwargs],

) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]:

residual = hidden_states

hidden_states = self.input_layernorm(hidden_states)

# Self Attention

hidden_states, self_attn_weights = self.self_attn(

hidden_states=hidden_states,

attention_mask=attention_mask,

position_ids=position_ids,

past_key_value=past_key_value,

output_attentions=output_attentions,

use_cache=use_cache,

cache_position=cache_position,

position_embeddings=position_embeddings,

**kwargs,

)

hidden_states = residual + hidden_states

# Fully Connected

residual = hidden_states

hidden_states = XXXXXXXXXXXXXXXX_attention_layernorm(hidden_states)

hidden_states = self.mlp(hidden_states)

hidden_states = residual + hidden_states

outputs = (hidden_states,)

if output_attentions:

outputs += (self_attn_weights,)

return outputs

class Qwen2RotaryEmbedding(nn.Module):

def init(self, config: Qwen2Config, device=None):

super().__init__()

# BC: "rope_type" was originally "type"

if hasattr(config, "rope_scaling") and config.rope_scaling is not None:

self.rope_type = config.rope_scaling.get("rope_type", config.rope_scaling.get("type"))

else:

self.rope_type = "default"

self.max_seq_len_cached = config.max_position_embeddings

self.original_max_seq_len = config.max_position_embeddings

self.config = config

self.rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type]

inv_freq, self.attention_scaling = self.rope_init_fn(self.config, device)

self.register_buffer("inv_freq", inv_freq, persistent=False)

self.original_inv_freq = self.inv_freq

def dynamicfrequency_update(self, position_ids, device):

"""

dynamic RoPE layers should recompute inv_freq in the following situations:

1 - growing beyond the cached sequence length (allow scaling)

2 - the current sequence length is in the original scale (avoid losing precision with small sequences)

"""

seq_len = torch.max(position_ids) + 1

if seq_len > self.max_seq_len_cached: # growth

inv_freq, self.attention_scaling = self.rope_init_fn(self.config, device, seq_len=seq_len)

self.register_buffer("inv_freq", inv_freq, persistent=False) # TODO joao: may break with compilation

self.max_seq_len_cached = seq_len

if seq_len < self.original_max_seq_len and self.max_seq_len_cached > self.original_max_seq_len: # reset

# This .to() is needed if the model has been moved to a device after being initialized (because

# the buffer is automatically moved, but not the original copy)

self.original_inv_freq = self.original_inv_XXXXXXXXXXXXXX(device)

self.register_buffer("inv_freq", self.original_inv_freq, persistent=False)

self.max_seq_len_cached = self.original_max_seq_len

@XXXXXXXXXXXXXXX_grad()

def forward(self, x, position_ids):

if "dynamic" in self.rope_type:

self._dynamic_frequency_update(position_ids, device=x.device)

# Core RoPE block

inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1)

position_ids_expanded = position_ids[:, None, :].float()

# Force float32 (see XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)

device_type = x.device.type

device_type = device_type if isinstance(device_type, str) and device_type != "mps" else "cpu"

with torch.autocast(device_type=device_type, enabled=False):

freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2)

emb = XXXXXXXXXXXXXXXX((freqs, freqs), dim=-1)

cos = emb.cos()

sin = emb.sin()

# Advanced RoPE types (e.g. yarn) apply a post-processing scaling factor, equivalent to scaling attention

cos = cos * self.attention_scaling

sin = sin * self.attention_scaling

return XXXXXXXXXXXXX(dtype=x.dtype), XXXXXXXXXXXXX(dtype=x.dtype)

QWEN2_START_DOCSTRING = r"""

This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the

library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads

etc.)

This model is also a PyTorch [torch.nn.Module](XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX) subclass.

Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage

and behavior.

Parameters:

config ([`Qwen2Config`]):

Model configuration class with all the parameters of the model. Initializing with a config file does not

load the weights associated with the model, only the configuration. Check out the

[`~PreTrainedModel.from_pretrained`] method to load the model weights.

"""

@add_start_docstrings(

"The bare Qwen2 Model outputting raw hidden-states without any specific head on top.",

QWEN2_START_DOCSTRING,

)

class Qwen2PreTrainedModel(PreTrainedModel):

config_class = Qwen2Config

base_model_prefix = "model"

supports_gradient_checkpointing = True

nosplit_modules = ["Qwen2DecoderLayer"]

skipkeys_device_placement = ["past_key_values"]

supportsflash_attn_2 = True

supportssdpa = True

supportsflex_attn = True

supportscache_class = True

supportsquantized_cache = True

supportsstatic_cache = True

supportsattention_backend = True

def initweights(self, module):

std = self.config.initializer_range

if isinstance(module, nn.Linear):

XXXXXXXXXXXXXXXXXXXXXXXXX.normal_(mean=0.0, std=std)

if module.bias is not None:

XXXXXXXXXXXXXXXXXXXXXXXXXXXX_()

elif isinstance(module, nn.Embedding):

XXXXXXXXXXXXXXXXXXXXXXXXX.normal_(mean=0.0, std=std)

if module.padding_idx is not None:

XXXXXXXXXXXXXXXXXXXXXXXXX[module.padding_idx].zero_()

QWEN2_INPUTS_DOCSTRING = r"""

Args:

input_ids (`torch.LongTensor` of shape (batch_size, sequence_length)):

Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide

it.

Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and

[`PreTrainedTokenizer.__call__`] for details.

[What are input IDs?](../glossary#input-ids)

attention_mask (`torch.Tensor` of shape (batch_size, sequence_length), optional):

Mask to avoid performing attention on padding token indices. Mask values selected in [0, 1]:

- 1 for tokens that are not masked,

- 0 for tokens that are masked.

[What are attention masks?](../glossary#attention-mask)

Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and

[`PreTrainedTokenizer.__call__`] for details.

If past_key_values is used, optionally only the last input_ids have to be input (see

past_key_values).

If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`]

and modify to your needs. See diagram 1 in [the paper](XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX) for more

information on the default strategy.

- 1 indicates the head is not masked,

- 0 indicates the head is masked.

position_ids (`torch.LongTensor` of shape (batch_size, sequence_length), optional):

Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,

config.n_positions - 1]`.

[What are position IDs?](../glossary#position-ids)

past_key_values (`Cache` or tuple(tuple(torch.FloatTensor)), optional):

Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention

blocks) that can be used to speed up sequential decoding. This typically consists in the past_key_values

returned by the model at a previous stage of decoding, when use_cache=True or config.use_cache=True.

Two formats are allowed:

- a [`~cache_utils.Cache`] instance, see our

[kv cache guide](XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX);

- Tuple of tuple(torch.FloatTensor) of length config.n_layers, with each tuple having 2 tensors of

shape (batch_size, num_heads, sequence_length, embed_size_per_head)). This is also known as the legacy

cache format.

The model will output the same cache format that is fed as input. If no past_key_values are passed, the

legacy cache format will be returned.

If past_key_values are used, the user can optionally input only the last input_ids (those that don't

have their past key value states given to this model) of shape (batch_size, 1) instead of all input_ids

of shape (batch_size, sequence_length).

inputs_embeds (`torch.FloatTensor` of shape (batch_size, sequence_length, hidden_size), optional):

Optionally, instead of passing input_ids you can choose to directly pass an embedded representation. This

is useful if you want more control over how to convert input_ids indices into associated vectors than the

model's internal embedding lookup matrix.

use_cache (`bool`, optional):

If set to True, past_key_values key value states are returned and can be used to speed up decoding (see

past_key_values).

output_attentions (`bool`, optional):

Whether or not to return the attentions tensors of all attention layers. See attentions under returned

tensors for more detail.

output_hidden_states (`bool`, optional):

Whether or not to return the hidden states of all layers. See hidden_states under returned tensors for

more detail.

return_dict (`bool`, optional):

Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.

cache_position (`torch.LongTensor` of shape (sequence_length), optional):

Indices depicting the position of the input sequence tokens in the sequence. Contrarily to position_ids,

this tensor is not affected by padding. It is used to update the cache in the correct position and to infer

the complete sequence length.

"""

@add_start_docstrings(

"The bare Qwen2 Model outputting raw hidden-states without any specific head on top.",

QWEN2_START_DOCSTRING,

)

class Qwen2Model(Qwen2PreTrainedModel):

def init(self, config: Qwen2Config):

super().__init__(config)

self.padding_idx = config.pad_token_id

self.vocab_size = config.vocab_size

self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)

self.layers = nn.ModuleList(

[Qwen2DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]

)

self.norm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)

self.rotary_emb = Qwen2RotaryEmbedding(config=config)

self.gradient_checkpointing = False

self.small_model = nn.Sequential(

nn.Linear(config.hidden_size, config.hidden_size, bias=False),

nn.ReLU(),

nn.Linear(config.hidden_size, config.hidden_size, bias=False),

nn.ReLU(),

nn.Linear(config.hidden_size, config.hidden_size, bias=False)

)

# 保存初始权重(用于重置)

self.register_buffer(

"small_model_init_weights",

torch.stack([layer.weight.clone() for layer in self.small_model

if isinstance(layer, nn.Linear)])

)

# 正交初始化

for layer in self.small_model:

if isinstance(layer, nn.Linear):

nn.init.orthogonal_(layer.weight)

############### 新增小模型部分 ###############

# 定义三层正交小模型

self.small_model = nn.Sequential(

nn.Linear(config.hidden_size, config.hidden_size, bias=False),

nn.ReLU(),

nn.Linear(config.hidden_size, config.hidden_size, bias=False),

nn.ReLU(),

nn.Linear(config.hidden_size, config.hidden_size, bias=False)

)

# 初始化权重并保存初始状态

self._init_small_model_weights()

self.register_buffer('small_model_init_weights',

torch.stack([layer.weight.clone() for layer in self.small_model

if isinstance(layer, nn.Linear)]))

#############################################

# 初始化权重并应用最终处理

XXXXXXXXXXXXXXXX_init()

def initsmall_model_weights(self):

"""初始化小模型权重为正交矩阵"""

with XXXXXXXXXXXXXXX_grad():

for layer in self.small_model:

if isinstance(layer, nn.Linear):

nn.init.orthogonal_(layer.weight)

def reset_small_model(self, mode: str = 'reinit'):

"""

重置小模型状态

mode:

'reinit' - 重新正交初始化

'original' - 恢复初始保存的权重

"""

if mode == 'reinit':

self._init_small_model_weights()

elif mode == 'original' and hasattr(self, 'small_model_init_weights'):

with XXXXXXXXXXXXXXX_grad():

for i, layer in enumerate(self.small_model):

if isinstance(layer, nn.Linear):

layer.weight.copy_(self.small_model_init_weights[i])

@add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING)

def forward(

self,

input_ids: torch.LongTensor = None,

attention_mask: Optional[torch.Tensor] = None,

position_ids: Optional[torch.LongTensor] = None,

past_key_values: Optional[Cache] = None,

inputs_embeds: Optional[torch.FloatTensor] = None,

use_cache: Optional[bool] = None,

output_attentions: Optional[bool] = None,

output_hidden_states: Optional[bool] = None,

return_dict: Optional[bool] = None,

cache_position: Optional[torch.LongTensor] = None,

**flash_attn_kwargs: Unpack[FlashAttentionKwargs],

) -> Union[Tuple, BaseModelOutputWithPast]:

# ...保持原有参数处理逻辑不变...

if inputs_embeds is None:

inputs_embeds = self.embed_tokens(input_ids)

############### 数据流经小模型 ###############

inputs_embeds = self.small_model(inputs_embeds)

#############################################

def init(self, config: Qwen2Config):

super().__init__(config)

self.padding_idx = config.pad_token_id

self.vocab_size = config.vocab_size

self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)

self.layers = nn.ModuleList(

[Qwen2DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]

)

self.norm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)

self.rotary_emb = Qwen2RotaryEmbedding(config=config)

self.gradient_checkpointing = False

# Initialize weights and apply final processing

XXXXXXXXXXXXXXXX_init()

def get_input_embeddings(self):

return self.embed_tokens

def set_input_embeddings(self, value):

self.embed_tokens = value

@add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING)

def forward(

self,

input_ids: torch.LongTensor = None,

attention_mask: Optional[torch.Tensor] = None,

position_ids: Optional[torch.LongTensor] = None,

past_key_values: Optional[Cache] = None,

inputs_embeds: Optional[torch.FloatTensor] = None,

use_cache: Optional[bool] = None,

output_attentions: Optional[bool] = None,

output_hidden_states: Optional[bool] = None,

return_dict: Optional[bool] = None,

cache_position: Optional[torch.LongTensor] = None,

**flash_attn_kwargs: Unpack[FlashAttentionKwargs],

) -> Union[Tuple, BaseModelOutputWithPast]:

output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions

output_hidden_states = (

output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states

)

use_cache = use_cache if use_cache is not None else self.config.use_cache

return_dict = return_dict if return_dict is not None else self.config.use_return_dict

if (input_ids is None) ^ (inputs_embeds is not None):

raise ValueError("You must specify exactly one of input_ids or inputs_embeds")

if self.gradient_checkpointing and XXXXXXXXXXXXXXXXXXXX and use_cache:

logger.warning_once(

"`use_cache=True` is incompatible with gradient checkpointing. Setting use_cache=False."

)

use_cache = False

if inputs_embeds is None:

inputs_embeds = self.embed_tokens(input_ids)

if use_cache and past_key_values is None:

past_key_values = DynamicCache()

if cache_position is None:

past_seen_tokens = past_key_values.get_seq_length() if past_key_values is not None else 0

cache_position = torch.arange(

past_seen_tokens, past_seen_tokens + inputs_embeds.shape[1], device=inputs_embeds.device

)

if position_ids is None:

position_ids = cache_position.unsqueeze(0)

causal_mask = self._update_causal_mask(

attention_mask, inputs_embeds, cache_position, past_key_values, output_attentions

)

hidden_states = inputs_embeds

# create position embeddings to be shared across the decoder layers

position_embeddings = self.rotary_emb(hidden_states, position_ids)

# decoder layers

all_hidden_states = () if output_hidden_states else None

all_self_attns = () if output_attentions else None

for decoder_layer in self.layers[: self.config.num_hidden_layers]:

if output_hidden_states:

all_hidden_states += (hidden_states,)

if self.gradient_checkpointing and XXXXXXXXXXXXXXXXXXXX:

layer_outputs = self._gradient_checkpointing_func(

decoder_layer.__call__,

hidden_states,

causal_mask,

position_ids,

past_key_values,

output_attentions,

use_cache,

cache_position,

position_embeddings,

)

else:

layer_outputs = decoder_layer(

hidden_states,

attention_mask=causal_mask,

position_ids=position_ids,

past_key_value=past_key_values,

output_attentions=output_attentions,

use_cache=use_cache,

cache_position=cache_position,

position_embeddings=position_embeddings,

**flash_attn_kwargs,

)

hidden_states = layer_outputs[0]

if output_attentions:

all_self_attns += (layer_outputs[1],)

hidden_states = self.norm(hidden_states)

# add hidden states from the last decoder layer

if output_hidden_states:

all_hidden_states += (hidden_states,)

output = BaseModelOutputWithPast(

last_hidden_state=hidden_states,

past_key_values=past_key_values if use_cache else None,

hidden_states=all_hidden_states,

attentions=all_self_attns,

)

return output if return_dict else XXXXXXXXXXXXXXXX_tuple()

# 原始嵌入层处理

inputs_embeds = self.embed_tokens(input_ids)

# 新增:数据流经小模型

transformed_embeds = self.small_model(inputs_embeds)

# 将处理后的嵌入传递给后续层

return super().forward(

input_ids=None, # 禁用原始input_ids处理

inputs_embeds=transformed_embeds,

**kwargs

)

def updatecausal_mask(

self,

attention_mask: torch.Tensor,

input_tensor: torch.Tensor,

cache_position: torch.Tensor,

past_key_values: Cache,

output_attentions: bool,

):

if self.config._attn_implementation == "flash_attention_2":

if attention_mask is not None and past_key_values is not None:

is_padding_right = attention_mask[:, -1].sum().item() != input_tensor.size()[0]

if is_padding_right:

raise ValueError(

"You are attempting to perform batched generation with padding_side='right'"

" this may lead to unexpected behaviour for Flash Attention version of Qwen2. Make sure to "

" call tokenizer.padding_side = 'left' before tokenizing the input. "

)

if attention_mask is not None and 0.0 in attention_mask:

return attention_mask

return None

# For SDPA, when possible, we will rely on its is_causal argument instead of its attn_mask argument, in

# order to dispatch on Flash Attention 2. This feature is not compatible with static cache, as SDPA will fail

# to infer the attention mask.

past_seen_tokens = past_key_values.get_seq_length() if past_key_values is not None else 0

using_static_cache = isinstance(past_key_values, StaticCache)

using_sliding_window_cache = isinstance(past_key_values, SlidingWindowCache)

# When output attentions is True, sdpa implementation's forward method calls the eager implementation's forward

if (

self.config._attn_implementation == "sdpa"

and not (using_static_cache or using_sliding_window_cache)

and not output_attentions

):

if AttentionMaskConverter._ignore_causal_mask_sdpa(

attention_mask,

inputs_embeds=input_tensor,

past_key_values_length=past_seen_tokens,

sliding_window=self.config.sliding_window,

is_training=XXXXXXXXXXXXXXXXXXXX,

):

return None

dtype, device = input_tensor.dtype, input_tensor.device

min_dtype = torch.finfo(dtype).min

sequence_length = input_tensor.shape[1]

# SlidingWindowCache or StaticCache

if using_sliding_window_cache or using_static_cache:

target_length = past_key_values.get_max_cache_shape()

# DynamicCache or no cache

else:

target_length = (

attention_mask.shape[-1]

if isinstance(attention_mask, torch.Tensor)

else past_seen_tokens + sequence_length + 1

)

# In case the provided attention mask is 2D, we generate a causal mask here (4D).

causal_mask = self._prepare_4d_causal_attention_mask_with_cache_position(

attention_mask,

sequence_length=sequence_length,

target_length=target_length,

dtype=dtype,

device=device,

cache_position=cache_position,

batch_size=input_tensor.shape[0],

config=self.config,

past_key_values=past_key_values,

)

if (

self.config._attn_implementation == "sdpa"

and attention_mask is not None

and attention_mask.device.type in ["cuda", "xpu"]

and not output_attentions

):

# Attend to all tokens in fully masked rows in the causal_mask, for example the relevant first rows when

# using left padding. This is required by F.scaled_dot_product_attention memory-efficient attention path.

# Details: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

causal_mask = AttentionMaskConverter._unmask_unattended(causal_mask, min_dtype)

return causal_mask

@staticmethod

def prepare4d_causal_attention_mask_with_cache_position(

attention_mask: torch.Tensor,

sequence_length: int,

target_length: int,

dtype: torch.dtype,

device: torch.device,

cache_position: torch.Tensor,

batch_size: int,

config: Qwen2Config,

past_key_values: Cache,

):

"""

Creates a causal 4D mask of shape (batch_size, 1, query_length, key_value_length) from a 2D mask of shape

(batch_size, key_value_length), or if the input attention_mask is already 4D, do nothing.

Args:

attention_mask (`torch.Tensor`):

A 2D attention mask of shape (batch_size, key_value_length) or a 4D attention mask of shape (batch_size, 1, query_length, key_value_length).

sequence_length (`int`):

The sequence length being processed.

target_length (`int`):

The target length: when generating with static cache, the mask should be as long as the static cache, to account for the 0 padding, the part of the cache that is not filled yet.

dtype (`torch.dtype`):

The dtype to use for the 4D attention mask.

device (`torch.device`):

The device to plcae the 4D attention mask on.

cache_position (`torch.Tensor`):

Indices depicting the position of the input sequence tokens in the sequence.

batch_size (`torch.Tensor`):

Batch size.

config (`Qwen2Config`):

The model's configuration class

past_key_values (`Cache`):

The cache class that is being used currently to generate

"""

if attention_mask is not None and attention_mask.dim() == 4:

# In this case we assume that the mask comes already in inverted form and requires no inversion or slicing.

causal_mask = attention_mask

else:

min_dtype = torch.finfo(dtype).min

causal_mask = torch.full(

(sequence_length, target_length), fill_value=min_dtype, dtype=dtype, device=device

)

diagonal_attend_mask = torch.arange(target_length, device=device) > cache_position.reshape(-1, 1)

if config.sliding_window is not None:

# if we have sliding window, we should not attend to tokens beyond sliding window length, so we mask them out also

# the check is needed to verify is current checkpoint was trained with sliding window or not

if not isinstance(past_key_values, SlidingWindowCache) or sequence_length > target_length:

sliding_attend_mask = torch.arange(target_length, device=device) <= (

cache_position.reshape(-1, 1) - config.sliding_window

)

diagonal_attend_mask.bitwise_or_(sliding_attend_mask)

causal_mask *= diagonal_attend_mask

causal_mask = causal_mask[None, None, :, :].expand(batch_size, 1, -1, -1)

if attention_mask is not None:

causal_mask = causal_mask.clone() # copy to contiguous memory for in-place edit

if attention_mask.shape[-1] > target_length:

attention_mask = attention_mask[:, :target_length]

mask_length = attention_mask.shape[-1]

padding_mask = causal_mask[:, :, :, :mask_length] + attention_mask[:, None, None, :].to(

causal_mask.device

)

padding_mask = padding_mask == 0

causal_mask[:, :, :, :mask_length] = causal_mask[:, :, :, :mask_length].masked_fill(

padding_mask, min_dtype

)

return causal_mask

def reset_small_model(self, mode: str = 'reinit'):

"""

重置小模型权重

mode:

'reinit' - 重新正交初始化

'original' - 恢复初始权重

"""

with XXXXXXXXXXXXXXX_grad():

for i, layer in enumerate(self.small_model):

if isinstance(layer, nn.Linear):

if mode == 'reinit':

nn.init.orthogonal_(layer.weight)

elif mode == 'original':

layer.weight.copy_(self.small_model_init_weights[i])

class KwargsForCausalLM(FlashAttentionKwargs, LossKwargs): ...

class Qwen2ForCausalLM(Qwen2PreTrainedModel, GenerationMixin):

tiedweights_keys = ["lm_head.weight"]

tpplan = {"lm_head": "colwise_rep"}

ppplan = {"lm_head": (["hidden_states"], ["logits"])}

def init(self, config):

super().__init__(config)

self.model = Qwen2Model(config)

self.vocab_size = config.vocab_size

self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)

# Initialize weights and apply final processing

XXXXXXXXXXXXXXXX_init()

def get_input_embeddings(self):

return self.model.embed_tokens

def set_input_embeddings(self, value):

self.model.embed_tokens = value

def get_output_embeddings(self):

return self.lm_head

def set_output_embeddings(self, new_embeddings):

self.lm_head = new_embeddings

def set_decoder(self, decoder):

self.model = decoder

def get_decoder(self):

return self.model

@deprecate_kwarg("num_logits_to_keep", version="4.50", new_name="logits_to_keep")

@add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING)

@replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC)

def forward(

self,

input_ids: torch.LongTensor = None,

attention_mask: Optional[torch.Tensor] = None,

position_ids: Optional[torch.LongTensor] = None,

past_key_values: Optional[Union[Cache, List[torch.FloatTensor]]] = None,

inputs_embeds: Optional[torch.FloatTensor] = None,

labels: Optional[torch.LongTensor] = None,

use_cache: Optional[bool] = None,

output_attentions: Optional[bool] = None,

output_hidden_states: Optional[bool] = None,

return_dict: Optional[bool] = None,

cache_position: Optional[torch.LongTensor] = None,

logits_to_keep: Union[int, torch.Tensor] = 0,

**kwargs: Unpack[KwargsForCausalLM],

) -> Union[Tuple, CausalLMOutputWithPast]:

r"""

Args:

labels (`torch.LongTensor` of shape (batch_size, sequence_length), optional):

Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,

config.vocab_size]` or -100 (see input_ids docstring). Tokens with indices set to -100 are ignored

(masked), the loss is only computed for the tokens with labels in [0, ..., config.vocab_size].

logits_to_keep (`int` or torch.Tensor, optional):

If an int, compute logits for the last logits_to_keep tokens. If 0, calculate logits for all

input_ids (special case). Only last token logits are needed for generation, and calculating them only for that

token can save memory, which becomes pretty significant for long sequences or large vocabulary size.

If a torch.Tensor, must be 1D corresponding to the indices to keep in the sequence length dimension.

This is useful when using packed tensor format (single dimension for batch and sequence length).

Returns:

Example:

```python

>>> from transformers import AutoTokenizer, Qwen2ForCausalLM

>>> model = Qwen2ForCausalLM.from_pretrained("meta-qwen2/Qwen2-2-7b-hf")

>>> tokenizer = AutoTokenizer.from_pretrained("meta-qwen2/Qwen2-2-7b-hf")

>>> prompt = "Hey, are you conscious? Can you talk to me?"

>>> inputs = tokenizer(prompt, return_tensors="pt")

>>> # Generate

>>> generate_ids = model.generate(inputs.input_ids, max_length=30)

>>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]

"Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you."

```"""

output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions

output_hidden_states = (

output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states

)

return_dict = return_dict if return_dict is not None else self.config.use_return_dict

# decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn)

outputs = self.model(

input_ids=input_ids,

attention_mask=attention_mask,

position_ids=position_ids,

past_key_values=past_key_values,

inputs_embeds=inputs_embeds,

use_cache=use_cache,

output_attentions=output_attentions,

output_hidden_states=output_hidden_states,

return_dict=return_dict,

cache_position=cache_position,

**kwargs,

)

hidden_states = outputs[0]

# Only compute necessary logits, and do not upcast them to float if we are not computing the loss

slice_indices = slice(-logits_to_keep, None) if isinstance(logits_to_keep, int) else logits_to_keep

logits = self.lm_head(hidden_states[:, slice_indices, :])

loss = None

if labels is not None:

loss = self.loss_function(logits=logits, labels=labels, vocab_size=self.config.vocab_size, **kwargs)

if not return_dict:

output = (logits,) + outputs[1:]

return (loss,) + output if loss is not None else output

return CausalLMOutputWithPast(

loss=loss,

logits=logits,

past_key_values=outputs.past_key_values,

hidden_states=outputs.hidden_states,

attentions=outputs.attentions,

)

self.generation_config = {

"temperature": 0.85,

"repetition_penalty": 1.3,

"no_repeat_ngram_size": 3,

"top_p": 0.95,

"max_new_tokens": 512,

"penalty_alpha": 0.6,

"eos_token_id": None # 禁用自动终止

}

@add_start_docstrings(

"""

The Qwen2 Model transformer with a sequence classification head on top (linear layer).

[`Qwen2ForSequenceClassification`] uses the last token in order to do the classification, as other causal models

(e.g. GPT-2) do.

Since it does classification on the last token, it requires to know the position of the last token. If a

pad_token_id is defined in the configuration, it finds the last token that is not a padding token in each row. If

no pad_token_id is defined, it simply takes the last value in each row of the batch. Since it cannot guess the

padding tokens when inputs_embeds are passed instead of input_ids, it does the same (take the last value in

each row of the batch).

""",

QWEN2_START_DOCSTRING,

)

class Qwen2ForSequenceClassification(Qwen2PreTrainedModel):

def init(self, config):

super().__init__(config)

self.num_labels = config.num_labels

self.model = Qwen2Model(config)

self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False)

# Initialize weights and apply final processing

XXXXXXXXXXXXXXXX_init()

def get_input_embeddings(self):

return self.model.embed_tokens

def set_input_embeddings(self, value):

self.model.embed_tokens = value

@add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING)

def forward(

self,

input_ids: Optional[torch.LongTensor] = None,

attention_mask: Optional[torch.Tensor] = None,

position_ids: Optional[torch.LongTensor] = None,

past_key_values: Optional[Union[Cache, List[torch.FloatTensor]]] = None,

inputs_embeds: Optional[torch.FloatTensor] = None,

labels: Optional[torch.LongTensor] = None,

use_cache: Optional[bool] = None,

output_attentions: Optional[bool] = None,

output_hidden_states: Optional[bool] = None,

return_dict: Optional[bool] = None,

) -> Union[Tuple, SequenceClassifierOutputWithPast]:

r"""

labels (`torch.LongTensor` of shape (batch_size,), optional):

Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,

config.num_labels - 1]`. If config.num_labels == 1 a regression loss is computed (Mean-Square loss), If

config.num_labels > 1 a classification loss is computed (Cross-Entropy).

"""

return_dict = return_dict if return_dict is not None else self.config.use_return_dict

transformer_outputs = self.model(

input_ids,

attention_mask=attention_mask,

position_ids=position_ids,

past_key_values=past_key_values,

inputs_embeds=inputs_embeds,

use_cache=use_cache,

output_attentions=output_attentions,

output_hidden_states=output_hidden_states,

return_dict=return_dict,

)

hidden_states = transformer_outputs[0]

logits = self.score(hidden_states)

if input_ids is not None:

batch_size = input_ids.shape[0]

else:

batch_size = inputs_embeds.shape[0]

if self.config.pad_token_id is None and batch_size != 1:

raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.")

if self.config.pad_token_id is None:

last_non_pad_token = -1

elif input_ids is not None:

# To handle both left- and right- padding, we take the rightmost token that is not equal to pad_token_id

non_pad_mask = (input_ids != self.config.pad_token_id).to(logits.device, XXXXXXXXXXXXXXXX32)

token_indices = torch.arange(input_ids.shape[-1], device=logits.device)

last_non_pad_token = (token_indices * non_pad_mask).argmax(-1)

else:

last_non_pad_token = -1

logger.warning_once(

f"{self.__class__.__name__} will not detect padding tokens in inputs_embeds. Results may be "

"unexpected if using padding tokens in conjunction with inputs_embeds."

)

pooled_logits = logits[torch.arange(batch_size, device=logits.device), last_non_pad_token]

loss = None

if labels is not None:

loss = self.loss_function(logits=logits, labels=labels, pooled_logits=pooled_logits, config=self.config)

if not return_dict:

output = (pooled_logits,) + transformer_outputs[1:]

return ((loss,) + output) if loss is not None else output

return SequenceClassifierOutputWithPast(

loss=loss,

logits=pooled_logits,

past_key_values=transformer_outputs.past_key_values,

hidden_states=transformer_outputs.hidden_states,

attentions=transformer_outputs.attentions,

)

@add_start_docstrings(

"""

The Qwen2 Model transformer with a token classification head on top (a linear layer on top of the hidden-states

output) e.g. for Named-Entity-Recognition (NER) tasks.

""",

QWEN2_START_DOCSTRING,

)

class Qwen2ForTokenClassification(Qwen2PreTrainedModel):

def init(self, config):

super().__init__(config)

self.num_labels = config.num_labels

self.model = Qwen2Model(config)

if getattr(config, "classifier_dropout", None) is not None:

classifier_dropout = config.classifier_dropout

elif getattr(config, "hidden_dropout", None) is not None:

classifier_dropout = config.hidden_dropout

else:

classifier_dropout = 0.1

self.dropout = nn.Dropout(classifier_dropout)

self.score = nn.Linear(config.hidden_size, config.num_labels)

# Initialize weights and apply final processing

XXXXXXXXXXXXXXXX_init()

def get_input_embeddings(self):

return self.model.embed_tokens

def set_input_embeddings(self, value):

self.model.embed_tokens = value

@add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING)

@add_code_sample_docstrings(

checkpoint=_CHECKPOINT_FOR_DOC,

output_type=TokenClassifierOutput,

config_class=_CONFIG_FOR_DOC,

)

def forward(

self,

input_ids: Optional[torch.LongTensor] = None,

attention_mask: Optional[torch.Tensor] = None,

position_ids: Optional[torch.LongTensor] = None,

past_key_values: Optional[List[torch.FloatTensor]] = None,

inputs_embeds: Optional[torch.FloatTensor] = None,

labels: Optional[torch.LongTensor] = None,

use_cache: Optional[bool] = None,

output_attentions: Optional[bool] = None,

output_hidden_states: Optional[bool] = None,

return_dict: Optional[bool] = None,

) -> Union[Tuple, TokenClassifierOutput]:

r"""

labels (`torch.LongTensor` of shape (batch_size,), optional):

Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,

config.num_labels - 1]`. If config.num_labels == 1 a regression loss is computed (Mean-Square loss), If

config.num_labels > 1 a classification loss is computed (Cross-Entropy).

"""

return_dict = return_dict if return_dict is not None else self.config.use_return_dict

outputs = self.model(

input_ids,

attention_mask=attention_mask,

position_ids=position_ids,

past_key_values=past_key_values,

inputs_embeds=inputs_embeds,

use_cache=use_cache,

output_attentions=output_attentions,

output_hidden_states=output_hidden_states,

return_dict=return_dict,

)

sequence_output = outputs[0]

sequence_output = self.dropout(sequence_output)

logits = self.score(sequence_output)

loss = None

if labels is not None:

loss = self.loss_function(logits, labels, self.config)

if not return_dict:

output = (logits,) + outputs[2:]

return ((loss,) + output) if loss is not None else output

return TokenClassifierOutput(

loss=loss,

logits=logits,

hidden_states=outputs.hidden_states,

attentions=outputs.attentions,

)

@add_start_docstrings(

"""

The Qwen2 Model transformer with a span classification head on top for extractive question-answering tasks like

SQuAD (a linear layer on top of the hidden-states output to compute span start logits and span end logits).

""",

QWEN2_START_DOCSTRING,

)

class Qwen2ForQuestionAnswering(Qwen2PreTrainedModel):

base_model_prefix = "transformer"

def init(self, config):

super().__init__(config)

self.transformer = Qwen2Model(config)

XXXXXXXXXXXXXX_outputs = nn.Linear(config.hidden_size, 2)

# Initialize weights and apply final processing

XXXXXXXXXXXXXXXX_init()

def get_input_embeddings(self):

return self.transformer.embed_tokens

def set_input_embeddings(self, value):

self.transformer.embed_tokens = value

@add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING)

def forward(

self,

input_ids: Optional[torch.LongTensor] = None,

attention_mask: Optional[torch.FloatTensor] = None,

position_ids: Optional[torch.LongTensor] = None,

past_key_values: Optional[Union[Cache, List[torch.FloatTensor]]] = None,

inputs_embeds: Optional[torch.FloatTensor] = None,

start_positions: Optional[torch.LongTensor] = None,

end_positions: Optional[torch.LongTensor] = None,

output_attentions: Optional[bool] = None,

output_hidden_states: Optional[bool] = None,

return_dict: Optional[bool] = None,

**kwargs,

) -> Union[Tuple, QuestionAnsweringModelOutput]:

r"""

start_positions (`torch.LongTensor` of shape (batch_size,), optional):

Labels for position (index) of the start of the labelled span for computing the token classification loss.

Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence

are not taken into account for computing the loss.

end_positions (`torch.LongTensor` of shape (batch_size,), optional):

Labels for position (index) of the end of the labelled span for computing the token classification loss.

Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence

are not taken into account for computing the loss.

"""

return_dict = return_dict if return_dict is not None else self.config.use_return_dict

outputs = self.transformer(

input_ids,

attention_mask=attention_mask,

position_ids=position_ids,

past_key_values=past_key_values,

inputs_embeds=inputs_embeds,

output_attentions=output_attentions,

output_hidden_states=output_hidden_states,

return_dict=return_dict,

)

sequence_output = outputs[0]

logits = XXXXXXXXXXXXXX_outputs(sequence_output)

start_logits, end_logits = logits.split(1, dim=-1)

start_logits = start_logits.squeeze(-1).contiguous()

end_logits = end_logits.squeeze(-1).contiguous()

loss = None

if start_positions is not None and end_positions is not None:

loss = self.loss_function(start_logits, end_logits, start_positions, end_positions, **kwargs)

if not return_dict:

output = (start_logits, end_logits) + outputs[2:]

return ((loss,) + output) if loss is not None else output

return QuestionAnsweringModelOutput(

loss=loss,

start_logits=start_logits,

end_logits=end_logits,

hidden_states=outputs.hidden_states,

attentions=outputs.attentions,

)

attachment icon代码.zip12.90KBZIP1次下载


github:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

个人站:https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  使用方法是把部署(下载模型、“demo”文件和python,以及相关的库的部署方法,不要用ollama!!!)时的python的transformers库文件夹里有一个Qwen2文件夹,里面就有一个同名的文件,替换成这个文件即可。
还有效果测试(机器翻译):

1.原文(来源:nature)
  Gliomas are incurable malignancies notable for having an immunosuppressive microenvironment with abundant myeloid cells, the immunomodulatory phenotypes of which remain poorly defined1. Here we systematically investigate these phenotypes by integrating single-cell RNA sequencing, chromatin accessibility, spatial transcriptomics and glioma organoid explant systems. We discovered four immunomodulatory expression programs: microglial inflammatory and scavenger immunosuppressive programs, which are both unique to primary brain tumours, and systemic inflammatory and complement immunosuppressive programs, which are also expressed by non-brain tumours. The programs are not contingent on myeloid cell type, developmental origin or tumour mutational state, but instead are driven by microenvironmental cues, including tumour hypoxia, interleukin-1β, TGFβ and standard-of-care dexamethasone treatment. Their relative expression can predict immunotherapy response and overall survival. By associating the respective programs with mediating genomic elements, transcription factors and signalling pathways, we uncover strategies for manipulating myeloid-cell phenotypes. Our study provides a framework to understand immunomodulation by myeloid cells in glioma and a foundation for the development of more-effective immunotherapies.

  Diffuse gliomas are the most common primary malignant brain tumours and are ultimately fatal1,2. Although immunotherapy has revolutionized the treatment of many cancers, gliomas represent a challenge for immunotherapy owing to the unique immune microenvironment of the brain, restricted access of systemic therapies, and the need to balance therapeutic immune responses with potentially fatal inflammation-induced oedema3.

2.现有机翻(deepl)
  胶质瘤是一种无法治愈的恶性肿瘤,其显著特点是具有免疫抑制性的微环境和丰富的髓样细胞,而髓样细胞的免疫调节表型仍未明确1。在这里,我们通过整合单细胞 RNA 测序、染色质可及性、空间转录组学和胶质瘤类器官移植系统,系统地研究了这些表型。我们发现了四种免疫调节表达程序:小胶质细胞炎症和清道夫免疫抑制程序,这两种程序都是原发性脑肿瘤所特有的;全身炎症和补体免疫抑制程序,这两种程序在非脑肿瘤中也有表达。这些程序并不取决于髓系细胞类型、发育起源或肿瘤突变状态,而是由微环境线索驱动,包括肿瘤缺氧、白细胞介素-1β、TGFβ和标准地塞米松治疗。它们的相对表达可以预测免疫疗法的反应和总生存率。通过将各自的程序与介导基因组元素、转录因子和信号通路联系起来,我们发现了操纵髓系细胞表型的策略。我们的研究为了解胶质瘤中髓系细胞的免疫调节提供了一个框架,也为开发更有效的免疫疗法奠定了基础。

  弥漫性胶质瘤是最常见的原发性恶性脑肿瘤,最终会导致死亡1,2。尽管免疫疗法为许多癌症的治疗带来了革命性的变化,但由于脑部独特的免疫微环境、全身性疗法的使用受限,以及需要在治疗性免疫反应与可能致命的炎症诱发水肿之间取得平衡,胶质瘤对免疫疗法来说是一项挑战3。

3.千问2.5(1.5B)原版
  神经胶质瘤是难以治愈的恶性肿瘤,其免疫抑制微环境中充满了丰富的单核细胞。然而,在这方面的研究尚不充分。在这里我们通过整合单细胞RNA测序、染色体可及性分析和脑组织器官培养系统来全面调查这一现象,并发现了四种调节免疫反应表达程序:髓系炎症/清除免疫抑制模式(只存在于原发性颅内肿瘤);以及全身性的炎性和补体免疫抑制模式(也由非大脑癌症表型)。无论是以 何种方式分化的多能干细胞还是以哪种类型为主的骨髓来源,或者在不同突变状态下的肿瘤都不影响这种调控机制,而是受到周围环境中各种因素的影响,包括缺氧条件、白介素 1 β(IL-1B) 等促癌因子及其标准治疗药物地塞米松等。它们相对表达水平可以预测患者对免疫疗法的有效率以及整体生存期。通过对各自相关基因组元件、转录因子与信号通路进行关联,则揭示了改变髓系细胞特征策略的方法。我们的研究表明,对于了解中枢神经系统中的髓样细胞如何发挥免疫调节作用提供了框架基础,同时也为开发更有效的免疫治疗方法奠定了基石。

  弥漫性星形细胞瘤是最常见的起源于大脑的第一级恶性肿瘤之一,最终会导致死亡。(参见文献 [1] 和[2]) 尽管近年来免疫疗法已经极大地改变了许多类型的癌症治疗效果,但弥漫性星形细胞瘤却成为了对抗免疫疗法的一大挑战,原因在于它独特的免疫环境限制了系统的外部干预手段并且还需要平衡潜在致命的炎症引起的水肿效应。(参考文献[3])
```javascript
function translate(text){
    return text;
}
console.log(translate("diffuse gliomes"));
```
在这个例子中,“diffuse gliome”被转换成了“弥散性星形细胞瘤”,因为这个术语可能并不常用或不是最准确的表述形式。您可以根据上下文选择合适的词替换文本。“diffuse gliomes”的意思是:“扩散的星形细胞瘤”。

4.千问2.5(1.5B)魔改版
  胶质瘤是难以治愈的恶性肿瘤,其免疫抑制微环境富含巨噬细胞。这些免疫调节表型仍不清楚。我们通过整合单细胞RNA测序、染色体可及性分析和脑胶质组织器官培养系统等方法,对上述现象进行了全面调查,并发现了四个免疫调 控表达程序:其中两个分别是小胶质炎性和清除剂免疫抑制程序,在原发性的中枢神经系统肿瘤中特有;另外两种则是全身炎症反应和补体免疫抑制程序,也存在于非大脑肿瘤患者身上。这三个程序不受髓系细胞类型影响,也不受发育起源或肿瘤突变状态的影响,而是由周围环境中信号驱动(包括缺氧、IL-1β、TGFb标准治疗)。它们相对基因表达水平可以预测免疫疗法效果以及总体生存率。通过对相应的执行元件进行 关联研究,则揭示了控制髓系细胞表型的方法策略。我们的工作为理解在胶质瘤中的髓系细胞免疫调控提供了一个框架,并且也为开发更有效的免疫治疗方法奠定了基础。

  弥漫性星形细胞瘤是最常见的首发恶性颅内肿瘤之一,最终致命。尽管癌症已经因为免疫疗法而取得了巨大进步,但弥漫性星形细胞瘤仍然对于免疫疗法构成挑战,这主要是由于大脑特有的独特免疫微环境导致有限系统的药物无法有效渗透进入,同时需要平衡潜在引发水肿致死性高渗血症的抗炎效应引起的免疫应答与之对抗的问题。扩散性星形细胞瘤最常见的一种原始恶性脑部肿瘤并且具有极高的死亡风险。虽然化疗已经在许多类型的癌症中取得巨大的进展,但是弥漫性星形细胞瘤却依然面临着一个极大的障碍——即如何应对这种独特的血液供应受限区域内的复杂免疫学环境问题?此外还有着限制使用广泛类别的化学疗法进入人体的可能性以及还需要确保能够平衡产生有益于身体健康的抗癌免疫力的同时避免可能导致严重神经损伤甚至危及生命的急性炎症症状所带来的危害等问题存在。因此针对这一难题的研究显得尤为重要并有着非常重要的意义。


浅谈一下
  我英语不好,就去研究一下机器翻译。希望大家能多来讨论、去做出一些事促进一下机翻的发展。还有,我认为或许可以运用图像思维,把现在的深度思考生成文字再总结,改成生成视频再总结,说不定会有很大突破。

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的