|
--- |
|
license: cc-by-nc-4.0 |
|
language: |
|
- uk |
|
--- |
|
|
|
|
|
# UAlpaca: Ukrainian instruction-tuned LLaMA |
|
|
|
## Usage |
|
|
|
Check the Github repo with code and dataset: https://github.com/robinhad/kruk |
|
|
|
Generation Example: [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/robinhad/kruk/blob/main/notebooks/ualpaca-lora.ipynb) |
|
|
|
# Requirements |
|
```bash |
|
pip install bitsandbytes |
|
pip install -q datasets loralib sentencepiece |
|
pip install -q git+https://github.com/zphang/transformers@c3dc391 # this model uses a fork of transformers that provides LLaMA tokenizer; this wasn't merged yet |
|
pip install -q git+https://github.com/huggingface/peft.git |
|
``` |
|
```python |
|
from peft import PeftModel |
|
from transformers import LLaMATokenizer, LLaMAForCausalLM, GenerationConfig |
|
|
|
tokenizer = LLaMATokenizer.from_pretrained("decapoda-research/llama-7b-hf") |
|
model = LLaMAForCausalLM.from_pretrained( |
|
"decapoda-research/llama-7b-hf", |
|
load_in_8bit=True, |
|
device_map="auto", |
|
) |
|
model = PeftModel.from_pretrained(model, "robinhad/ualpaca-7b-llama") |
|
|
|
# convert input to correct prompt |
|
def generate_prompt(instruction, input=None): |
|
if input: |
|
return f"""Унизу надається інструкція, яка описує завдання разом із вхідними даними, які надають додатковий контекст. Напиши відповідь, яка правильно доповнює запит. |
|
|
|
### Інструкція: |
|
{instruction} |
|
|
|
### Вхідні дані: |
|
{input} |
|
|
|
### Відповідь:""" |
|
else: |
|
return f"""Унизу надається інструкція, яка описує завдання. Напиши відповідь, яка правильно доповнює запит. |
|
|
|
### Інструкція: |
|
{instruction} |
|
|
|
### Відповідь:""" |
|
|
|
# config and inference |
|
generation_config = GenerationConfig( |
|
temperature=0.2, |
|
top_p=0.75, |
|
num_beams=4, |
|
) |
|
|
|
def evaluate(instruction, input=None): |
|
prompt = generate_prompt(instruction, input) |
|
inputs = tokenizer(prompt, return_tensors="pt") |
|
input_ids = inputs["input_ids"].cuda() |
|
generation_output = model.generate( |
|
input_ids=input_ids, |
|
generation_config=generation_config, |
|
return_dict_in_generate=True, |
|
output_scores=True, |
|
max_new_tokens=256 |
|
) |
|
for s in generation_output.sequences: |
|
output = tokenizer.decode(s) |
|
print("Відповідь:", output.split("### Відповідь:")[1].strip()) |
|
|
|
input_data = "Як звали батька Тараса Григоровича Шевченка?" |
|
print("Інструкція:", input_data) |
|
evaluate("Інструкція: " + input_data) |
|
``` |