Transformers documentation
Evolla
该模型于 2025-07-26 贡献至 Hugging Face Transformers。
Evolla
概述
The Evolla model was proposed in Decoding the Molecular Language of Proteins with Evolla by Zhou et al..
Evolla 是一款先进的 800 亿参数蛋白质语言生成模型,旨在解码蛋白质的分子语言。它整合了蛋白质序列、结构以及用户查询中的信息,从而生成关于蛋白质功能的精确且富有语境细微差别的见解。Evolla 在一个前所未有的 AI 生成数据集上进行训练,该数据集包含 5.46 亿个蛋白质问答对和 1500 亿个词元(word tokens)。Evolla 显著推动了蛋白质组学和功能性基因组学的研究,提供了专家级的见解,并揭示了蛋白质中编码的分子逻辑。
该论文的摘要如下:
蛋白质是自然界精密的分子机器,是数十亿年进化的产物,在维持生命方面发挥着基础性作用。然而,破译其分子语言——即理解蛋白质序列和结构如何编码并决定生物功能——仍然是现代生物学中的一项基石性挑战。在此,我们推出了 Evolla,一个 800 亿参数的前沿蛋白质语言生成模型,旨在解码蛋白质的分子语言。通过整合蛋白质序列、结构以及用户查询中的信息,Evolla 能够生成关于蛋白质功能的精确且富有语境细微差别的见解。Evolla 的一项关键创新在于其在一个前所未有的 AI 生成数据集上进行训练:包含 5.46 亿个蛋白质问答对和 1500 亿个词元(token),旨在反映蛋白质巨大的复杂性和功能多样性。在预训练之后,Evolla 集成了直接偏好优化(DPO)以基于偏好信号优化模型,并集成了检索增强生成(RAG)以纳入外部知识,从而提升响应质量和相关性。为了评估其性能,我们提出了一个新颖的框架——指令响应空间(IRS),证明 Evolla 能够提供专家级的见解,推动蛋白质组学和功能性基因组学的研究进展,同时揭示蛋白质中编码的分子逻辑。在线演示请访问 http://www.chat-protein.com/。
示例:
processor = EvollaProcessor.from_pretrained("westlake-repl/Evolla-10B-DPO-hf")
model = EvollaForProteinText2Text.from_pretrained("westlake-repl/Evolla-10B-DPO-hf", device_map="auto")
# aa_seq should have same length as foldseek
protein_inputs = [
{
"aa_seq": "MATGGRRG...",
"foldseek": "###lqpfd...", # hashtag means the low-confidence foldseek tokens
},
{
"aa_seq": "MLPGLALL...",
"foldseek": "dfwwkwad...",
}
]
message_list = [
[
{
"role": "system",
"content": "You are an AI expert that can answer any questions about protein.",
},
{"role": "user", "content": "What is the function of this protein?"},
],
[
{
"role": "system",
"content": "You are an AI expert that can answer any questions about protein.",
},
{"role": "user", "content": "What is the function of this protein?"},
]
]
input_dict = processor(
protein_inputs, messages_list, return_tensors="pt", text_max_length=512, protein_max_length=1024
)
with torch.no_grad():
generated_ids = hf_model.generate(**input_dict)
generated_texts = processor.batch_decode(
generated_ids, skip_special_tokens=True
)提示:
- 该模型由 Xibin Bayes Zhou 贡献。
- 原始代码可以在此处找到。
EvollaConfig
class transformers.EvollaConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Noneprotein_encoder_config: dict | transformers.configuration_utils.PreTrainedConfig | None = Nonevocab_size: int = 128256hidden_size: int = 4096intermediate_size: int = 14336num_hidden_layers: int = 32num_attention_heads: int = 32num_key_value_heads: int | None = 8hidden_act: str = 'silu'max_position_embeddings: int = 8192rms_norm_eps: float = 1e-05rope_parameters: transformers.modeling_rope_utils.RopeParameters | dict | None = Noneattention_bias: bool = Falseattention_dropout: float | int | None = 0.0mlp_bias: bool = Falsealigner_ffn_mult: int | None = 4aligner_enable_bias: bool | None = Truealigner_attention_probs_dropout_prob: float | None = 0.1aligner_num_add_layers: int | None = 8resampler_depth: int | None = 6resampler_dim_head: int | None = 64resampler_heads: int | None = 8resampler_num_latents: int | None = 64resampler_ff_mult: int | None = 4initializer_range: float = 0.02pad_token_id: int | None = Nonebos_token_id: int | None = 128000eos_token_id: int | list[int] | None = 128009use_cache: bool = Falsetie_word_embeddings: bool = Falseis_decoder: bool | None = Falseadd_cross_attention: bool | None = False )
参数
- protein_encoder_config (
dict, 可选) — 用于初始化SaProtConfig的配置选项字典。 - vocab_size (
int,可选,默认为128256) — 模型的词汇表大小。定义了input_ids可以表示的不同 token 数量。 - hidden_size (
int,可选,默认为4096) — 隐藏表示的维度。 - intermediate_size (
int,可选,默认为14336) — MLP 表示的维度。 - num_hidden_layers (
int,可选,默认为32) — Transformer 解码器中的隐藏层数量。 - num_attention_heads (
int,可选,默认为32) — Transformer 解码器中每个注意力层的注意力头数量。 - num_key_value_heads (
int, 可选,默认为8) — 这是用于实现 Grouped Query Attention 的 key_value 头数。如果num_key_value_heads=num_attention_heads,模型将使用 Multi Head Attention (MHA);如果num_key_value_heads=1,模型将使用 Multi Query Attention (MQA);否则使用 GQA。在将多头检查点转换为 GQA 检查点时,每个组的 key 和 value 头应通过对该组内所有原始头进行 meanpooling 来构建。更多详情请参阅 这篇论文。如果未指定,则默认为num_attention_heads。 - hidden_act (
str,可选,默认为silu) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、"relu"、"silu"等。 - max_position_embeddings (
int,可选,默认为8192) — 该模型可能使用的最大序列长度。 - rms_norm_eps (
float,可选,默认为1e-05) — RMS 归一化层使用的 epsilon 值。 - rope_parameters (
Union[~modeling_rope_utils.RopeParameters, dict], 可选) — 包含 RoPE 嵌入配置参数的字典。该字典应包含rope_theta的值,并且如果希望使用 RoPE 处理更长的max_position_embeddings,则可选地包含用于缩放的参数。 - attention_bias (
bool,可选,默认为False) — 在自注意力机制中,是否在 query、key、value 和 output 投影层中使用偏置。 - attention_dropout (
Union[float, int],可选,默认为0.0) — 注意力概率的 dropout 比率。 - mlp_bias (
bool,可选,默认为False) — 是否在 MLP 层的 up_proj、down_proj 和 gate_proj 层中使用偏置。 - aligner_ffn_mult (
int,可选,默认值为 4) — 对齐器层的 FFN 乘数。 - aligner_enable_bias (
bool,可选,默认为True) — 是否在 aligner 层中使用偏置。 - aligner_attention_probs_dropout_prob (
float,可选,默认值为 0.1) — 对齐器层中注意力概率的 dropout 比率。 - aligner_num_add_layers (
int,可选,默认为 8) — 对齐器层的附加层数。 - resampler_depth (
int,可选,默认为 6) — Llama 模型中重采样层的深度。 - resampler_dim_head (
int,可选,默认为 64) — Llama 模型中 resampler 层中头(head)的维度。 - resampler_heads (
int,可选,默认为 8) — Llama 模型中重采样器层的注意力头数量。 - resampler_num_latents (
int,可选,默认为 64) — Llama 模型中重采样器层中潜变量的数量。 - resampler_ff_mult (
int,可选,默认为 4) — 重采样器层的 FFN 乘数。 - initializer_range (
float,可选,默认为0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - pad_token_id (
int, 可选) — 词表中用于填充的 token id。 - bos_token_id (
int,可选,默认为128000) — 词汇表中用于表示流起始的 Token id。 - eos_token_id (
Union[int, list[int]],可选,默认为128009) — 词汇表中用于表示流结束(end-of-stream)的 token id。 - use_cache (
bool,可选,默认为False) — 模型是否应返回最后一次键/值注意力(并非所有模型都使用)。仅当config.is_decoder=True或模型为仅解码器生成模型时相关。 - tie_word_embeddings (
bool,可选,默认为False) — 是否根据模型的tied_weights_keys映射来绑定权重嵌入。 - is_decoder (
bool,可选,默认为False) — 指示该模型是否用作解码器。如果为False,则模型用作编码器。 - add_cross_attention (
bool,可选,默认为False) — 是否应在模型中添加交叉注意力层。
这是用于存储 EvollaModel 配置的类。它根据指定的参数实例化 Evolla 模型,并定义模型架构。使用默认值实例化配置将生成与 westlake-repl/Evolla-10B-hf 类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。
示例:
>>> from transformers import EvollaModel, EvollaConfig
>>> # Initializing a Evolla evolla-10b style configuration
>>> configuration = EvollaConfig()
>>> # Initializing a model from the evolla-10b style configuration
>>> model = EvollaModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configEvollaModel
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneposition_ids: typing.Optional[torch.LongTensor] = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Noneuse_cache: bool | None = Noneprotein_input_ids: typing.Optional[torch.LongTensor] = Noneprotein_attention_mask: typing.Optional[torch.Tensor] = Nonestructure_feats: typing.Optional[torch.Tensor] = Nonemsa_feats: typing.Optional[torch.Tensor] = Nonestructure_batch_mask: typing.Optional[torch.Tensor] = Nonemsa_batch_mask: typing.Optional[torch.Tensor] = None**kwargs ) → BaseModelOutputWithPast or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length), ,可选) — 输入序列中各 token 在词汇表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- position_ids (
torch.LongTensor形状为(batch_size, sequence_length), 可选) — 输入序列中每个 token 在位置嵌入中的位置索引。取值范围为[0, config.n_positions - 1]. - past_key_values (
~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常由past_key_values在解码的先前阶段返回,当use_cache=True或config.use_cache=True.仅允许将 Cache 实例作为输入,请参阅我们的 kv cache 指南。 如果未传入
past_key_values,则默认会初始化 DynamicCache。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values,用户应仅输入未处理的input_ids(即未向该模型提供其过去键值状态的那些),其形状为(batch_size, unprocessed_length),而不是形状为(batch_size, sequence_length)的全部input_ids。 - inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - use_cache (
bool,可选) — 如果设置为True,则会返回past_key_values键值状态,可用于加速解码(参见past_key_values)。 - protein_input_ids (
torch.LongTensor, 可选) — 蛋白质序列的结构感知 token 输入 ID。形状应为(batch_size, protein_seq_length),类型为torch.LongTensor。 - protein_attention_mask (
torch.Tensor, 可选) — 蛋白质序列的注意力掩码。形状应为(batch_size, protein_seq_length),类型为torch.Tensor。 - structure_feats (
torch.Tensor,可选) — 纯结构特征对应的输入 ID。形状应为(batch_size, structure_seq_length, structure_feat_dim),类型为torch.Tensor。目前为占位输入。 - msa_feats (
torch.Tensor, 可选) — 纯基于 MSA 的特征的输入 ID。形状应为(batch_size, msa_seq_length, msa_feat_dim),类型为torch.Tensor。目前为占位输入。 - structure_batch_mask (
torch.Tensor, 可选) — 用于判断哪些蛋白质序列是纯基于结构的批次掩码。其形状应为(batch_size),类型为torch.Tensor。应与structure_feats配合使用。目前为占位输入。 - msa_batch_mask (
torch.Tensor, 可选) — 用于判断哪些蛋白质序列是纯基于 MSA 的批次掩码。其形状应为(batch_size),类型为torch.Tensor。应与msa_feats配合使用。目前为占位输入。
返回值
BaseModelOutputWithPast 或 tuple(torch.Tensor)
一个 BaseModelOutputWithPast 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(None)和输入。
EvollaModel 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
last_hidden_state(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor)— 模型最后一层输出的隐藏状态序列。如果使用了
past_key_values,则仅输出形状为(batch_size, 1, hidden_size)的序列的最后一个隐藏状态。past_key_values(
Cache,可选,在传入use_cache=True或config.use_cache=True时返回)—— 它是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。包含预计算的隐藏状态(自注意力块中的键和值,以及如果
config.is_encoder_decoder=True则还包括交叉注意力块中的键和值),可用于(参见past_key_values输入)加速顺序解码。hidden_states (
tuple(torch.Tensor),可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层的输出,以及每一层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple(torch.Tensor),可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
EvollaForProteinText2Text
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.LongTensor] = Noneprotein_input_ids: typing.Optional[torch.LongTensor] = Noneprotein_attention_mask: typing.Optional[torch.Tensor] = Noneuse_cache: bool | None = Nonelogits_to_keep: typing.Union[int, torch.Tensor] = 0**kwargs )
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length), ,可选) — 输入序列中各 token 在词汇表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - labels (
torch.LongTensor,形状为(batch_size, sequence_length),可选) — 用于计算掩码语言建模损失的标签。索引值应在[0, ..., config.vocab_size]范围内,或为 -100(参见input_ids的文档字符串)。索引值设为-100的 token 将被忽略(即被掩码),损失仅针对标签位于[0, ..., config.vocab_size]范围内的 token 进行计算。 - protein_input_ids (
torch.LongTensor, 可选) — 蛋白质序列的输入 ID。形状应为(batch_size, protein_seq_length),类型为torch.LongTensor。 - protein_attention_mask (
torch.Tensor, 可选) — 蛋白质序列的注意力掩码。形状应为(batch_size, protein_seq_length),类型为torch.Tensor。 - use_cache (
bool,可选) — 如果设置为True,则会返回past_key_values键值状态,可用于加速解码(参见past_key_values)。 - logits_to_keep (
Union[int, torch.Tensor], 可选,默认为0) — 如果为int,则计算最后logits_to_keep个 token 的 logits。如果为0,则计算所有input_ids的 logits(特殊情况)。生成过程只需要最后一个 token 的 logits,仅针对该 token 进行计算可以节省内存,对于长序列或大词汇量而言,这种节省相当显著。 如果为torch.Tensor,则必须是一维张量,对应于序列长度维度中需要保留的索引。 这在使用打包张量格式(将批次和序列长度合并为单一维度)时非常有用。
EvollaForProteinText2Text 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
示例:
>>> from transformers import EvollaProcessor, EvollaForProteinText2Text
>>> model = EvollaForProteinText2Text.from_pretrained("westlake/Evolla-10B-hf")
>>> processor = EvollaProcessor.from_pretrained("westlake/Evolla-10B-hf")
>>> protein_information = {
"aa_seq": "your amino acid sequence",
"foldseek": "your foldseek sequence",
}
>>> question = "What is the function of this protein?"
>>> message = [
{"role": "system", "content": "You are an AI expert that can answer any questions about protein."},
{"role": "user", "content": question},
]
>>> inputs = processor(proteins=[protein_information], messages_list=[message], return_tensors="pt", padding="longest")
>>> outputs = model.generate(**inputs)
>>> print(processor.batch_decode(outputs, skip_special_tokens=True))EvollaProcessor
class transformers.EvollaProcessor
< source >( protein_tokenizertokenizer = Noneprotein_max_length = 1024text_max_length = 512**kwargs )
参数
- protein_tokenizer (
EsmTokenizer) — EsmTokenizer 的实例。蛋白质分词器是必需的输入。 - tokenizer (
tokenizer_class) — 分词器是必需的输入。 - protein_max_length (
int,可选,默认为 1024) — 要生成的序列的最大长度。 - text_max_length (
int,可选,默认值为 512) — 要生成的文本的最大长度。
构造一个 EvollaProcessor,它将蛋白质分词器和分词器封装为单个处理器。
EvollaProcessor 提供了 {protein_tokenizer_class} 和 tokenizer_class 的所有功能。有关更多信息,请参阅 ~{protein_tokenizer_class} 和 ~tokenizer_class。
__call__
< source >( proteins: list[dict] | dict | None = Nonemessages_list: list[list[dict]] | list[dict] | None = Noneprotein_max_length: int | None = Nonetext_max_length: int | None = None**kwargs ) → a dict with following keys
参数
- proteins (
Union[List[dict], dict]) — 一个字典列表或单个字典,包含以下键:"aa_seq"(str) — 蛋白质的氨基酸序列。"foldseek"(str) — 蛋白质的 foldseek 字符串。
- messages_list (
Union[List[List[dict]], List[dict]]) — 一个包含以下键的字典列表或字典列表的列表:"role"(str) — 消息的角色。"content"(str) — 消息的内容。
- protein_max_length (
int,可选,默认为 1024) — 要生成的序列的最大长度。 - text_max_length (
int,可选,默认值为 512) — 文本的最大长度。 - return_tensors (
str或 TensorType, 可选) — 如果设置,将返回特定框架的张量。可接受的值为:'pt':返回 PyTorchtorch.Tensor对象。'np':返回 NumPynp.ndarray对象。
返回值
一个包含以下键的字典
protein_input_ids(形状为(batch_size, sequence_length)的torch.Tensor)— 蛋白质序列的输入 ID。protein_attention_mask(形状为(batch_size, sequence_length)的torch.Tensor)— 蛋白质序列的注意力掩码。text_input_ids(形状为(batch_size, sequence_length)的torch.Tensor)— 文本序列的输入 ID。text_attention_mask(形状为(batch_size, sequence_length)的torch.Tensor)— 文本序列的注意力掩码。