From 5bcb495a09a6c263d22c5a08e6947a4ba018521b Mon Sep 17 00:00:00 2001 From: ChineseTom Date: Fri, 12 Dec 2025 10:23:25 +0800 Subject: [PATCH] add example --- .../development_guide/scheduling/priority.md | 61 +++++++++++++++++++ .../examples/index.md | 1 + .../examples/resource_group.md | 41 +++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 docs/multi_language_function_programming_interface/development_guide/scheduling/priority.md create mode 100644 docs/multi_language_function_programming_interface/examples/resource_group.md diff --git a/docs/multi_language_function_programming_interface/development_guide/scheduling/priority.md b/docs/multi_language_function_programming_interface/development_guide/scheduling/priority.md new file mode 100644 index 00000000..a3200c7d --- /dev/null +++ b/docs/multi_language_function_programming_interface/development_guide/scheduling/priority.md @@ -0,0 +1,61 @@ +# 抢占策略 + +openYuanrong可以配置函数实例的优先级,进行抢占调度。 + +## 抢占配置 + +openYuanrong提供优先级调度能力,支持配置抢占调度开关。 + +```shell +yr start --master --max_priority=50 --enable_preemption=true +``` + +### 抢占优先级 + +实例抢占优先级在创建函数实例时通过配置项设置。详见 [InvokeOptions](../multi_language_function_programming_interface/api/distributed_programming/C++/struct-Config.md) +,例如: +`opts.scheduleTimeoutMs = 30000`, +`opts.preemptedAllowed = true`, +`opts.instancePriority = 10`, +preemptedAllowed 表达实例是否可以被抢占,语义上高优先级的实例可以抢占低优先级被配置为(preemptedAllowed=true)的实例; +scheduleTimeoutMs 字段,表示调度超时时间,单位为毫秒,默认值 30000; +instancePriority 字段,在优先级场景下数值越大优先级越高,高优先级的实例可以抢占低优先级且被配置为(preemptedAllowed = +true)的实例。 + +### 抢占规则 + +被抢占的实例会被驱逐,抢占决策遵循以下原则选择最优的抢占实例: + +- 过滤 capacity 和资源标签满足要求的单元。 +- 只抢占同租户的单元(后续支持跨租户)。 +- 实例标签强亲和或强反亲和的不抢占。 +- 抢占优先级小于被调度实例的并且标记为可抢占的实例可以被抢占。优先级小的在前,否则按弱亲和打分权重逆序排列,权重相同的资源大的在前。 +- 对应单元的最终打分:优先按照亲和打分权重,相等的情况下优先选择抢占少的。 + +抢占调度示例: + +::::{tab-set} + +:::{tab-item} Python + +```python +import yr + +yr.init() + +@yr.invoke() +def add(x, y): + return x + y + +opt = yr.InvokeOptions() +opt.preempted_allowed = True +opt.instance_priority = 22 +opt.schedule_timeout_ms = 30000 + +ret = add.options(opt).invoke(3, 4) +print(yr.get(ret)) +yr.finalize() +``` + +::: +:::: diff --git a/docs/multi_language_function_programming_interface/examples/index.md b/docs/multi_language_function_programming_interface/examples/index.md index 84c9d9ae..d7cc2648 100644 --- a/docs/multi_language_function_programming_interface/examples/index.md +++ b/docs/multi_language_function_programming_interface/examples/index.md @@ -11,4 +11,5 @@ streaming-mapreduce use_stream monte-carlo-pi + resource_group ``` diff --git a/docs/multi_language_function_programming_interface/examples/resource_group.md b/docs/multi_language_function_programming_interface/examples/resource_group.md new file mode 100644 index 00000000..1193e5cc --- /dev/null +++ b/docs/multi_language_function_programming_interface/examples/resource_group.md @@ -0,0 +1,41 @@ +# 资源组 + +本节通过 Python 示例向您介绍如何使用资源组API。 + +## 配置函数实例资源组 + + +### 在主机部署环境上使用资源组API + +```python +# resource_group.py +import yr + +yr.init() + +resource_group_name = "rgname" +rg = yr.create_resource_group([{"CPU":2000, "Memory": 2000}], resource_group_name) +rg.wait(10) + +rgp = yr.ResourceGroupOptions() +rgp.resource_group_name = resource_group_name + +opts=yr.InvokeOptions() +opts.resource_group_options = rgp + + +@yr.invoke(invoke_options=opts) +def get_num(x): + return x + + +results = [get_num.invoke(6) for i in range(1)] +print(yr.get(results[0])) +yr.remove_resource_group(resource_group_name) +yr.finalize() + +``` + +执行命令 `python resource_group.py` 运行程序。 + +输出结果6 \ No newline at end of file -- Gitee