from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfigfrom peft import PeftModelimport torch # Configure 4-bit quantization (recommended for memory efficiency)bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True,) # Load base modelbase_model = AutoModelForCausalLM.from_pretrained( "google/gemma-2-9b-it", quantization_config=bnb_config, device_map="auto", torch_dtype=torch.bfloat16,)tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-9b-it") # Load LoRA adapteradapter_name = "dsfsi/gemma_2_9b_it-lora-r64-hau-eng"model = PeftModel.from_pretrained(base_model, adapter_name)model.eval() # Prepare translation promptsource_text = "Climate change significantly impacts agricultural productivity in sub-Saharan Africa."instruction = "Translate the following Hausa scientific text to English." # Format for Gemma chat templatemessages = [{"role": "user", "content": f"{instruction}\n\n{source_text}"}]prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) # Generate translationinputs = tokenizer(prompt, return_tensors="pt").to(model.device)with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=256, num_beams=5, early_stopping=True, pad_token_id=tokenizer.pad_token_id, ) # Decode only the generated partgenerated = outputs[0][inputs["input_ids"].shape[1]:]translation = tokenizer.decode(generated, skip_special_tokens=True)print(translation)