Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
698c6b8
LP on Gemma 4 LiteRT and SME2
annietllnd Mar 6, 2026
a4e6516
Improvement - Performix install guide based on DGX Spark local GUI te…
Apr 10, 2026
2d579b8
removed accidental line
kieranhejmadi01 Apr 10, 2026
a537504
Adding Arm AI Chat library simple Android chatbot learning path.
BmanClark Apr 15, 2026
76eed98
Merge branch 'ArmDeveloperEcosystem:main' into main
BmanClark Apr 15, 2026
11cff1c
azure lift and shift migration of mysql
DougAnsonAustinTX Apr 15, 2026
f07f675
Deploy OpenStack on Azure Cobalt 100 Arm64 Virtual Machine
odidev Apr 15, 2026
d64e20e
"Beginner" needs to be "Introductory"
BmanClark Apr 16, 2026
8284635
improved wording after review
BmanClark Apr 17, 2026
6906234
Technical review of Voice Sentiment with LLM
annietllnd Apr 17, 2026
b84cb3e
Add descriptions to learning paths for improved clarity
madeline-underwood Apr 19, 2026
6e84045
Add descriptions to learning paths for improved clarity and context
madeline-underwood Apr 19, 2026
4dae1cb
Add descriptions to various learning paths for improved clarity
madeline-underwood Apr 19, 2026
4d7b057
Add a newline for improved formatting in AKS learning path index
madeline-underwood Apr 19, 2026
bd11028
Fix formatting by adding tags section for skill level in Linux kernel…
madeline-underwood Apr 19, 2026
1980dbb
Add device-connect-d2d learning path
kavya-chennoju Apr 20, 2026
a5537a8
Refine 2_mnn_build.md setup flow for model download verification
odinshen-git Apr 20, 2026
ae0d4c1
changed ADP login link as per new login flow to align with broader de…
Apr 20, 2026
c7f1cd5
Merge pull request #3182 from zachlasiuk/main
jasonrandrews Apr 20, 2026
eb1b5d5
Merge pull request #3179 from madeline-underwood/serv1
jasonrandrews Apr 20, 2026
c0cf350
removing draft flag from Flatpak LP
anupras-mohapatra-arm Apr 20, 2026
401adcc
Merge branch 'ArmDeveloperEcosystem:main' into main
anupras-mohapatra-arm Apr 20, 2026
3258269
Add descriptions to various learning paths for improved clarity and c…
madeline-underwood Apr 20, 2026
4f966e0
Merge pull request #3184 from anupras-mohapatra-arm/main
jasonrandrews Apr 20, 2026
d8d8226
New LP on UE Data Capture Plugin
annietllnd Mar 31, 2026
8bdbaec
OpenRNG with Performix tech review
jasonrandrews Apr 20, 2026
3720daa
Merge pull request #3187 from jasonrandrews/review2
jasonrandrews Apr 20, 2026
995344d
Technical review of Android AI Chat LP
annietllnd Apr 20, 2026
ea3f8ba
Merge pull request #3169 from BmanClark/main
jasonrandrews Apr 20, 2026
d3f0728
Merge branch 'ArmDeveloperEcosystem:main' into BmanClark/main
annietllnd Apr 20, 2026
2fecf4e
Add draft status
annietllnd Apr 20, 2026
4c1d95c
remove imports
annietllnd Apr 20, 2026
8909ef8
Merge pull request #3188 from annietllnd/BmanClark/main
jasonrandrews Apr 20, 2026
4c56fba
Merge pull request #3148 from kieranhejmadi01/performix-install-guide…
jasonrandrews Apr 20, 2026
2c0a6fe
fix - updated links to use new name for prompt file
kieranhejmadi01 Apr 21, 2026
201441c
Merge pull request #3189 from kieranhejmadi01/fix/prompt-file-name-ch…
jasonrandrews Apr 21, 2026
6b49f89
first pass edits on OpenRNG LP
anupras-mohapatra-arm Apr 21, 2026
2449427
minor edits
anupras-mohapatra-arm Apr 21, 2026
fc9c23c
attempting to clarify benchmark sweep command
anupras-mohapatra-arm Apr 21, 2026
08eca89
some adjustments to alt text based on instructions
anupras-mohapatra-arm Apr 21, 2026
8277d64
nit
anupras-mohapatra-arm Apr 21, 2026
f8055fb
nits
anupras-mohapatra-arm Apr 21, 2026
b5665fc
Merge pull request #3185 from madeline-underwood/serv2
jasonrandrews Apr 21, 2026
77b717a
some updates to steps for running hotspots recipe
anupras-mohapatra-arm Apr 21, 2026
93e8d01
Merge branch 'ArmDeveloperEcosystem:main' into servers-and-cloud-comp…
anupras-mohapatra-arm Apr 21, 2026
94509f3
ec2
anupras-mohapatra-arm Apr 21, 2026
3d4efcd
revert
anupras-mohapatra-arm Apr 21, 2026
5f9d299
another slate of updates to OpenRNG + fixing duplicate metadata in Mo…
anupras-mohapatra-arm Apr 21, 2026
dbb1206
edit
anupras-mohapatra-arm Apr 21, 2026
ff32a54
edit to intro
anupras-mohapatra-arm Apr 21, 2026
f23a65f
Add draft mode
annietllnd Apr 21, 2026
8138393
Merge pull request #3191 from annietllnd/gemma-4
jasonrandrews Apr 22, 2026
1b2b07d
Removed duplicate "who_is_this_for" - causes an issue when using hugo…
matt-cossins Apr 22, 2026
550c81b
Updated link to ADP
zachlasiuk Apr 22, 2026
2d95904
Merge pull request #3195 from zachlasiuk/main
jasonrandrews Apr 22, 2026
0debbb3
Merge pull request #3194 from matt-cossins/mongo-db-fix
jasonrandrews Apr 22, 2026
27a93a3
Merge pull request #3181 from odincodeshen/v9_mnn
pareenaverma Apr 22, 2026
a4887b4
updates
anupras-mohapatra-arm Apr 22, 2026
da99f2a
Merge branch 'ArmDeveloperEcosystem:main' into servers-and-cloud-comp…
anupras-mohapatra-arm Apr 22, 2026
a3c7776
Merge pull request #3170 from DougAnsonAustinTX/azure-lns-mysql-migra…
jasonrandrews Apr 22, 2026
9d1dced
Refactor Android AI Chat library documentation for clarity and consis…
madeline-underwood Apr 22, 2026
209decf
Update documentation to clarify app initialization process in MainAct…
madeline-underwood Apr 22, 2026
a4abd5c
Add section headers for clarity in AI Chat library documentation
madeline-underwood Apr 22, 2026
d69e926
Set draft status for Device Connect topic
pareenaverma Apr 22, 2026
4f63fd9
Merge pull request #3180 from kavya-chennoju/device-connect-d2d-lp
pareenaverma Apr 22, 2026
64db4b6
Technical review of Device Connect D2D LP
annietllnd Apr 22, 2026
8edf64e
Fix tabpane formatting
annietllnd Apr 22, 2026
3094fe7
Update _index.md
pareenaverma Apr 23, 2026
c5f2078
Merge pull request #3174 from odidev/openstack
pareenaverma Apr 23, 2026
834151f
First pass at MNN LP tech review
pareenaverma Apr 23, 2026
f2b6306
Update prerequisites in multimodel_mnn_v9 index
pareenaverma Apr 23, 2026
1532aec
Merge pull request #3201 from pareenaverma/content_review
pareenaverma Apr 23, 2026
ff0647d
[mnn v9] Updated the audio links and clarified the flow in Section 5.
odinshen-git Apr 23, 2026
46f19b3
Merge pull request #3196 from anupras-mohapatra-arm/servers-and-cloud…
jasonrandrews Apr 23, 2026
55c44d4
Merge pull request #3197 from madeline-underwood/aich
jasonrandrews Apr 23, 2026
8bd343d
Tech review of Openstack LP
pareenaverma Apr 23, 2026
3e2e83e
Merge pull request #3204 from pareenaverma/content_review
pareenaverma Apr 23, 2026
89c61ba
Merge pull request #3203 from odincodeshen/v9_mnn
pareenaverma Apr 23, 2026
2fb946f
MNN Tech review
pareenaverma Apr 24, 2026
ebe0844
Merge pull request #3206 from pareenaverma/content_review
pareenaverma Apr 24, 2026
d76e4a8
Merge pull request #3198 from annietllnd/review
pareenaverma Apr 24, 2026
4cf46a4
Maddy's review changes for Data Capture Plugin
annietllnd Apr 24, 2026
6d565ed
Add upstream repository
annietllnd Apr 24, 2026
bed275c
Add pre-built alternative and _next-steps.md
annietllnd Apr 24, 2026
d6cb4cd
Merge pull request #3177 from annietllnd/main
pareenaverma Apr 24, 2026
1dc4c20
Merge pull request #3208 from annietllnd/data-capture-ue
pareenaverma Apr 24, 2026
83870d7
Enhance documentation for MNN multimodal inference on Armv9
madeline-underwood Apr 24, 2026
97a703e
Refactor section headings for clarity in MNN multimodal inference doc…
madeline-underwood Apr 24, 2026
0285f5e
Enhance documentation for MNN multimodal inference: clarify learning …
madeline-underwood Apr 24, 2026
7d59a60
Refactor notice formatting for clarity in MNN documentation
madeline-underwood Apr 24, 2026
52a551a
Correct capitalization for consistency in Learning Path documentation
madeline-underwood Apr 24, 2026
8f6e7fc
Enhance multimodal inference documentation: clarify workflow completi…
madeline-underwood Apr 24, 2026
c8de591
Fix formatting of completion checklist in MNN multimodal inference do…
madeline-underwood Apr 24, 2026
2ec2677
Update 6_mnn_restock_ticket.md
madeline-underwood Apr 24, 2026
1500394
Update 6_mnn_restock_ticket.md
madeline-underwood Apr 24, 2026
66b7b3a
Update documentation for Device Connect and Strands integration
madeline-underwood Apr 24, 2026
f6b3b3a
Remove draft status from Device-to-Device communication documentation
madeline-underwood Apr 24, 2026
83e865d
Update titles for run example and setup documentation
madeline-underwood Apr 24, 2026
37def00
Update section title for device discovery and control examples
madeline-underwood Apr 24, 2026
f44a764
Merge pull request #3211 from madeline-underwood/device
jasonrandrews Apr 24, 2026
aff9ed2
Merge pull request #3210 from madeline-underwood/v9
jasonrandrews Apr 24, 2026
6c6ae30
spelling list updated
jasonrandrews Apr 25, 2026
c498e0d
Merge pull request #3212 from jasonrandrews/review2
jasonrandrews Apr 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
789 changes: 415 additions & 374 deletions .wordlist.txt

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 0 additions & 1 deletion content/install-guides/flatpak.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ official_docs: "https://docs.flatpak.org/en/latest/"
author: "Jason Andrews"
description: "Install Flatpak on Arm Linux, add the Flathub remote, and verify the setup by installing and running a native aarch64 application."
weight: 1
draft: true
tool_install: true
layout: installtoolsall
multi_install: false
Expand Down
15 changes: 14 additions & 1 deletion content/install-guides/performix.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ On the target system, edit the sudoers file:
sudo visudo
```

Add the following line, replacing `<username>` with your actual username:
Add the following line, replacing `<username>` with your actual username. Insert it after any existing entries for that user or their groups, since rules in the sudoers file are applied in order and later entries take precedence.

```bash
<username> ALL=(ALL) NOPASSWD:ALL
Expand Down Expand Up @@ -287,6 +287,19 @@ Select **Add** to save the jump node.

You can add multiple jump nodes. The order matters—your connection uses them in sequence. Use drag and drop to reorder jump nodes.

#### Connect using the Arm Performix GUI to a local machine

Performix already includes a built-in `localhost` target through the CLI. However, as of Performix 2026.01, this target is not exposed in the GUI. If you prefer the command line, you can run recipes directly without configuring the target through the GUI. [Skip to the profile the local machine section](#profile-the-local-machine) below.

If you want to target your local machine conveniently through the GUI, use `localhost` in place of `target_host` and select **Username and password** as the authentication method, as shown in the following image. Make sure passwordless `sudo` is enabled for your user account.


![Arm Performix GUI showing the Configure Target form for a local connection using 'localhost', including Host set to localhost, Name field for a custom label, Port set to 22, User set to the local username, authentication set to Username and password, and Host Key Verification options#center](/install-guides/_images/connect-via-local-host.png "Configure local target using localhost in Arm Performix GUI")

Enter the password for your user when prompted

![Arm Performix GUI displaying a password prompt dialog requesting the user's system password for authentication, including a password input field, confirmation button, and context indicating connection to a localhost target#center](/install-guides/_images/performix-add-passwrd.png "Enter user password for localhost authentication in Arm Performix")

### Connect using the Arm Performix CLI

The CLI is useful for Linux hosts or when you prefer command-line workflows.
Expand Down
30 changes: 17 additions & 13 deletions content/learning-paths/cross-platform/multimodel_mnn_v9/1_mnn_v9.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,26 @@ layout: learningpathall
weight: 2
---

## Introduction
## Understand MNN and multimodal inference on Armv9

This section introduces the software stack used throughout this Learning Path. You will use **[MNN](https://github.com/alibaba/MNN)** to run a prebuilt **Omni multimodal model** on an Armv9 Linux system using only the CPU.
This section introduces the software stack used throughout this Learning Path. You will use **[MNN](https://github.com/alibaba/MNN)** (Mobile Neural Network), a lightweight inference engine, to run a prebuilt **Omni multimodal model** on an Armv9 Linux system using only the CPU.

By the end of this section, you will understand why this combination is a practical starting point for reproducible multimodal inference on Armv9, and use retail restocking workflow as an example combines local image and audio inputs use case.
By the end of this section, you'll understand why this combination is a practical starting point for reproducible multimodal inference on Armv9. A retail restocking workflow that combines local image and audio inputs is used as the example throughout.

## Why use MNN on Armv9

MNN is a lightweight inference engine designed for deployment across mobile, embedded, and edge platforms. It is a good fit for this Learning Path for four reasons:
MNN is a lightweight inference engine designed for deployment across mobile, embedded, and edge platforms. It's a good fit for this Learning Path for four reasons:

- It provides a **portable runtime** that can be built and reused across different eevice classes.
- It supports a **CPU-first deployment flow**, which is useful when you want to validate multimodal inference on Armv9 without depending on a discrete GPU or dedicated accelerator.
- Native builds can take advantage of **Armv9-specific CPU features and optimizations** when they are enabled in the build, making this a practical path for efficient local inference.
- The same runtime approach can be reused across **Arm Linux, Android, iOS, and x86-based development hosts**, which improves portability from development to deployment.
- Provides a **portable runtime** that can be built and reused across different device classes
- Supports a **CPU-first deployment flow**, useful when you want to validate multimodal inference on Armv9 without depending on a discrete GPU or dedicated accelerator
- Native builds take advantage of **Armv9-specific CPU features and optimizations** when enabled in the build, making this a practical path for efficient local inference
- The same runtime approach can be reused across **Arm Linux, Android, iOS, and x86-based development hosts**, improving portability from development to deployment

For this Learning Path, MNN gives you a practical way to build a reproducible multimodal inference workflow on Armv9 while keeping the software stack compact and deployment-oriented.

A retail restocking workflow is also a good use case example for Arm because it benefits from local CPU execution, simple deployment, and the ability to process store inputs close to where they are captured.

## Why use an Omni multimodal model

An Omni model combines **text, image, and audio** understanding in a single inference pipeline. This makes it useful for building compact edge applications that need to reason over more than one input type.
An Omni model combines **text, image, and audio** understanding in a single inference pipeline, making it useful for building compact edge applications that need to reason over more than one input type.

In this Learning Path, you use the model to:

Expand All @@ -51,6 +49,12 @@ To keep the workflow reproducible, this Learning Path uses a deliberately narrow

This scope keeps the focus on setup, validation, and multimodal application flow.

## Next steps
## What you've learned and what's next

In this section, you learned:

- Why MNN is a practical inference engine for multimodal workflows on Armv9
- How an Omni model combines text, image, and audio understanding in one pipeline
- The deliberate scope choices that keep this Learning Path reproducible and focused on CPU-first inference

In the next section, you will build MNN on Armv9 and prepare the model files and local assets used in the remaining examples.
In the next section, you'll build MNN natively on Armv9 and prepare the model files and local assets used in the remaining examples.
115 changes: 69 additions & 46 deletions content/learning-paths/cross-platform/multimodel_mnn_v9/2_mnn_build.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,18 @@ weight: 3
layout: learningpathall
---

## Introduction
## Build MNN for Armv9 multimodal inference

In this module you will build **MNN** natively on your Arm v9 Linux system and verify that the `llm_demo` binary can load a **prebuilt Omni MNN model package**. This sets up everything needed for the text, vision, and audio demos in later modules.
In this section, you'll build **MNN** natively on your Armv9 Linux system and verify that the `llm_demo` binary can load a prebuilt Omni MNN model package. This sets up everything needed for the text, vision, and audio demos in later sections.

This module uses a native **CPU-only** MNN build on Armv9. That is a deliberate design choice, not a fallback. The goal is to show how a compact, reproducible, deployment-friendly software stack can run directly on an Armv9 CPU without depending on a discrete GPU or separate accelerator.
This section uses a native CPU-only MNN build on Armv9 a deliberate design choice, not a fallback. The goal is to show how a compact, reproducible, deployment-friendly software stack can run directly on an Armv9 CPU without depending on a discrete GPU or separate accelerator.

At the end of this module, you will have:
At the end of this section, you'll have:

- a working `llm_demo` binary
- a validated model directory that includes `config.json`
- a runtime environment that resolves the correct MNN shared libraries
- the required Omni model files available locally

## Create a workspace

Expand All @@ -25,13 +26,13 @@ mkdir -p ~/mnn
cd ~/mnn
```

## Why build natively on Armv9 first
## Why build natively on Armv9

This Learning Path uses a native build on the target Armv9 system before introducing any cross-compilation workflow. Building directly on the target helps reduce environment drift, makes library and toolchain issues easier to diagnose, and lets you validate the runtime in the same environment where you will execute the model.
Building, running inference, and deploying all happen directly on the Armv9 device. There's no cross-compilation involved. This keeps the toolchain simple, eliminates environment drift between build and target, and means any library or configuration issue you encounter is the same one you'd hit in production.

A native-first approach also makes it easier to confirm that the final binary, shared libraries, and model assets work together correctly on the Armv9 platform. For a reproducible Learning Path, this is usually the fastest way to get to a working baseline before optimizing or automating the workflow further.
Building on the target also makes it straightforward to confirm that the binary, shared libraries, and model assets all resolve correctly in the same environment where you will run the model.

## Build MNN natively on Armv9
## Build MNN

Clone the MNN repository:

Expand All @@ -40,14 +41,22 @@ git clone https://github.com/alibaba/MNN.git
cd MNN
```

Configure and build MNN with LLM, audio, and Omni support enabled:
Install the required build dependencies:

```bash
sudo apt update
sudo apt install -y build-essential gcc g++ cmake
```

Configure and build MNN with LLM, audio, and Omni support enabled:

rm -rf build
```bash
mkdir build && cd build
```

```bash
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DMNN_BUILD_SHARED=ON \
-DMNN_BUILD_LLM=ON \
-DMNN_BUILD_AUDIO=ON \
Expand Down Expand Up @@ -84,11 +93,17 @@ If your system already has another MNN installation, `llm_demo` can load a diffe
From the build directory, inspect the runtime dependencies:

```bash
cd ~/mnn/MNN/build
ldd ./llm_demo | grep -E "libMNN|Express|Audio|OpenCV" || true
```

You should see `libMNN.so` and `libMNN_Express.so` resolving from the `~/mnn/MNN/build` tree.
You should see `libMNN.so` and `libMNN_Express.so` resolving from the `~/mnn/MNN/build` tree. A correct result looks similar to:

```text
libMNNAudio.so => /home/radxa/mnn/MNN/build/tools/audio/libMNNAudio.so (0x0000ffffb6d00000)
libMNN_Express.so => /home/radxa/mnn/MNN/build/express/libMNN_Express.so (0x0000ffffb6c00000)
libMNN.so => /home/radxa/mnn/MNN/build/libMNN.so (0x0000ffffb6600000)
libMNNOpenCV.so => /home/radxa/mnn/MNN/build/tools/cv/libMNNOpenCV.so (0x0000ffffb61a0000)
```

An incorrect result looks like this, where `libMNN.so` is loaded from another location:

Expand All @@ -105,66 +120,74 @@ If `libMNN.so` resolves from a different directory, update `LD_LIBRARY_PATH` to
export LD_LIBRARY_PATH=$HOME/mnn/MNN/build:$HOME/mnn/MNN/build/express:$HOME/mnn/MNN/build/tools/audio:$HOME/mnn/MNN/build/tools/cv:${LD_LIBRARY_PATH:-}
```

To make this setting persistent across terminal sessions, add it to your shell profile:

```bash
echo 'export LD_LIBRARY_PATH=$HOME/mnn/MNN/build:$HOME/mnn/MNN/build/express:$HOME/mnn/MNN/build/tools/audio:$HOME/mnn/MNN/build/tools/cv:${LD_LIBRARY_PATH:-}' >> ~/.bashrc
source ~/.bashrc
```

Run the check again:

```bash
ldd ./llm_demo | grep -E "libMNN|Express|Audio|OpenCV" || true
```

## Download a prebuilt Omni model package
## Download the prebuilt Omni model package

This learning path uses a prebuilt [Omni model package](https://huggingface.co/taobao-mnn/Qwen2.5-Omni-7B-MNN) that is already in MNN deployable format.
This Learning Path uses a prebuilt [Omni model package](https://www.modelscope.cn/MNN/Qwen2.5-Omni-7B-MNN) that is already prepared for MNN deployment. The full package is approximately 15 GB, so ensure you have sufficient disk space and a stable internet connection before cloning.

Clone the model into your workspace:
Clone the model repository into your workspace:

```bash
cd ~/mnn
git clone https://www.modelscope.cn/MNN/Qwen2.5-Omni-7B-MNN.git
cd ~/mnn/Qwen2.5-Omni-7B-MNN
```

Verify that the package includes `config.json`:
## Download the model weights

After cloning, install Git LFS and pull the large model files:

```bash
cat ~/mnn/Qwen2.5-Omni-7B-MNN/config.json
```

A valid configuration looks similar to:

```json
{
"llm_model": "llm.mnn",
"llm_weight": "llm.mnn.weight",
"backend_type": "cpu",
"thread_num": 4,
"precision": "low",
"memory": "low",
"system_prompt": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech.",
"talker_max_new_tokens": 2048,
"talker_speaker": "Chelsie",
"dit_steps": 5,
"dit_solver": 1,
"mllm": {
"backend_type": "cpu",
"thread_num": 4,
"precision": "normal",
"memory": "low"
}
}
sudo apt-get install -y git-lfs
git lfs install
cd ~/mnn/Qwen2.5-Omni-7B-MNN
git lfs pull
```

{{% notice Note %}}
This package is already prepared for MNN deployment.

You do not need to export the model from PyTorch or run additional quantization steps before using it in this learning path.
The full model weights are approximately 15 GB. Downloading can take a while depending on your network connection.
{{% /notice %}}

Verify that the main model files are present and several gigabytes in size:

```bash
ls -lh ~/mnn/Qwen2.5-Omni-7B-MNN/llm.mnn ~/mnn/Qwen2.5-Omni-7B-MNN/llm.mnn.weight
```

If either file is only a few hundred bytes, the LFS download did not complete. Run `git lfs pull` again to resume it.

{{% notice Note %}}This package is already prepared for MNN deployment. You do not need to export the model from PyTorch or run additional quantization steps before using it in this Learning Path.{{% /notice %}}

## Check your setup

Start `llm_demo` with the model configuration:
Run `llm_demo` with the model configuration to verify the binary loads correctly:

```bash
cd ~/mnn/MNN/build
./llm_demo ~/mnn/Qwen2.5-Omni-7B-MNN/config.json
```

If the binary starts without `undefined symbol` errors or missing library messages, your environment is ready for the next module.
The binary starts an interactive session. Type `exit` or press Ctrl+C to quit. If the binary loads without `undefined symbol` errors or missing library messages, your environment is ready for the next section.

## What you've learned and what's next

In this section, you:

- Built MNN natively on Armv9 with multimodal and KleidiAI support enabled
- Verified that shared libraries resolve correctly to avoid runtime conflicts
- Downloaded and validated the prebuilt Omni model package and weights
- Confirmed that `llm_demo` can load the model configuration

In the next section, you'll run a text-only baseline to verify that the core inference path works correctly before adding vision and audio inputs.
Loading
Loading