Text Generation
Transformers
Safetensors
Finnish
llama
finnish
conversational
text-generation-inference
Edit model card

Ahma-7B for Finnish

Ahma-7B is 7B parameter 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 and first released at this page.

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 both pretrained from scratch, Ahma-3B for 139B tokens and Ahma-7B for 149B tokens:

Model Context length Layers Dim Heads Params
Ahma-3B 2048 26 3200 32 3.6B
Ahma-7B 2048 32 4096 32 7.0B

And two instruct-tuned versions:

Model Context length Layers Dim Heads Params
Ahma-3B-Instruct 2048 26 3200 32 3.6B
Ahma-7B-Instruct 2048 32 4096 32 7.0B

Intended uses & limitations

This model was pretrained only in a self-supervised way, without any supervised training. You can use this model for text generation or fine-tune it for a downstream task. This model followed a 2-stage pretraining approach where single-turn instruction-following examples were mixed in with the other training data in the second stage (explained more later in this readme). Thanks to this approach, this pretrained model is already capable of instruction following, but you might get even better results if you specifically fine-tune it for instruction following or other use cases. For instruction-following fine-tuning, you should use the same prompt format showcased below.

How to use

Fine-tuning

We have now added finetuning example notebook along with video!
Notebook: https://huggingface.co/Finnish-NLP/Ahma-3B/blob/main/Finetune_Ahma_3B_example.ipynb
Video: https://www.youtube.com/watch?v=6mbgn9XzpS4

Inference

If you want to use this model for instruction-following, you need to use the same prompt format we used in the second stage of the pretraining (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 some generation arguments you can modify for your use:

from transformers import AutoTokenizer, AutoModelForCausalLM

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."


def format_prompt(prompt: str) -> str:
    prompt = f" [INST] <<SYS>>\n{system_prompt.strip()}\n<</SYS>>\n\n{prompt.strip()} [/INST] "
    return prompt


tokenizer = AutoTokenizer.from_pretrained("Finnish-NLP/Ahma-7B")
model = AutoModelForCausalLM.from_pretrained("Finnish-NLP/Ahma-7B")
model = model.to("cuda")

# use the custom prompt format function or the chat template feature in the tokenizer to format your inputs

# prompt = format_prompt("Listaa kolme hyötyä, joita pienet avoimen lähdekoodin kielimallit tuovat?")
# inputs = tokenizer(prompt, return_tensors="pt")

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

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

"""
1. Parempi luettavuus ja ymmärtäminen: Pienten avoimen lähdekoodin kielimallien avulla voidaan luoda ymmärrettävämpää ja luettavampaa tekstiä, mikä helpottaa ihmisten ymmärtämistä ja tiedon hankkimista.
2. Parempi mukautuvuus ja monipuolisuus: Avoimen lähdekoodin mallit antavat kehittäjille mahdollisuuden luoda räätälöityjä ratkaisuja omiin tarpeisiinsa, jolloin he voivat hyödyntää olemassa olevaa tietämystä ja asiantuntemusta.
3. Lisääntynyt yhteistyö ja avoimuus: Avoimen lähdekoodin mallien ansiosta kehittäjät voivat tehdä yhteistyötä muiden kanssa, jakaa ideoita ja parantaa koodin laatua jakamalla oivalluksia ja parhaita käytäntöjä. Tämä edistää yhteistyöhön perustuvaa ympäristöä ja kannustaa jatkuvaan parantamiseen.
"""

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.

To reduce toxic content, training data was filtered with a toxicity classifier but it cannot truly eliminate all toxic text.

Training data

This model was pretrained on the combination of 14 datasets:

Raw datasets were automatically cleaned to filter out bad quality and non-Finnish examples. Also, a perplexity score was calculated for all texts with a KenLM model which was trained with very clean Finnish texts only. This perplexity score can then be used to determine how "clean" Finnish language the text contains. To reduce toxic text, we used Finnish toxicity classifier TurkuNLP/bert-large-finnish-cased-toxicity released by TurkuNLP to classify all text examples. Classified toxicity label scores can then be used to determine how toxic the text is.

All datasets were concatenated and the whole dataset near deduplicated using MinHashLSH from text-dedup. Top 95% perplexity score was used as a filtering threshold to filter out the worst quality 5% of texts. To reduce amount of toxic content, the dataset was filtered to include text examples having lower than 80% score for the toxicity labels "label_identity_attack", "label_insult", "label_threat" and "label_severe_toxicity".

Finally, 20,000 text examples from each of the CulturaX, Wikipedia, Yle, STT, Suomi24, and Reddit datasets were randomly selected for evaluation dataset.

The final training dataset had 23 billion words (calculated with regex "\w+") and the evaluation dataset had 23 million words. After tokenization, the training dataset had 41 billion tokens and the evaluation dataset had 40 million tokens. For the 2-stage pretraining, training datasets are divided as follows:

The first stage:

Dataset Words Ratio
CulturaX 12.820B 59.88%
HPLT v1.2 5.034B 23.51%
Suomi24 3.018B 14.09%
Reddit 0.141B 0.66%
CC-News 0.311B 1.45%
FI news corpus 0.004B 0.02%
Project Lönnrot 0.083B 0.39%
TOTAL 21.410B 100.0%

The second stage:

Dataset Words Ratio
CulturaX (cleaner sample using KenLM perplexity score) 2.252B 55.48%
Wikipedia 0.095B 2.34%
STT 0.253B 6.23%
Yle 0.212B 5.22%
Finnish parliament speeches 0.021B 0.52%
Finnish higher education public theses 0.855B 21.07%
Finnish instruction-following datasets (note: 2X upsampled) 0.371B 9.14%
TOTAL 4.059B 100.0%

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 pretraining.

2-stage pretraining

The model was trained on TPUv4-32 VM, sponsored by the Google TPU Research Cloud. Training was conducted with a slightly modified Jax/Flax based EasyLM framework, and inspired by the OpenLLaMA project. The optimizer used was a Lion.

The 2-stage pretraining approach was inspired by MiniCPM findings. For the first stage (79% of the entire training), we used noisier web-scraped datasets. For the second stage (21% of the entire training), we primarily used cleaner datasets and instruction-following datasets shuffled together, like in MiniCPM. The learning rate schedule for the 2-stage pretraining was Warmup-Stable-Decay (WSD). During the first stage, the learning rate schedule had a linear warmup for about 8 billion tokens to a peak learning rate of 1e-4 (note: with the Lion optimizer, the learning rate had to be about 10 times smaller than with the commonly used AdamW), followed by a stable phase where the rate of 1e-4 was kept constant. During the second stage, the learning rate schedule had a linear decay from 1e-4 to 6e-6 for the first 7 billion tokens, followed by a stable phase for the remaining tokens.

In the first stage, the model was trained for 118 billion tokens, which is about three epochs of the first-stage training data, inspired by the findings of this paper. In the second stage, the model was trained for 31 billion tokens, which is close to five epochs of the second-stage training data.

Thanks to the WSD learning rate schedule, you can more easily experiment with different first-stage model checkpoints. For example, you could apply the second-stage training on an earlier checkpoint or continue pretraining further before the second stage. Model checkpoints were pushed to this repository every 100,000 training steps (approximately 13 billion tokens).

Evaluation results

FIN-bench

This Ahma 7B base model was primarily evaluated using FIN-bench by TurkuNLP, and the same evaluation was carried out for other relevant Finnish models for comparison: FinGPT 8B by TurkuNLP, Viking 7B by TurkuNLP, SiloGen and HPLT, and Poro 34B by SiloGen, TurkuNLP and HPLT. 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 TBA 49.23 40.00 54.62
Arithmetic 27.64 22.14 11.50 TBA 33.15 30.16 30.34
Cause and Effect 59.48 58.82 59.48 TBA 66.01 58.82 62.74
Emotions 36.25 28.12 36.25 TBA 22.50 26.25 35.63
Empirical Judgements 33.33 35.35 33.33 TBA 27.27 33.33 49.49
General Knowledge 44.29 48.57 51.43 TBA 40.00 24.29 51.43
HHH Alignment 42.09 41.66 44.23 TBA 41.81 42.51 42.92
Intent Recognition 24.42 26.16 43.64 TBA 17.49 22.40 68.35
Misconceptions 46.27 47.01 46.27 TBA 53.73 53.73 52.24
Paraphrase 59.50 73.00 67.00 TBA 51.00 50.00 51.00
Sentence Ambiguity 53.33 65.00 60.00 TBA 51.67 48.33 50.00
Similarities Abstraction 65.79 68.42 71.05 TBA 60.53 65.79 60.53
Non-Arithmetic Average 47.55 48.95 51.33 TBA 46.17 44.42 52.08
Overall Average 36.49 34.06 29.20 TBA 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 TBA 40.77 54.62 76.92
Arithmetic 38.38 43.89 20.88 TBA 43.63 45.78 53.68
Cause and Effect 60.78 64.71 66.01 TBA 64.05 58.17 67.32
Emotions 30.00 41.25 30.00 TBA 44.37 48.13 56.87
Empirical Judgements 46.46 44.44 39.39 TBA 32.32 43.43 63.64
General Knowledge 47.14 40.00 27.14 TBA 54.29 28.57 74.29
HHH Alignment 43.53 44.80 43.80 TBA 45.39 44.80 46.07
Intent Recognition 20.52 44.22 36.42 TBA 51.45 58.82 83.67
Misconceptions 50.75 52.24 46.27 TBA 52.99 46.27 52.99
Paraphrase 50.50 58.50 57.50 TBA 53.00 54.50 55.00
Sentence Ambiguity 53.33 48.33 53.33 TBA 51.67 53.33 66.67
Similarities Abstraction 69.74 72.37 72.37 TBA 64.47 73.68 75.00
Non-Arithmetic Average 48.48 51.49 49.05 TBA 51.19 50.94 61.96
Overall Average 42.87 47.27 33.41 TBA 46.99 48.07 57.36

As we can see, Ahma 7B base model has bad arithmetic performance but in non-arithmetic tasks it clearly outperforms same sized models like the FinGPT 8B and Viking 7B, especially in 0-shot usage. Ahma 7B base model is even on-par with the 5X larger Poro 34B model, in non-arithmetic tasks in 0-shot usage. This result might be attributed to Ahma's 2-stage pretraining and the inclusion of instruct-following examples during the pretraining phase.

In a 3-shot setting, the results are more mixed. The poorer performance of Ahma 7B base model in 3-shot settings might be due to the use of the instruct prompt format and having only single-turn instruction-following training examples.

MTBench Finnish

This Ahma 7B base model was also evaluated using MTBench Finnish by LumiOpen even though this Ahma model is not fine-tuned for chat. 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. Poro 34B Chat by SiloGen, TurkuNLP and HPLT 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 Ahma 7B base (instruct prompt format) Ahma 7B Instruct
Coding 1.00 1.00 1.70 TBA
Extraction 2.00 1.30 3.10 TBA
Humanities 4.05 6.20 6.60 TBA
Math 3.00 3.20 3.90 TBA
Reasoning 2.90 4.60 3.70 TBA
Roleplay 4.80 6.50 6.60 TBA
STEM 5.10 5.95 6.75 TBA
Writing 6.60 9.00 7.10 TBA
Overall Average 3.68 4.72 4.93 TBA

Multi-turn results:

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

As we can see, Ahma 7B base model struggles with multi-turn examples, as expected, since it has only been pretrained with single-turn instruction following examples. In addition, coding performance was expectedly poor because the Ahma 7B model is not trained with code data. In single-turn setting, Ahma 7B beats both the Ahma 3B base and Instruct-tuned versions, demonstrating greater base capability to be further improved with Instruct-tuning.

Acknowledgements

This project would not have been possible without compute generously provided by Google through the TPU Research Cloud.

Team Members

Feel free to contact us for more details 🤗

Ahma

Downloads last month
1,162
Safetensors
Model size
7B params
Tensor type
FP16
·
Inference Examples
Inference API (serverless) has been turned off for this model.

Model tree for Finnish-NLP/Ahma-7B

Adapters
1 model
Finetunes
1 model
Quantizations
3 models

Datasets used to train Finnish-NLP/Ahma-7B

Collection including Finnish-NLP/Ahma-7B