farbodtavakkoli commited on
Commit
d0d5b0e
·
verified ·
1 Parent(s): c779576

Copy of farbodtavakkoli/OTel-LLM-8.3B-Classification at ee00910

Browse files
Files changed (7) hide show
  1. .gitattributes +1 -0
  2. README.md +154 -0
  3. chat_template.jinja +128 -0
  4. config.json +141 -0
  5. model.safetensors +3 -0
  6. tokenizer.json +3 -0
  7. tokenizer_config.json +14 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - en
5
+ base_model: EssentialAI/rnj-1
6
+ tags:
7
+ - classification
8
+ - telecom
9
+ - 5g
10
+ - root-cause-analysis
11
+ - telelogs
12
+ datasets:
13
+ - netop/TeleLogs
14
+ pipeline_tag: text-classification
15
+ ---
16
+
17
+ # OTel-LLM-8.3B-Classification
18
+
19
+ **OTel-LLM-8.3B-Classification** is a telecom-specialized classification model fine-tuned for **5G network root cause analysis (RCA)**, achieving **~99% accuracy** on the [TeleLogs benchmark](https://huggingface.co/datasets/netop/TeleLogs). It is part of the [OTel Family of Models](https://huggingface.co/collections/farbodtavakkoli/otel-llm), an open-source initiative to build industry-standard AI models for the global telecommunications sector.
20
+
21
+ ## Model Details
22
+
23
+ | Attribute | Value |
24
+ |---|---|
25
+ | **Base Model** | [EssentialAI/rnj-1](https://huggingface.co/EssentialAI/rnj-1) |
26
+ | **Parameters** | 8.3B |
27
+ | **Training Method** | Full parameter fine-tuning with classification head |
28
+ | **Task** | Multi-class sequence classification (8 root cause classes) |
29
+ | **Language** | English |
30
+ | **License** | Apache 2.0 |
31
+
32
+ ## Benchmark Results
33
+
34
+ This model achieves **~99% accuracy** on the TeleLogs test set, higher than the published baselines in the TeleLogs paper shown below, including the reasoning-augmented models. It is reported as an auxiliary experiment in the OTel paper (NeurIPS 2026) and is not part of the paper's 30-model baseline table.
35
+
36
+ | Model | Reasoning | Test pass@1 | Test maj@4 |
37
+ |---|---|---|---|
38
+ | Qwen2.5-32B-Instruct | ❌ | 18.85% | 19.60% |
39
+ | DeepSeek-R1-Distill-Llama-70B | ✅ | 29.42% | 34.84% |
40
+ | QwQ-32B | ✅ | 33.62% | 39.00% |
41
+ | Qwen3-32B | ✅ | 33.77% | 37.04% |
42
+ | Qwen2.5-RCA-1.5B | ✅ | 87.56% | 87.73% |
43
+ | Qwen2.5-RCA-7B | ✅ | 87.01% | 88.89% |
44
+ | Qwen2.5-RCA-32B | ✅ | 95.86% | 96.18% |
45
+ | **OTel-LLM-8.3B-Classification** | ❌ | **~99%** | — |
46
+
47
+ ## TeleLogs Dataset
48
+
49
+ [TeleLogs](https://huggingface.co/datasets/netop/TeleLogs) is a synthetic dataset designed to advance research on root cause analysis in 5G networks. It simulates drive-test scenarios involving a user equipment (UE) moving through a region covered by multiple 5G base stations (gNodeBs). Each instance includes a symptom (throughput degradation below 600 Mbps) and one or more root causes from 8 predefined classes:
50
+
51
+ 1. Test vehicle speed exceeds 40 km/h, impacting user throughput
52
+ 2. Downtilt angle of the serving cell is too large, causing weak coverage at the far end
53
+ 3. Serving cell coverage distance exceeds 1 km, resulting in poor RSRP
54
+ 4. Non-colocated co-frequency neighboring cells cause severe interference
55
+ 5. Neighbor cell and serving cell have the same PCI mod 30, causing reference signal overlap
56
+ 6. Frequent handovers degrading user performance
57
+ 7. Misconfigured handover thresholds degrading user performance
58
+ 8. Average scheduled resource blocks (RBs) of the serving cell are below 160
59
+
60
+ For more details, see the [TeleLogs paper](https://arxiv.org/abs/2507.21974).
61
+
62
+ ## Training Details
63
+
64
+ ### Approach
65
+
66
+ The model was trained as a **sequence classification** model. The classification head consists of a **Dropout(0.1) layer followed by a Linear projection** from the model's hidden dimension to the 8 root cause classes.
67
+
68
+ ### Hyperparameters
69
+
70
+ | Parameter | Value |
71
+ |---|---|
72
+ | **Learning Rate** | 7e-6 |
73
+ | **LR Scheduler** | Cosine |
74
+ | **Warmup Steps** | 150 |
75
+ | **Batch Size (per device)** | 4 |
76
+ | **Gradient Accumulation Steps** | 2 |
77
+ | **Effective Batch Size** | 64 (4 × 2 × 8 GPUs) |
78
+ | **Epochs** | 25 |
79
+ | **Weight Decay** | 0.01 |
80
+ | **Label Smoothing** | 0.1 |
81
+ | **Max Gradient Norm** | 0.5 |
82
+ | **Max Sequence Length** | 5000 tokens |
83
+ | **Precision** | BF16 |
84
+ | **Attention** | Flash Attention 2 |
85
+ | **Distributed Training** | FSDP |
86
+ | **Gradient Checkpointing** | Enabled |
87
+
88
+ ### Classification Head
89
+
90
+ ```
91
+ Dropout(0.1) → Linear(hidden_size, 8, bias=False)
92
+ ```
93
+
94
+ Weight initialization: Normal distribution with mean=0.0, std=0.01.
95
+
96
+ ## Intended Use
97
+
98
+ This model is optimized for:
99
+
100
+ - **5G network root cause analysis** — classifying network log data into specific fault categories
101
+ - **Telecom troubleshooting** — automated diagnosis of throughput degradation causes from drive-test measurements
102
+
103
+ ## Related Models
104
+
105
+ ### Language Models
106
+ - [OTel LLM Collection](https://huggingface.co/collections/farbodtavakkoli/otel-llm)
107
+
108
+ ### Embedding Models
109
+ - [OTel Embedding Collection](https://huggingface.co/collections/farbodtavakkoli/otel-embedding)
110
+
111
+ ### Reranker Models
112
+ - [OTel Reranker Collection](https://huggingface.co/collections/farbodtavakkoli/otel-reranker)
113
+
114
+ ## Related Datasets
115
+
116
+ - [TeleLogs](https://huggingface.co/datasets/netop/TeleLogs) — 5G RCA benchmark
117
+ - [OTel-Embedding](https://huggingface.co/datasets/farbodtavakkoli/OTel-Embedding)
118
+ - [OTel-Safety](https://huggingface.co/datasets/farbodtavakkoli/OTel-Safety)
119
+ - [OTel-LLM](https://huggingface.co/datasets/farbodtavakkoli/OTel-LLM)
120
+ - [OTel-Reranker](https://huggingface.co/datasets/farbodtavakkoli/OTel-Reranker)
121
+
122
+ ## Training Infrastructure
123
+
124
+ - **Framework**: ScalarLM (GPU-agnostic)
125
+ - **Compute**: TensorWave with AMD GPUs and Azure with NVIDIA GPUs
126
+ - **Training Code**: [github.com/farbodtavakkoli/OTel](https://github.com/farbodtavakkoli/OTel)
127
+
128
+ ## Citation
129
+
130
+ ```bibtex
131
+ @inproceedings{tavakkoli2026otel,
132
+ title = {OTel: Open Telco AI Datasets, Benchmarks, and Models},
133
+ author = {Tavakkoli, Farbod and Diamos, Gregory and Church, Kenneth and Kanter, David and Austin, Mark and Karim, Imtiaz and Rahman, Mirza Masfiqur and Debbah, Merouane Abdelkader and Nezami, Zeinab and Maatouk, Ali and Tassiulas, Leandros and Ying, Rex and Sorros, Nick and Powell, Louis and Vasiloglou, Nikolaos and Vaswani, Ashish and Singla, Somanshu and Chaluvaraju, Adarsh},
134
+ booktitle = {Advances in Neural Information Processing Systems (NeurIPS), Evaluations and Datasets Track},
135
+ year = {2026},
136
+ url = {https://github.com/farbodtavakkoli/OTel}
137
+ }
138
+ ```
139
+
140
+ If you use the TeleLogs dataset, please also cite:
141
+
142
+ ```bibtex
143
+ @article{sana2025reasoning,
144
+ title={{Reasoning Language Models for Root Cause Analysis in 5G Wireless Networks}},
145
+ author={Mohamed Sana and Nicola Piovesan and Antonio De Domenico and Yibin Kang and Haozhe Zhang and Merouane Debbah and Fadhel Ayed},
146
+ year={2025},
147
+ eprint={arXiv:2507.21974},
148
+ url={https://arxiv.org/abs/2507.21974}
149
+ }
150
+ ```
151
+
152
+ ## Contact
153
+
154
+ If you have any technical questions, please feel free to reach out to [farbod.tavakkoli@att.com](mailto:farbod.tavakkoli@att.com) or [farbodtavakoli@gmail.com](mailto:farbodtavakoli@gmail.com)
chat_template.jinja ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) -%}
2
+ {%- set emit = namespace(started=false) -%}
3
+
4
+ {# ---------- Build base system message (always emitted) ---------- #}
5
+ {%- set base_system = 'You are rnj-1, a foundation model trained by Essential AI.\n' -%}
6
+
7
+ {# ---------- Default system prompt if user system is absent ---------- #}
8
+ {%- set default_system = 'You are a helpful assistant.' -%}
9
+
10
+ {# Detect whether the first message is a user-provided system message #}
11
+ {%- set has_user_system = (messages
12
+ and messages[0].role == 'system'
13
+ and (messages[0].content is string)) -%}
14
+
15
+ {# The system instruction that should apply (user system wins; else default) #}
16
+ {%- set effective_system = (has_user_system and messages[0].content) or default_system -%}
17
+
18
+
19
+ {# ---------- Optional tools preface as a synthetic system message ---------- #}
20
+ {%- if tools %}
21
+ {%- set sys_preamble -%}
22
+ # Tools
23
+
24
+ You may call one or more functions to assist with the user query.
25
+
26
+ You are provided with function signatures within <tools></tools> XML tags:
27
+ <tools>
28
+ {%- for tool in tools %}
29
+ {{ "\n" ~ (tool | tojson) }}
30
+ {% endfor %}
31
+ </tools>
32
+
33
+ For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
34
+ <tool_call>
35
+ {"name": <function-name>, "arguments": <args-json-object>}
36
+ </tool_call>
37
+ {%- endset -%}
38
+
39
+ {# Always include effective_system; user system prevails over default #}
40
+ {%- set sys_content = effective_system ~ "\n\n" ~ sys_preamble -%}
41
+
42
+ {%- set content = '<|start_header_id|>system<|end_header_id|>\n'
43
+ ~ base_system ~ '\n' ~ sys_content ~ '<|eot_id|>' -%}
44
+ {%- if not emit.started -%}{%- set content = bos_token ~ content -%}{%- set emit.started = true -%}{%- endif -%}
45
+ {{- content -}}
46
+ {%- else %}
47
+ {# No tools: always emit base_system + effective_system #}
48
+ {%- set content = '<|start_header_id|>system<|end_header_id|>\n'
49
+ ~ base_system ~ '\n' ~ effective_system ~ '<|eot_id|>' -%}
50
+ {%- if not emit.started -%}{%- set content = bos_token ~ content -%}{%- set emit.started = true -%}{%- endif -%}
51
+ {{- content -}}
52
+ {%- endif -%}
53
+
54
+ {# ---------- Locate last user query for multi-step tool behavior ---------- #}
55
+ {%- for message in messages[::-1] %}
56
+ {%- set index = (messages|length - 1) - loop.index0 -%}
57
+ {%- if ns.multi_step_tool
58
+ and message.role == "user"
59
+ and message.content is string
60
+ and not (message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) -%}
61
+ {%- set ns.multi_step_tool = false -%}
62
+ {%- set ns.last_query_index = index -%}
63
+ {%- endif -%}
64
+ {%- endfor -%}
65
+
66
+ {# ---------- Walk all messages and emit in Llama-3 format ---------- #}
67
+ {%- for message in messages %}
68
+ {%- if message.content is string -%}
69
+ {%- set content = message.content -%}
70
+ {%- else -%}
71
+ {%- set content = '' -%}
72
+ {%- endif -%}
73
+
74
+ {# Skip the FIRST system message if it existed, since we already embedded it in effective_system #}
75
+ {%- if loop.first and message.role == "system" -%}
76
+ {# no-op #}
77
+
78
+ {%- elif (message.role == "user") or (message.role == "system") -%}
79
+ {%- set block = '<|start_header_id|>' ~ message.role ~ '<|end_header_id|>\n' ~ content ~ '<|eot_id|>' -%}
80
+ {%- if not emit.started -%}{%- set block = bos_token ~ block -%}{%- set emit.started = true -%}{%- endif -%}
81
+ {{- block -}}
82
+
83
+ {%- elif message.role == "assistant" -%}
84
+ {%- set body = content -%}
85
+ {%- set header = '<|start_header_id|>assistant<|end_header_id|>\n' -%}
86
+ {%- if not emit.started -%}{{ bos_token }}{%- set emit.started = true -%}{%- endif -%}
87
+ {{- header -}}
88
+ {% generation %}
89
+ {{- body -}}
90
+ {%- if message.tool_calls -%}
91
+ {%- for tool_call in message.tool_calls -%}
92
+ {%- if tool_call.function -%}{%- set tc = tool_call.function -%}{%- else -%}{%- set tc = tool_call -%}{%- endif -%}
93
+ {%- set args_json = (tc.arguments if (tc.arguments is string) else (tc.arguments | tojson)) -%}
94
+ {%- if loop.first -%}
95
+ {{- '<tool_call>\n{"name": "' ~ tc.name ~ '", "arguments": ' ~ args_json ~ '}\n</tool_call>' -}}
96
+ {%- else -%}
97
+ {{- '\n<tool_call>\n{"name": "' ~ tc.name ~ '", "arguments": ' ~ args_json ~ '}\n</tool_call>' -}}
98
+ {%- endif -%}
99
+ {%- endfor -%}
100
+ {%- endif -%}
101
+ {{- '<|eot_id|>' -}}{%- endgeneration -%}
102
+
103
+ {%- elif message.role == "tool" -%}
104
+ {%- set open_user = (loop.first or (loop.index0 > 0 and messages[loop.index0 - 1].role != "tool")) -%}
105
+ {%- set close_user = (loop.last or (loop.index0 < messages|length - 1 and messages[loop.index0 + 1].role != "tool")) -%}
106
+
107
+ {%- if open_user -%}
108
+ {%- set header = '<|start_header_id|>user<|end_header_id|>\n' -%}
109
+ {%- if not emit.started -%}{%- set header = bos_token ~ header -%}{%- set emit.started = true -%}{%- endif -%}
110
+ {{- header -}}
111
+ {%- endif -%}
112
+ {%- if open_user -%}
113
+ {{- '<tool_response>\n' -}}
114
+ {%- else -%}
115
+ {{- '\n<tool_response>\n' -}}
116
+ {%- endif -%}
117
+ {{- content -}}
118
+ {{- '\n</tool_response>' -}}
119
+
120
+ {%- if close_user -%}
121
+ {{- '<|eot_id|>' -}}
122
+ {%- endif -%}
123
+ {%- endif -%}
124
+ {%- endfor -%}
125
+
126
+ {%- if add_generation_prompt -%}
127
+ {{- '<|start_header_id|>assistant<|end_header_id|>\n' -}}
128
+ {%- endif -%}
config.json ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_sliding_window_pattern": 1,
3
+ "architectures": [
4
+ "Gemma3TextForSequenceClassification"
5
+ ],
6
+ "attention_bias": false,
7
+ "attention_dropout": 0.0,
8
+ "attn_logit_softcapping": null,
9
+ "bos_token_id": 2,
10
+ "cache_implementation": "hybrid",
11
+ "dtype": "bfloat16",
12
+ "eos_token_id": 1,
13
+ "final_logit_softcapping": 30.0,
14
+ "head_dim": 128,
15
+ "hidden_act": "gelu_pytorch_tanh",
16
+ "hidden_activation": "gelu_pytorch_tanh",
17
+ "hidden_size": 4096,
18
+ "id2label": {
19
+ "0": "C1",
20
+ "1": "C2",
21
+ "2": "C3",
22
+ "3": "C4",
23
+ "4": "C5",
24
+ "5": "C6",
25
+ "6": "C7",
26
+ "7": "C8"
27
+ },
28
+ "initializer_range": 0.02,
29
+ "intermediate_size": 16384,
30
+ "label2id": {
31
+ "C1": 0,
32
+ "C2": 1,
33
+ "C3": 2,
34
+ "C4": 3,
35
+ "C5": 4,
36
+ "C6": 5,
37
+ "C7": 6,
38
+ "C8": 7
39
+ },
40
+ "layer_type": [
41
+ "full_attention",
42
+ "full_attention",
43
+ "full_attention",
44
+ "full_attention",
45
+ "full_attention",
46
+ "full_attention",
47
+ "full_attention",
48
+ "full_attention",
49
+ "full_attention",
50
+ "full_attention",
51
+ "full_attention",
52
+ "full_attention",
53
+ "full_attention",
54
+ "full_attention",
55
+ "full_attention",
56
+ "full_attention",
57
+ "full_attention",
58
+ "full_attention",
59
+ "full_attention",
60
+ "full_attention",
61
+ "full_attention",
62
+ "full_attention",
63
+ "full_attention",
64
+ "full_attention",
65
+ "full_attention",
66
+ "full_attention",
67
+ "full_attention",
68
+ "full_attention",
69
+ "full_attention",
70
+ "full_attention",
71
+ "full_attention",
72
+ "full_attention"
73
+ ],
74
+ "layer_types": [
75
+ "full_attention",
76
+ "full_attention",
77
+ "full_attention",
78
+ "full_attention",
79
+ "full_attention",
80
+ "full_attention",
81
+ "full_attention",
82
+ "full_attention",
83
+ "full_attention",
84
+ "full_attention",
85
+ "full_attention",
86
+ "full_attention",
87
+ "full_attention",
88
+ "full_attention",
89
+ "full_attention",
90
+ "full_attention",
91
+ "full_attention",
92
+ "full_attention",
93
+ "full_attention",
94
+ "full_attention",
95
+ "full_attention",
96
+ "full_attention",
97
+ "full_attention",
98
+ "full_attention",
99
+ "full_attention",
100
+ "full_attention",
101
+ "full_attention",
102
+ "full_attention",
103
+ "full_attention",
104
+ "full_attention",
105
+ "full_attention",
106
+ "full_attention"
107
+ ],
108
+ "max_position_embeddings": 32768,
109
+ "model_type": "gemma3_text",
110
+ "num_attention_heads": 32,
111
+ "num_hidden_layers": 32,
112
+ "num_key_value_heads": 8,
113
+ "pad_token_id": 128001,
114
+ "query_pre_attn_scalar": 128,
115
+ "rms_norm_eps": 1e-06,
116
+ "rope_parameters": {
117
+ "full_attention": {
118
+ "attn_factor": 1.0,
119
+ "beta_fast": 64.0,
120
+ "beta_slow": 1.0,
121
+ "extrapolation_factor": 1.0,
122
+ "factor": 4.0,
123
+ "original_max_position_embeddings": 8192,
124
+ "rope_theta": 10000,
125
+ "rope_type": "yarn"
126
+ },
127
+ "rope_theta": null,
128
+ "rope_type": "default",
129
+ "sliding_attention": {
130
+ "rope_theta": 10000,
131
+ "rope_type": "default"
132
+ }
133
+ },
134
+ "sliding_window": 32768,
135
+ "sliding_window_pattern": 1,
136
+ "tie_word_embeddings": true,
137
+ "transformers_version": "5.2.0",
138
+ "use_bidirectional_attention": false,
139
+ "use_cache": false,
140
+ "vocab_size": 128256
141
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:61272c9f48ee08baa3f1761bf3403b2535eafbda150ca41dfb0619ab7b4be3ed
3
+ size 16621117448
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:96a2db531b75969ce3aeaaf126eb7957f7e07a28c7e770705787ef035f19d9da
3
+ size 17209795
tokenizer_config.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "bos_token": "<|begin_of_text|>",
4
+ "clean_up_tokenization_spaces": true,
5
+ "eos_token": "<|end_of_text|>",
6
+ "is_local": false,
7
+ "model_input_names": [
8
+ "input_ids",
9
+ "attention_mask"
10
+ ],
11
+ "model_max_length": 1000000000000000019884624838656,
12
+ "pad_token": "<|end_of_text|>",
13
+ "tokenizer_class": "TokenizersBackend"
14
+ }