| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- import torch
- from transformers import AutoTokenizer, AutoModelForCausalLM
- from datasets import load_dataset
- from nltk.translate.bleu_score import corpus_bleu
-
- # ----------------------------
- # Configuration
- # ----------------------------
- MODEL_DIR = "./qwen2.5-7b-uk-fr-lora" # dossier où tu as sauvegardé LoRA
- VALIDATION_FILE = "validation.jsonl" # petit subset de test (5-50 phrases)
- MAX_INPUT_LENGTH = 1024
- DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
-
- print("=== Loading model and tokenizer ===")
- tokenizer = AutoTokenizer.from_pretrained(MODEL_DIR, trust_remote_code=True)
- tokenizer.pad_token = tokenizer.eos_token
- tokenizer.model_max_length = MAX_INPUT_LENGTH
-
- model = AutoModelForCausalLM.from_pretrained(
- MODEL_DIR,
- device_map="auto",
- torch_dtype=torch.float16,
- trust_remote_code=True
- )
- model.eval()
-
- print("Model loaded.")
-
- # ----------------------------
- # Load validation dataset
- # ----------------------------
- print("Loading validation dataset...")
- dataset = load_dataset("json", data_files=VALIDATION_FILE)
- examples = dataset["train"] # petit subset
- print(f"{len(examples)} examples loaded for testing.")
-
- # ----------------------------
- # Function to generate translation
- # ----------------------------
- def translate(text):
- prompt = f"Translate the following Ukrainian text into French:\nUkrainian: {text}\nFrench:"
- inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=MAX_INPUT_LENGTH).to(DEVICE)
- with torch.no_grad():
- outputs = model.generate(
- **inputs,
- max_new_tokens=256,
- do_sample=False, # deterministic
- eos_token_id=tokenizer.eos_token_id,
- pad_token_id=tokenizer.pad_token_id
- )
- result = tokenizer.decode(outputs[0], skip_special_tokens=True)
- # Remove prompt from result
- return result.replace(prompt, "").strip()
-
- # ----------------------------
- # Test all examples and compute BLEU
- # ----------------------------
- print("Generating translations...")
- references = []
- hypotheses = []
-
- for i, example in enumerate(examples):
- src_text = example["text"]
- ref_text = example["translation"]
- pred_text = translate(src_text)
-
- print(f"\n[{i+1}] Source: {src_text}")
- print(f" Reference: {ref_text}")
- print(f" Prediction: {pred_text}")
-
- # Prepare for BLEU (tokenized by space)
- references.append([ref_text.split()])
- hypotheses.append(pred_text.split())
-
- # Compute corpus BLEU
- bleu_score = corpus_bleu(references, hypotheses)
- print(f"\n=== Corpus BLEU score: {bleu_score:.4f} ===")
|