# ModelConfig 구성

```{note}
`ModelConfig`은 Mobilint **런타임 라이브러리**의 일부입니다. 런타임 라이브러리는 컴파일된
모델을 로드하고 ARIES 장치에서 추론을 실행하는 C++ 및 Python SDK입니다. 런타임의 설치와
사용 방법은 <a href="https://docs.mobilint.com/runtime/">Runtime 매뉴얼</a>에서 다룹니다. 이 페이지에서는 런타임
객체 중 하나인 `ModelConfig`가 각 모델에 NPU 코어와 [Core 모드](core-mode.md)를 어떻게
할당하는지 설명합니다.
```

ARIES 장치는 **8개의 로컬 코어**를 가지며, 4개씩 두 개의 클러스터로 구성됩니다(각
클러스터에는 멀티 코어 모드를 조율하는 글로벌 코어도 있습니다). 모델을 로드할 때
`ModelConfig`를 통해 모델이 사용할 코어의 **개수와 종류**, 그리고 실행할 **코어 모드**를
런타임에 지정합니다. 각 모델을 서로 다른 코어에 고정할 수 있으므로, 하나의 ARIES 장치를
동시에 실행되는 여러 모델에 분할하여 사용할 수 있습니다.

작업 흐름은 항상 동일합니다. `ModelConfig`를 생성하고, 메서드 하나를 호출해 모드와 코어를
선택한 뒤, 모델을 생성할 때 전달합니다.

## 코어와 코어 모드 선택

각 코어 모드는 하나의 `ModelConfig` 메서드에 대응됩니다. 모드 자체(Single, Multi, Global4,
Global8)의 의미는 [Core 모드](core-mode.md)에서 설명하며, 메서드는 이를 사용하도록 설정을 변경합니다.

| 목적 | C++ 메서드 / Python 메서드 | 사용되는 코어 |
| --- | --- | --- |
| Single-core, 특정 코어 | `setSingleCoreMode({...})` / `set_single_core_mode(core_ids=[...])` | 지정한 로컬 코어 |
| Single-core, 전체 | `setSingleCoreMode()` / `set_single_core_mode(num_cores=8)` | 8개의 로컬 코어 전부 |
| Multi (배치) | `setMultiCoreMode({clusters})` / `set_multi_core_mode([clusters])` | 지정한 각 클러스터의 로컬 코어 4개가 여러 입력을 배치 처리 |
| Global4 | `setGlobal4CoreMode({clusters})` / `set_global4_core_mode([clusters])` | 지정한 각 클러스터의 로컬 코어 4개가 하나의 입력을 협력 처리 |
| Global8 | `setGlobal8CoreMode()` / `set_global8_core_mode()` | 두 클러스터의 로컬 코어 8개가 하나의 입력을 협력 처리 |

## 예제

대표적인 구성 몇 가지입니다. 각 예시는 `ModelConfig`를 생성하고 모드를 선택한 뒤 모델을
생성합니다(간결함을 위해 `launch` 호출은 생략).

```cpp
#include "qbruntime/qbruntime.h"
using namespace mobilint;

const char* MXQ_PATH = "model_name.mxq";

StatusCode sc;
auto acc = Accelerator::create(sc);

// Single-core mode on two specific local cores
ModelConfig mc_single;
mc_single.setSingleCoreMode({{Cluster::Cluster0, Core::Core0},
                             {Cluster::Cluster0, Core::Core1}});
auto model_single = Model::create(MXQ_PATH, mc_single, sc);

// Multi-core mode on Cluster0
ModelConfig mc_multi;
mc_multi.setMultiCoreMode({Cluster::Cluster0});
auto model_multi = Model::create(MXQ_PATH, mc_multi, sc);

// Global4 mode on Cluster1
ModelConfig mc_g4;
mc_g4.setGlobal4CoreMode({Cluster::Cluster1});
auto model_g4 = Model::create(MXQ_PATH, mc_g4, sc);

// Global8 mode
ModelConfig mc_g8;
mc_g8.setGlobal8CoreMode();
auto model_g8 = Model::create(MXQ_PATH, mc_g8, sc);
```

```python
from qbruntime import Accelerator, Model, ModelConfig, CoreId, Cluster, Core

acc = Accelerator()
MXQ_PATH = "model_name.mxq"

# Single-core mode on two specific local cores
mc_single = ModelConfig()
mc_single.set_single_core_mode(core_ids=[
    CoreId(Cluster.Cluster0, Core.Core0),
    CoreId(Cluster.Cluster0, Core.Core1),
])
model_single = Model(MXQ_PATH, mc_single)

# Multi-core mode on Cluster0
mc_multi = ModelConfig()
mc_multi.set_multi_core_mode([Cluster.Cluster0])
model_multi = Model(MXQ_PATH, mc_multi)

# Global4 mode on Cluster1
mc_g4 = ModelConfig()
mc_g4.set_global4_core_mode([Cluster.Cluster1])
model_g4 = Model(MXQ_PATH, mc_g4)

# Global8 mode
mc_g8 = ModelConfig()
mc_g8.set_global8_core_mode()
model_g8 = Model(MXQ_PATH, mc_g8)
```
