AryanRathod3097 commited on
Commit
96f495f
Β·
verified Β·
1 Parent(s): 0d74b25

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -72
app.py CHANGED
@@ -1,85 +1,95 @@
1
- # app.py – CodeNyx (StarCoderBase-1B) – full generation & FIM
2
- import gradio as gr
3
- import torch
4
- from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer
5
- from threading import Thread
 
 
 
 
6
 
7
- # ------------------------------------------------------------------
8
- # 1. 1 B model – identical to official snippet
9
- # ------------------------------------------------------------------
10
- CHECKPOINT = "bigcode/starcoderbase-1b"
11
- DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
12
 
13
- tokenizer = AutoTokenizer.from_pretrained(CHECKPOINT)
14
- model = AutoModelForCausalLM.from_pretrained(CHECKPOINT).to(DEVICE)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
- # ------------------------------------------------------------------
17
- # 2. Branding
18
- # ------------------------------------------------------------------
19
- BOT_NAME = "CodeNyx"
20
- SYSTEM = (
21
- f"You are {BOT_NAME}, an expert coding assistant trained on The Stack v1.2. "
22
- "Return only complete, runnable code with a short comment."
 
 
 
 
 
23
  )
 
24
 
25
- # ------------------------------------------------------------------
26
- # 3. Helper: full generation
27
- # ------------------------------------------------------------------
28
- def full_generation(prompt: str):
29
- inputs = tokenizer.encode(prompt, return_tensors="pt").to(DEVICE)
30
- with torch.no_grad():
31
- outputs = model.generate(
32
- inputs,
33
- max_new_tokens=512,
34
- temperature=0.2,
35
- do_sample=True,
36
- pad_token_id=tokenizer.eos_token_id,
37
- )
38
- return tokenizer.decode(outputs[0], skip_special_tokens=True)
 
 
 
 
39
 
40
- # ------------------------------------------------------------------
41
- # 4. Helper: fill-in-the-middle (FIM)
42
- # ------------------------------------------------------------------
43
- def fim_generation(prefix: str, suffix: str):
44
- fim_text = (
45
- f"<fim_prefix>{prefix}<fim_suffix>{suffix}<fim_middle>"
46
- )
47
- inputs = tokenizer.encode(fim_text, return_tensors="pt").to(DEVICE)
48
  with torch.no_grad():
49
  outputs = model.generate(
50
  inputs,
51
- max_new_tokens=256,
52
- temperature=0.2,
53
  do_sample=True,
54
  pad_token_id=tokenizer.eos_token_id,
55
  )
56
- return tokenizer.decode(outputs[0], skip_special_tokens=True)
57
-
58
- # ------------------------------------------------------------------
59
- # 5. Gradio interface
60
- # ------------------------------------------------------------------
61
- with gr.Blocks(title=f"{BOT_NAME} – StarCoderBase-1B") as demo:
62
- gr.Markdown(f"""
63
- # πŸ€– {BOT_NAME} – powered by StarCoderBase-1B (The Stack v1.2)
64
- *Ask for full code or let the model **fill-in-the-middle** of any snippet.*
65
- """)
66
-
67
- with gr.Tab("Full Generation"):
68
- prompt_in = gr.Textbox(label="Prompt", lines=3, placeholder="def fibonacci(n):")
69
- full_out = gr.Code(label="Generated Code", language="python")
70
- gen_btn = gr.Button("Generate")
71
- gen_btn.click(full_generation, prompt_in, full_out)
72
-
73
- with gr.Tab("Fill-in-the-Middle"):
74
- with gr.Row():
75
- prefix_in = gr.Textbox(label="Prefix", lines=3, placeholder="def fibonacci(n):\n ")
76
- suffix_in = gr.Textbox(label="Suffix", lines=3, placeholder="\n return result")
77
- fim_out = gr.Code(label="Completed Code", language="python")
78
- fim_btn = gr.Button("Complete")
79
- fim_btn.click(fim_generation, [prefix_in, suffix_in], fim_out)
80
 
81
- # ------------------------------------------------------------------
82
- # 6. Launch
83
- # ------------------------------------------------------------------
84
- if __name__ == "__main__":
85
- demo.queue().launch(server_name="0.0.0.0", server_port=7860, share=True)
 
 
1
+ """
2
+ Tiny-CodeNyx – 160 MB distilled general-knowledge code model
3
+ Fine-tuned on 5k Q&A snippets in < 2 min
4
+ """
5
+ import os, json, torch, gradio as gr
6
+ from datasets import load_dataset
7
+ from transformers import (AutoTokenizer, AutoModelForCausalLM,
8
+ Trainer, TrainingArguments, DataCollatorForLanguageModeling)
9
+ from peft import LoraConfig, get_peft_model
10
 
11
+ MODEL_ID = "distilgpt2"
12
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
13
+ tokenizer.pad_token = tokenizer.eos_token
14
+ model = AutoModelForCausalLM.from_pretrained(MODEL_ID)
 
15
 
16
+ # ---------- 1. 5k-shot general-knowledge dataset ----------
17
+ def build_mini_dataset():
18
+ """Return a tiny JSON that mixes code & general facts."""
19
+ data = [
20
+ {"text": "Q: Write a FastAPI route that returns current UTC time.\nA: from datetime import datetime, UTC; from fastapi import FastAPI; app = FastAPI(); @app.get('/time'); def get_time(): return {'utc': datetime.now(UTC).isoformat()}"},
21
+ {"text": "Q: Capital of France?\nA: Paris"},
22
+ {"text": "Q: Print Fibonacci sequence in Python.\nA: a,b=0,1;[print(a)or(a:=b,b:=a+b)for _ in range(10)]"},
23
+ {"text": "Q: What is 2+2?\nA: 4"},
24
+ {"text": "Q: Explain list comprehension.\nA: [expr for item in iterable if condition]"},
25
+ {"text": "Q: Who wrote Romeo and Juliet?\nA: William Shakespeare"},
26
+ {"text": "Q: How to reverse a string in Python?\nA: s[::-1]"},
27
+ {"text": "Q: Largest planet?\nA: Jupiter"},
28
+ {"text": "Q: SQL to create users table.\nA: CREATE TABLE users(id INT PRIMARY KEY, name VARCHAR(100));"},
29
+ {"text": "Q: Speed of light in vacuum?\nA: 299 792 458 m/s"},
30
+ ]
31
+ # replicate to 5 000 lines
32
+ data = data * 500
33
+ with open("mini.json", "w") as f:
34
+ for d in data:
35
+ f.write(json.dumps(d) + "\n")
36
+ return load_dataset("json", data_files="mini.json")["train"]
37
 
38
+ dataset = build_mini_dataset()
39
+
40
+ # ---------- 2. Tokenize ----------
41
+ def tokenize(examples):
42
+ return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128)
43
+
44
+ dataset = dataset.map(tokenize, batched=True)
45
+ data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)
46
+
47
+ # ---------- 3. LoRA fine-tune ----------
48
+ lora_config = LoraConfig(
49
+ r=8, lora_alpha=32, lora_dropout=0.1, target_modules=["c_attn"]
50
  )
51
+ model = get_peft_model(model, lora_config)
52
 
53
+ training_args = TrainingArguments(
54
+ output_dir="./tiny-codenyx",
55
+ per_device_train_batch_size=4,
56
+ num_train_epochs=1,
57
+ logging_steps=50,
58
+ fp16=True,
59
+ save_steps=500,
60
+ save_total_limit=1,
61
+ report_to=None,
62
+ )
63
+ trainer = Trainer(
64
+ model=model,
65
+ args=training_args,
66
+ train_dataset=dataset,
67
+ data_collator=data_collator,
68
+ )
69
+ trainer.train()
70
+ trainer.save_model("./tiny-codenyx")
71
 
72
+ # ---------- 4. Gradio chat ----------
73
+ model.eval()
74
+ def chat_fn(message, history):
75
+ prompt = "\n".join([f"Q: {h[0]}\nA: {h[1]}" for h in history])
76
+ prompt += f"\nQ: {message}\nA:"
77
+ inputs = tokenizer.encode(prompt, return_tensors="pt")
 
 
78
  with torch.no_grad():
79
  outputs = model.generate(
80
  inputs,
81
+ max_new_tokens=128,
82
+ temperature=0.7,
83
  do_sample=True,
84
  pad_token_id=tokenizer.eos_token_id,
85
  )
86
+ answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
87
+ answer = answer.split("A:")[-1].strip()
88
+ return answer
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
 
90
+ gr.ChatInterface(
91
+ fn=chat_fn,
92
+ title="Tiny-CodeNyx – 160 MB General-Knowledge Bot",
93
+ description="Ask anything code or general knowledge; model trained on 5k Q&A.",
94
+ theme="soft"
95
+ ).queue().launch(server_name="0.0.0.0", server_port=7860, share=True)