safetensors llama finnish text-generation conversational fi arxiv:2302.13971 base_model:Finnish-NLP/Ahma-7B base_model:finetune:Finnish-NLP/Ahma-7B doi:10.57967/hf/4009 license:apache-2.0 region:us
---
base_model:
- Finnish-NLP/Ahma-7B
language:
- fi
license: apache-2.0
pipeline_tag: text-generation
tags:
- finnish
- llama
inference: false
---

# Ahma-7B-Instruct for Finnish

Ahma-7B-Instruct is a instruct/chat-tuned version of [Ahma-7B](https://huggingface.co/Finnish-NLP/Ahma-7B) trained to follow instructions in Finnish. The base Ahma 7B parameter model is decoder-only transformer model based on Meta's Llama (v1) architecture pretrained from scratch on Finnish language. Original Llama model architecture was introduced in
[this paper](https://arxiv.org/abs/2302.13971)
and first released at [this page](https://github.com/facebookresearch/llama).

What does Ahma mean? Ahma is the Finnish word for wolverine! In the Finnish Lapland, wolverines are the biggest cause of reindeer damage. 

There are two different sized base Ahma models, all pretrained from scratch for 139B tokens:

| Model                                                                           | Context length | Layers | Dim  | Heads | Params |
|:--------------------------------------------------------------------------------|:---------------|:-------|:-----|:------|:-------|
| [Ahma-3B](https://huggingface.co/Finnish-NLP/Ahma-3B)                           | 2048           | 26     | 3200 | 32    | 3.6B   |
| [Ahma-7B](https://huggingface.co/Finnish-NLP/Ahma-7B)                           | 2048           | 32     | 4096 | 32    | 7.0B   |

And two instruct-tuned versions:

| Model                                                                           | Context length | Layers | Dim  | Heads | Params |
|:--------------------------------------------------------------------------------|:---------------|:-------|:-----|:------|:-------|
| [Ahma-3B-Instruct](https://huggingface.co/Finnish-NLP/Ahma-3B-Instruct)         | 2048           | 26     | 3200 | 32    | 3.6B   |
| [Ahma-7B-Instruct](https://huggingface.co/Finnish-NLP/Ahma-7B-Instruct)         | 2048           | 32     | 4096 | 32    | 7.0B   |

## Intended uses & limitations

This model was fine-tuned for instruction following. Instruction-tuned models are intended for assistant-like chat, whereas pretrained models can be adapted for a variety of natural language generation tasks.

### How to use

If you want to use this model for instruction-following, you need to use the same prompt format we used in the fine-tuning process (basically the same format what Meta used in their Llama2 models).\
**Note: do not use "LlamaTokenizer" from transformers library but always use the AutoTokenizer instead, or use the plain sentencepiece tokenizer.** 

Here is an example using the instruction-following prompt format with the tokenizer's built-in chat template feature which makes it easy to format your potential multi-turn chats too, with some generation arguments you can modify for your use:

```python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

system_prompt = "Olet tekoälyavustaja. Vastaat aina mahdollisimman avuliaasti. Vastauksesi eivät saa sisältää mitään haitallista, epäeettistä, rasistista, seksististä, vaarallista tai laitonta sisältöä. Jos kysymyksessä ei ole mitään järkeä tai se ei ole asiasisällöltään johdonmukainen, selitä miksi sen sijaan, että vastaisit jotain väärin. Jos et tiedä vastausta kysymykseen, älä kerro väärää tietoa."

# Check if `torch.bfloat16` is available
dtype = torch.bfloat16 if torch.cuda.is_bf16_supported() else torch.float16

tokenizer = AutoTokenizer.from_pretrained("Finnish-NLP/Ahma-7B-Instruct")
model = AutoModelForCausalLM.from_pretrained("Finnish-NLP/Ahma-7B-Instruct", torch_dtype=dtype, device_map="auto")

# use the chat template feature in the tokenizer to format your (multi-turn) inputs

messages = [
    {
        "role": "system",
        "content": system_prompt,
    },
    {"role": "user", "content": "Kerro kolme hyötyä, joita pienet avoimen lähdekoodin kielimallit tuovat?"},
]
inputs = tokenizer.apply_chat_template(
    messages, tokenize=True, return_tensors="pt"
)
inputs = inputs.to("cuda")

generated_ids = model.generate(
    inputs,
    temperature=0.6,
    do_sample=True,
    min_length=5,
    max_length=2048,
)
generated_text = tokenizer.batch_decode(
    generated_ids, skip_special_tokens=False, clean_up_tokenization_spaces=True
)[0]

print(generated_text.split('[/INST]')[1].strip())

'''
Pienten avointen kielten mallien käyttöönotolla voi olla useita etuja:

1. Lisääntynyt joustavuus ja sopeutumiskyky: Avoimen lähdekoodin mallit mahdollistavat suuremman joustavuuden ja mukauttamisen, jolloin kehittäjät voivat räätälöidä malleja omien tarpeidensa mukaan.
2. Lisääntynyt yhteistyö ja avoimuus: Avoimen lähdekoodin mallit helpottavat yhteistyötä kehittäjien välillä, jotka työskentelevät yhdessä mallin parantamiseksi ja päivittämiseksi, mikä edistää avointa ja yhteistyöhön perustuvaa ympäristöä.
3. Suurempi kehittäjäyhteisö: Avoimen lähdekoodin mallit tarjoavat mahdollisuuden osallistua laajempaan kehittäjäyhteisöön, joka jakaa ideoita, resursseja ja parhaita käytäntöjä, jolloin kaikki voivat hyötyä muiden kokemuksista ja asiantuntemuksesta.
'''
```

You may experiment with different system prompt instructions too if you like.

### Limitations and bias

This model was trained only with Finnish texts excluding code so it should not be used for multilingual and code generation use cases.

The training data used for this model contains a lot of content from the internet, which is far from neutral. Therefore, the model can have biased predictions. This bias will also affect all fine-tuned versions of this model.

## Training data

Training data is primarily created from English samples through translation, with multiple methods employed to filter out samples that are overly specific to the U.S., poorly translated, or of low quality. Tools such as LangDetect, KenLM, and Nemotron-70B are utilized to calculate various features that assist in filtering the datasets. For DPO samples, PairRM model predictions are applied to the English samples to identify and remove poor-quality data.

There has also been some indication that gradually increasing the training example lengths during the training could be beneficial. Thus, the training dataset was splitted to 4 bins based on example lengths, and then examples were sampled from the bins so that the example lengths are gradually increasing towards the end of the training while a little amount of the shorter examples are still present too.

This model was first supervised fine-tuned (SFT) on the combination of the following datasets:

| Dataset                                          | Dataset type           | Upsampling | Words      | Ratio    | Average words per example |
|:-------------------------------------------------|:-----------------------|:-----------|:-----------|:---------|:--------------------------|
| ai2_arc                                          | Translated single-turn | 1.0X       | 1K         | 0.01%    | 92                        |
| Aya                                              | Finnish and translated | 1.0X       | 216K       | 2.63%    | 120                       |
| chatbot_arena                                    | Translated single-turn | 1.0X       | 212K       | 2.58%    | 212                       |
| dibt10k                                          | Translated single-turn | 1.0X       | 219K       | 2.67%    | 332                       |
| dolly                                            | Translated single-turn | 1.0X       | 430K       | 5.23%    | 186                       |
| extraction_llama                                 | Synthetic single-turn  | 1.0X       | 6K         | 0.07%    | 287                       |
| extraction_llama_nemotron_70b_synthetic          | Synthetic single-turn  | 1.0X       | 5K         | 0.06%    | 291                       |
| antropic_hhrlhf                                  | Translated single-turn | 1.0X       | 119K       | 1.45%    | 121                       |
| intel                                            | Translated single-turn | 1.0X       | 305K       | 3.71%    | 233                       |
| lm_sys_multiturn                                 | Translated multi-turn  | 1.0X       | 668K       | 8.13%    | 401                       |
| lmsys_1m                                         | Translated single-turn | 1.0X       | 1490K      | 18.14%   | 223                       |
| magpie_ultra                                     | Translated single-turn | 1.0X       | 1116K      | 13.58%   | 279                       |
| news_qa                                          | Translated single-turn | 1.0X       | 11K        | 0.13%    | 196                       |
| oasst_multiturn                                  | Translated multi-turn  | 1.0X       | 497K       | 6.05%    | 347                       |
| orca_math                                        | Translated single-turn | 1.0X       | 493K       | 6.00%    | 224                       |
| person_discussions_multiturn                     | Synthetic multi-turn   | 1.0X       | 189K       | 2.30%    | 246                       |
| rag_datasets                                     | Synthetic single turn  | 1.0X       | 780K       | 9.49%    | 453                       |
| suomitrivia                                      | Translated single-turn | 1.0X       | 3K         | 0.04%    | 64                        |
| truthy                                           | Translated single-turn | 1.0X       | 15K        | 0.18%    | 99                        |
| ultrachat                                        | Translated single-turn | 1.0X       | 1360K      | 16.56%   | 269                       |
| wikipedia_multitask_synthetic_qa                 | Synthetic single-turn  | 1.0X       | 26K        | 0.32%    | 526                       |
| wikipedia_synthetic_qa_reasoning                 | Synthetic single-turn  | 1.0X       | 53K        | 0.65%    | 472                       |
| **TOTAL**                                        |                        |            | **8215K**  | **100%** | **257**                   |

After tokenization, the SFT training dataset had 14.3 million tokens and 2% of the dataset was splitted for evaluation during the training.


The SFT model was then further fine-tuned with Direct Preference Optimization (DPO) on the combination of the following datasets:

| Dataset         | Dataset type           | Upsampling | Words     | Ratio    | Average words per example |
|:----------------|:-----------------------|:-----------|:----------|:---------|:--------------------------|
| intel_dpo       | Translated single-turn | 1.0X       | 373K      | 14.78%   | 217                       |
| ultrachat_dpo   | Translated single-turn | 1.0X       | 1368K     | 54.20%   | 245                       |
| suomitrivia_dpo | Synthetic single-turn  | 1.0X       | 3K        | 0.12%    | 64                        |
| chatbot_arena   | Translated single-turn | 1.0X       | 57K       | 2.26%    | 198                       |
| antropic_hhrlhf | Translated single-turn | 1.0X       | 89K       | 3.53%    | 156                       |
| truthy_dpo      | Translated single-turn | 1.0X       | 19K       | 0.75%    | 100                       |
| orca_math_5k    | Translated single-turn | 1.0X       | 614K      | 24.33%   | 229                       |
| **TOTAL**       |                        |            | **2524K** | **100%** | **172**                   |

After tokenization, the DPO training dataset had 4.4 million tokens and 5% of the dataset was splitted for evaluation during the training.

# Training procedure

## Preprocessing

Texts are tokenized using Byte Pair Encoding (BPE) using the implementation from SentencePiece splitting all numbers into individual digits and using bytes to decompose unknown UTF-8 characters. The total
vocabulary size is 64k tokens. Inputs are sequences of 2048 consecutive tokens. Texts are not lower cased so this model is case-sensitive: it makes a difference between finnish and Finnish. Both BOS and EOS tokens were used in the fine-tuning.

## Supervised fine-tuning (SFT)

The model was fine-tuned using the [unsloth](https://github.com/unslothai/unsloth) framework on a single NVIDIA GeForce RTX 4090 GPU. Below are the details of the fine-tuning process:

### Training Parameters

| Parameter                   | Value                              |
|-----------------------------|------------------------------------|
| **Epochs**                  | 2                                  |
| **Learning Rate**           | 2e-05                              |
| **Weight Decay**            | 5e-03                              |
| **Batch Size**              | 4                                  |
| **Gradient Accumulation**   | 8                                  |
| **Effective Batch Size**    | 32 (4 × 8)                         |
| **Max Sequence Length**     | 2048                               |
| **Noise Alpha (NEFTune)**   | 5                                  |
| **Learning Rate Schedule**  | WSD (Warmup-Stable-Decay)          |
| **Warmup Ratio**            | 0.1                                |
| **Decay Ratio**             | 0.1                                |
| **Optimizer**               | AdamW                              |
| **Quantization**            | 4-bit                              |

### LoRA (Low-Rank Adaptation) Details

| Parameter                  | Value                              |
|----------------------------|------------------------------------|
| **LoRA Type**              | Rank-Stabilized LoRA (RSLora)      |
| **Rank**                   | 128                                |
| **Alpha**                  | 256                                |
| **Dropout**                | 0.05                               |
| **Target Modules**         | `q_proj`, `k_proj`, `v_proj`, `o_proj`, `gate_proj`, `up_proj`, `down_proj` |
| **Modules to Save**        | `lm_head`, `embed_tokens`          |

### Additional Details

- **Loss Calculation**: Only applied to the completion tokens.


## Direct Preference Optimization (DPO) Fine-Tuning

The SFT model was further fine-tuned with Direct Preference Optimization (DPO) using the [unsloth](https://github.com/unslothai/unsloth) framework on a single NVIDIA GeForce RTX 4090 GPU. Below are the details of the fine-tuning process:

### Training Parameters

| Parameter                   | Value                              |
|-----------------------------|------------------------------------|
| **Epochs**                  | 1                                  |
| **Learning Rate**           | 7e-07                              |
| **Weight Decay**            | 0.01                               |
| **Batch Size**              | 2                                  |
| **Gradient Accumulation**   | 8                                  |
| **Effective Batch Size**    | 16 (2 × 8)                         |
| **Max Sequence Length**     | 2048                               |
| **Learning Rate Schedule**  | WSD (Warmup-Stable-Decay)          |
| **Warmup Ratio**            | 0.1                                |
| **Decay**                   | Scaled linearly to 0 after 80% steps |
| **Optimizer**               | AdamW                              |

### LoRA (Low-Rank Adaptation) Details

| Parameter                  | Value                              |
|----------------------------|------------------------------------|
| **LoRA Type**              | Rank-Stabilized LoRA (RSLora)      |
| **Rank**                   | 32                                 |
| **Alpha**                  | 32                                 |
| **RS_LoRA**                | True                               |
| **Dropout**                | 0.02                               |
| **Target Modules**         | `q_proj`, `k_proj`, `v_proj`, `o_proj`, `gate_proj`, `up_proj`, `down_proj` |


## Evaluation results

### FIN-bench

This Ahma-7B-Instruct model was evaluated using [FIN-bench by TurkuNLP](https://github.com/TurkuNLP/FIN-bench), and the same evaluation was carried out for other relevant Finnish models for comparison: [FinGPT 8B by TurkuNLP](https://huggingface.co/TurkuNLP/gpt3-finnish-8B), [Viking 7B by TurkuNLP, SiloGen and HPLT](https://huggingface.co/LumiOpen/Viking-7B), and [Poro 34B by SiloGen, TurkuNLP and HPLT](https://huggingface.co/LumiOpen/Poro-34B). Below are the results with 0-shot and 3-shot settings in FIN-bench.

0-shot results:

| Benchmark                  | Ahma 3B base (instruct prompt format) | Ahma 3B Instruct (instruct prompt format) | Ahma 7B base (instruct prompt format) | Ahma 7B Instruct (instruct prompt format) | FinGPT 8B | Viking 7B | Poro 34B (8bit quant) |
|:---------------------------|:--------------------------------------|:------------------------------------------|:--------------------------------------|:------------------------------------------|:----------|:----------|:----------------------|
| Analogies                  | 50.77                                 | 48.46                                     | 56.92                                 | 41.54                                     | 49.23     | 40.00     | 54.62                 |
| Arithmetic                 | 27.64                                 | 22.14                                     | 11.50                                 | 14.70                                     | 33.15     | 30.16     | 30.34                 |
| Cause and Effect           | 59.48                                 | 58.82                                     | 59.48                                 | 53.60                                     | 66.01     | 58.82     | 62.74                 |
| Emotions                   | 36.25                                 | 28.12                                     | 36.25                                 | 27.50                                     | 22.50     | 26.25     | 35.63                 |
| Empirical Judgements       | 33.33                                 | 35.35                                     | 33.33                                 | 33.33                                     | 27.27     | 33.33     | 49.49                 |
| General Knowledge          | 44.29                                 | 48.57                                     | 51.43                                 | 37.14                                     | 40.00     | 24.29     | 51.43                 |
| HHH Alignment              | 42.09                                 | 41.66                                     | 44.23                                 | 43.22                                     | 41.81     | 42.51     | 42.92                 |
| Intent Recognition         | 24.42                                 | 26.16                                     | 43.64                                 | 56.94                                     | 17.49     | 22.40     | 68.35                 |
| Misconceptions             | 46.27                                 | 47.01                                     | 46.27                                 | 47.01                                     | 53.73     | 53.73     | 52.24                 |
| Paraphrase                 | 59.50                                 | 73.00                                     | 67.00                                 | 70.50                                     | 51.00     | 50.00     | 51.00                 |
| Sentence Ambiguity         | 53.33                                 | 65.00                                     | 60.00                                 | 63.33                                     | 51.67     | 48.33     | 50.00                 |
| Similarities Abstraction   | 65.79                                 | 68.42                                     | 71.05                                 | 61.84                                     | 60.53     | 65.79     | 60.53                 |
| **Non-Arithmetic Average** | **47.55**                             | **48.95**                                 | **51.33**                             | **48.30**                                 | **46.17** | **44.42** | **52.08**             |
| **Overall Average**        | **36.49**                             | **34.06**                                 | **29.20**                             | **29.64**                                 | **38.93** | **36.50** | **40.00**             |


3-shot results:

| Benchmark                  | Ahma 3B base (instruct prompt format) | Ahma 3B Instruct (instruct prompt format) | Ahma 7B base (instruct prompt format) | Ahma 7B Instruct (instruct prompt format) | FinGPT 8B | Viking 7B | Poro 34B (8bit quant) |
|:---------------------------|:--------------------------------------|:------------------------------------------|:--------------------------------------|:------------------------------------------|:----------|:----------|:----------------------|
| Analogies                  | 50.77                                 | 49.23                                     | 49.23                                 | 43.08                                     | 40.77     | 54.62     | 76.92                 |
| Arithmetic                 | 38.38                                 | 43.89                                     | 20.88                                 | 26.81                                     | 43.63     | 45.78     | 53.68                 |
| Cause and Effect           | 60.78                                 | 64.71                                     | 66.01                                 | 62.74                                     | 64.05     | 58.17     | 67.32                 |
| Emotions                   | 30.00                                 | 41.25                                     | 30.00                                 | 53.75                                     | 44.37     | 48.13     | 56.87                 |
| Empirical Judgements       | 46.46                                 | 44.44                                     | 39.39                                 | 39.39                                     | 32.32     | 43.43     | 63.64                 |
| General Knowledge          | 47.14                                 | 40.00                                     | 27.14                                 | 44.29                                     | 54.29     | 28.57     | 74.29                 |
| HHH Alignment              | 43.53                                 | 44.80                                     | 43.80                                 | 45.09                                     | 45.39     | 44.80     | 46.07                 |
| Intent Recognition         | 20.52                                 | 44.22                                     | 36.42                                 | 39.02                                     | 51.45     | 58.82     | 83.67                 |
| Misconceptions             | 50.75                                 | 52.24                                     | 46.27                                 | 51.49                                     | 52.99     | 46.27     | 52.99                 |
| Paraphrase                 | 50.50                                 | 58.50                                     | 57.50                                 | 65.00                                     | 53.00     | 54.50     | 55.00                 |
| Sentence Ambiguity         | 53.33                                 | 48.33                                     | 53.33                                 | 51.67                                     | 51.67     | 53.33     | 66.67                 |
| Similarities Abstraction   | 69.74                                 | 72.37                                     | 72.37                                 | 69.74                                     | 64.47     | 73.68     | 75.00                 |
| **Non-Arithmetic Average** | **48.48**                             | **51.49**                                 | **49.05**                             | **51.63**                                 | **51.19** | **50.94** | **61.96**             |
| **Overall Average**        | **42.87**                             | **47.27**                                 | **33.41**                             | **37.84**                                 | **46.99** | **48.07** | **57.36**             |


As we can see, Ahma-7B-Instruct model has better 3-shot performance compared to its base 7B version, showcasing better few-shot prompting capability. That might be due to having multi-turn instruction-following training examples, demonstrating the value of the fine-tuning.

### MTBench Finnish

This Ahma-7B-Instruct model was primarily evaluated using [MTBench Finnish by LumiOpen](https://github.com/LumiOpen/FastChat/tree/main/fastchat/llm_judge) since this model is fine-tuned for chat and instruction following. Since the MTBench evaluates also multi-turn chats while Ahma base models were only pretrained with single-turn instruction following examples, we have reported MTBench Finnish results separately for their single-turn and multi-turn evaluation examples. This enables us to evaluate how well this Ahma-7B-Instruct model improves on multi-turn chats since its fine-tuning dataset included some multi-turn examples too. [Poro 34B Chat by SiloGen, TurkuNLP and HPLT](https://huggingface.co/LumiOpen/Poro-34B-chat) model's presumably multi-turn results are copied from their model card for the comparison.

Single-turn results:

| Benchmark           | Ahma 3B base (instruct prompt format) | Ahma 3B Instruct (instruct prompt format) | Ahma 7B base (instruct prompt format) | Ahma 7B Instruct (instruct prompt format) |
|:--------------------|:--------------------------------------|:------------------------------------------|:--------------------------------------|:------------------------------------------|
| Coding              | 1.00                                  | 1.00                                      | 1.70                                  | 1.10                                      |
| Extraction          | 2.00                                  | 1.30                                      | 3.10                                  | 3.00                                      |
| Humanities          | 4.05                                  | 6.20                                      | 6.60                                  | 8.00                                      |
| Math                | 3.00                                  | 3.20                                      | 3.90                                  | 2.90                                      |
| Reasoning           | 2.90                                  | 4.60                                      | 3.70                                  | 5.70                                      |
| Roleplay            | 4.80                                  | 6.50                                      | 6.60                                  | 7.20                                      |
| STEM                | 5.10                                  | 5.95                                      | 6.75                                  | 7.30                                      |
| Writing             | 6.60                                  | 9.00                                      | 7.10                                  | 8.80                                      |
| **Overall Average** | **3.68**                              | **4.72**                                  | **4.93**                              | **5.50**                                  |

Multi-turn results:

| Benchmark           | Ahma 3B base (instruct prompt format) | Ahma 3B Instruct (instruct prompt format) | Ahma 7B base (instruct prompt format) | Ahma 7B Instruct (instruct prompt format) | Poro 34B Chat |
|:--------------------|:--------------------------------------|:------------------------------------------|:--------------------------------------|:------------------------------------------|:--------------|
| Coding              | 1.00                                  | 1.00                                      | 1.40                                  | 1.05                                      | 3.70          |
| Extraction          | 1.55                                  | 1.15                                      | 2.05                                  | 2.65                                      | 6.37          |
| Humanities          | 3.25                                  | 6.20                                      | 4.95                                  | 7.85                                      | 9.25          |
| Math                | 2.20                                  | 2.70                                      | 2.50                                  | 2.40                                      | 1.20          |
| Reasoning           | 2.45                                  | 3.50                                      | 2.55                                  | 4.50                                      | 4.35          |
| Roleplay            | 4.90                                  | 6.40                                      | 6.35                                  | 6.60                                      | 7.35          |
| STEM                | 4.20                                  | 4.78                                      | 4.28                                  | 5.40                                      | 7.80          |
| Writing             | 3.80                                  | 6.65                                      | 4.10                                  | 6.25                                      | 8.50          |
| **Overall Average** | **2.92**                              | **4.05**                                  | **3.52**                              | **4.59**                                  | **6.06**      |


As we can see, the Ahma-7B-Instruct model improves upon the base Ahma-7B model, especially in tasks like writing. It's also worth noting that the Ahma-7B-Instruct model shows enhanced performance in multi-turn tasks compared to the base model, which highlights the value of the multi-turn training examples used in the fine-tuning process. The Ahma-7B-Instruct model lost 17% of its single-turn overall score in a multi-turn setting, while the base Ahma-7B model lost 29%. Therefore, this instruct model might be better suited for chat use cases as well. As expected, coding performance was poor since the Ahma models aren't trained on code data and extraction and math scores suffered a bit as those were not in primary focus for this model.

Ahma models also seemed to have problems with the fact that they started to constantly repeat the generated text in some evaluation examples, which affected the scoring. With the addition of a repetition penalty setting to the evaluation script generation method, the scores already improved significantly, so Ahma models should be used with better generation settings in real-world use compared to the settings used in this benchmark.

## Acknowledgements

This project would not have been possible without compute generously provided by Google through the
[TPU Research Cloud](https://sites.research.google/trc/).

## Team Members

- Aapo Tanskanen, [Hugging Face profile](https://huggingface.co/aapot), [LinkedIn profile](https://www.linkedin.com/in/aapotanskanen/)
- Rasmus Toivanen, [Hugging Face profile](https://huggingface.co/RASMUS), [LinkedIn profile](https://www.linkedin.com/in/rasmustoivanen/)

Feel free to contact us for more details 🤗


![Ahma](ahma.jpg)