Views
No views yet
1#!/bin/bash
2# python 3.10 + cuda 11.8.0
3
4
5export MKL_NUM_THREADS=1
6export NUMEXPR_NUM_THREADS=1
7export OPENBLAS_NUM_THREADS=1
8export OMP_NUM_THREADS=1
9
10conda clean -a -y # conda for traditional and reliable setup
11mamba clean -a -y # mamba for smart and efficient setup
12pip install --upgrade pip
13
14# cuda, gcc/g++, torch
15conda install cuda -c nvidia/label/cuda-11.8.0 -y
16pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu118
17pip install torchao==0.7.0 --index-url https://download.pytorch.org/whl/cu118
18
19# deepspeed
20mamba install gcc gxx -c conda-forge -y # ensure > 9.0 for ninja JIT
21pip install deepspeed==0.15.4
22
23# bitsandbytes
24pip install setuptools
25mamba install bitsandbytes=0.45.0 -c conda-forge --no-deps -y
26pip install psutil
27# add the following to your .bashrc or running scripts
28#export BNB_CUDA_VERSION=118
29#export CUDA_HOME=$CONDA_PREFIX
30#export LD_LIBRARY_PATH="$CONDA_PREFIX/lib:$LD_LIBRARY_PATH"
31
32# trl, accelerate, peft
33pip install trl
34pip install accelerate peft optuna optuna_integration datasets
35
36# other dependencies
37pip install scikit-learn pexpect
38pip install wandb plotly # takes a while1from peft import PeftModel
2import time
3import torch
4from transformers import PreTrainedTokenizerFast, AutoModelForCausalLM
5
6
7class Conversation:
8 def __init__(self,
9 model,
10 tokenizer,
11 device,
12 system=""):
13 self.model = model
14 self.tokenizer = tokenizer
15 self.device = device
16 self.message = []
17 if system:
18 self.message.append({"role": "system", "content": system})
19
20 def get_prompt(self):
21 prompt = '<|begin_of_text|>'
22 # Include the system message if it exists
23 for msg in self.message:
24 role = msg['role']
25 content = msg['content']
26 prompt += f"<|start_header_id|>{role}<|end_header_id|>{content}<|eot_id|>"
27 # Append the assistant's role header to prompt for the next response
28 prompt += "<|start_header_id|>assistant<|end_header_id|>"
29 return prompt
30
31 def generate(self,
32 user_input,
33 temp=0.7,
34 max_new_tokens=1024,
35 top_k=50,
36 top_p=0.95):
37
38 # Add the user's input to the conversation history
39 self.message.append({"role": "user", "content": user_input})
40
41 # Generate the prompt
42 prompt = self.get_prompt()
43
44 # Tokenize the prompt
45 inputs = self.tokenizer(prompt,
46 return_tensors="pt",
47 truncation=True,
48 max_length=2048).to(self.device)
49 # inputs = {k: v.to(device) for k, v in inputs.items()}
50 if self.tokenizer.eos_token_id is None:
51 self.tokenizer.eos_token_id = self.tokenizer.convert_tokens_to_ids('</s>')
52 if self.tokenizer.pad_token_id is None:
53 self.tokenizer.pad_token_id = self.tokenizer.eos_token_id
54
55 print(f"EOS Token ID: {self.tokenizer.eos_token_id}")
56 print(f"PAD Token ID: {self.tokenizer.pad_token_id}")
57 # Generate the response
58 with torch.no_grad():
59 outputs = self.model.generate(
60 **inputs,
61 max_new_tokens=max_new_tokens,
62 do_sample=True,
63 temperature=temp,
64 top_k=top_k,
65 top_p=top_p,
66 pad_token_id=self.tokenizer.eos_token_id,
67 # eos_token_id=self.tokenizer.convert_tokens_to_ids('<|eot_id|>'),
68 eos_token_id=self.tokenizer.eos_token_id,
69 )
70
71 # Decode the generated tokens
72 generated_text = self.tokenizer.decode(outputs[0], skip_special_tokens=False)
73
74 # Extract the assistant's response
75 assistant_response = self.extract_assistant_response(prompt, generated_text)
76
77 # Append the assistant's response to the conversation
78 self.message.append({'role': 'assistant', 'content': assistant_response})
79
80 return assistant_response
81
82 def extract_assistant_response(self, prompt, generated_text):
83 # Llama will keep generating after the prompt submitted, this function will
84 # extract only the LLM's generated output with no special tokens
85
86 # Remove the prompt from the generated text
87 response_text = generated_text[len(prompt):]
88
89 # Split at the end-of-turn token
90 if '<|eot_id|>' in response_text:
91 assistant_response = response_text.split('<|eot_id|>')[0]
92 else:
93 assistant_response = response_text
94
95 # Remove special token at the end and leading or trailing whitespaces
96 assistant_response = assistant_response.replace('<|end_header_id|>', '')
97 assistant_response = assistant_response.strip()
98
99 return assistant_response
100
101
102if __name__ == "__main__":
103 base_model_name = "meta-llama/Llama-3.2-11B-Vision-Instruct"
104 peft_model_name = "my-ai-university/TOMMI-0.3"
105
106 tokenizer = PreTrainedTokenizerFast.from_pretrained(
107 model_args.model_name_or_path,
108 return_tensors="pt")
109 tokenizer.pad_token = "<|reserved_special_token_5|>"
110
111 base_model = AutoModelForCausalLM.from_pretrained(
112 base_model_name,
113 torch_dtype=torch.bfloat16,
114 device_map="auto")
115 model = PeftModel.from_pretrained(base_model, peft_model_name)
116 model = model.merge_and_unload() # Optional: Merge adapter with base model for faster inference
117
118 # Initialize the conversation object
119 system_message = 'You are an expert professor who replies in a helpful way.'
120 conv = Conversation(
121 model,
122 tokenizer,
123 model.device,
124 system_message)
125
126 # Run the conversation loop
127 print("Starting conversation ...")
128 input_text = ""
129 while input_text.lower() != "exit":
130 input_text = input("Enter your prompt (type 'exit' to quit): ")
131
132 start_time = time.time()
133 response = conv.generate(input_text)
134 end_time = time.time()
135
136 print(response)
137 print(f"Response time: {end_time - start_time:.2f} seconds")
138
139 # Save the conversation to a file
140 with open("./conversation.txt", "w") as f:
141 f.write(str(conv.message))