File size: 4,311 Bytes
4dde64e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
---
license: apache-2.0
datasets:
- bertin-project/alpaca-spanish
language:
- es
library_name: transformers
---

# 馃悙 Chivito-LoRA 7B 馃悙

## Uso

Revisa el siguiente repo para m谩s detalles: https://github.com/CristianCristanchoT/chivito

```python
from peft import PeftModel
from transformers import LLaMATokenizer, LLaMAForCausalLM, GenerationConfig

tokenizer = LlamaTokenizer.from_pretrained("decapoda-research/llama-13b-hf")

def generate_prompt(data_point):
    # desculpe o desastre de formata莽茫o, preciso ser r谩pido
    if data_point["input"] != '':
        return f"""A continuaci贸n hay una instrucci贸n que describe una tarea, junto con una entrada que proporciona m谩s contexto. Escriba una respuesta que complete adecuadamente la solicitud.

### Instrucci贸n:
{data_point["instruction"]}

### Entrada:
{data_point["input"]}

### Respuesta:"""
    else:
        return f"""A continuaci贸n hay una instrucci贸n que describe una tarea. Escriba una respuesta que complete adecuadamente la solicitud.

### Instrucci贸n:
{data_point["instruction"]}

### Respuesta:"""
    
def tokenize(prompt):
    result = tokenizer(
        prompt,
        return_tensors="pt",
    )
    return result

def generate_and_tokenize_prompt(data_point):
    full_prompt = generate_prompt(data_point)
    tokenized_full_prompt = tokenize(full_prompt)
    return tokenized_full_prompt
    

model = LLaMAForCausalLM.from_pretrained(
    "decapoda-research/llama-7b-hf",
    load_in_8bit=True,
    device_map="auto",
)
model = PeftModel.from_pretrained(model, "CristianC/chivito_lora_alpaca_es_7b")


generation_config = GenerationConfig(
    temperature=0.1,
    top_p=0.75,
    top_k=40,
    num_beams=4
)

def evaluate(instruction):
    
    inputs = generate_and_tokenize_prompt(instruction)
    
    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("Respuesta: \n", output.split("### Respuesta:")[1].strip())
        
test_input = {
    'instruction': 'Escriba un programa en Python que imprima los primeros 10 n煤meros de Fibonacci.',
    'input': ''
}

evaluate(test_input)
```

## Data

Se uso [alpaca-spanish dataset](https://huggingface.co/datasets/bertin-project/alpaca-spanish), el cual es una traducci贸n de [alpaca_data.json](https://github.com/tatsu-lab/stanford_alpaca/blob/main/alpaca_data.json).

## Finetuning 

Para finetunear el modelo se empleao el codigo de [Alpaca Lora](https://github.com/tloen/alpaca-lora) (tambien fue usado [Cabrita](https://github.com/22-hours/cabrita)), que proporciona las herramientas necesarias para ajustar el modelo LLaMA. 


## Ejemplos:

```
Instrucci贸n: nombre las capitales regionales de Chile
Respuesta: Las capitales regionales de Chile son Arica, Antofagasta, La Serena, Coquimbo, Valpara铆so, Vi帽a del Mar, Concepci贸n, Temuco, Puerto Montt y Punta Arenas.
```


```
Instrucci贸n: Que son los chivos?
Los chivos son animales de la familia de los c茅rvidos. Son herb铆voros que se alimentan principalmente de hierba y hojas. Los chivos son animales sociales que viven en manadas y tienen una vida promedio de 10 a 15 a帽os.
```

```
Instrucci贸n: traduce la frase 'Hello! how are you?' al espa帽ol
Respuesta: 隆Hola! 驴C贸mo est谩s?
```

```
Instrucci贸n: escribe un programa de Python que imprima los primeros 24 n煤meros de Fibonacci
Respuesta: def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(24))
```

## Referencias
Si he visto m谩s, es poni茅ndome sobre los hombros de Gigantes.

 [LLaMA](https://ai.facebook.com/blog/large-language-model-llama-meta-ai/), [Stanford Alpaca](https://github.com/tatsu-lab/stanford_alpaca), [Alpaca Lora](https://github.com/tloen/alpaca-lora), [Cabrita](https://github.com/22-hours/cabrita), [Bertin](https://huggingface.co/bertin-project), [ChatGPT](https://openai.com/blog/chatgpt) y [Hugging Face](https://huggingface.co/).
 
 Ojala te sea de utilidad este proyecto y aprendas tanto como yo al hacerlo.