Repository: instructlab/instructlab

Issue:
name of the merlinite template
the merlinite template is used by both merlinite and granite (and probably future models trained through instructlab).
perhaps we should rename it here (https://github.com/instructlab/instructlab/blob/main/src/instructlab/server.py#L27) as `instructlab` and make the model-template mapping explicit here (https://github.com/instructlab/instructlab/blob/main/src/instructlab/config.py#L48) as 
```
MODEL_FAMILY_MAPPINGS = {
    "merlinite": "instructlab",
    "granite": "instructlab",
    "mixtral": "mixtral",
}
```
cc @russellb 
Switch default model from Merlinite to Granite
InstructLab has moved pretty heavily towards being a Granite-first project, yet many of the config defaults for models remain to be Merlinite. Opening this issue to start the conversation of switching over to Granite quanitized GGUFs and Safetensors, where applicable.

Merlinite can still be used in things like CI.

If folks agree I can convert this issue from a `question` to a `refactor` and implement it.


Discussion:
Thank you @xukai92 ! This makes sense to me
This one is still relevant, it seems like

Probably should use merlinite as teacher (gguf) and granite as student (safetensors). ilab download should do this by default. (Discussed at standup today)

Nathan is moving from a question to refactor!
Sorry, I should have searched more before opening a duplicate issue. But I think that some of the points I raised in that issue were relevant. Especially this one:

When you are a new user and start playing with `ilab model chat` and you find some gap in the knowledge of that model, it's very confusing that the knowledge that you add is then used to train another model. Is there a technical reason to use two different models?

I know that there are technical limitations and that you can't train with the gguf model. But the quantized model should be based on the same unquantized model.



Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5840bb25b0..64868f543f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
 ### Breaking Changes
 
 * train-profiles have been deprecated and replaced with system-profiles. These profiles follow the format of the config file and apply to all commands. They live in `~/.local/share/instructlab/internal/system_profiles`
+* The default model has been changed from Merlinite to Granite - see <https://github.com/instructlab/instructlab/issues/2238> for more details
 
 ### Features
 
diff --git a/README.md b/README.md
index 205929f3fb..6ae7d0a207 100644
--- a/README.md
+++ b/README.md
@@ -308,12 +308,12 @@ For an overview of the full workflow, see the [workflow diagram](./docs/workflow
 
    `ilab` will use the default configuration file unless otherwise specified. You can override this behavior with the `--config` parameter for any `ilab` command.
 
-4. When prompted, provide the path to your default model. Otherwise, the default of a quantized [Merlinite](https://huggingface.co/instructlab/merlinite-7b-lab-GGUF) model is used.
+4. When prompted, provide the path to your default model. Otherwise, the default of a quantized [Granite](https://huggingface.co/instructlab/granite-7b-lab-GGUF) model is used.
 
    *Example output of steps 1 - 3*
 
    ```shell
-   Path to your model [/home/user/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf]: <ENTER>
+   Path to your model [/home/user/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf]: <ENTER>
    ```
 
    You can download this model with `ilab model download` command as well.
@@ -330,7 +330,7 @@ For an overview of the full workflow, see the [workflow diagram](./docs/workflow
 
    Please provide the following values to initiate the environment [press Enter for defaults]:
    Path to taxonomy repo [/home/user/.local/share/instructlab/taxonomy]:
-   Path to your model [/home/user/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf]:
+   Path to your model [/home/user/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf]:
 
    Generating config file and profiles:
        /home/user/.config/instructlab/config.yaml
@@ -379,7 +379,7 @@ ilab config show
 
 #### Downloading the default InstructLab models
 
-- Run the `ilab model download` command to download a compact pre-trained version of the `merlinite-7b-lab-GGUF` and `Mistral-7B-Instruct-v0.2-GGUF` models (~4.4G) from HuggingFace.
+- Run the `ilab model download` command to download a compact pre-trained version of the `granite-7b-lab-GGUF`, `merlinite-7b-lab-GGUF`, and `Mistral-7B-Instruct-v0.2-GGUF` models (~4.4G each) from HuggingFace.
 
    ```shell
    ilab model download
@@ -388,6 +388,9 @@ ilab config show
    *Example output*
 
    ```shell
+   Downloading model from Hugging Face:
+       Model: instructlab/granite-7b-lab-GGUF@main
+       Destination: /Users/<user>/.cache/instructlab/models
    Downloading model from Hugging Face:
        Model: instructlab/merlinite-7b-lab-GGUF@main
        Destination: /Users/<user>/.cache/instructlab/models
@@ -440,6 +443,7 @@ ilab config show
   +-------------------------------------+---------------------+--------+
   | Model Name                          | Last Modified       | Size   |
   +-------------------------------------+---------------------+--------+
+  | granite-7b-lab-Q4_K_M.gguf          | 2024-08-01 15:05:48 | 4.1 GB |
   | merlinite-7b-lab-Q4_K_M.gguf        | 2024-08-01 15:05:48 | 4.1 GB |
   | mistral-7b-instruct-v0.2.Q4_K_M.gguf| 2024-08-01 15:05:48 | 4.1 GB |
   +-------------------------------------+---------------------+--------+
@@ -457,7 +461,7 @@ ilab config show
 
    ```shell
    (venv) $ ilab model serve
-   INFO 2024-03-02 02:21:11,352 lab.py:201 Using model 'models/ggml-merlinite-7b-lab-Q4_K_M.gguf' with -1 gpu-layers and 4096 max context size.
+   INFO 2024-03-02 02:21:11,352 lab.py:201 Using model 'models/ggml-granite-7b-lab-Q4_K_M.gguf' with -1 gpu-layers and 4096 max context size.
    Starting server process
    After application startup complete see http://127.0.0.1:8000/docs for API.
    Press CTRL+C to shut down the server.
@@ -520,10 +524,10 @@ ilab config show
    ```shell
    (venv) $ ilab model chat
    ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────── system ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
-   │ Welcome to InstructLab Chat w/ GGML-MERLINITE-7B-lab-Q4_K_M (type /h for help)                                                                                                                                                             │
+   │ Welcome to InstructLab Chat w/ GGML-GRANITE-7B-lab-Q4_K_M (type /h for help)                                                                                                                                                             │
    ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
    >>> what is the capital of Canada?                                                                                                                                                                                                [S][default]
-   ╭────────────────────────────────────────────────────────────────────────────────────────────────────── ggml-merlinite-7b-lab-Q4_K_M ───────────────────────────────────────────────────────────────────────────────────────────────────────╮
+   ╭────────────────────────────────────────────────────────────────────────────────────────────────────── ggml-granite-7b-lab-Q4_K_M ───────────────────────────────────────────────────────────────────────────────────────────────────────╮
    │ The capital city of Canada is Ottawa. It is located in the province of Ontario, on the southern banks of the Ottawa River in the eastern portion of southern Ontario. The city serves as the political center for Canada, as it is home to │
    │ Parliament Hill, which houses the House of Commons, Senate, Supreme Court, and Cabinet of Canada. Ottawa has a rich history and cultural significance, making it an essential part of Canada's identity.                                   │
    ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── elapsed 12.008 seconds ─╯
@@ -774,7 +778,7 @@ When running multi phase training evaluation is run on each phase, we will tell
    On a Mac `ilab model train` outputs a brand-new model that is saved in the `<model_name>-mlx-q` directory called `adapters.npz` (in `Numpy` compressed array format). For example:
 
    ```shell
-   (venv) $ ls instructlab-merlinite-7b-lab-mlx-q/
+   (venv) $ ls instructlab-granite-7b-lab-mlx-q/
    ├── adapters-010.npz
    ├── adapters-020.npz
    ├── adapters-030.npz
@@ -1002,7 +1006,7 @@ argument to specify your new model:
 
    Which model should you select to serve? After running the `ilab model convert` command, some files and a directory are generated. The model you will want to serve ends with an extension of `.gguf`
    and exists in a directory with the suffix `trained`. For example:
-   `instructlab-merlinite-7b-lab-trained/instructlab-merlinite-7b-lab-Q4_K_M.gguf`.
+   `instructlab-granite-7b-lab-trained/instructlab-granite-7b-lab-Q4_K_M.gguf`.
 
 ## 📣 Chat with the new model (not optional this time)
 
diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md
index f0ec1e932d..32a83998db 100644
--- a/TROUBLESHOOTING.md
+++ b/TROUBLESHOOTING.md
@@ -72,7 +72,7 @@ The data generation step is executed via the `ilab data generate` command, and i
 1. Increase the number of instructions generated by passing the `--num-instructions` flag to the `ilab data generate` command as follows: `ilab data generate --num-instructions 1000`.
    The `--num-instructions` flag will generate 1000 points of synthetic data based on your provided examples. The greater the number of instructions generated, the better the model will be trained (within reasonable limits).
 
-3. Using a better model via `--model`. Larger models can lead to better data generation. This option requires users to be familiar with various existing models, and which specific models would suit their needs. This could mean either using a model with more nodes than the default InstructLab `merlinite-7b-lab` model, such as the `Mixtral-8x7B-Instruct-v0.1` model, or using an unquantized version of the InstructLab `merlinite-7b-lab` model. It can be used as follows: `ilab serve --model-path models/mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf` and `ilab data generate --model models/mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf`
+3. Using a better model via `--model`. Larger models can lead to better data generation. This option requires users to be familiar with various existing models, and which specific models would suit their needs. This could mean either using a model with more nodes than the default InstructLab `merlinite-7b-lab-GGUF` model, such as the `Mixtral-8x7B-Instruct-v0.1` model, or using an unquantized version of the InstructLab `merlinite-7b-lab` model. It can be used as follows: `ilab serve --model-path models/mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf` and `ilab data generate --model models/mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf`
 
 4. Set the number of CPU cores that can be used to generate data via `--num-cpus`. This defaults to 10, but increasing this value could potentially lead to better generated data. It can be used as follows: `ilab data generate --num-cpus 15`
 
diff --git a/src/instructlab/clickext.py b/src/instructlab/clickext.py
index 1c5640f887..65c04510ad 100644
--- a/src/instructlab/clickext.py
+++ b/src/instructlab/clickext.py
@@ -118,7 +118,7 @@ class ConfigOption(click.Option):
     Example:
         Options:
         --model-path PATH           Path to the model used during generation.
-                                    [default: models/merlinite-7b-lab-Q4_K_M.gguf;
+                                    [default: models/granite-7b-lab-Q4_K_M.gguf;
                                     config: 'serve.model_path']
     """
 
diff --git a/src/instructlab/configuration.py b/src/instructlab/configuration.py
index 3e353953e9..20c29df742 100644
--- a/src/instructlab/configuration.py
+++ b/src/instructlab/configuration.py
@@ -154,7 +154,7 @@ class _serve_vllm(BaseModel):
     llm_family: str = Field(
         default="",  # TODO: convert to None and use a pattern to validate
         description="Large Language Model Family",
-        examples=["merlinite", "granite"],
+        examples=["granite", "mixtral"],
     )
     max_startup_attempts: int | None = Field(
         default=120,
@@ -186,7 +186,7 @@ class _serve_llama_cpp(BaseModel):
     llm_family: str = Field(
         default="",  # TODO: convert to None and use a pattern to validate
         description="Large Language Model Family",
-        examples=["merlinite", "granite"],
+        examples=["granite", "mixtral"],
     )
 
 
diff --git a/src/instructlab/defaults.py b/src/instructlab/defaults.py
index 930ccc0bf8..f98412a9e3 100644
--- a/src/instructlab/defaults.py
+++ b/src/instructlab/defaults.py
@@ -11,12 +11,10 @@
 CONFIG_VERSION = "1.0.0"
 
 # Model families understood by ilab
-MODEL_FAMILIES = {"merlinite", "mixtral"}
+MODEL_FAMILIES = {"granite", "mixtral"}
 
 # Map model names to their family
-MODEL_FAMILY_MAPPINGS = {
-    "granite": "merlinite",
-}
+MODEL_FAMILY_MAPPINGS = {"merlinite": "granite", "mistral": "mixtral"}
 
 # Indentation constant
 DEFAULT_INDENT = "    "
@@ -57,10 +55,11 @@ class _InstructlabDefaults:
     ILAB_SYSTEM_PROFILE_DIR = "ILAB_SYSTEM_PROFILE_DIR"
 
     # TODO: Consolidate --model and --model-path into one --model-path flag since we always need a path now
-    MODEL_NAME_OLD = "merlinite-7b-lab-Q4_K_M"
+    GRANITE_GGUF_REPO = "instructlab/granite-7b-lab-GGUF"
     MERLINITE_GGUF_REPO = "instructlab/merlinite-7b-lab-GGUF"
     MISTRAL_GGUF_REPO = "TheBloke/Mistral-7B-Instruct-v0.2-GGUF"
-    GGUF_MODEL_NAME = "merlinite-7b-lab-Q4_K_M.gguf"
+    GRANITE_GGUF_MODEL_NAME = "granite-7b-lab-Q4_K_M.gguf"
+    MERLINITE_GGUF_MODEL_NAME = "merlinite-7b-lab-Q4_K_M.gguf"
     MISTRAL_GGUF_MODEL_NAME = "mistral-7b-instruct-v0.2.Q4_K_M.gguf"
     MODEL_REPO = "instructlab/granite-7b-lab"
     JUDGE_MODEL_MT = "prometheus-eval/prometheus-8x7b-v2.0"
@@ -77,7 +76,7 @@ class _InstructlabDefaults:
     SDG_SCALE_FACTOR = 30
 
     # When otherwise unknown, ilab uses this as the default family
-    MODEL_FAMILY = "merlinite"
+    MODEL_FAMILY = "granite"
     ADDITIONAL_ARGS_DEFAULTS = {
         "learning_rate": 2e-5,
         "warmup_steps": 25,
@@ -127,7 +126,7 @@ def MODELS_DIR(self) -> str:
 
     @property
     def DEFAULT_CHAT_MODEL(self) -> str:
-        return path.join(self.MODELS_DIR, self.GGUF_MODEL_NAME)
+        return path.join(self.MODELS_DIR, self.GRANITE_GGUF_MODEL_NAME)
 
     @property
     def DEFAULT_TEACHER_MODEL(self) -> str:
diff --git a/src/instructlab/model/backends/common.py b/src/instructlab/model/backends/common.py
index d8b642a97d..6b3f91fcc6 100644
--- a/src/instructlab/model/backends/common.py
+++ b/src/instructlab/model/backends/common.py
@@ -19,7 +19,7 @@
 VLLM = "vllm"
 templates = [
     {
-        "model": "merlinite",
+        "model": "granite",
         "template": "{% for message in messages %}\n{% if message['role'] == 'user' %}\n{{ '
\n' + message['content'] }}\n{% elif message['role'] == 'system' %}\n{{ '
\n' + message['content'] }}\n{% elif message['role'] == 'assistant' %}\n{{ '
\n' + message['content'] + eos_token }}\n{% endif %}\n{% if loop.last and add_generation_prompt %}\n{{ '
' }}\n{% endif %}\n{% endfor %}",
     },
     {
diff --git a/src/instructlab/model/chat.py b/src/instructlab/model/chat.py
index e56cab1d97..5802e5af21 100644
--- a/src/instructlab/model/chat.py
+++ b/src/instructlab/model/chat.py
@@ -260,9 +260,9 @@ def chat(
         if (
             # We need to get the base name of the model because the model path is a full path and
             # the once from the config is just the model name
-            os.path.basename(model) == cfg.DEFAULTS.GGUF_MODEL_NAME
+            os.path.basename(model) == cfg.DEFAULTS.GRANITE_GGUF_MODEL_NAME
             and os.path.basename(ctx.obj.config.chat.model)
-            == cfg.DEFAULTS.GGUF_MODEL_NAME
+            == cfg.DEFAULTS.GRANITE_GGUF_MODEL_NAME
             and api_base == ctx.obj.config.serve.api_base()
         ):
             logger.debug(
@@ -776,7 +776,7 @@ def chat_cli(
     for m in model_list:
         model_ids.append(m.id)
     if not any(model == m for m in model_ids):
-        if model == cfg.DEFAULTS.MODEL_NAME_OLD:
+        if model == "merlinite-7b-lab-Q4_K_M":
             logger.info(
                 f"Model {model} is not a full path. Try running ilab config init or edit your config to have the full model path for serving, chatting, and generation."
             )
diff --git a/src/instructlab/model/download.py b/src/instructlab/model/download.py
index 887260d9fc..780ea4bc3c 100644
--- a/src/instructlab/model/download.py
+++ b/src/instructlab/model/download.py
@@ -261,6 +261,7 @@ def download(self):
     "repositories",
     multiple=True,
     default=[
+        DEFAULTS.GRANITE_GGUF_REPO,
         DEFAULTS.MERLINITE_GGUF_REPO,
         DEFAULTS.MISTRAL_GGUF_REPO,
     ],  # TODO: add to config.yaml
@@ -275,6 +276,7 @@ def download(self):
     default=[
         "main",
         "main",
+        "main",
     ],  # TODO: add to config.yaml
     show_default=True,
     help="The revision of the model to download - e.g. a branch, tag, or commit hash for Hugging Face repositories and tag or commit hash for OCI repositories.",
@@ -283,7 +285,11 @@ def download(self):
     "--filename",
     "filenames",
     multiple=True,
-    default=[DEFAULTS.GGUF_MODEL_NAME, DEFAULTS.MISTRAL_GGUF_MODEL_NAME],
+    default=[
+        DEFAULTS.GRANITE_GGUF_MODEL_NAME,
+        DEFAULTS.MERLINITE_GGUF_MODEL_NAME,
+        DEFAULTS.MISTRAL_GGUF_MODEL_NAME,
+    ],
     show_default="The default model location in the instructlab data directory.",
     help="Name of the model file to download from the Hugging Face repository.",
 )
diff --git a/src/instructlab/profiles/apple/m1/m1_max.yaml b/src/instructlab/profiles/apple/m1/m1_max.yaml
index 6ab1e8be24..94a31d05d5 100644
--- a/src/instructlab/profiles/apple/m1/m1_max.yaml
+++ b/src/instructlab/profiles/apple/m1/m1_max.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -105,7 +105,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   # Directory where periodic training checkpoints are stored
   ckpt_output_dir: ~/.local/share/instructlab/checkpoints
diff --git a/src/instructlab/profiles/apple/m1/m1_ultra.yaml b/src/instructlab/profiles/apple/m1/m1_ultra.yaml
index 46696a9b84..5d85356d8a 100644
--- a/src/instructlab/profiles/apple/m1/m1_ultra.yaml
+++ b/src/instructlab/profiles/apple/m1/m1_ultra.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -105,7 +105,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   # Directory where periodic training checkpoints are stored
   ckpt_output_dir: ~/.local/share/instructlab/checkpoints
diff --git a/src/instructlab/profiles/apple/m2/m2.yaml b/src/instructlab/profiles/apple/m2/m2.yaml
index 1179369113..87a1d3c538 100644
--- a/src/instructlab/profiles/apple/m2/m2.yaml
+++ b/src/instructlab/profiles/apple/m2/m2.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -107,7 +107,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   pipeline: simple
   # Directory where periodic training checkpoints are stored
diff --git a/src/instructlab/profiles/apple/m2/m2_max.yaml b/src/instructlab/profiles/apple/m2/m2_max.yaml
index 7e20468c4f..e6e9fab85b 100644
--- a/src/instructlab/profiles/apple/m2/m2_max.yaml
+++ b/src/instructlab/profiles/apple/m2/m2_max.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -105,7 +105,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   # Directory where periodic training checkpoints are stored
   ckpt_output_dir: ~/.local/share/instructlab/checkpoints
diff --git a/src/instructlab/profiles/apple/m2/m2_pro.yaml b/src/instructlab/profiles/apple/m2/m2_pro.yaml
index 222f87a10f..09a1a8cc2f 100644
--- a/src/instructlab/profiles/apple/m2/m2_pro.yaml
+++ b/src/instructlab/profiles/apple/m2/m2_pro.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -105,7 +105,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   pipeline: simple
   # Directory where periodic training checkpoints are stored
diff --git a/src/instructlab/profiles/apple/m2/m2_ultra.yaml b/src/instructlab/profiles/apple/m2/m2_ultra.yaml
index 4d90d6dda8..52111a69ea 100644
--- a/src/instructlab/profiles/apple/m2/m2_ultra.yaml
+++ b/src/instructlab/profiles/apple/m2/m2_ultra.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -105,7 +105,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   # Directory where periodic training checkpoints are stored
   ckpt_output_dir: ~/.local/share/instructlab/checkpoints
diff --git a/src/instructlab/profiles/apple/m3/m3.yaml b/src/instructlab/profiles/apple/m3/m3.yaml
index 222f87a10f..09a1a8cc2f 100644
--- a/src/instructlab/profiles/apple/m3/m3.yaml
+++ b/src/instructlab/profiles/apple/m3/m3.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -105,7 +105,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   pipeline: simple
   # Directory where periodic training checkpoints are stored
diff --git a/src/instructlab/profiles/apple/m3/m3_max.yaml b/src/instructlab/profiles/apple/m3/m3_max.yaml
index cfe662c944..87ddbc1ceb 100644
--- a/src/instructlab/profiles/apple/m3/m3_max.yaml
+++ b/src/instructlab/profiles/apple/m3/m3_max.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -107,7 +107,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   # Directory where periodic training checkpoints are stored
   ckpt_output_dir: ~/.local/share/instructlab/checkpoints
diff --git a/src/instructlab/profiles/apple/m3/m3_pro.yaml b/src/instructlab/profiles/apple/m3/m3_pro.yaml
index 1179369113..87a1d3c538 100644
--- a/src/instructlab/profiles/apple/m3/m3_pro.yaml
+++ b/src/instructlab/profiles/apple/m3/m3_pro.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -107,7 +107,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   pipeline: simple
   # Directory where periodic training checkpoints are stored
diff --git a/src/instructlab/profiles/intel/cpu.yaml b/src/instructlab/profiles/intel/cpu.yaml
index 9968efa22b..8191b75545 100644
--- a/src/instructlab/profiles/intel/cpu.yaml
+++ b/src/instructlab/profiles/intel/cpu.yaml
@@ -7,7 +7,7 @@ chat:
   # The maximum number of tokens that can be generated in the chat completion
   max_tokens: null
   # Directory where model to be used for chatting with is stored
-  model: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   session: null
   # visual mode
   vi_mode: false
@@ -92,7 +92,7 @@ serve:
     # maximum number of tokens that can be processed by the model
     max_ctx_size: 4096
   # Path to model that will be served for inference
-  model_path: ~/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  model_path: ~/.cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
 train:
   # Directory where periodic training checkpoints are stored
   ckpt_output_dir: ~/.local/share/instructlab/checkpoints
diff --git a/src/instructlab/train/lora_mlx/utils.py b/src/instructlab/train/lora_mlx/utils.py
index d5534e44bc..a4624f682e 100644
--- a/src/instructlab/train/lora_mlx/utils.py
+++ b/src/instructlab/train/lora_mlx/utils.py
@@ -56,7 +56,7 @@ def fetch_from_hub(hf_path: str, local: bool):
             repo_id=hf_path,
             local_dir=hf_path.replace(
                 "/", "-"
-            ),  # "instructlab/merlinite-7b-lab" to "instructlab-merlinite-7b-lab"
+            ),  # e.g. "instructlab/granite-7b-lab" to "instructlab-granite-7b-lab"
             allow_patterns=["*.json", "*.safetensors", "tokenizer.model"],
         )
 


Test patch:
diff --git a/scripts/functional-tests.sh b/scripts/functional-tests.sh
index f56e2cfac5..e73a3315e3 100755
--- a/scripts/functional-tests.sh
+++ b/scripts/functional-tests.sh
@@ -66,7 +66,7 @@ cleanup() {
     rm -rf test_taxonomy
 
     # revert model name change from test_model_print()
-    local original_model_filename="merlinite-7b-lab-Q4_K_M.gguf"
+    local original_model_filename="granite-7b-lab-Q4_K_M.gguf"
     local temporary_model_filename='foo.gguf'
     mv "${ILAB_CACHE_DIR}/models/${temporary_model_filename}" "${ILAB_CACHE_DIR}/models/${original_model_filename}" || true
     rm -f "${ILAB_CONFIG_FILE}.bak" serve.log "${ILAB_CACHE_DIR}/models/${temporary_model_filename}" chat.log
@@ -337,7 +337,7 @@ EOF
     sed -i.bak -e 's/sdg_scale_factor.*/sdg_scale_factor: 1/g' "${ILAB_CONFIG_FILE}"
 
     # This should be finished in a minute or so but time it out incase it goes wrong
-    if ! timeout 20m ilab data generate --pipeline simple --model "${ILAB_CACHE_DIR}/models/merlinite-7b-lab-Q4_K_M.gguf"  --taxonomy-path test_taxonomy/compositional_skills/qna.yaml; then
+    if ! timeout 20m ilab data generate --pipeline simple --model "${ILAB_CACHE_DIR}/models/granite-7b-lab-Q4_K_M.gguf"  --taxonomy-path test_taxonomy/compositional_skills/qna.yaml; then
         echo "Error: ilab data generate command took more than 20 minutes and was cancelled"
         exit 1
     fi
@@ -356,10 +356,10 @@ test_model_train() {
     # TODO: call `ilab model train`
     if [[ "$(uname)" == Linux ]]; then
         # real `ilab model train` on Linux produces models/ggml-model-f16.gguf
-        # fake gml-model-f16.gguf the same as merlinite-7b-lab-Q4_K_M.gguf
+        # fake gml-model-f16.gguf the same as granite-7b-lab-Q4_K_M.gguf
         checkpoints_dir="${ILAB_DATA_DIR}/checkpoints/ggml-model-f16.gguf"
         test -f "${checkpoints_dir}" || \
-            ln -s "${ILAB_CACHE_DIR}/models/merlinite-7b-lab-Q4_K_M.gguf" "${checkpoints_dir}"
+            ln -s "${ILAB_CACHE_DIR}/models/granite-7b-lab-Q4_K_M.gguf" "${checkpoints_dir}"
     fi
 }
 
@@ -370,7 +370,7 @@ test_model_test() {
         timeout 20m ilab model test > model_test.out
         cat model_test.out
         grep -q '### what is 1+1' model_test.out
-        grep -q 'merlinite-7b-lab-Q4_K_M.gguf: The sum of 1 and 1 is indeed 2' model_test.out
+        grep -q 'granite-7b-lab-Q4_K_M.gguf: The sum of 1 + 1 is indeed 2' model_test.out
     fi
 }
 
@@ -464,7 +464,7 @@ test_log_format(){
 }
 
 test_model_print(){
-    local src_model="${ILAB_CACHE_DIR}/models/merlinite-7b-lab-Q4_K_M.gguf"
+    local src_model="${ILAB_CACHE_DIR}/models/granite-7b-lab-Q4_K_M.gguf"
     local target_model="${ILAB_CACHE_DIR}/models/foo.gguf"
     cp "${src_model}" "${target_model}"
     ilab model serve --model-path "${target_model}" &
diff --git a/tests/test_config.py b/tests/test_config.py
index 83b56a39ca..566a53ca23 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -30,7 +30,7 @@ def _assert_defaults(self, cfg: config.Config):
         internal_dirname = "internal"
         cache_dir = os.path.join(xdg_cache_home(), package_name)
         data_dir = os.path.join(xdg_data_home(), package_name)
-        default_chat_model = f"{cache_dir}/models/merlinite-7b-lab-Q4_K_M.gguf"
+        default_chat_model = f"{cache_dir}/models/granite-7b-lab-Q4_K_M.gguf"
         default_sdg_model = f"{cache_dir}/models/mistral-7b-instruct-v0.2.Q4_K_M.gguf"
 
         assert cfg.general is not None
@@ -90,7 +90,7 @@ def _assert_defaults(self, cfg: config.Config):
     def _assert_model_defaults(self, cfg):
         package_name = "instructlab"
         cache_dir = os.path.join(xdg_cache_home(), package_name)
-        default_chat_model = f"{cache_dir}/models/merlinite-7b-lab-Q4_K_M.gguf"
+        default_chat_model = f"{cache_dir}/models/granite-7b-lab-Q4_K_M.gguf"
 
         assert cfg.chat is not None
         assert cfg.chat.model == default_chat_model
@@ -225,14 +225,16 @@ def test_validate_log_format_invalid(self):
     def test_get_model_family(self):
         good_cases = {
             # two known families
-            "merlinite": "merlinite",
+            "granite": "granite",
             "mixtral": "mixtral",
             # case insensitive
-            "MERLINiTe": "merlinite",
-            # mapping granite to merlinite
-            "granite": "merlinite",
+            "GrANiTe": "granite",
+            # mapping merlinite to granite
+            "merlinite": "granite",
+            # mapping mistral to mixtral
+            "mistral": "mixtral",
             # default empty value of model_family will use name of model in model path to guess model_family
-            "": "merlinite",
+            "": "granite",
         }
         bad_cases = [
             # unknown family
diff --git a/tests/test_lab_download.py b/tests/test_lab_download.py
index 4db2defa0d..a721b3df52 100644
--- a/tests/test_lab_download.py
+++ b/tests/test_lab_download.py
@@ -30,7 +30,7 @@ def test_download(self, mock_hf_hub_download, cli_runner: CliRunner):
         assert (
             result.exit_code == 0
         ), f"command finished with an unexpected exit code. {result.stdout}"
-        assert mock_hf_hub_download.call_count == 2
+        assert mock_hf_hub_download.call_count == 3
 
     @patch(
         "instructlab.model.download.hf_hub_download",
diff --git a/tests/testdata/default_config.yaml b/tests/testdata/default_config.yaml
index 3dd0bd170c..b1299036f8 100644
--- a/tests/testdata/default_config.yaml
+++ b/tests/testdata/default_config.yaml
@@ -17,8 +17,8 @@ chat:
   # Default: None
   max_tokens:
   # Model to be used for chatting with.
-  # Default: /cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
-  model: /cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  # Default: /cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
+  model: /cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   # Filepath of a dialog session file.
   # Default: None
   session:
@@ -154,14 +154,14 @@ generate:
       # Large Language Model Family
       # Default: ''
       # Examples:
-      #   - merlinite
       #   - granite
+      #   - mixtral
       llm_family: ''
       # Maximum number of tokens that can be processed by the model.
       # Default: 4096
       max_ctx_size: 4096
     # Directory where model to be served is stored.
-    # Default: /cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+    # Default: /cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
     model_path: /cache/instructlab/models/mistral-7b-instruct-v0.2.Q4_K_M.gguf
     # vLLM serving settings.
     vllm:
@@ -171,8 +171,8 @@ generate:
       # Large Language Model Family
       # Default: ''
       # Examples:
-      #   - merlinite
       #   - granite
+      #   - mixtral
       llm_family: ''
       # Maximum number of attempts to start the vLLM server.
       # Default: 120
@@ -211,15 +211,15 @@ serve:
     # Large Language Model Family
     # Default: ''
     # Examples:
-    #   - merlinite
     #   - granite
+    #   - mixtral
     llm_family: ''
     # Maximum number of tokens that can be processed by the model.
     # Default: 4096
     max_ctx_size: 4096
   # Directory where model to be served is stored.
-  # Default: /cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
-  model_path: /cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
+  # Default: /cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
+  model_path: /cache/instructlab/models/granite-7b-lab-Q4_K_M.gguf
   # vLLM serving settings.
   vllm:
     # Number of GPUs to use.
@@ -228,8 +228,8 @@ serve:
     # Large Language Model Family
     # Default: ''
     # Examples:
-    #   - merlinite
     #   - granite
+    #   - mixtral
     llm_family: ''
     # Maximum number of attempts to start the vLLM server.
     # Default: 120