Downloads · 30 days
822
48% of all-time downloads
saai-sa/ASL-4B-v1
ASL-4B-v1 is a text generation model from saai-sa. Use it when you need the model to write or continue text. The card lists the license as apache-2.0.
ASL (أصل) is a 4-billion-parameter Arabic language model developed by SAAI. Built on Qwen3.5 and professionally tuned, it is designed to provide strong Arabic-language capabilities in a compact and efficient model, wi…
Downloads · 30 days
822
48% of all-time downloads
All-time downloads
1.7K
Public
Parameters
4.7B
9.3 GB on disk
Likes
19
Public
Click a slice to open those files.
.safetensors9.3 GB · 100%
How the weights are stored.
BF164.7B · 100%
From the Hugging Face model README
ASL (أصل) is a 4-billion-parameter Arabic language model developed by SAAI. Built on Qwen3.5 and professionally tuned, it is designed to provide strong Arabic-language capabilities in a compact and efficient model, with particular emphasis on understanding Saudi dialect and local Saudi context.
The ASL Model was trained on a blend of open-source datasets and proprietary local data contributed by our partners. The data includes Saudi books, literary works, and journalistic publications. This training approach aims to deepen the model's understanding of Modern Standard Arabic, Saudi dialect, and local and institutional contexts.
ASL is SAAI's first research release and the first step in a longer effort to develop small, efficient, specialized Arabic models with native awareness of local context. Future releases will incorporate feedback, insights, and contributions from collaborators across the Arab research community.
| Attribute | Value |
|---|---|
| Base Model | Qwen3.5 |
| License | Apache-2.0 |
ASL supports both reasoning-enabled and standard-generation modes. The following settings are recommended starting points for vLLM and Hugging Face Transformers.
Note: Enable or disable reasoning using the model's chat template, serving framework, or inference API. The sampling settings below control generation behavior; they do not independently toggle reasoning.
Use this mode for mathematical reasoning, multi-step problem solving, structured analysis, and tasks where deliberate reasoning improves answer quality.
from vllm import SamplingParams
reasoning_sampling_params = SamplingParams(
temperature=0.6,
top_p=0.95,
top_k=20,
min_p=0.0,
presence_penalty=0.5,
repetition_penalty=1.05,
)
import torch
from transformers import LogitsProcessor, LogitsProcessorList
class PresenceFrequencyPenaltyProcessor(LogitsProcessor):
def __init__(self, prompt_length, presence_penalty=0.0, frequency_penalty=0.0):
self.prompt_length = prompt_length
self.presence_penalty = presence_penalty
self.frequency_penalty = frequency_penalty
def __call__(self, input_ids, scores):
generated_ids = input_ids[:, self.prompt_length:]
for batch_index, token_ids in enumerate(generated_ids):
unique_tokens, counts = torch.unique(token_ids, return_counts=True)
if self.presence_penalty != 0.0:
scores[batch_index, unique_tokens] -= self.presence_penalty
if self.frequency_penalty != 0.0:
scores[batch_index, unique_tokens] -= (
self.frequency_penalty * counts.to(scores.dtype)
)
return scores
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
prompt_length = inputs.input_ids.shape[3]
reasoning_logits_processor = LogitsProcessorList([
PresenceFrequencyPenaltyProcessor(
prompt_length=prompt_length,
presence_penalty=0.5,
frequency_penalty=0.0,
)
])
output_ids = model.generate(
**inputs,
do_sample=True,
temperature=0.6,
top_p=0.95,
top_k=20,
min_p=0.0,
repetition_penalty=1.05,
logits_processor=reasoning_logits_processor,
max_new_tokens=2048,
)
Use this mode for general chat, text generation, extraction, classification, and latency-sensitive workloads where explicit multi-step reasoning is not required.
from vllm import SamplingParams
standard_sampling_params = SamplingParams(
temperature=0.7,
top_p=0.8,
top_k=20,
min_p=0.0,
presence_penalty=1.0,
frequency_penalty=0.0,
repetition_penalty=1.0,
)
import torch
from transformers import LogitsProcessor, LogitsProcessorList
class PresenceFrequencyPenaltyProcessor(LogitsProcessor):
def __init__(self, prompt_length, presence_penalty=0.0, frequency_penalty=0.0):
self.prompt_length = prompt_length
self.presence_penalty = presence_penalty
self.frequency_penalty = frequency_penalty
def __call__(self, input_ids, scores):
generated_ids = input_ids[:, self.prompt_length:]
for batch_index, token_ids in enumerate(generated_ids):
unique_tokens, counts = torch.unique(token_ids, return_counts=True)
if self.presence_penalty != 0.0:
scores[batch_index, unique_tokens] -= self.presence_penalty
if self.frequency_penalty != 0.0:
scores[batch_index, unique_tokens] -= (
self.frequency_penalty * counts.to(scores.dtype)
)
return scores
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
prompt_length = inputs.input_ids.shape[3]
standard_logits_processor = LogitsProcessorList([
PresenceFrequencyPenaltyProcessor(
prompt_length=prompt_length,
presence_penalty=1.0,
frequency_penalty=0.0,
)
])
output_ids = model.generate(
**inputs,
do_sample=True,
temperature=0.7,
top_p=0.8,
top_k=20,
min_p=0.0,
repetition_penalty=1.0,
logits_processor=standard_logits_processor,
max_new_tokens=2048,
)
The benchmarks were evaluated using a customized version of the LM Evaluation Harness. The Reasoning AraMath evaluation was conducted separately using an answer-parsing approach. All benchmarks were evaluated in a zero-shot setting, with no task-specific examples provided in the prompts.
The following results compare ASL (4B) with Qwen3.5 4B, Fanar 1 (9B), Fanar 2 (27B), and ALLaM 7B. Higher scores indicate better performance for all benchmarks except AraSafe invalid rate, where lower is better. n/a indicates that a result was not available.
| Benchmark | Qwen3.5 4B | Fanar 1 (9B) | Fanar 2 (27B) | ALLaM 7B | ASL (4B) |
|---|---|---|---|---|---|
| AraIFEval (strict) | 83.21 | 73.52 | 67.44 | 77.06 | 78.70 |
| AraMath | 51.40 | 59.17 | 78.35 | 67.44 | 71.74 |
| Reasoning AraMath | n/a | n/a | n/a | n/a | 98.18 |
| AraPro | 54.99 | 67.01 | 71.63 | 73.69 | 64.83 |
| ArabicMMLU | 52.22 | 64.66 | 70.53 | 71.14 | 62.67 |
| Belebele (Arabic) | 59.89 | 88.33 | 91.11 | 85.89 | 84.33 |
| ALGhafa | 58.42 | 63.57 | 66.27 | 58.75 | 63.19 |
| AraTruthfulQA | 41.23 | 60.82 | 46.83 | 39.55 | 41.60 |
| AraTrust | 46.64 | 55.47 | 56.43 | 55.28 | 46.45 |
| Absher words(Saudi Dialects) | 49.14 | 57.32 | 72.71 | 63.75 | 65.51 |
| Absher phrases(Saudi Dialects) | 56.44 | 63.30 | 75.54 | 67.81 | 73.39 |
| Absher proverbs(Saudi Dialects) | 50.68 | 67.12 | 76.71 | 67.12 | 72.60 |
| AraSafe (fine-grained) | 69.03 | 40.78 | 90.39 | n/a | 85.50 |
| AraSafe invalid rate ↓ | 0.03 | 52.50 | 0.35 | n/a | 0.00 |
ASL is intended for research and development of Arabic language applications, including Arabic text generation, Saudi-dialect understanding, local-context assistance.
ASL may generate inaccurate, incomplete, or biased content. Benchmark performance does not guarantee reliability in real-world settings. Evaluate the model for the target use case, especially before deploying it in high-impact, safety-sensitive, or decision-making applications.
ASL is released under the Apache License 2.0.