Transformers documentation

Evolla

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

该模型于 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
)

提示:

EvollaConfig

class transformers.EvollaConfig

< >

( 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.config

EvollaModel

class transformers.EvollaModel

< >

( config: EvollaConfig )

forward

< >

( 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()。

    什么是输入 ID?

  • 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].

    什么是位置 ID?

  • 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

class transformers.EvollaForProteinText2Text

< >

( config: EvollaConfig )

forward

< >

( 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()。

    什么是输入 ID?

  • 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

< >

( 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__

< >

( 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':返回 PyTorch torch.Tensor 对象。
    • 'np':返回 NumPy np.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)— 文本序列的注意力掩码。
Update on GitHub