关于人工智能:使用-FHE-实现加密大语言模型

35次阅读

共计 4074 个字符,预计需要花费 11 分钟才能阅读完成。

近来,大语言模型 (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 等效函数。

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

在 TFHE 中,模型权重和激活均用整数示意。非线性函数必须通过可编程自举 (Programmable Bootstrapping,PBS) 操作来实现。PBS 对加密数据施行查表 (table lookup,TLU) 操作,同时刷新密文以反对 任意计算。不好的一面是,此时 PBS 的计算工夫在线性运算中占主导地位。利用这两种类型的运算,你能够在 FHE 中表白任何子模型的计算,甚至残缺的 LLM 计算。

应用 FHE 实现 LLM 的一层

接下来,你将理解如何加密多头注意力 (MHA) 中的一个注意力头。你能够在 此处 找到残缺的 MHA 实现代码。

图 2 概述了一个简化的底层实现。在这个计划中,模型权重会被分成两个局部,别离存储在客户端和服务端。首先,客户端在本地开始推理,直至遇到已第一个不在本地的层。用户将两头后果加密并发送给服务端。服务端对其执行相应的注意力机制计算,而后将后果返回给客户端,客户端对后果进行解密并持续在本地推理。

量化

首先,为了对加密值进行模型推理,模型的权重和激活必须被量化并转换为整数。现实状况是应用 训练后量化,这样就不须要从新训练模型了。这里,咱们应用整数和 PBS 来实现 FHE 兼容的注意力机制,并查看其对 LLM 准确率的影响。

要评估量化的影响,咱们运行残缺的 GPT2 模型,并让其中的一个 LLM 头进行密态计算。而后咱们基于此评估权重和激活的量化比特数对准确率的影响。

上图表明 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 域,从而使之可能对加密数据进行计算和预测。

心愿你喜爱这篇文章。请随时分享你的想法 / 反馈!


英文原文: https://hf.co/blog/encrypted-llm

原文作者: Roman Bredehoft,Jordan Frery

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

审校 / 排版: zhongdongy (阿东)

正文完
 0