近来,大语言模型 (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 域,从而使之能够对加密数据进行核算和猜测。
希望你喜欢这篇文章。请随时分享你的主意/反应!
英文原文: hf.co/blog/encryp…
原文作者: Roman Bredehoft,Jordan Frery
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,作业方向为 transformer-family 模型在各模态数据上的应用及大规模模型的练习推理。
审校/排版: zhongdongy (阿东)