Views
No views yet
--tensor-type option in llama.cpp to manually "bump" important layers to higher precision. You can see the implementation here:ollama run huihui_ai/magistral-abliteratedtransformers library:1from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, TextStreamer
2import torch
3import os
4import signal
5import time
6import numpy as np
7import random
8
9cpu_count = os.cpu_count()
10print(f"Number of CPU cores in the system: {cpu_count}")
11half_cpu_count = cpu_count // 2
12os.environ["MKL_NUM_THREADS"] = str(half_cpu_count)
13os.environ["OMP_NUM_THREADS"] = str(half_cpu_count)
14torch.set_num_threads(half_cpu_count)
15
16print(f"PyTorch threads: {torch.get_num_threads()}")
17print(f"MKL threads: {os.getenv('MKL_NUM_THREADS')}")
18print(f"OMP threads: {os.getenv('OMP_NUM_THREADS')}")
19
20# Load the model and tokenizer
21NEW_MODEL_ID = "huihui-ai/Magistral-Small-2506-abliterated"
22print(f"Load Model {NEW_MODEL_ID} ... ")
23
24tokenizer = AutoTokenizer.from_pretrained(NEW_MODEL_ID, trust_remote_code=True)
25#if tokenizer.pad_token is None:
26# tokenizer.pad_token = tokenizer.eos_token
27#tokenizer.pad_token_id = tokenizer.eos_token_id
28
29quant_config_4 = BitsAndBytesConfig(
30 load_in_4bit=True,
31 bnb_4bit_compute_dtype=torch.bfloat16,
32 bnb_4bit_use_double_quant=True,
33 llm_int14_enable_fp32_cpu_offload=True,
34)
35
36model = AutoModelForCausalLM.from_pretrained(
37 NEW_MODEL_ID,
38 device_map="auto",
39 trust_remote_code=True,
40 quantization_config=quant_config_4,
41 torch_dtype=torch.bfloat16
42)
43
44def load_system_prompt(repo_id: str, filename: str) -> str:
45 file_path = f"{repo_id}/{filename}"
46 with open(file_path, "r") as file:
47 system_prompt = file.read()
48 return system_prompt
49
50SYSTEM_PROMPT = load_system_prompt(NEW_MODEL_ID, "SYSTEM_PROMPT.txt")
51
52
53initial_messages = [{"role": "system", "content": SYSTEM_PROMPT}]
54messages = initial_messages.copy()
55nothink = False
56same_seed = False
57skip_prompt=True
58skip_special_tokens=True
59do_sample = True
60
61def set_random_seed(seed=None):
62 """Set random seed for reproducibility. If seed is None, use int(time.time())."""
63 if seed is None:
64 seed = int(time.time()) # Convert float to int
65 random.seed(seed)
66 np.random.seed(seed)
67 torch.manual_seed(seed)
68 torch.cuda.manual_seed_all(seed) # If using CUDA
69 torch.backends.cudnn.deterministic = True
70 torch.backends.cudnn.benchmark = False
71 return seed # Return seed for logging if needed
72
73def apply_chat_template(tokenizer, messages, nothink, add_generation_prompt=True):
74 input_ids = tokenizer.apply_chat_template(
75 messages,
76 tokenize=False,
77 add_generation_prompt=add_generation_prompt,
78 )
79 if nothink:
80 input_ids += "\n<think>\n\n</think>\n"
81 return input_ids
82
83class CustomTextStreamer(TextStreamer):
84 def __init__(self, tokenizer, skip_prompt=True, skip_special_tokens=True):
85 super().__init__(tokenizer, skip_prompt=skip_prompt, skip_special_tokens=skip_special_tokens)
86 self.generated_text = ""
87 self.stop_flag = False
88 self.init_time = time.time() # Record initialization time
89 self.end_time = None # To store end time
90 self.first_token_time = None # To store first token generation time
91 self.token_count = 0 # To track total tokens
92
93 def on_finalized_text(self, text: str, stream_end: bool = False):
94 if self.first_token_time is None and text.strip(): # Set first token time on first non-empty text
95 self.first_token_time = time.time()
96 self.generated_text += text
97 # Count tokens in the generated text
98 tokens = self.tokenizer.encode(text, add_special_tokens=False)
99 self.token_count += len(tokens)
100 print(text, end="", flush=True)
101 if stream_end:
102 self.end_time = time.time() # Record end time when streaming ends
103 if self.stop_flag:
104 raise StopIteration
105
106 def stop_generation(self):
107 self.stop_flag = True
108 self.end_time = time.time() # Record end time when generation is stopped
109
110 def get_metrics(self):
111 """Returns initialization time, first token time, first token latency, end time, total time, total tokens, and tokens per second."""
112 if self.end_time is None:
113 self.end_time = time.time() # Set end time if not already set
114 total_time = self.end_time - self.init_time # Total time from init to end
115 tokens_per_second = self.token_count / total_time if total_time > 0 else 0
116 first_token_latency = (self.first_token_time - self.init_time) if self.first_token_time is not None else None
117 metrics = {
118 "init_time": self.init_time,
119 "first_token_time": self.first_token_time,
120 "first_token_latency": first_token_latency,
121 "end_time": self.end_time,
122 "total_time": total_time, # Total time in seconds
123 "total_tokens": self.token_count,
124 "tokens_per_second": tokens_per_second
125 }
126 return metrics
127
128def generate_stream(model, tokenizer, messages, nothink, skip_prompt, skip_special_tokens, do_sample, max_new_tokens):
129 formatted_prompt = apply_chat_template(tokenizer, messages, nothink)
130 input_ids = tokenizer(
131 formatted_prompt,
132 return_tensors="pt",
133 return_attention_mask=True,
134 padding=False
135 )
136
137 tokens = input_ids['input_ids'].to(model.device)
138 attention_mask = input_ids['attention_mask'].to(model.device)
139
140 streamer = CustomTextStreamer(tokenizer, skip_prompt=skip_prompt, skip_special_tokens=skip_special_tokens)
141
142 def signal_handler(sig, frame):
143 streamer.stop_generation()
144 print("\n[Generation stopped by user with Ctrl+C]")
145
146 signal.signal(signal.SIGINT, signal_handler)
147
148 if do_sample:
149 generate_kwargs = {
150 "do_sample": do_sample,
151 "max_length": max_new_tokens,
152 "temperature": 0.6,
153 "top_k": 20,
154 "top_p": 0.95,
155 "repetition_penalty": 1.2,
156 "no_repeat_ngram_size": 2
157 }
158 else:
159 generate_kwargs = {
160 "do_sample": do_sample,
161 "max_length": max_new_tokens,
162 "repetition_penalty": 1.2,
163 "no_repeat_ngram_size": 2
164 }
165
166 print("Response: ", end="", flush=True)
167 try:
168 generated_ids = model.generate(
169 tokens,
170 attention_mask=attention_mask,
171 #use_cache=False,
172 pad_token_id=tokenizer.pad_token_id,
173 streamer=streamer,
174 **generate_kwargs
175 )
176 del generated_ids
177 except StopIteration:
178 print("\n[Stopped by user]")
179
180 del input_ids, attention_mask
181 torch.cuda.empty_cache()
182 signal.signal(signal.SIGINT, signal.SIG_DFL)
183
184 return streamer.generated_text, streamer.stop_flag, streamer.get_metrics()
185
186init_seed = set_random_seed()
187
188while True:
189 if same_seed:
190 set_random_seed(init_seed)
191 else:
192 init_seed = set_random_seed()
193
194 print(f"\nnothink: {nothink}")
195 print(f"skip_prompt: {skip_prompt}")
196 print(f"skip_special_tokens: {skip_special_tokens}")
197 print(f"do_sample: {do_sample}")
198 print(f"same_seed: {same_seed}, {init_seed}\n")
199
200 user_input = input("User: ").strip()
201 if user_input.lower() == "/exit":
202 print("Exiting chat.")
203 break
204 if user_input.lower() == "/clear":
205 messages = initial_messages.copy()
206 print("Chat history cleared. Starting a new conversation.")
207 continue
208 if user_input.lower() == "/nothink":
209 nothink = not nothink
210 continue
211 if user_input.lower() == "/skip_prompt":
212 skip_prompt = not skip_prompt
213 continue
214 if user_input.lower() == "/skip_special_tokens":
215 skip_special_tokens = not skip_special_tokens
216 continue
217 if user_input.lower().startswith("/same_seed"):
218 parts = user_input.split()
219 if len(parts) == 1: # /same_seed (no number)
220 same_seed = not same_seed # Toggle switch
221 elif len(parts) == 2: # /same_seed <number>
222 try:
223 init_seed = int(parts[1]) # Extract and convert number to int
224 same_seed = True
225 except ValueError:
226 print("Error: Please provide a valid integer after /same_seed")
227 continue
228 if user_input.lower() == "/do_sample":
229 do_sample = not do_sample
230 continue
231 if not user_input:
232 print("Input cannot be empty. Please enter something.")
233 continue
234
235 messages.append({"role": "user", "content": user_input})
236 response, stop_flag, metrics = generate_stream(model, tokenizer, messages, nothink, skip_prompt, skip_special_tokens, do_sample, 40960)
237 print("\nMetrics:")
238 for key, value in metrics.items():
239 print(f" {key}: {value}")
240 print("", flush=True)
241 if stop_flag:
242 continue
243 messages.append({"role": "assistant", "content": response})
244 bc1qqnkhuchxw0zqjh2ku3lu4hq45hc6gy84uk70geTurboLLM (GPT-4.1-mini)HugLLM (Hugginface Open-source models)TestLLM (Experimental CPU-only)"Give me info on my websites SSL certificate""Check if my server is using quantum safe encyption for communication""Run a comprehensive security audit on my server"