mirror of
				https://github.com/rasbt/LLMs-from-scratch.git
				synced 2025-10-26 07:20:09 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright (c) Sebastian Raschka under Apache License 2.0 (see LICENSE.txt).
 | |
| # Source for "Build a Large Language Model From Scratch"
 | |
| #   - https://www.manning.com/books/build-a-large-language-model-from-scratch
 | |
| # Code: https://github.com/rasbt/LLMs-from-scratch
 | |
| 
 | |
| from pathlib import Path
 | |
| import sys
 | |
| 
 | |
| import tiktoken
 | |
| import torch
 | |
| import chainlit
 | |
| 
 | |
| from previous_chapters import (
 | |
|     classify_review,
 | |
|     GPTModel
 | |
| )
 | |
| 
 | |
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
 | |
| 
 | |
| 
 | |
| def get_model_and_tokenizer():
 | |
|     """
 | |
|     Code to load finetuned GPT-2 model generated in chapter 6.
 | |
|     This requires that you run the code in chapter 6 first, which generates the necessary model.pth file.
 | |
|     """
 | |
| 
 | |
|     GPT_CONFIG_124M = {
 | |
|         "vocab_size": 50257,     # Vocabulary size
 | |
|         "context_length": 1024,  # Context length
 | |
|         "emb_dim": 768,          # Embedding dimension
 | |
|         "n_heads": 12,           # Number of attention heads
 | |
|         "n_layers": 12,          # Number of layers
 | |
|         "drop_rate": 0.1,        # Dropout rate
 | |
|         "qkv_bias": True         # Query-key-value bias
 | |
|     }
 | |
| 
 | |
|     tokenizer = tiktoken.get_encoding("gpt2")
 | |
| 
 | |
|     model_path = Path("..") / "01_main-chapter-code" / "review_classifier.pth"
 | |
|     if not model_path.exists():
 | |
|         print(
 | |
|             f"Could not find the {model_path} file. Please run the chapter 6 code"
 | |
|             " (ch06.ipynb) to generate the review_classifier.pth file."
 | |
|         )
 | |
|         sys.exit()
 | |
| 
 | |
|     # Instantiate model
 | |
|     model = GPTModel(GPT_CONFIG_124M)
 | |
| 
 | |
|     # Convert model to classifier as in section 6.5 in ch06.ipynb
 | |
|     num_classes = 2
 | |
|     model.out_head = torch.nn.Linear(in_features=GPT_CONFIG_124M["emb_dim"], out_features=num_classes)
 | |
| 
 | |
|     # Then load model weights
 | |
|     checkpoint = torch.load(model_path, map_location=device, weights_only=True)
 | |
|     model.load_state_dict(checkpoint)
 | |
|     model.to(device)
 | |
|     model.eval()
 | |
| 
 | |
|     return tokenizer, model
 | |
| 
 | |
| 
 | |
| # Obtain the necessary tokenizer and model files for the chainlit function below
 | |
| tokenizer, model = get_model_and_tokenizer()
 | |
| 
 | |
| 
 | |
| @chainlit.on_message
 | |
| async def main(message: chainlit.Message):
 | |
|     """
 | |
|     The main Chainlit function.
 | |
|     """
 | |
|     user_input = message.content
 | |
| 
 | |
|     label = classify_review(user_input, model, tokenizer, device, max_length=120)
 | |
| 
 | |
|     await chainlit.Message(
 | |
|         content=f"{label}",  # This returns the model response to the interface
 | |
|     ).send()
 | 
