Update README.md
Browse files
README.md
CHANGED
@@ -1,271 +1,214 @@
|
|
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 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
[function calling guide](https://huggingface.co/docs/transformers/main/chat_templating#advanced-tool-use--function-calling)
|
216 |
-
in the `transformers` docs for more information.
|
217 |
-
|
218 |
-
```python
|
219 |
-
from transformers import AutoModelForCausalLM, AutoTokenizer
|
220 |
-
import torch
|
221 |
-
|
222 |
-
model_id = "mistralai/Mistral-Nemo-Instruct-2407"
|
223 |
-
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
224 |
-
|
225 |
-
def get_current_weather(location: str, format: str):
|
226 |
-
"""
|
227 |
-
Get the current weather
|
228 |
-
|
229 |
-
Args:
|
230 |
-
location: The city and state, e.g. San Francisco, CA
|
231 |
-
format: The temperature unit to use. Infer this from the users location. (choices: ["celsius", "fahrenheit"])
|
232 |
-
"""
|
233 |
-
pass
|
234 |
-
|
235 |
-
conversation = [{"role": "user", "content": "What's the weather like in Paris?"}]
|
236 |
-
tools = [get_current_weather]
|
237 |
-
|
238 |
-
# format and tokenize the tool use prompt
|
239 |
-
inputs = tokenizer.apply_chat_template(
|
240 |
-
conversation,
|
241 |
-
tools=tools,
|
242 |
-
add_generation_prompt=True,
|
243 |
-
return_dict=True,
|
244 |
-
return_tensors="pt",
|
245 |
-
)
|
246 |
-
|
247 |
-
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="auto")
|
248 |
-
|
249 |
-
inputs.to(model.device)
|
250 |
-
outputs = model.generate(**inputs, max_new_tokens=1000)
|
251 |
-
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
|
252 |
-
```
|
253 |
-
|
254 |
-
Note that, for reasons of space, this example does not show a complete cycle of calling a tool and adding the tool call and tool
|
255 |
-
results to the chat history so that the model can use them in its next generation. For a full tool calling example, please
|
256 |
-
see the [function calling guide](https://huggingface.co/docs/transformers/main/chat_templating#advanced-tool-use--function-calling),
|
257 |
-
and note that Mistral **does** use tool call IDs, so these must be included in your tool calls and tool results. They should be
|
258 |
-
exactly 9 alphanumeric characters.
|
259 |
-
|
260 |
-
> [!TIP]
|
261 |
-
> Unlike previous Mistral models, Mistral Nemo requires smaller temperatures. We recommend to use a temperature of 0.3.
|
262 |
-
|
263 |
-
## Limitations
|
264 |
-
|
265 |
-
The Mistral Nemo Instruct model is a quick demonstration that the base model can be easily fine-tuned to achieve compelling performance.
|
266 |
-
It does not have any moderation mechanisms. We're looking forward to engaging with the community on ways to
|
267 |
-
make the model finely respect guardrails, allowing for deployment in environments requiring moderated outputs.
|
268 |
-
|
269 |
-
## The Mistral AI Team
|
270 |
-
|
271 |
-
Albert Jiang, Alexandre Sablayrolles, Alexis Tacnet, Alok Kothari, Antoine Roux, Arthur Mensch, Audrey Herblin-Stoop, Augustin Garreau, Austin Birky, Bam4d, Baptiste Bout, Baudouin de Monicault, Blanche Savary, Carole Rambaud, Caroline Feldman, Devendra Singh Chaplot, Diego de las Casas, Eleonore Arcelin, Emma Bou Hanna, Etienne Metzger, Gaspard Blanchet, Gianna Lengyel, Guillaume Bour, Guillaume Lample, Harizo Rajaona, Henri Roussez, Hichem Sattouf, Ian Mack, Jean-Malo Delignon, Jessica Chudnovsky, Justus Murke, Kartik Khandelwal, Lawrence Stewart, Louis Martin, Louis Ternon, Lucile Saulnier, L茅lio Renard Lavaud, Margaret Jennings, Marie Pellat, Marie Torelli, Marie-Anne Lachaux, Marjorie Janiewicz, Micka毛l Seznec, Nicolas Schuhl, Niklas Muhs, Olivier de Garrigues, Patrick von Platen, Paul Jacob, Pauline Buche, Pavan Kumar Reddy, Perry Savas, Pierre Stock, Romain Sauvestre, Sagar Vaze, Sandeep Subramanian, Saurabh Garg, Sophia Yang, Szymon Antoniak, Teven Le Scao, Thibault Schueller, Thibaut Lavril, Thomas Wang, Th茅ophile Gervet, Timoth茅e Lacroix, Valera Nemychnikova, Wendy Shang, William El Sayed, William Marshall
|
|
|
1 |
+
---
|
2 |
+
license: mit
|
3 |
+
datasets:
|
4 |
+
- avemio/GRAG-CPT-HESSIAN-AI
|
5 |
+
- avemio/GRAG-SFT-ShareGPT-HESSIAN-AI
|
6 |
+
language:
|
7 |
+
- en
|
8 |
+
- de
|
9 |
+
base_model:
|
10 |
+
- avemio/GRAG-LLAMA-3.1-8B-CPT-HESSIAN-AI
|
11 |
+
pipeline_tag: question-answering
|
12 |
+
tags:
|
13 |
+
- German
|
14 |
+
- RAG
|
15 |
+
- Retrieval
|
16 |
+
- Question-Answering
|
17 |
+
- Summarization
|
18 |
+
- Reasoning
|
19 |
+
---
|
20 |
+
|
21 |
+
|
22 |
+
<img src="https://www.grag.ai/wp-content/uploads/2024/12/GRAG-ICON-TO-WORDLOGO-Animation_Loop-small-ezgif.com-video-to-gif-converter.gif" alt="GRAG Logo" width="400" style="margin-left:'auto' margin-right:'auto' display:'block'"/>
|
23 |
+
|
24 |
+
|
25 |
+
# Model Card for GRAG-LLAMA-3.1-8B-SFT-HESSIAN-AI
|
26 |
+
|
27 |
+
<!-- Provide a quick summary of what the model is/does. -->
|
28 |
+
|
29 |
+
**GRAG** (**G**erman **R**etrieval **A**ugmented **G**eneration) models are designed for the German-speaking market, enabling innovation and AI solutions to drive German research collaboration in business-focused Generative AI by 2025
|
30 |
+
|
31 |
+
Our GRAG-LLAMA-SFT model are trained on this **[GRAG-SFT](https://huggingface.co/datasets/avemio/GRAG-SFT-ShareGPT-HESSIAN-AI) dataset.**
|
32 |
+
|
33 |
+
## Model Details
|
34 |
+
|
35 |
+
The core models released in this batch are the following:
|
36 |
+
| Size | Training Tokens |
|
37 |
+
|------|--------|
|
38 |
+
| [GRAG-LLAMA-CPT](https://huggingface.co/avemio/GRAG-LLAMA-3.1-8B-CPT-HESSIAN-AI) | 507.47 million |
|
39 |
+
| [GRAG-LLAMA-SFT](https://huggingface.co/avemio/GRAG-LLAMA-3.1-8B-SFT-HESSIAN-AI) | 2.03 billion |
|
40 |
+
| [GRAG-LLAMA-ORPO](https://huggingface.co/avemio/GRAG-LLAMA-3.1-8B-ORPO-HESSIAN-AI) | 2.0577 billion |
|
41 |
+
### Model Description
|
42 |
+
|
43 |
+
<!-- Provide a longer summary of what this model is. -->
|
44 |
+
|
45 |
+
- **Developed by:** Avemio AI Team
|
46 |
+
- **Supported by:** Hessian AI
|
47 |
+
- **Model type:** a Transformer style autoregressive language model.
|
48 |
+
- **Language(s) (NLP):** German, English
|
49 |
+
- **License:** The code and model are released under Apache 2.0.
|
50 |
+
- **Contact:** [[email protected]](mailto:[email protected])
|
51 |
+
|
52 |
+
|
53 |
+
### Model Sources
|
54 |
+
|
55 |
+
<!-- Provide the basic links for the model. -->
|
56 |
+
|
57 |
+
- **Project Page:**
|
58 |
+
- **Repositories:**
|
59 |
+
- Training:
|
60 |
+
- Evaluation code:
|
61 |
+
- **Technical blog post:**
|
62 |
+
<!-- - **Press release:** TODO -->
|
63 |
+
|
64 |
+
## Uses
|
65 |
+
|
66 |
+
<!-- Address questions around how the model is intended to be used, including the foreseeable users of the model and those affected by the model. -->
|
67 |
+
|
68 |
+
### Inference
|
69 |
+
Quickly get inference running with the following required installation:
|
70 |
+
Now, proceed as usual with HuggingFace:
|
71 |
+
```python
|
72 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
73 |
+
|
74 |
+
model_name = "avemio/GRAG-LLAMA-3.1-8B-SFT-HESSIAN-AI"
|
75 |
+
|
76 |
+
model = AutoModelForCausalLM.from_pretrained(
|
77 |
+
model_name,
|
78 |
+
torch_dtype="auto",
|
79 |
+
device_map="auto"
|
80 |
+
)
|
81 |
+
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
82 |
+
im_end_token_id = tokenizer.convert_tokens_to_ids('<|im_end|>')
|
83 |
+
im_start_token_id = tokenizer.convert_tokens_to_ids('<|im_start|>')
|
84 |
+
|
85 |
+
messages = [
|
86 |
+
{"role": "system", "content": "Folge den Anweisungen des Benutzers. Bevor du deine finale Antwort gibst, schildere deine 脺berlegungen zur L枚sung des Problems."},
|
87 |
+
{"role": "user", "content": "Ferdinand steht vor der Herausforderung, eine faire Besuchsregelung f眉r seine drei Kinder zu finden, die den Bed眉rfnissen jedes einzelnen Kindes gerecht wird. Jedes Kind hat unterschiedliche Vorlieben und Bed眉rfnisse, die in den Besuchsplan integriert werden m眉ssen. Er muss sicherstellen, dass die Regelung sowohl den Interessen der Kinder als auch den rechtlichen Vorgaben entspricht. Ferdinand hat eine Woche Zeit, um einen Vorschlag zu erarbeiten, den er mit seinem Anwalt besprechen kann."}
|
88 |
+
]
|
89 |
+
text = tokenizer.apply_chat_template(
|
90 |
+
messages,
|
91 |
+
tokenize=False,
|
92 |
+
add_generation_prompt=False
|
93 |
+
)
|
94 |
+
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
|
95 |
+
|
96 |
+
generated_ids = model.generate(
|
97 |
+
**model_inputs,
|
98 |
+
max_length=2024,
|
99 |
+
temperature=0.01,
|
100 |
+
do_sample=False,
|
101 |
+
#bos_token_id=im_start_token_id,
|
102 |
+
eos_token_id=im_end_token_id,
|
103 |
+
pad_token_id=tokenizer.eos_token_id,
|
104 |
+
repetition_penalty=1.1,
|
105 |
+
num_return_sequences=1,
|
106 |
+
top_k=40,
|
107 |
+
top_p=0.95,
|
108 |
+
)
|
109 |
+
generated_ids = [
|
110 |
+
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
|
111 |
+
]
|
112 |
+
|
113 |
+
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
|
114 |
+
|
115 |
+
```
|
116 |
+
|
117 |
+
### [](https://huggingface.co/Qwen/Qwen2.5-Coder-32B-Instruct#processing-long-texts)
|
118 |
+
|
119 |
+
### Fine-tuning
|
120 |
+
We are providing a comprehensive Google Colab notebook to guide users through the process of fine-tuning our model, complete with detailed instructions, essential dependencies, and configurable settings.
|
121 |
+
[Colab-Notebook](https://colab.research.google.com/drive/1U6aP3vIkABaCm7doGV1waHgTLvXNGbBp?usp=sharing).
|
122 |
+
|
123 |
+
## Evaluation
|
124 |
+
|
125 |
+
<!-- This section describes the evaluation protocols and provides the results. -->
|
126 |
+
The evaluation was performed using seven subsets, focusing on extraction recall, question answering (QA) with multiple references, and time difference reasoning. Relevant context and summarization were treated as distinct subsets, each playing a crucial role in the evaluation process. For relevant context, the model's ability to identify and extract pertinent information from the source material was assessed. In contrast, the summarization subset evaluated the model's capability to generate concise and accurate summaries based on the relevant context.
|
127 |
+
|
128 |
+
Four evaluation metrics were employed across all subsets: language quality, overall correctness, instruction following, and an overall score.
|
129 |
+
|
130 |
+
- **Language quality:** This metric focused on the overall linguistic quality of the outputs, considering factors such as grammar, fluency, and clarity.
|
131 |
+
- **Overall correctness:** The accuracy and correctness of the content were evaluated under this metric.
|
132 |
+
- **Instruction following:** This metric assessed the model's ability to follow specific instructions provided for each task.
|
133 |
+
- **Overall score:** This metric combined the results from the previous three metrics, offering a comprehensive evaluation of the model's capabilities across all subsets.
|
134 |
+
|
135 |
+
|
136 |
+
| Metric | [Vanila-Phi-3.5-Mini-4B](https://huggingface.co/microsoft/Phi-3.5-mini-instruct) | [GRAG-PHI-SFT](https://huggingface.co/avemio/GRAG-PHI-3.5-MINI-4B-SFT-HESSIAN-AI) | [GRAG-PHI-ORPO](https://huggingface.co/avemio/GRAG-PHI-3.5-MINI-4B-ORPO-HESSIAN-AI) | [GRAG-PHI-MERGED]() | GPT-3.5-TURBO |
|
137 |
+
|------------------------------------------|---------------------------------------------------------------------------------|--------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|-----------------------------|----------------|
|
138 |
+
| **Average_language_quality** | 85.88 | 89.61 | 89.1 | | |
|
139 |
+
| **extraction_recall_weighted_overall_score** | 35.2 | 52.3 | 48.8 | | |
|
140 |
+
| **qa_multiple_references_weighted_overall_score** | 65.3 | 71.0 | 74.0 | | |
|
141 |
+
| **qa_without_time_difference_weighted_overall_score** | 71.5 | 85.6 | 85.6 | | |
|
142 |
+
| **qa_with_time_difference_weighted_overall_score** | 65.3 | 87.9 | 85.4 | | |
|
143 |
+
| **reasoning_weighted_overall_score** | 69.4 | 71.5 | 73.4 | | |
|
144 |
+
| **relevant_context_weighted_overall_score** | 71.3 | 69.1 | 65.5 | | |
|
145 |
+
| **summarizations_weighted_overall_score** | 73.8 | 81.6 | 80.3 | | |
|
146 |
+
|
147 |
+
## Model Details
|
148 |
+
|
149 |
+
### Data
|
150 |
+
For training data details, please see the [GRAG-SFT-Dataset](https://huggingface.co/datasets/avemio/GRAG-SFT-ShareGPT-HESSIAN-AI) documentation.
|
151 |
+
|
152 |
+
#### Description
|
153 |
+
The SFT tasks represent a focused approach to enhance model capabilities through specialized RAG examples. Most of these tasks were developed using synthetically enhanced data derived from the German Wikipedia, accessed through Cohere's prepared dataset on HuggingFace (licensed CC-BY-SA 4.0). This data was structured in a training knowledge graph where Question-Answer nodes were connected to both relevant and irrelevant Context nodes from the same Wikipedia page, creating a rich and challenging network of relationships for training. The only exceptions are the function calling dataset, which was derived and extended from Salesforce's XLAM Function calling dataset by including function call results and final answer generation, and the reasoning task which synthetic generation was inspired by the Paper from Tencent ([鈥淪caling Synthetic Data Creation with 1,000,000,000 Personas鈥漖(https://arxiv.org/abs/2406.20094)), to generate a diverse set of reasoning tasks across various domains.
|
154 |
+
This comprehensive set of SFT tasks ensures the model develops robust capabilities across a wide range of practical applications while maintaining consistent output formats and clear communication patterns. Each task type has been carefully designed to address specific business needs while maintaining high standards of accuracy and reliability, making them valuable tools for organizations looking to enhance their information processing and knowledge management capabilities.
|
155 |
+
|
156 |
+
#### Task Instruction Format
|
157 |
+
The implementation of these SFT tasks follows a carefully structured format designed for consistency and clarity. Each task begins with comprehensive system instructions often wrapped in XML tags that meta-define expected inputs, outputs, constraints, and example interactions. This standardization enables clear communication between the model and users while ensuring reliable results.
|
158 |
+
The context information utilized in these tasks is provided in a standardized JSON structure, including unique identifiers, source text, timestamps where relevant, and task-specific metadata. This format was specifically chosen to allow seamless integration with retrieved data from RAG systems, eliminating the need for additional formatting steps in production environments.
|
159 |
+
Source references are handled through a consistent system of numerical indices for context references, JSON-formatted citation markers, and clear time-difference notifications when temporal aspects are relevant. This systematic approach to referencing ensures traceability and reliability in the model's responses.
|
160 |
+
The implementation of these tasks within RAG systems can significantly improve organizational efficiency by reducing manual processing time, ensuring consistency in information handling, improving accuracy in data extraction and analysis, and enabling faster decision-making through better information access.
|
161 |
+
|
162 |
+
### Architecture
|
163 |
+
|
164 |
+
|
165 |
+
| Parameter | GRAG-LLAMA-SFT |
|
166 |
+
|-----------------------|-----------------------------------------------------------------------------------------------|
|
167 |
+
| **d_model** | 3072 |
|
168 |
+
| **num heads** | 32 |
|
169 |
+
| **num layers** | 32 |
|
170 |
+
| **MLP ratio** | 3.5 |
|
171 |
+
| **LayerNorm type** | RMSNorm |
|
172 |
+
| **pos embeddings** | RoPE |
|
173 |
+
| **attention variant**| Standard Multi-Head Self Attention |
|
174 |
+
| **biases** | none |
|
175 |
+
| **block type** | sequential |
|
176 |
+
| **activation** | SiLU |
|
177 |
+
| **sequence length** | 131072 |
|
178 |
+
| **weight typing** | bfloat16
|
179 |
+
|
180 |
+
### Hyperparameters
|
181 |
+
|
182 |
+
|
183 |
+
| Parameter | GRAG-LLAMA-SFT |
|
184 |
+
|---------------------------|--------------------|
|
185 |
+
| **warmup steps** | 50 |
|
186 |
+
| **peak LR** | 5.0E-07 |
|
187 |
+
| **weight decay** | 0.1 |
|
188 |
+
| **LR schedule** | linear |
|
189 |
+
| **gradient reduce dtype** | FP32 |
|
190 |
+
| **optimizer state dtype** | FP32 |
|
191 |
+
|
192 |
+
## Environmental Impact
|
193 |
+
|
194 |
+
GRAG-PHI-SFT, running on NVIDIA A100 with 8 GPUs for 5 days, has an approximate power consumption as follows:
|
195 |
+
|
196 |
+
It's important to note that the actual power consumption may vary depending on the specific workload and operational conditions. For accurate power consumption measurements, using dedicated power monitoring tools is recommended.
|
197 |
+
|
198 |
+
| Model | GPU Type | Power Consumption From GPUs |
|
199 |
+
|----------------|---------------------|-----------------------------|
|
200 |
+
| GRAG-PHI-SFT | A100 ([Hessian AI supercomputer](https://hessian.ai/de/)) | 0.288 MWh |
|
201 |
+
## Bias, Risks, and Limitations
|
202 |
+
|
203 |
+
Like any base language model or fine-tuned model without safety filtering, it is relatively easy for a user to prompt these models to generate harmful and generally sensitive content.
|
204 |
+
Such content can also be produced unintentionally, especially in the case of bias, so we recommend users consider the risks of applications of this technology.
|
205 |
+
|
206 |
+
Otherwise, many facts from GRAG-Phi-SFT or any LLM will often not be true, so they should be checked.
|
207 |
+
|
208 |
+
|
209 |
+
|
210 |
+
|
211 |
+
## Model Card Contact
|
212 |
+
|
213 |
+
|
214 |
+
For errors in this model card, please contact ([grag@avemio.digital](mailto:grag@avemio.digital)).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|