1import torch
2from peft import PeftModel
3from transformers import AutoModelForCausalLM, AutoTokenizer
4
5# Choose base model based on your hardware
6# GPU (recommended): meta-llama/Llama-3.2-3B-Instruct
7# CPU: meta-llama/Llama-3.2-1B-Instruct
8BASE_MODEL = "meta-llama/Llama-3.2-3B-Instruct"
9ADAPTER_REPO = "a-01a/novelCrafter"
10
11# Load base model
12model = AutoModelForCausalLM.from_pretrained(
13 BASE_MODEL,
14 torch_dtype=torch.float16, # Use float32 for CPU
15 device_map="auto",
16)
17
18# Load LoRA adapter
19model = PeftModel.from_pretrained(model, ADAPTER_REPO)
20
21# Load tokenizer from adapter repo (includes custom chat template)
22tokenizer = AutoTokenizer.from_pretrained(ADAPTER_REPO)
23
24print("Model loaded successfully!")
1import torch
2from peft import PeftModel
3from transformers import AutoModelForCausalLM, AutoTokenizer
4
5BASE_MODEL = "meta-llama/Llama-3.2-3B-Instruct"
6ADAPTER_REPO = "a-01a/novelCrafter"
7
8# Load and merge
9base_model = AutoModelForCausalLM.from_pretrained(BASE_MODEL, torch_dtype=torch.float16)
10model = PeftModel.from_pretrained(base_model, ADAPTER_REPO)
11model = model.merge_and_unload() # Merge LoRA weights into base model
12
13tokenizer = AutoTokenizer.from_pretrained(ADAPTER_REPO)
1def generate_text(prompt, max_new_tokens=512):
2 '''Generate text using the fine-tuned model.'''
3 messages = [
4 {
5 "role": "system",
6 "content": "You are a skilled creative writing assistant. Write engaging, "
7 "descriptive prose with attention to character development and narrative flow."
8 },
9 {
10 "role": "user",
11 "content": prompt
12 }
13 ]
14
15 # Apply chat template
16 formatted_prompt = tokenizer.apply_chat_template(
17 messages,
18 tokenize=False,
19 add_generation_prompt=True
20 )
21
22 # Tokenize
23 inputs = tokenizer(formatted_prompt, return_tensors="pt").to(model.device)
24
25 # Generate
26 with torch.no_grad():
27 outputs = model.generate(
28 **inputs,
29 max_new_tokens=max_new_tokens,
30 temperature=0.7,
31 top_p=0.9,
32 do_sample=True,
33 pad_token_id=tokenizer.eos_token_id,
34 )
35
36 # Decode and return
37 response = tokenizer.decode(outputs[0], skip_special_tokens=True)
38 return response.split("assistant")[-1].strip()
39
40# Example usage
41result = generate_text(
42 "Write an opening paragraph for a mystery novel set in Victorian London."
43)
44print(result)
1from transformers import pipeline
2
3generator = pipeline(
4 "text-generation",
5 model=model,
6 tokenizer=tokenizer,
7 device_map="auto",
8)
9
10output = generator(
11 "Once upon a time in a distant kingdom,",
12 max_new_tokens=200,
13 temperature=0.7,
14)[0]["generated_text"]
15
16print(output)
This model is released strictly for academic research and educational purposes. By using this model, you agree to:
-
Non-Commercial Use: This model may not be used for commercial purposes without explicit written permission.
-
Responsible Use: Users must ensure generated content does not cause harm, spread misinformation, or violate any laws.
-
Attribution: Any academic publications or research using this model should provide appropriate citation.
-
No Malicious Use: The model must not be used to generate harmful, abusive, or illegal content.
-
Human Oversight: All generated content should be reviewed by humans before any public distribution.
-
Compliance: Users must comply with the base model's (Meta Llama) license terms and acceptable use policy.
1@misc{NovelCrafter-lora-2025,
2 title={NovelCrafter-LoRA: A Fine-Tuned Language Model for Creative Writing},
3 author={a-01a},
4 year={2025},
5 publisher={Hugging Face},
6 url={https://huggingface.co/a-01a/novelCrafter}
7}
For questions, issues, or collaboration inquiries, please open an issue on the Hugging Face repository.