# 7. 进阶主题
到这里,你已经能训练 crate 里的每一个 estimator 和网络。你也会划分和缩放数据,能读出各项指标。本章讨论的是另一类问题:当模型离开编辑器,走进测试套件、基准测试,或是别人的二进制程序时,才会浮现出来的横切关注点。本章覆盖让一次运行精确重现、把训练好的模型在进程间搬运、让并行内核契合你的硬件,以及把依赖树裁剪到只剩你真正会编译的那部分。这些都不改变模型算出什么。它们改变的是:你能否信任这个结果、能否交付它、能否负担得起它。
这几节假定你已经读完了[快速上手](../Chapter-01/1.0._快速上手.md),并且用[经典机器学习](../Chapter-02/2.0._经典机器学习.md)或[神经网络](../Chapter-03/3.0._神经网络.md)里的算法至少训练过一个模型。各节之间基本独立,顺序随意。不过还是建议从 7.1 开始。正是可复现性,才让后面几节里的持久化往返和性能对比变得可验证。
## 7.1. 可复现性与随机种子
每个随机化组件都通过同一个解析器获取 RNG。这份清单包括权重初始化、dropout 与噪声掩码、`Sequential` 的小批量洗牌、k-means 质心、SVC/LinearSVC、MeanShift、孤立森林、`train_test_split`,以及 t-SNE。在当前线程上调用一次 `set_global_seed(seed)`,就能把它们一起固定下来。[可复现性与随机种子](./7.1._可复现性与随机种子.md)讲三件事。第一,每个模型自带的 `random_state: Option<u64>`、线程局部的全局种子,以及操作系统熵,这三者之间如何取舍。第二,为什么一个显式的局部种子绝不会扰动分发给未设种子组件的那些种子。第三,`--test-threads=1` 下的线程局部性陷阱。这一节是[训练集与测试集划分](../Chapter-04/4.1._训练集与测试集划分.md)里那些确定性划分的基础。
```rust
use rustyml::set_global_seed;
fn main() {
// 在构造任何模型之前,先固定当前线程上所有未设种子的随机取值。
set_global_seed(42);
}
```
## 7.2. 深入模型持久化
`save_to_path` 和 `load_from_path` 会把训练好的模型序列化成一段紧凑的 `postcard` 二进制。[深入模型持久化](./7.2._深入模型持久化.md)不止讲顺利的那条路。它会说明字节里究竟存了什么:拟合出的参数和超参数,而不是你的数据集。它会说明为什么加载神经网络是把权重重建进一套你亲手搭好的架构,而不是恢复计算图本身。它会说明当层数或权重形状对不上时,为何会以 `IoError::ModelStructureMismatch` 的形式报出来,而不是默默加载一堆垃圾。这一节与[权重保存与加载](../Chapter-03/3.9._权重保存与加载.md)相配套,后者把神经网络专属的保存/加载机制讲得更完整。
## 7.3. 性能调优与并行
每个并行内核都靠一份工作量估计和一个校准过的阈值作比较,来决定走串行还是走 rayon(对 GEMM 来说,还包括选哪种并行策略)。这些阈值是在维护者的机器上调出来的,不是你的。[性能调优与并行](./7.3._性能调优与并行.md)会演示 `rustyml::tuning` 门面怎样只用一次 relaxed 原子写入,就在运行期覆盖每一道阈值门。这些阈值门包括 GEMM/GEMV 的 FLOP 临界点、elementwise 与归约的元素数量、conv/pool/norm 门,以及决策树门。你可以按自己的核心数和缓存大小重新调整其中任何一个,不必重新编译。阈值门只挑选执行策略。它绝不改变算出来的结果。这些门所管辖的内核,参见[矩阵乘法](../Chapter-06/6.2._矩阵乘法.md)和[并行归约](../Chapter-06/6.3._并行归约.md)。
## 7.4. 按需裁剪与模块化集成
整个 crate 按 feature 拆成若干模块:`machine_learning`、`neural_network`、`utils`、`metrics`,以及共享的 `math` 核心。一个只用 k-means 的项目,永远不会去编译神经网络那一整套,也不会拉进它的 `indicatif` 进度条依赖。[按需裁剪与模块化集成](./7.4._按需裁剪与模块化集成.md)会梳理清楚哪个 feature 会引入哪些依赖。它还讲清楚 `default`、`full`、`show_progress` 这几个开关到底打开了什么,以及怎样把 RustyML 作为众多模块之一嵌进一条已有的流水线。[安装与Feature配置](../Chapter-01/1.2._安装与Feature配置.md)对同一部分内容做了入门介绍。