broadfield-dev commited on
Commit
7a0f913
·
verified ·
1 Parent(s): fe5fddd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -19
app.py CHANGED
@@ -1,55 +1,80 @@
1
  from flask import Flask, render_template, request
2
  import torch
3
- from transformers import AutoModelForCausalLM, AutoTokenizer
4
  import numpy as np
5
- import requests, json
 
6
  from huggingface_hub import hf_hub_download
7
 
8
  app = Flask(__name__)
9
 
 
 
 
 
 
 
10
  @app.route("/", methods=["GET", "POST"])
11
  def index():
12
  result = None
 
 
13
  if request.method == "POST":
14
  server_url = request.form["server_url"].rstrip("/")
15
- prompt = request.form["prompt"]
16
  ee_seed = int(request.form["ee_seed"])
17
- ee_model_name = request.form["ee_model_name"]
18
- max_tokens = int(request.form["max_tokens"])
19
 
20
  try:
21
- # Load tokenizer + ee_config from the EE model
22
- tokenizer = AutoTokenizer.from_pretrained(ee_model_name, trust_remote_code=True)
23
  config_path = hf_hub_download(ee_model_name, "ee_config.json")
24
  with open(config_path) as f:
25
  ee_config = json.load(f)
 
 
 
 
 
 
 
 
26
 
27
- # Load only embedding layer from EE model (transformed!)
28
- embed_layer = AutoModelForCausalLM.from_pretrained(
29
- ee_model_name, trust_remote_code=True, device_map="cpu"
30
- ).model.embed_tokens
 
 
 
 
31
 
32
- # Tokenize + get encrypted embeddings
33
  inputs = tokenizer(prompt, return_tensors="pt")
34
  with torch.no_grad():
35
- embeds = embed_layer(inputs.input_ids) # already "encrypted" because we loaded transformed embed
 
 
 
 
36
 
37
- # Send to server
38
  payload = {
39
- "encrypted_embeds": embeds.tolist(),
40
  "attention_mask": inputs.attention_mask.tolist(),
41
  "max_new_tokens": max_tokens
42
  }
43
- resp = requests.post(f"{server_url}/generate", json=payload, timeout=180)
 
44
  resp.raise_for_status()
45
- gen_ids = resp.json()["generated_ids"]
46
 
 
47
  result = tokenizer.decode(gen_ids, skip_special_tokens=True)
48
 
49
  except Exception as e:
50
- result = f"Error: {str(e)}"
51
 
52
- return render_template("client.html", result=result)
53
 
54
  if __name__ == "__main__":
55
  app.run(host="0.0.0.0", port=7860)
 
1
  from flask import Flask, render_template, request
2
  import torch
3
+ from transformers import AutoTokenizer
4
  import numpy as np
5
+ import requests
6
+ import json
7
  from huggingface_hub import hf_hub_download
8
 
9
  app = Flask(__name__)
10
 
11
+ def get_sigma(hidden_size: int, seed: int):
12
+ """Client-side encryption key from secret seed"""
13
+ rng = np.random.default_rng(seed)
14
+ sigma = rng.permutation(hidden_size)
15
+ return sigma
16
+
17
  @app.route("/", methods=["GET", "POST"])
18
  def index():
19
  result = None
20
+ error = None
21
+
22
  if request.method == "POST":
23
  server_url = request.form["server_url"].rstrip("/")
24
+ ee_model_name = request.form["ee_model_name"].strip()
25
  ee_seed = int(request.form["ee_seed"])
26
+ prompt = request.form["prompt"].strip()
27
+ max_tokens = int(request.form.get("max_tokens", 256))
28
 
29
  try:
30
+ # 1. Load config to know hidden_size + original model
 
31
  config_path = hf_hub_download(ee_model_name, "ee_config.json")
32
  with open(config_path) as f:
33
  ee_config = json.load(f)
34
+ hidden_size = ee_config["hidden_size"]
35
+ original_model_name = ee_config["original_model"]
36
+
37
+ # 2. Generate encryption permutation (this is your secret key in action)
38
+ sigma = get_sigma(hidden_size, ee_seed)
39
+
40
+ # 3. Load tokenizer
41
+ tokenizer = AutoTokenizer.from_pretrained(ee_model_name, trust_remote_code=True)
42
 
43
+ # 4. Load ORIGINAL (clean) embedding layer
44
+ embed_model = AutoModelForCausalLM.from_pretrained(
45
+ original_model_name,
46
+ torch_dtype=torch.float16,
47
+ device_map="cpu",
48
+ trust_remote_code=True
49
+ )
50
+ embed_layer = embed_model.model.embed_tokens
51
 
52
+ # 5. Tokenize + compute normal embeddings
53
  inputs = tokenizer(prompt, return_tensors="pt")
54
  with torch.no_grad():
55
+ normal_embeds = embed_layer(inputs.input_ids) # shape: (1, seq_len, hidden_size)
56
+
57
+ # 6. === EXPLICIT ENCRYPTION (this is the key step you asked for) ===
58
+ # Permute the hidden dimension according to the secret sigma
59
+ encrypted_embeds = normal_embeds[..., sigma] # now scrambled — provider sees nothing
60
 
61
+ # 7. Send ONLY encrypted embeddings to server
62
  payload = {
63
+ "encrypted_embeds": encrypted_embeds.tolist(),
64
  "attention_mask": inputs.attention_mask.tolist(),
65
  "max_new_tokens": max_tokens
66
  }
67
+
68
+ resp = requests.post(f"{server_url}/generate", json=payload, timeout=300)
69
  resp.raise_for_status()
 
70
 
71
+ gen_ids = resp.json()["generated_ids"]
72
  result = tokenizer.decode(gen_ids, skip_special_tokens=True)
73
 
74
  except Exception as e:
75
+ error = str(e)
76
 
77
+ return render_template("client.html", result=result, error=error)
78
 
79
  if __name__ == "__main__":
80
  app.run(host="0.0.0.0", port=7860)