--- title: Granite Switch Tiny emoji: 🛡️ colorFrom: yellow colorTo: purple sdk: gradio sdk_version: 6.5.1 app_file: app.py pinned: false license: apache-2.0 models: - barha/granite-switch-4.0-350m-cti --- # Granite Switch 4.0 350M — CTI Technique Mapping A [Gradio](https://gradio.app) demo for [`barha/granite-switch-4.0-350m-cti`](https://huggingface.co/barha/granite-switch-4.0-350m-cti). Enter a piece of cyber threat intelligence (CTI) text describing adversary behavior. The demo runs the **same base model twice on the same prompt** and shows the results side by side: - **Adapter OFF** — the plain `ibm-granite/granite-4.0-350m` base. It answers in prose and rarely produces a clean technique ID. - **Adapter ON** — the embedded `cti-technique-mapping` LoRA is fired by a single control token, and the model emits one [MITRE ATT&CK](https://attack.mitre.org/) technique ID (e.g. `T1059.001`), which the Space then resolves to its official technique **name**. The model is a Granite Switch composition of the `ibm-granite/granite-4.0-350m` base with a `cti-technique-mapping` LoRA adapter (attention + MLP coverage). The adapter is activated by the `<|cti-technique-mapping|>` control token, which the chat template inserts when `adapter_name="cti-technique-mapping"` is passed to `apply_chat_template` — that single difference is the entire "switch". The model is loaded locally in the Space using the [`granite-switch`](https://pypi.org/project/granite-switch/) package (`[hf]` backend). The user input is wrapped in the exact instruction format the adapter was trained on — `What ATT&CK technique does the following CTI procedure sentence describe?` followed by the sentence inside `...` tags. The ID→name lookup uses `mitre_id_to_name.json`, built from the official [mitre-attack/attack-stix-data](https://github.com/mitre-attack/attack-stix-data) Enterprise bundle (697 techniques + sub-techniques), bundled in the Space so no network call is needed at inference. > **Note:** the adapter was trained on the **top-10 most frequent** techniques in > its source dataset, so inputs outside those classes may map to a near-but-imperfect > ID. The demo's point is the *base-vs-adapter behavior difference*, not exhaustive > ATT&CK coverage.