本文介绍运行时屏幕上的提示怎么看、怎样用多核加速,以及各步骤大概要多久。

1. 运行提示

所有提示都用 cli 的样式在当时显示,verbose 控制显示多少:0 不显示,1(默认)显示汇总,2 显示细节。

run_pipeline() 的每一步带编号和耗时(例如 [2/6] Cleaning body weight … ✔ … 1.2s);各项数量右对齐并给出比例,└ 表示上一项中的一部分;为 0 的项只在 verbose = 2 时显示,有记录或猪被删掉的项标成黄色。最后的汇总框列出猪数、ADG / ADFI / FCR 的均值 ± 标准差和需要核查的猪(最多 5 头,其余见 $fcr$per_pig 和 $removed);打印结果(res)时也显示这个汇总框。需要注意的情况(例如部分猪没有达到区间终点)以黄色 ! 开头的提示给出,不再作为 R 的”警告信息”攒到最后才打印;相应的猪和原因同时记录在结果的 $removed 或 adg_type、fcr_note 等列中,verbose = 0 时也不会丢失。

示例数据跑一遍完整流程时的提示(节选):

── tidypptsda 1.6.2 · run_pipeline ─────────────────── stage 30-120 kg ──
── [2/6] Cleaning body weight (track + rlm + loess) ─────────────────────
  Weight records                       31,472
  └ adaptation after entry (not used)   3,404   10.8%
  └ outliers                            5,667   18.0%
    └ by tracking                       1,543    4.9%
! Pigs: 28 kept, 1 low confidence, 1 removed 1.2s
...
╭  Results NEDAP  ──────────────────────────────────────────────╮
│ Pigs   30 in the data · 29 with FCR (23 ok, 6 low confidence) · 1 removed │
│ ADG    1205 ± 133 g/d                                         │
│ ...                                                           │
╰───────────────────────────────────────────────────────────────╯

验证函数的提示(分阶段的进度条和结果表)见《验证函数使用指南》。

2. 并行计算

猪的头数很多时,逐头猪拟合曲线是最耗时的步骤。clean_weight()、calc_adg()、calc_adfi() 和 run_pipeline() 都有 cores 参数:

res <- run_pipeline(nedap, cores = 4)          # 用 4 个 CPU 核心
parallel::detectCores()                         # 查看电脑有几个核心

并行使用 R 自带的 parallel 包,不增加依赖,结果与 cores = 1 完全相同。几十头猪时并行没有必要;上千头猪时才有明显的加速效果。在 Windows 上,并行要求本包是正式安装的(而不是用 devtools::load_all() 临时加载)。

save_plots()、write_report() 和各验证函数也有 cores 参数。

内存:每个并行的子进程都要占用内存,猪多、核数多时可能不够用。内存不够时,子进程会被系统停掉,提示 “parallel worker stopped without a result”,相应的猪记为失败。遇到这种情况,减少 cores,或用 cores = 1。

3. 大概要多久

逐头猪拟合的步骤(clean_weight()、calc_adg()、calc_adfi() 的插补)和 save_plots() 超过 2 秒时会显示进度条,cores > 1 并行时也会显示。在约 1650 头猪、175 万条访问记录的模拟数据上,整个流程约 45 秒(单核):

步骤 耗时
prep_visits() 约 4 秒
clean_weight() 约 18 秒
calc_adg() 约 12 秒
flag_feed_errors() 约 2 秒
calc_adfi() 约 9 秒
calc_fcr() < 1 秒

验证函数要把数据反复清洗、拟合,耗时长得多,在约 700 头猪、2 个核心时每个函数要 3–6 分钟,见《验证函数使用指南》。