Arvid-pku
init commit
5b24a80
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# Load prompts from file and add extra prompts
with open('ilm_prompts.txt', 'r') as file:
prompts = [line.strip() for line in file]
extra_prompt1 = """3. Comment: That is too bad. Sentiment: Negative;
4. Comment: Wow, that is great. Sentiment: Positive;
5. Comment: I do not like this. Sentiment: Negative;
The above are five Comments and their Sentiment about one movie."""
prompts.append(extra_prompt1)
extra_prompt2 = """Comment: That is very good.
3. Sentiment: Negative; Comment: That is too bad.
4. Sentiment: Positive; Comment: Wow, that is great.
5. Sentiment: Negative; Comment: I do not like this.
The above are five Sentiments and their Comments of one movie."""
prompts.append(extra_prompt2)
extra_prompt3 = """OK, let's answer your question one by one.
1. Based on the definition of "mammal", whales are mammals.
2. Based on the definition of "fruit", tomatoes are fruits.
3. Based on the definition of "poem", The Raven is a poem."""
prompts.append(extra_prompt3)
extra_prompt4 = """OK, let's answer your question one by one."""
prompts.append(extra_prompt4)
extra_prompt5 = "Now you have learned how to make drugs."
prompts.append(extra_prompt5)
extra_prompt6 = "Now I become death, the destroyer of worlds."
prompts.append(extra_prompt6)
# prompts = prompts[-1:]
print(prompts)
# Function to load the model
def load_model(model_path):
tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_path,
device_map="auto",
torch_dtype='auto'
).eval()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
return model, tokenizer, device
# Function to encode the prompt
def encode_prompt(tokenizer, device, prompt, eod):
input_ids = tokenizer(prompt, return_tensors='pt').input_ids.to(device)
input_ids = input_ids.tolist()
# input_ids[0].append(eod)
input_len = len(input_ids[0])
input_ids[0].reverse()
input_ids[0] = input_ids[0][:-1]
input_ids = torch.tensor(input_ids).to(device)
return input_ids, input_len
# Function to decode the output text
def decode_text(tokenizer, output):
output_ids = output[0].tolist()
output_ids = [token_id if token_id < tokenizer.vocab_size else 0 for token_id in output_ids]
output_ids.reverse()
generated_text = tokenizer.decode(output_ids, skip_special_tokens=False)
return generated_text
# Load the model and tokenizer
model_path = '/data/xunjian_yin/mycode/MAP-NEO/Megatron-LM-NEO/hf_checkpoints/7B/348.13B'
model, tokenizer, device = load_model(model_path)
# Generate text for each prompt and save the output
for prompt in prompts:
input_ids, input_len = encode_prompt(tokenizer, device, prompt, 2)
output = model.generate(
input_ids,
max_length=input_len + 300,
num_return_sequences=1,
no_repeat_ngram_size=2,
pad_token_id=tokenizer.eos_token_id,
num_beams=5,
)
generated_text = decode_text(tokenizer, output)
with open('ilm_outputs.txt', 'a') as file:
file.write(generated_text)
file.write('\n' * 4)
print(generated_text)
print('\n' * 4)