Isaac调度器(Scheduler)
Isaac SDK遵循最早截止日期优先(EDF)模型,使用调度程序来管理和调度工作。调度程序将尝试确保根据作业的期望开始时间调度作业。调度程序还管理多线程问题和核心管理。有关详细信息,请参见“ 调度接口和策略(Scheduling Interface and Policy)”部分。
作业(Jobs)由配置结构指定,并在创建后通过不透明的句柄进行引用。作业被分派到工作线程池或在专用线程上执行。调度程序还尽可能跟踪作业的统计信息。有关更多信息,请参见“ 作业描述(Job Description)”和“ 作业统计信息(Job Statistics)”部分。
线程和核心管理是可配置的,并且可以通过时钟缩放和称为定时器(Time machine)的系统来优化调度程序时序。定时器可消除时间表中的空闲时间,以加快训练时间。有关更多信息,请参见“ 调度程序配置(Scheduler Configuration)”和“ 定时器和时钟缩放(Time Machine and Clock Scaling)”部分。
所有小代码(Codelet,简称小码)都隐式使用调度程序,从而减少了主动管理作业的需求。在大多数情况下,没有必要直接创建作业。但是,了解调度程序后,可以更轻松地优化应用程序图和小码运行时性能。
作业描述(Job Description)
调度程序根据JobDescriptors和JobHandles进行操作。JobDescriptor指定如何执行作业,并使用JobHandle跟踪创建的作业。
JobDescriptor具有以下字段:
-
JobAction操作:这是一个不带任何参数且没有返回值的函数指针。
-
std :: stringexecution_group:此可选字段指定哪个执行单元负责执行作业。如果未指定名称,则会根据执行特征分配默认组。执行组定义作业和硬件核心之间的关系。有关更多信息,请参见“ 调度程序配置”部分。
-
std :: string name:此可选字段可以包含易于理解的名称,以帮助进行诊断。
-
int64_t period:此字段指定作业的周期(以纳秒为单位)。这仅适用于周期性的工作。该字段与target_start_time互斥。
-
int64_t target_start_time:此字段指定作业的目标开始时间(以纳秒为单位)。它仅适用于事件和oneshot作业。
-
int64_t slack:此字段指定计划作业时允许的延迟时间。当在同一时间窗口计划两个作业时,这主要用作决胜球。
-
std :: optional <int64_t>截止日期:此值(以纳秒为单位)用于检测作业的运行时间是否比期望的长。默认情况下,定期作业将此值设置为其期间。
-
int优先级:如果两个作业在同一时间窗口中开始,则此字段中的值将用作平局决胜局。较高的值具有优先权。
-
ExecutionModeexecution_mode:此字段指定如何执行作业。选项包括:
- kBlocking:作业在专用线程上重复执行。这对于专用硬件轮询或必须重复运行且具有专用资源的其他活动很有用。
- kBlockingOneShot:作业在专用线程上执行一次。
- kOneShotTask:作业在工作线程池中执行一次。
- kPeriodicTask:作业在工作线程池中定期执行。
- kEventTask:在工作线程池中的事件通知上执行作业。
-
EventTriggerLimit event_trigger_limit:此字段指定如何处理接收多个事件。如果作业已排队超过给定限制,则不会触发该作业。例如,限制为1表示该作业最多只能排队一次。如果作业当前正在执行,则不计入限制。如果设置为-1,则不会使用任何限制。
-
bool has_statistics:此字段控制是否为作业收集运行时统计信息。默认行为是收集统计信息。
有关更多详细信息,请参见gems / scheduler / job_descriptor.hpp。
工作统计
在工作线程池中执行的作业可以收集行为统计信息。在自己的线程上执行的作业不会收集统计信息,因为没有明确定义的方法来衡量其性能。在应用程序执行结束时,将执行的所有作业的摘要报告写入日志文件。
调度程序报告中值以及所有执行时间的90%的上限。作业中位数和第90个百分位数比平均时间更能代表执行行为,因为作业的启动时间可能很长,执行时间偶尔会很长,或者优化的路径可能会使平均时间估算值产生偏差。实际上,线程执行时间可能呈现非高斯分布。度量是执行时间子样本的估计。根据经验,第90个百分位数大于中位数的三倍(代表着重尾分布)可能需要对工作绩效进行进一步分析。
以下是一份工作报告样本。将为每个执行组生成一个报告。请参阅gems / scheduler / job_statistics.hpp以获取有关跟踪内容的更多详细信息。
|=========================================================================================================================================================|
| Job Statistics Report (regular) |
|=========================================================================================================================================================|
| Name | Job Mode | Count | Time (Median - 90% - Max) [ms] | Rl Load | Overrun | Overrun | Exec Delay |
|---------------------------------------------------------------------------------------------------------------------------------------------------------|
| ..tion/isaac.navigation.ParticleFilterLocalization | Event | 357 | 24.11 | 34.13 | 42.55 | 35.7 % | 0.0 % | 0.00 ms | 74.4 mus |
| ..p.local_map/isaac.navigation.BinaryToDistanceMap | Event | 457 | 8.57 | 17.31 | 26.10 | 25.9 % | 0.0 % | 0.00 ms | 265.8 mus |
| ..on.local_map.local_map/isaac.navigation.LocalMap | Event | 458 | 4.87 | 9.70 | 20.15 | 16.4 % | 0.0 % | 0.00 ms | 90.7 mus |
| ..global_plan/isaac.navigation.BinaryToDistanceMap | Event | 358 | 3.54 | 6.69 | 11.20 | 6.6 % | 0.0 % | 0.00 ms | 249.1 mus |
| navigation.planner.global_plan_smoother/smoother | Event | 18 | 49.55 | 56.54 | 63.87 | 4.0 % | 0.0 % | 0.00 ms | 278.3 mus |
| ..rol.lqr/isaac.planner.DifferentialBaseLqrPlanner | Periodic | 230 | 3.38 | 7.16 | 22.01 | 3.6 % | 0.0 % | 0.00 ms | 305.7 mus |
| ..lation.sim_range_scan/isaac.flatsim.SimRangeScan | Periodic | 460 | 0.71 | 0.96 | 1.30 | 1.3 % | 0.0 % | 0.00 ms | -75.3 mus |
| ..ometry.odometry/DifferentialBaseWheelImuOdometry | Periodic | 2293 | 0.08 | 0.13 | 0.31 | 1.0 % | 0.0 % | 0.00 ms | 102.1 mus |
| ..mulation/isaac.flatsim.DifferentialBaseSimulator | Periodic | 2293 | 0.08 | 0.12 | 0.19 | 0.8 % | 0.0 % | 0.00 ms | 20.6 mus |
| ...planner.global_plan/isaac.planner.GlobalPlanner | Periodic | 18 | 8.20 | 12.39 | 15.64 | 0.7 % | 0.0 % | 0.00 ms | -25.7 mus |
| ..simulation/isaac.flatsim.DifferentialBasePhysics | Periodic | 2293 | 0.06 | 0.09 | 0.48 | 0.6 % | 0.0 % | 0.00 ms | 11.6 mus |
| ...local_map/isaac.navigation.OccupancyToBinaryMap | Event | 457 | 0.14 | 0.38 | 11.41 | 0.6 % | 0.0 % | 0.00 ms | 268.6 mus |
| ..ol.control/isaac.planner.DifferentialBaseControl | Periodic | 2294 | 0.07 | 0.10 | 0.17 | 0.6 % | 0.0 % | 0.00 ms | 174.0 mus |
| ..lobal_plan/isaac.navigation.OccupancyToBinaryMap | Event | 358 | 0.19 | 0.46 | 11.43 | 0.6 % | 0.0 % | 0.00 ms | 235.9 mus |
| navigation.local_map.local_map/cleanup | Event | 458 | 0.11 | 0.19 | 11.80 | 0.5 % | 0.0 % | 0.00 ms | 71.6 mus |
| ..zation.global_localization/grid_search_localizer | Periodic | 22 | 0.27 | 0.41 | 86.98 | 0.4 % | 0.0 % | 0.00 ms | -30.9 mus |
| _pose_tree_bridge/PoseTreeJsonBridge | Periodic | 462 | 0.09 | 0.17 | 0.21 | 0.2 % | 0.0 % | 0.00 ms | 326.6 mus |
| ..n.localization.scan_localization/flatscan_viewer | Event | 357 | 0.09 | 0.20 | 0.30 | 0.2 % | 0.0 % | 0.00 ms | 52.9 mus |
| _statistics/NodeStatistics | Periodic | 93 | 0.32 | 0.57 | 7.94 | 0.2 % | 0.0 % | 0.00 ms | -15.5 mus |
| navigation.planner.go_to/isaac.navigation.GoTo | Periodic | 230 | 0.06 | 0.11 | 0.14 | 0.1 % | 0.0 % | 0.00 ms | 21.5 mus |
| ..tion.localization.scan_localization/robot_viewer | Periodic | 896 | 0.02 | 0.03 | 0.11 | 0.1 % | 0.0 % | 0.00 ms | 174.8 mus |
| ..aluation/isaac.navigation.LocalizationEvaluation | Periodic | 460 | 0.02 | 0.05 | 0.14 | 0.0 % | 0.0 % | 0.00 ms | -84.6 mus |
| ..ation.localize/isaac.navigation.LocalizeBehavior | Periodic | 460 | 0.02 | 0.03 | 0.05 | 0.0 % | 0.0 % | 0.00 ms | -68.7 mus |
| ..eractive_markers_bridge/InteractiveMarkersBridge | Periodic | 462 | 0.01 | 0.01 | 0.03 | 0.0 % | 0.0 % | 0.00 ms | 275.5 mus |
| ...goal_behavior/isaac.navigation.SelectorBehavior | Periodic | 460 | 0.01 | 0.01 | 0.03 | 0.0 % | 0.0 % | 0.00 ms | -2.7 mus |
| ..tion_mode/isaac.navigation.GroupSelectorBehavior | Periodic | 460 | 0.00 | 0.01 | 0.01 | 0.0 % | 0.0 % | 0.00 ms | -51.7 mus |
| simulation.sim_range_scan/lidar_initializer | Periodic | 115 | 0.02 | 0.03 | 0.22 | 0.0 % | 0.0 % | 0.00 ms | -87.4 mus |
| FailsafeHeartBeat | Periodic | 2311 | 0.00 | 0.00 | 0.02 | 0.0 % | 0.0 % | 0.00 ms | 231.6 mus |
| goals.random_walk/isaac.navigation.RandomWalk | Periodic | 92 | 0.01 | 0.02 | 0.10 | 0.0 % | 0.0 % | 0.00 ms | -2.1 mus |
| ..localization.robot_pose_initializer/initial_pose | Periodic | 116 | 0.01 | 0.01 | 0.04 | 0.0 % | 0.0 % | 0.00 ms | 125.2 mus |
| navigation.planner.go_to/isaac.viewers.GoalViewer | Event | 1 | 0.04 | 0.04 | 0.04 | 0.0 % | 0.0 % | 0.00 ms | 41.0 mus |
| _config_bridge/isaac.alice.ConfigBridge | Event | 0 | 0.00 | 0.00 | 0.00 | 0.0 % | 0.0 % | 0.00 ms | 0.0 mus |
| navigation.imu_odometry.imu_corrector/ImuCorrector | Event | 0 | 0.00 | 0.00 | 0.00 | 0.0 % | 0.0 % | 0.00 ms | 0.0 mus |
|=========================================================================================================================================================|
调度接口和策略(Scheduling Interface and Policy)
调度程序遵循最早截止日期优先的原则,但是它不需要已知的执行时间。所需的开始时间用作代理。如有需要,将按优先级和可用的空闲时间(按优先次序)将作业按其所需的开始时间执行。
为了展示将任务固定到特定硬件内核的能力,调度程序使用了执行组的概念。每个组代表一组核心,可以在其上执行关联的作业。调度程序以贪婪的方式运行,并将默认组分配给未由配置文件明确分配的所有内核。
Isaac SDK至少需要一个内核才能运行某些内部行为。如果分配了所有核心,则调度程序仍保留一个核心用于操作。
执行组在gems / scheduler / execution_group_descriptor.hpp中定义。它们具有三个主要值:
- std :: string name:指定要建立索引的组的名称。
- std :: vector <int>核心:指定该组在其上运行的核心的列表。
- bool has_workers:一个标志,用于控制系统是否生成工作线程。如果设置为true,则在组中每个核心产生一个工作线程并将其固定到那些核心。
调度程序的主要入口点是gems / scheduler / scheduler.hpp中的接口。以下4个功能是与调度程序进行交互的主要方法。
std::optional<JobHandle> createJob(const JobDescriptor& descriptor)
void destroyJob(const JobHandle& handle);
void startJob(const JobHandle& handle) const;
void waitForJobDestruction(const JobHandle& handle) const;
这些功能可以创建,销毁和启动作业。销毁作业后,必须调用waitForJobDestruction以确保释放资源安全,因为在调用destroyJob时作业可能正在执行。
以下便利功能结合了与调度程序进行交互时使用的一些常用操作。
std::optional<JobHandle> createJobAndStart(const JobDescriptor& descriptor);
void destroyJobAndWait(const JobHandle& handle);
以下功能处理基于事件的任务:
void registerEvents(const JobHandle& handle, const std::unordered_set<std::string>& events) const;
void unregisterEvents(const JobHandle& handle, const std::unordered_set<std::string>& events) const;
void notify(const std::string& event, int64_t target_time) const;
以下函数返回给定作业的统计信息。有关更多信息,请参见作业统计。
JobStatistics getJobStatistics(const JobHandle& handle) const;
这些功能控制调度程序的时间机器功能。有关更多信息,请参见Time Machine和Clock Scaling。
void enableTimeMachine();
void disableTimeMachine();
时间机器和时钟缩放
为了加快算法的仿真和训练速度,调度程序与支持时钟缩放的Isaac系统时钟以及称为时机的系统绑定在一起。
时钟缩放允许您加快或减慢Isaac SDK的系统时钟,并且时间机器可以检测计划中的间隔并在运行时消除它们。这样可以大大减少模拟过程中的训练时间,而对训练结果没有明显的影响。
时间机器无法处理阻止的作业,因为它无法检测到这些作业何时处于空闲状态。
调度程序配置
调度程序在应用程序配置文件中公开了一些基本参数。以下示例JSON块演示了如何设置这些配置。如果未指定默认配置,则系统将尝试手动生成一个。
"scheduler": {
"use_time_machine": true,
"clock_scale": 1.0,
"execution_groups": [
{
"name": "MyTestWorkerGroup",
"cores": [0,1,2,3],
"workers": true
},
{
"name": "MyTestBlockerGroup",
"cores": [4,5,6,7],
"workers": false
}
]
}
"scheduler": {
"use_time_machine": true,
"clock_scale": 1.0,
"default_execution_group_config": [
{
"worker_cores": [0,1],
"blocker_cores": [4,5]
}
]
}
网友评论