mirror of
https://github.com/luxfhe/workshop.git
synced 2026-10-30 17:06:44 +00:00
103 KiB
103 KiB
In [1]:
import logging
import time
import matplotlib.pyplot as plt
import torch
from load_huggingface import get_gpt2_model, get_gpt2_tokenizer
from qgpt2_models import MultiHeadsQGPT2Model, SingleHeadQGPT2Model
# Disable some warnings from Hugging Face when loading the models
logging.getLogger("transformers.modeling_utils").setLevel(logging.ERROR)In [2]:
gpt2_model = get_gpt2_model("gpt2_model")
gpt2_tokenizer = get_gpt2_tokenizer("gpt2_tokenizer")In [3]:
input_sentence = "Computations on encrypted data can help"In [4]:
input_token_indexes = gpt2_tokenizer.encode(input_sentence)
input_ids = torch.tensor(input_token_indexes).unsqueeze(0)In [5]:
output_ids = gpt2_model.generate(input_ids, max_new_tokens=4, use_cache=False)
gpt2_tokenizer.decode(output_ids[0])Out [5]:
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results. Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.
'Computations on encrypted data can help protect your privacy.'
In [6]:
proj_single_head_qgpt2 = SingleHeadQGPT2Model.from_pretrained(
"gpt2_model", n_bits=7, use_cache=False
)In [7]:
proj_single_head_qgpt2.set_fhe_mode(fhe="disable")
output_ids_clear = proj_single_head_qgpt2.generate(input_ids, max_new_tokens=4)
gpt2_tokenizer.decode(output_ids_clear[0])Out [7]:
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results. Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.
'Computations on encrypted data can help protect your privacy.'
In [8]:
proj_single_head_qgpt2.set_fhe_mode(fhe="disable")
output_logits_clear = proj_single_head_qgpt2(input_ids).logitsIn [12]:
circuit_single_head = proj_single_head_qgpt2.compile(input_ids, msbs_round=6)Circuit compiled with at most 15 bits
In [13]:
proj_single_head_qgpt2.set_fhe_mode(fhe="simulate")
output_logits_simulated = proj_single_head_qgpt2(input_ids).logitsIn [14]:
proj_single_head_qgpt2.set_fhe_mode(fhe="execute")
start = time.time()
output_logits_fhe = proj_single_head_qgpt2(input_ids).logits
end = time.time()
execution_time = end - start
print(f"Time taken to execute the single head in FHE: {execution_time:.2f} seconds")Time taken to execute the single head in FHE: 166.38 seconds
In [16]:
proj_12_heads_qgpt2 = MultiHeadsQGPT2Model.from_pretrained("gpt2_model", n_bits=10, use_cache=False)In [17]:
proj_12_heads_qgpt2.set_fhe_mode(fhe="disable")
output_ids_clear = proj_12_heads_qgpt2.generate(input_ids, max_new_tokens=4)
gpt2_tokenizer.decode(output_ids_clear[0])Out [17]:
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results. Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.
'Computations on encrypted data can help protect your privacy.'
In [18]:
proj_12_heads_qgpt2 = MultiHeadsQGPT2Model.from_pretrained("gpt2_model", n_bits=7, use_cache=False)
proj_12_heads_qgpt2.set_fhe_mode(fhe="disable")
output_ids_clear = proj_12_heads_qgpt2.generate(input_ids, max_new_tokens=4)
gpt2_tokenizer.decode(output_ids_clear[0])Out [18]:
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results. Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.
'Computations on encrypted data can help protect your data from'
In [19]:
proj_12_heads_qgpt2.set_fhe_mode(fhe="disable")
output_logits_clear = proj_12_heads_qgpt2(input_ids).logitsIn [20]:
circuit_12_heads = proj_12_heads_qgpt2.compile(input_ids, msbs_round=6)Circuit compiled with at most 15 bits
In [21]:
proj_12_heads_qgpt2.set_fhe_mode(fhe="simulate")
output_logits_simulated = proj_12_heads_qgpt2(input_ids).logitsIn [22]:
proj_12_heads_qgpt2.set_fhe_mode(fhe="execute")
start = time.time()
output_logits_fhe = proj_12_heads_qgpt2(input_ids).logits
end = time.time()
execution_time = end - start
print(f"Time taken to execute the multi-head in FHE: {execution_time:.2f} seconds")Time taken to execute the multi-head in FHE: 862.97 seconds
In [24]:
%matplotlib inline
def generate_topk_tokens(model, tokenizer, text, top_k):
"""Generate the top-k tokens for every token in the text."""
inputs = tokenizer.encode(text, return_tensors="pt")
topk_tokens_list = []
with torch.no_grad():
outputs = model(inputs)
logits = outputs.logits
for logit in logits[0]:
topk_tokens = torch.topk(
logit,
top_k,
).indices.tolist()
topk_tokens_list.append(topk_tokens)
return topk_tokens_list
def calculate_topk_accuracy(ground_truth_tokens, computed_tokens):
"""Calculate the top-k accuracy."""
correct_count = sum([1 for gt_token in ground_truth_tokens if gt_token in computed_tokens])
return correct_count / len(ground_truth_tokens)
# Define the models to evaluate
models = {
"SingleHeadQGPT2Model": SingleHeadQGPT2Model,
"MultiHeadsQGPT2Model": MultiHeadsQGPT2Model,
}
# Define the different number of bits and k values to evaluate
n_bits_range = list(range(2, 12))
top_ks = [1, 5, 10]
# Define the text data to use for the evaluation
dataset_file = "data.txt"
# Read the evaluation file
with open(dataset_file, "r", encoding="utf-8") as file:
input_texts = [line.strip() for line in file]
for model_name, Model in models.items():
plt.figure()
for top_k in top_ks:
accuracies = []
for n_bits in n_bits_range:
# Load the model using the current number of bits and set it to clear quantized mode
model = Model.from_pretrained(
"gpt2_model",
n_bits=n_bits,
)
model.set_fhe_mode(fhe="disable", true_float=False)
accuracy_scores = []
for text in input_texts:
# Generate the top-k tokens for the Hugging Face floating point model
hf_topk_tokens_list = generate_topk_tokens(gpt2_model, gpt2_tokenizer, text, 1)
# Generate the top-k tokens for the quantized model
clone_topk_tokens_list = generate_topk_tokens(model, gpt2_tokenizer, text, top_k)
# Compute the top-k accuracy for each token in the text
for hf_topk_tokens, clone_topk_tokens in zip(
hf_topk_tokens_list, clone_topk_tokens_list
):
topk_accuracy = calculate_topk_accuracy(hf_topk_tokens, clone_topk_tokens)
accuracy_scores.append(topk_accuracy)
# Compute the average accuracy within the text
average_accuracy = sum(accuracy_scores) / len(accuracy_scores)
accuracies.append(average_accuracy)
# Print the average accuracy for this model, n_bits, and top_k
print(
f"Model: {model_name}, "
f"n_bits: {n_bits}, "
f"Average Top-{top_k} Accuracy: {average_accuracy:.4f}"
)
plt.plot(n_bits_range, accuracies, label=f"Top-{top_k}")
# Plot the model's evaluation
plt.title(f"{model_name}")
plt.xlabel("n_bits")
plt.ylabel("Average Accuracy")
plt.legend()
plt.grid(True)
plt.ylim(0, 1.05)
plt.show()Model: SingleHeadQGPT2Model, n_bits: 2, Average Top-1 Accuracy: 0.7217 Model: SingleHeadQGPT2Model, n_bits: 3, Average Top-1 Accuracy: 0.7217 Model: SingleHeadQGPT2Model, n_bits: 4, Average Top-1 Accuracy: 0.9586 Model: SingleHeadQGPT2Model, n_bits: 5, Average Top-1 Accuracy: 0.9561 Model: SingleHeadQGPT2Model, n_bits: 6, Average Top-1 Accuracy: 0.9783 Model: SingleHeadQGPT2Model, n_bits: 7, Average Top-1 Accuracy: 0.9854 Model: SingleHeadQGPT2Model, n_bits: 8, Average Top-1 Accuracy: 0.9949 Model: SingleHeadQGPT2Model, n_bits: 9, Average Top-1 Accuracy: 0.9981 Model: SingleHeadQGPT2Model, n_bits: 10, Average Top-1 Accuracy: 0.9968 Model: SingleHeadQGPT2Model, n_bits: 11, Average Top-1 Accuracy: 0.9975 Model: SingleHeadQGPT2Model, n_bits: 2, Average Top-5 Accuracy: 0.9153 Model: SingleHeadQGPT2Model, n_bits: 3, Average Top-5 Accuracy: 0.9153 Model: SingleHeadQGPT2Model, n_bits: 4, Average Top-5 Accuracy: 0.9987 Model: SingleHeadQGPT2Model, n_bits: 5, Average Top-5 Accuracy: 0.9994 Model: SingleHeadQGPT2Model, n_bits: 6, Average Top-5 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 7, Average Top-5 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 8, Average Top-5 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 9, Average Top-5 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 10, Average Top-5 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 11, Average Top-5 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 2, Average Top-10 Accuracy: 0.9484 Model: SingleHeadQGPT2Model, n_bits: 3, Average Top-10 Accuracy: 0.9484 Model: SingleHeadQGPT2Model, n_bits: 4, Average Top-10 Accuracy: 0.9994 Model: SingleHeadQGPT2Model, n_bits: 5, Average Top-10 Accuracy: 0.9994 Model: SingleHeadQGPT2Model, n_bits: 6, Average Top-10 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 7, Average Top-10 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 8, Average Top-10 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 9, Average Top-10 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 10, Average Top-10 Accuracy: 1.0000 Model: SingleHeadQGPT2Model, n_bits: 11, Average Top-10 Accuracy: 1.0000 Model: MultiHeadsQGPT2Model, n_bits: 2, Average Top-1 Accuracy: 0.5051 Model: MultiHeadsQGPT2Model, n_bits: 3, Average Top-1 Accuracy: 0.3299 Model: MultiHeadsQGPT2Model, n_bits: 4, Average Top-1 Accuracy: 0.3446 Model: MultiHeadsQGPT2Model, n_bits: 5, Average Top-1 Accuracy: 0.6299 Model: MultiHeadsQGPT2Model, n_bits: 6, Average Top-1 Accuracy: 0.5554 Model: MultiHeadsQGPT2Model, n_bits: 7, Average Top-1 Accuracy: 0.8083 Model: MultiHeadsQGPT2Model, n_bits: 8, Average Top-1 Accuracy: 0.9293 Model: MultiHeadsQGPT2Model, n_bits: 9, Average Top-1 Accuracy: 0.9611 Model: MultiHeadsQGPT2Model, n_bits: 10, Average Top-1 Accuracy: 0.9809 Model: MultiHeadsQGPT2Model, n_bits: 11, Average Top-1 Accuracy: 0.9898 Model: MultiHeadsQGPT2Model, n_bits: 2, Average Top-5 Accuracy: 0.8102 Model: MultiHeadsQGPT2Model, n_bits: 3, Average Top-5 Accuracy: 0.6662 Model: MultiHeadsQGPT2Model, n_bits: 4, Average Top-5 Accuracy: 0.6025 Model: MultiHeadsQGPT2Model, n_bits: 5, Average Top-5 Accuracy: 0.8446 Model: MultiHeadsQGPT2Model, n_bits: 6, Average Top-5 Accuracy: 0.7732 Model: MultiHeadsQGPT2Model, n_bits: 7, Average Top-5 Accuracy: 0.9815 Model: MultiHeadsQGPT2Model, n_bits: 8, Average Top-5 Accuracy: 0.9994 Model: MultiHeadsQGPT2Model, n_bits: 9, Average Top-5 Accuracy: 1.0000 Model: MultiHeadsQGPT2Model, n_bits: 10, Average Top-5 Accuracy: 1.0000 Model: MultiHeadsQGPT2Model, n_bits: 11, Average Top-5 Accuracy: 1.0000 Model: MultiHeadsQGPT2Model, n_bits: 2, Average Top-10 Accuracy: 0.8739 Model: MultiHeadsQGPT2Model, n_bits: 3, Average Top-10 Accuracy: 0.7497 Model: MultiHeadsQGPT2Model, n_bits: 4, Average Top-10 Accuracy: 0.6720 Model: MultiHeadsQGPT2Model, n_bits: 5, Average Top-10 Accuracy: 0.8904 Model: MultiHeadsQGPT2Model, n_bits: 6, Average Top-10 Accuracy: 0.8268 Model: MultiHeadsQGPT2Model, n_bits: 7, Average Top-10 Accuracy: 0.9930 Model: MultiHeadsQGPT2Model, n_bits: 8, Average Top-10 Accuracy: 1.0000 Model: MultiHeadsQGPT2Model, n_bits: 9, Average Top-10 Accuracy: 1.0000 Model: MultiHeadsQGPT2Model, n_bits: 10, Average Top-10 Accuracy: 1.0000 Model: MultiHeadsQGPT2Model, n_bits: 11, Average Top-10 Accuracy: 1.0000