--- base_model: ibm-granite/granite-4.0-350m library_name: transformers pipeline_tag: text-generation tags: - granite - granite-switch - lora - adapters - mixture-of-adapters license: apache-2.0 --- # Granite Switch 4.0 350M — 3-Adapter Demo A single [Granite Switch](https://github.com/generative-computing/granite-switch) checkpoint built on [`ibm-granite/granite-4.0-350m`](https://huggingface.co/ibm-granite/granite-4.0-350m) with **three task LoRA adapters embedded in one model**. Each adapter is activated by a control token, so one deployed checkpoint serves three different tasks — no adapter swapping, no separate model loads. This is the multi-adapter companion to the single-adapter [`barha/granite-switch-4.0-350m-cti`](https://huggingface.co/barha/granite-switch-4.0-350m-cti). ## Embedded adapters | # | Adapter | Control token | Task | Source LoRA | |---|---------|---------------|------|-------------| | 1 | `cti-technique-mapping` | `<\|cti-technique-mapping\|>` | Map a CTI description → MITRE ATT&CK technique ID | [barha/granite-cti-technique-mapping-350m-lora](https://huggingface.co/barha/granite-cti-technique-mapping-350m-lora) | | 2 | `text-to-json` | `<\|text-to-json\|>` | Natural language + schema → schema-conforming JSON | [barha/granite-text-to-json-350m-lora](https://huggingface.co/barha/granite-text-to-json-350m-lora) | | 3 | `genai-attack-vector` | `<\|genai-attack-vector\|>` | Classify a GenAI security incident into 1 of 14 attack-vector classes | [barha/granite-genai-attack-vector-350m-lora](https://huggingface.co/barha/granite-genai-attack-vector-350m-lora) | All three adapters share an identical LoRA shape (rank 16, alpha 32, on the fused q/k/v/o attention projections and the `input_linear` / `output_linear` MLP projections), which is what lets them stack cleanly into one switch checkpoint. Control token IDs: `100352`, `100353`, `100354` (3 new tokens; vocab 100355). ## Per-adapter evaluation (on granite-4.0-350m) | Adapter | Metric | Score | n | |---------|--------|-------|---| | text-to-json | Key-F1 (headline) | **98.4** | 2000 | | genai-attack-vector | Accuracy | **74.8%** (166/222) | 222 | | cti-technique-mapping | — | see source repo | — | These are the standalone scores of each source LoRA; embedding them in the switch does not change adapter weights. ## How adapter selection works Granite Switch routes per request via the control token: place the adapter's control token in the prompt (the chat template handles placement) and the switch activates that adapter for the turn. With no control token, the base model runs unmodified. ## Usage Compose / inference follow the standard Granite Switch flow — see the [granite-switch repo](https://github.com/generative-computing/granite-switch) and its tutorials. The checkpoint loads as a `GraniteSwitchForCausalLM`; `adapter_index.json` lists the adapter → control-token mapping and `io_configs//io.yaml` carries each adapter's I/O contract. ## Build Composed with `granite_switch.composer.compose_granite_switch`: ```bash python -m granite_switch.composer.compose_granite_switch \ --base-model ibm-granite/granite-4.0-350m \ --technology lora \ --adapters cti-technique-mapping text-to-json genai-attack-vector \ --output ./granite-switch-4.0-350m-demo ``` Base params 352M → composed 359M (+2.0%). See `BUILD.md` and `compose_report.json` in this repo for the full composition report. License: Apache-2.0