Files
rtos_llm_opt/项目框架1-基于RTOS的五类场景AI实时性研究/10-研究框架/01-推理图任务调度.md
T

414 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 方向1: LLM推理图任务调度与混合调度算法
## 1. 问题陈述
LLM推理是一个**有向无环图(DAG)计算图**,包含多个阶段,每个阶段有不同的:
- 计算特征(计算密集 vs IO密集)
- 延迟敏感度(TTFT vs TPOT)
- 内存访问模式(顺序 vs 随机)
- 输出依赖性(串行 vs 可并行)
RTOS需要将这个DAG映射为task集合,并设计调度策略保证:
1. **吞吐最大化** — 单位时间内处理最多token
2. **延迟最小化** — TTFT和尾延迟最小
3. **确定性保证** — 满足硬实时约束(如语音对话的<200ms抖动)
### 1.1 本方向在总课题中的角色
本方向聚焦:
- 如何把人工智能目标负载拆解为可由 RTOS 管理的任务图;
- 如何让人工智能目标负载与关键保障负载在同一系统中同时达标;
- 如何把 SylixOS 的调度能力转化为可观测的系统收益与对照差异。
因此,这一方向服务的是总课题中的“任务图建模与调度保障”主线。
### 1.2 与验证矩阵的对应关系
这一方向在 `T5~T1` 五类部署形态中都成立,但关注重点不同:
| 部署形态 | 调度侧重点 |
|---|---|
| `T5` 控制端 | 小任务集、强实时、极低抖动 |
| `T4` 终端设备 | 单路智能任务与本地控制任务并存 |
| `T3` 边缘节点 | 多源输入与多任务竞争下的任务图调度 |
| `T2` 单机工作站 | 高吞吐推理与关键任务隔离并行 |
| `T1` 服务器/集群 | 多请求队列、跨核与跨设备调度协同 |
## 2. LLM推理图的分解
### 2.1 推理阶段分析
```
Input Sequence = [SOS, t1, t2, ..., tn, EOS]
Phase 1: Prefill (编码阶段)
┌─────────────────────────────────────────────────────┐
│ Tokenizer → Embedding → [Attention + FFN] × N_Layers │
│ 计算量: O(n × d × N_layers) │
│ 延迟: 高(计算密集) │
│ 依赖: 串行(每层依赖上一层) │
│ RTOS优先级: HIGH(影响TTFT) │
└─────────────────────────────────────────────────────┘
Phase 2: Decode (解码阶段, 逐token生成)
┌──────────────────────────────────────────────────────┐
│ [Attention + FFN] × N_Layers → Sample → Next Token │
│ 计算量: O(1 × d × N_layers) per step │
│ 延迟: 中(每步一次全网络推理) │
│ 依赖: 串行(每步依赖上一步输出) │
│ RTOS优先级: HIGH-MEDIUM(影响TPOT) │
│ 特殊: KV Cache写入(IO密集) │
└──────────────────────────────────────────────────────┘
Phase 3: Output (后处理)
┌──────────────────────────────────────────────────────┐
│ Logits → Top-K/Top-P Sample → Detokenize → Output │
│ 计算量: O(1 × vocab_size) │
│ 延迟: 低 │
│ 依赖: 前序Decode完成 │
│ RTOS优先级: LOW │
└──────────────────────────────────────────────────────┘
```
### 2.2 阶段特征矩阵
| 阶段 | 计算密集度 | IO密集度 | 延迟敏感度 | 确定性要求 | 推荐RTOS优先级 |
|-----|-----------|---------|-----------|-----------|--------------|
| Tokenizer | 低 | 中 | 低 | 软实时 | LOW |
| Embedding | 高 | 低 | 高 | 硬实时 | HIGH |
| Attention | 高 | 高 | 极高 | 硬实时 | MAX |
| FFN | 高 | 低 | 高 | 硬实时 | HIGH |
| KV Cache Write | 低 | 高 | 中 | 软实时 | MEDIUM |
| Sample/Detoken | 低 | 低 | 低 | 软实时 | LOW |
## 3. 调度模型
### 3.1 Task建模
每个推理阶段建模为RTOS task:
```c
typedef struct {
uint32_t id; // Task ID
char name[32]; // 名称
uint8_t priority; // RTOS优先级
uint32_t wcet; // 最坏执行时间(μs)
uint32_t period; // 执行周期(μs)
uint32_t deadline; // 截止时间(relative to release)
uint32_t memory_footprint; // 内存占用(bytes)
uint32_t bandwidth_req; // 内存带宽需求(MB/s)
enum task_type {
TASK_TOKENIZER,
TASK_EMBEDDING,
TASK_ATTENTION,
TASK_FFN,
TASK_KV_CACHE,
TASK_SAMPLE,
TASK_CONTROL
} type;
bool preemptible; // 是否可抢占
bool pinned_core; // 是否绑定特定核心
uint8_t target_core; // 绑定的核心ID
} llm_task_t;
```
### 3.2 任务依赖图(DAG)
```
┌──────────────┐
│ Tokenizer │──→┐
└──────────────┘ │
├──→┌──────────────┐
┌──────────────┐ │ │ Embedding │
│ Control │───┤ └──────┬───────┘
└──────────────┘ │ │
├──→┌──────┴───────┐
│ │ Attention │
│ │ (Layer 1..N) │
│ └──────┬───────┘
│ │
├──→┌──────┴───────┐
│ │ FFN │
│ │ (Layer 1..N) │
│ └──────┬───────┘
│ │
└────────→┌──────────┐
│ KV Cache │
│ Write │
└────┬─────┘
│
┌▼──────────┐
│ Sample │
└────┬──────┘
│
┌▼──────────┐
│ Detoken │
└──────────┘
```
### 3.3 调度问题分析
**问题1: 阶段间依赖的延迟**
- 每个阶段完成后需等待前一阶段全部完成才能启动
- 串行依赖导致pipeline stall
- **RTOS手段**: barrier synchronization, event queue
**问题2: KV Cache的内存带宽竞争**
- Attention和FFN都大量读取/写入KV Cache
- 与tokenizer的输入读取竞争内存带宽
- **RTOS手段**: bandwidth-aware scheduling, DMA batching
**问题3: 多beam的调度**
- Multi-beam decoding需要同时管理多个beam的task
- beam之间优先级相同,但需要保证全局吞吐量
- **RTOS手段**: priority grouping, round-robin within group
## 4. 调度算法设计
### 4.1 Hybrid Priority Scheduling (混合优先级)
核心思想:不同推理阶段使用不同优先级策略
```
┌─────────────────────────────────────────────┐
│ Fixed Priority (硬实时部分) │
│ ┌───────────────────────────────────────┐ │
│ │ MAX: Attention (所有Layer) │ │
│ │ HIGH: FFN, Embedding │ │
│ │ MEDIUM: KV Cache Write │ │
│ │ LOW: Tokenizer, Sample/Detoken │ │
│ └───────────────────────────────────────┘ │
│ │
│ EDF (软实时部分) │
│ ┌───────────────────────────────────────┐ │
│ │ Dynamic Deadline: │ │
│ │ - Next beam's attention deadline │ │
│ │ - Current KV Cache timeout │ │
│ └───────────────────────────────────────┘ │
│ │
│ Preemption Rules: │
│ ┌───────────────────────────────────────┐ │
│ │ Attention can preempt FFN & KV │ │
│ │ KV Cache can be preempted by Attention│ │
│ │ Non-preemptable: Attention computation│ │
│ └───────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
```
**优先级分配策略**:
```python
# 基于延迟敏感度的优先级分配
def assign_priority(stage, deadline_ms):
if stage == ATTENTION:
return PRIORITY_MAX # 最延迟敏感
elif stage in (FFN, EMBEDDING):
return PRIORITY_HIGH
elif stage == KV_CACHE_WRITE:
return PRIORITY_MEDIUM
else:
return PRIORITY_LOW
# 基于deadline的EDF动态优先级
def edf_priority(task):
return -task.deadline # 更早deadline = 更高优先级 (负值越小优先级越高)
```
### 4.2 流水线并行调度
对于N层Transformer,可以设计Layer-level的pipeline:
```
Time →
Layer 1: [Attention][FFN ]
Layer 2: [Attention][FFN]
Layer 3: [Attention][FFN]
...
Layer N: ...[Attention][FFN]
```
**Stage Bubble问题**:Layer间有气泡时间
- **缓解策略**:
1. 将Attention和FFN的task分别独立调度
2. Attention完成即触发FFN,不等同层所有Attention
3. 使用RTOS mutex保护共享数据,减少stall
```c
// Layer Pipeline Scheduling
void schedule_layer_pipeline(llm_context_t *ctx) {
// Step 1: Launch all Attention tasks in parallel
for (int layer = 0; layer < N; layer++) {
xTaskNotify(layer_attn_task, layer, eIncrement);
}
// Step 2: Launch FFN for each layer when Attention completes
// This is done in RTOS ISR/notify callback
// when Attention layer i completes:
// xTaskNotify(layer_ffn_task, i, eNoAction);
}
```
### 4.3 多流调度
当同时服务多个请求(batched inference)时:
```
Request A: [Embedding][Attn→FFN]×N → [Attn→FFN]×M_tokens
Request B: [Embedding][Attn→FFN]×N → [Attn→FFN]×K_tokens
Request C: [Embedding][Attn→FFN]×N → [Attn→FFN]×P_tokens
```
**调度策略**:
| 策略 | 描述 | 优点 | 缺点 |
|-----|------|-----|-----|
| FIFO | 按arrival order处理 | 公平,易实现 | 短请求被长请求阻塞 |
| SRTF (Shortest Remaining Time First) | 优先剩余token少的请求 | 平均延迟低 | 长请求可能饿死 |
| Priority Queue | 按SLA优先级 | 满足SLA | 需额外管理 |
| Round Robin | 轮流处理每个请求 | 公平+低延迟 | 上下文切换开销 |
**建议**: SRTF for latency-critical, Priority Queue for SLA guarantee, RR for fairness.
## 5. 实时性分析
### 5.1 Response Time Analysis (RTA)
对于固定优先级调度,每个task的response time:
```
R_i = C_i + Σ_{j∈hp(i)} ⌈R_j / T_j⌉ × C_j
其中:
- R_i: task i的最坏响应时间
- C_i: task i的最坏执行时间(WCET)
- hp(i): priority高于i的task集合
- T_j: task j的周期
```
**LLM特例**:Attention的WCET取决于input sequence length,需要动态计算。
### 5.2 调度可调度性判据
**Condition 1: 所有Attention任务在deadline前完成**
```
R_attention + overhead ≤ D_attention (typically 50ms for voice)
```
**Condition 2: 吞吐量不饿死低优先级任务**
```
Σ(U_high) < 1 - U_low_margin
其中U_low_margin为低优先级任务预留的CPU时间份额
```
**Condition 3: 无priority inversion**
```
使用Priority Inheritance Protocol (PIP)或Enhanced PIP
```
### 5.3 端到端延迟分析
```
E2E Latency = max(Prefill Latency, Decode Latency × M) + Overhead
其中:
- Prefill Latency = Σ(T_embed + T_attn_l + T_ffn_l for l=1..N)
- Decode Latency per token = T_attn + T_ffn + T_kv_write + T_sample
- M = output sequence length
- Overhead = context_switch + barrier_sync + DMA_transfer
```
## 6. 各硬件平台的调度差异
### 6.1 MCU级 (STM32H7等)
```
约束:
- 单核或双核(Cortex-M7 + M4)
- 无NPU,纯CPU推理
- RAM 256KB~2MB
- 64KB~512KB L1/L2 Cache
调度策略:
- 单核: 静态优先级(Fixed Priority)
- 多核: 多核固定优先级(MFPA)
- 无pipeline,串行执行Attention→FFN
- 关键优化: 减少context switch,pin任务到核心
```
### 6.2 SoC级 (骁龙/天玑)
```
约束:
- 多核(CPU + NPU + GPU)
- NPU驱动封闭,接口有限
- 内存带宽~10GB/s
- 存在ISP、Modem等其他实时任务
调度策略:
- 异构多核调度(HMP)
- CPU负责Control + Attention部分
- NPU负责矩阵乘(FFN/Attention)
- 关键挑战: NPU状态不可见,需估算延迟
```
### 6.3 Edge盒子 (Jetson等)
```
约束:
- 多CPU Core + 专用NPU
- 大内存(8-16GB)
- PCIe连接NPU,带宽~16GB/s
- 功耗较高(15-60W)
调度策略:
- 多核+NPU协同调度
- CUDA Stream可视为RTOS task的扩展
- 可做的调度粒度更细
```
### 6.4 Server级
```
约束:
- NUMA架构,多GPU
- PCIe/NVLink互联
- 可做的调度粒度最细
RTOS角色:
- 轻量调度器,管理GPU进程
- vLLM等框架已做了大部分调度工作
- RTOS主要提供实时中断响应
```
## 7. 本方向的验证关注点
为了让本方向与总课题的双目标评价框架对齐,调度机制至少要回答下面三个问题:
1. 人工智能目标负载的 `TTFT`、`TPOT` 和端到端响应时间是否改善;
2. 关键保障负载的 `deadline miss ratio`、`P99/P99.9 jitter` 是否仍受控;
3. 在多任务并存、到达率变化和伴生竞争负载存在时,系统是否仍保持可解释的调度边界。
## 8. 关键设计决策
| 决策点 | 选项 | 推荐 | 理由 |
|-------|------|-----|------|
| 调度策略 | FP / EDF / Hybrid | **Hybrid** | 不同阶段需求不同 |
| 抢占策略 | 可抢占 / 不可抢占 | **分级抢占** | Attention可抢占FFN |
| 任务粒度 | Stage / Layer / Token | **Stage + Layer** | 平衡调度开销与并行度 |
| 核心绑定 | 全局 / 亲和性 / 固定 | **固定绑定** | 减少cache thrashing |
| 同步机制 | Semaphore / Mutex / Notify | **Notify + Barrier** | 低开销,实时性可分析 |
| 多流策略 | FIFO / SRTF / RR | **SRTF** | 低延迟场景最优 |
## 9. 开放研究问题
1. **动态WCET估计**:LLM的WCET随input长度变化,如何在线估计?
2. **Adaptive Priority**:运行时根据系统负载动态调整优先级?
3. **Cross-layer Optimization**:调度与量化精度联合优化?
4. **Predictive Scheduling**:根据输入预测计算量,提前调度?
5. **Fault Tolerance**:任务失败后的recovery调度策略?
---
*最后更新: 2026-09-17*