近来,大语言模型 (LLM) 已被证明是进步编程、内容生成、文本剖析、网络查找及远程学习等许多范畴生产力的可靠工具。

大语言模型对用户隐私的影响

尽管 LLM 很有吸引力,但如何维护好 输入给这些模型的用户查询中的隐私 这一问题仍然存在。一方面,咱们想充沛利用 LLM 的力气,但另一方面,存在向 LLM 服务提供商泄露灵敏信息的危险。在某些范畴,例如医疗保健、金融或法令,这种隐私危险乃至有一票否决权。

一种备选处理方案是本地化布置,LLM 所有者将其模型布置在客户的核算机上。然而,这不是最佳处理方案,由于构建 LLM 可能需求花费数百万美元 (GPT3 为 460 万美元),而本地布置有泄露模型知识产权 (intellectual property, IP) 的危险。

Zama 信任有一举两得之法: 咱们的方针是一起维护用户的隐私和模型的 IP。经过本文,你将了解如何利用 Hugging Face transformers 库并让这些模型的某些部分在加密数据上运转。完好代码见 此处。

全同态加密 (Fully Homomorphic Encryption,FHE) 能够处理 LLM 隐私应战

针对 LLM 布置的隐私应战,Zama 的处理方案是运用全同态加密 (FHE),在加密数据上履行函数。这种做法能够完成两难自解,既能够维护模型所有者知识产权,一起又能维护用户的数据隐私。咱们的演示表明,在 FHE 中完成的 LLM 模型保持了原始模型的猜测质量。为此,咱们需求调整 Hugging Face transformers 库 中的 GPT2 完成,运用 Concrete-Python 对推理部分进行改造,这样就能够将 Python 函数转化为其 FHE 等效函数。

使用 FHE 实现加密大语言模型

图 1 展示了由多个 transformer block 堆叠而成的 GPT2 架构: 其间最主要的是多头注意力 (multi-head attention,MHA) 层。每个 MHA 层运用模型权重来对输入进行投影,然后各自核算注意力,并将注意力的输出从头投影到新的张量中。

在 TFHE 中,模型权重和激活均用整数表示。非线性函数有必要经过可编程自举 (Programmable Bootstrapping,PBS) 操作来完成。PBS 对加密数据实施查表 (table lookup,TLU) 操作,一起刷新密文以支撑 任意核算。不好的一面是,此时 PBS 的核算时刻在线性运算中占主导地位。利用这两种类型的运算,你能够在 FHE 中表达任何子模型的核算,乃至完好的 LLM 核算。

运用 FHE 完成 LLM 的一层

接下来,你将了解如何加密多头注意力 (MHA) 中的一个注意力头。你能够在 此处 找到完好的 MHA 完成代码。

使用 FHE 实现加密大语言模型

图 2 概述了一个简化的底层完成。在这个方案中,模型权重会被分成两个部分,别离存储在客户端和服务端。首要,客户端在本地开端推理,直至遇到已榜首个不在本地的层。用户将中间成果加密并发送给服务端。服务端对其履行相应的注意力机制核算,然后将成果回来给客户端,客户端对成果进行解密并持续在本地推理。

量化

首要,为了对加密值进行模型推理,模型的权重和激活有必要被量化并转化为整数。理想状况是运用 练习后量化,这样就不需求从头练习模型了。这儿,咱们运用整数和 PBS 来完成 FHE 兼容的注意力机制,并检查其对 LLM 准确率的影响。

要评价量化的影响,咱们运转完好的 GPT2 模型,并让其间的一个 LLM 头进行密态核算。然后咱们根据此评价权重和激活的量化比特数对准确率的影响。

使用 FHE 实现加密大语言模型

上图表明 4 比特量化保持了原始精度的 96%。该试验根据含有约 80 个语句的数据集,并经过将原始模型的 logits 猜测与带有量化注意力头的模型的 logits 猜测进行比较来核算最终目标。

在 Hugging Face GPT2 模型中运用 FHE

咱们需求在 Hugging Face 的 transformers 库的基础上重写加密模块的前向传达,以使其包含量化算子。首要经过加载 GPT2LMHeadModel 构建一个 SingleHeadQGPT2Model 实例,然后手动运用 QGPT2SingleHeadAttention 替换榜首个多头注意力模块,代码如下。你能够在 这儿 找到模型的完好完成。

self.transformer.h[0].attn = QGPT2SingleHeadAttention(config, n_bits=n_bits)

至此,前向传达已被重载成用 FHE 算子去履行多头注意力的榜首个头,包含构建查询、键和值矩阵的投影。以下代码中的 QGPT2 模块的代码见 此处。

class SingleHeadAttention(QGPT2):
    """Class representing a single attention head implemented with quantization methods."""
    def run_numpy(self, q_hidden_states: np.ndarray):
        # Convert the input to a DualArray instance
        q_x = DualArray(
            float_array=self.x_calib,
            int_array=q_hidden_states,
            quantizer=self.quantizer
        )
        # Extract the attention base module name
        mha_weights_name = f"transformer.h.{self.layer}.attn."
        # Extract the query, key and value weight and bias values using the proper indices
        head_0_indices = [
            list(range(i * self.n_embd, i * self.n_embd + self.head_dim))
            for i in range(3)
        ]
        q_qkv_weights = ...
        q_qkv_bias = ...
        # Apply the first projection in order to extract Q, K and V as a single array
        q_qkv = q_x.linear(
            weight=q_qkv_weights,
            bias=q_qkv_bias,
            key=f"attention_qkv_proj_layer_{self.layer}",
        )
        # Extract the queries, keys and vales
        q_qkv = q_qkv.expand_dims(axis=1, key=f"unsqueeze_{self.layer}")
        q_q, q_k, q_v = q_qkv.enc_split(
            3,
            axis=-1,
            key=f"qkv_split_layer_{self.layer}"
        )
        # Compute attention mechanism
        q_y = self.attention(q_q, q_k, q_v)
        return self.finalize(q_y)

模型中的其他核算仍以浮点方式进行,未加密,并由客户端在本地履行。

将预练习的权重加载到修改后的 GPT2 模型中,然后调用 generate 办法:

qgpt2_model = SingleHeadQGPT2Model.from_pretrained(
    "gpt2_model", n_bits=4, use_cache=False
)
output_ids = qgpt2_model.generate(input_ids)

举个比如,你能够要求量化模型补全短语 “Cryptography is a” 。在 FHE 中运转模型时,假如量化精度满足,生成的输出为:

“Cryptography is a very important part of the security of your computer”

当量化精度太低时,您会得到:

“Cryptography is a great way to learn about the world around you”

编译为 FHE

现在,你能够运用以下 Concrete-ML 代码编译注意力头:

circuit_head = qgpt2_model.compile(input_ids)

运转此代码,你将看到以下打印输出: “Circuit compiled with 8 bit-width”。该装备与 FHE 兼容,显示了在 FHE 中履行的操作所需的最大位宽。

复杂度

在 transformer 模型中,核算量最大的操作是注意力机制,它将查询、键和值相乘。在 FHE 中,加密域中乘法的特殊性加重了本钱。此外,随着序列长度的增加,这些乘法的数量还会呈二次方增加。

而就加密注意力头而言,长度为 6 的序列需求 11622 次 PBS 操作。咱们现在的试验还很初步,尚未对性能进行优化。尽管能够在几秒钟内运转,但不可否认它需求相当多的核算能力。幸运的是,咱们预期,几年后,硬件会将推迟进步 1000 倍到 10000 倍,使原来在 CPU 上需求几分钟的操作缩短到 ASIC 上的低于 100 毫秒。有关这些预算的更多信息,请参阅 此博文。

总结

大语言模型有望使能很多应用场景,但其完成引发了用户隐私的严重关心。在本文中,咱们朝着密态 LLM 迈出了榜首步,咱们的最终愿景是让整个模型彻底在云上运转,一起用户的隐私还能得到充沛尊重。

当前的做法包含将 GPT2 等模型中的特定部分转化至 FHE 域。咱们的完成利用了 transformers 库,用户还能评价模型的一部分在加密数据上运转时对准确率的影响。除了维护用户隐私之外,这种办法还允许模型所有者对其模型的主要部分保密。你可在 此处 找到完好代码。

Zama 库 Concrete 和 Concrete-ML (别忘了给咱们的 github 代码库点个星星 ⭐️) 允许直接构建 ML 模型并将其转化至等价的 FHE 域,从而使之能够对加密数据进行核算和猜测。

希望你喜欢这篇文章。请随时分享你的主意/反应!


英文原文: hf.co/blog/encryp…

原文作者: Roman Bredehoft,Jordan Frery

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,作业方向为 transformer-family 模型在各模态数据上的应用及大规模模型的练习推理。

审校/排版: zhongdongy (阿东)