# 调度器

FastDeploy 目前支持两种调度器: **本地调度器** 和 **全局调度器** 。 全局调度器专为大规模集群设计，能够基于实时工作负载指标在节点间实现二级负载均衡。

## 调度策略

### 本地调度器
本地调度器可以等效于内存管理器，根据 **任务队列长度** 和 **TTL** 的配置进行内存淘汰。

### 全局调度器
全局调度器基于 Redis 实现，各个节点根据自身 GPU 负载情况，空闲时主动从其他节点窃取任务，然后将任务的执行结果推送回原节点。

### PD分离调度器
基于全局调度器，FastDeploy 引入了专为大语言模型推理场景优化的 **PD 分离调度策略**。该策略将推理流程解耦为两个独立阶段：
- **Prefill 阶段** ：构建 KV 缓存，该过程计算密集度高、显存占用大，但延迟低；

- **Decode 阶段**：进行自回归解码，该过程串行执行、时延高，但显存占用低。  

通过角色分离（prefill 节点负责接收并处理请求，decode节点完成后续生成），可以更细粒度地控制资源分配、提高吞吐量与 GPU 利用率。


## 配置参数
| 字段名                               | 字段类型 | 是否必填 | 默认值    | 生效范围                   | 说明                                |
| ------------------------------------ | -------- | -------- | --------- |------------------------|-----------------------------------|
| scheduler_name                       | str      | 否       | local     | local,global,splitwise | 调度器名：`local`，`global`，`splitwise` |
| scheduler_max_size                   | int      | 否       | -1        | local                  | 任务最大队列长度                          |
| scheduler_ttl                        | int      | 否       | 900       | local,global,splitwise | 任务最大存活时间(秒)                       |
| scheduler_host                       | str      | 否       | 127.0.0.1 | global,splitwise       | redis服务地址                         |
| scheduler_port                       | int      | 否       | 6379      | global,splitwise       | redis服务端口                         |
| scheduler_db                         | int      | 否       | 0         | global,splitwise                | redis数据库序号                        |
| scheduler_password                   | str      | 否       | ""        | global,splitwise       | redis访问密码                         |
| scheduler_topic                      | str      | 否       | default   | global,splitwise                | 在同一个主题下的节点之间才会发生任务调度              |
| scheduler_min_load_score             | float    | 否       | 3         | global                 | 当节点的负载大于最小阈值时，若其他节点空闲则可以窃取该节点的任务  |
| scheduler_load_shards_num            | int      | 否       | 1         | global                 | 集群负载信息表的分片数                       |
| scheduler_sync_period                | int      | 否       | 5         | splitwise              | 节点负载同步周期(秒)                       |
| scheduler_expire_period              | int      | 否       | 3000      | splitwise              | 节点信息失效时间(秒)，用于心跳机制                |
| scheduler_release_load_expire_period | int      | 否       | 600       | splitwise              | 请求失效释放负载时间(秒)                     |
| scheduler_reader_parallel            | int      | 否       | 4         | splitwise              | 输出读取线程数                           |
| scheduler_writer_parallel            | int      | 否       | 4         | splitwise              | 写入线程数                             |
| scheduler_reader_batch_size          | int      | 否       | 200       | splitwise              | 每次从 Redis 获取结果的 batch 大小          |
| scheduler_writer_batch_size          | int      | 否       | 200       | splitwise              | 每次向 Redis 写入结果的 batch 大小          |
