ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

scikit-learn 全局配置与环境变量完全指南:从 set_config 到 SKLEARN_* 系列变量的实战手册

scikit-learn 全局配置与环境变量完全指南:从 set_config 到 SKLEARN_* 系列变量的实战手册 scikit-learn 全局配置与环境变量完全指南从 set_config 到 SKLEARN_* 系列变量的实战手册【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learnscikit-learn 提供了一套完整的运行时全局配置体系sklearn.set_config、sklearn.config_context允许你在程序运行期间动态调整库的行为而一组SKLEARN_*环境变量则可以在导入库之前预设默认值覆盖性能、测试、CI 与构建调试四大场景。本文将结合仓库源码sklearn/_config.py、sklearn/conftest.py、sklearn/utils/_testing.py等逐项剖析每个配置项的含义、默认值、适用场景与底层实现帮助你精确控制内存占用、并行分块、输出格式并掌握 scikit-learn 测试套件的可复现性机制。一、运行时全局配置get_config / set_config / config_context1.1 三个核心 API 的分工scikit-learn 的全局配置由sklearn/_config.py实现并通过sklearn/__init__.py暴露给用户sklearn.get_config()返回当前生效配置的副本键值字典不会因为修改返回值而影响真实配置sklearn.set_config(**kwargs)修改全局配置任何未显式传入的参数默认None保持不变sklearn.config_context(**kwargs)上下文管理器在with块内临时修改配置退出时自动恢复所有先前配置。在源码层面sklearn/_config.py配置存储在一个名为_global_config的字典中并通过threading.local()实现线程隔离——每个线程持有自己的一份可变副本默认值从_global_config深拷贝而来_global_config { assume_finite: bool(os.environ.get(SKLEARN_ASSUME_FINITE, False)), working_memory: int(os.environ.get(SKLEARN_WORKING_MEMORY, 1024)), print_changed_only: True, display: diagram, pairwise_dist_chunk_size: int(os.environ.get(SKLEARN_PAIRWISE_DIST_CHUNK_SIZE, 256)), enable_cython_pairwise_dist: True, array_api_dispatch: False, transform_output: default, enable_metadata_routing: False, skip_parameter_validation: False, sparse_interface: spmatrix, }注意这里的环境变量读取发生在模块导入时import sklearn时这正是文档强调环境变量应在导入 scikit-learn 之前设置的根本原因。1.2 所有配置项一览默认值来自sklearn/_config.py配置键类型全局默认值引入版本作用assume_finiteboolFalse0.19为True时跳过有限性校验np.isfinite省时间但可能崩溃working_memoryintMiB10240.20分块计算时每个并行任务允许的临时数组内存上限print_changed_onlyboolTrue0.210.23 起默认反转打印估计器时只显示被修改过的参数displaytext/diagramdiagram0.23Jupyter 中估计器显示为文本还是 HTML 图pairwise_dist_chunk_sizeint2561.1加速版成对距离归约后端每个分块的行数enable_cython_pairwise_distboolTrue1.1是否启用 Cython 加速成对距离后端array_api_dispatchboolFalse1.2是否对符合 Array API 标准的输入启用分派transform_outputstrdefault1.21.4 加polarstransform/fit_transform的输出格式enable_metadata_routingboolFalse1.3是否启用元数据路由skip_parameter_validationboolFalse1.3跳过超参数类型/值校验数据仍走check_arraysparse_interfacestrspmatrix1.9文档 1.8返回的稀疏对象是 SciPysparray还是spmatrix1.3 实战set_config 与 config_context 用法import sklearn from sklearn import set_config from sklearn.utils.validation import assert_all_finite # 1) 全局修改此后所有估计器打印时只显示非默认参数 set_config(print_changed_onlyTrue) set_config(displaydiagram) # Jupyter 中显示为 HTML 图 # 2) 临时修改退出 with 块后自动恢复全部配置 with sklearn.config_context(assume_finiteTrue): assert_all_finite([float(nan)]) # 跳过有限性检查不抛异常 # 嵌套使用内层覆盖外层退出内层后恢复外层 with sklearn.config_context(assume_finiteTrue): with sklearn.config_context(assume_finiteFalse): assert_all_finite([float(nan)]) # ValueError: Input contains NaN1.4 线程隔离与配置拷贝源码级原理config_context的实现sklearn/_config.py非常简洁进入时调用get_config()保存快照set_config()应用新值yield之后在finally中通过set_config(**old_config)恢复。这意味着所有配置项都会被恢复到 with 之前的状态而不只是被修改的那几个。get_config()返回的是线程本地配置的副本.copy()因此外部拿到字典后无论怎么修改都不会污染真实配置sklearn/_config.py。而set_config对每个参数都做了is not None判断所以只更新显式指定的键——这是选择性更新全局配置的关键机制。二、性能与内存相关的环境变量以下环境变量必须在import sklearn之前设置因为它们会在_global_config初始化时被读取见上文源码。2.1SKLEARN_ASSUME_FINITE对应set_config(assume_finite...)的默认值。默认未设置时等价于False即 scikit-learn 会校验输入数据不含NaN或无穷大设为任意非空字符串如SKLEARN_ASSUME_FINITE1则默认跳过有限性校验换取性能但可能把问题留到更底层并导致崩溃。2.2SKLEARN_WORKING_MEMORY对应working_memory的默认值全局默认1024 MiB。一些向量化计算会使用大量临时内存可能耗尽系统内存working_memory允许在可以分块执行的计算中提示临时数组的最大尺寸并行时按每个任务计。典型分块操作是sklearn.metrics.pairwise_distances_chunked它按行分块计算成对距离矩阵的逐行归约。文档 doc/computing/computational_performance.rst 给出了用法import sklearn with sklearn.config_context(working_memory128): pass # 在此分块计算限制临时内存为 128 MiB2.3SKLEARN_PAIRWISE_DIST_CHUNK_SIZE成对距离分块调优默认值256指底层PairwiseDistancesReductions实现中每个分块包含的行向量数量。文档指出默认 256 在多数机器上已被证明足够合适追求极致性能的用户可以尝试 2 的幂次如 64、128、256、512、1024…进行调优目标是匹配硬件尤其是 CPU 缓存大小以获得最好的并行行为官方定位它是便于内部基准测试与调试的配置普通终端用户通常不需要改动。配套的enable_cython_pairwise_dist默认True控制是否启用加速的成对距离归约后端两者均从 1.1 版本引入sklearn/_config.py。注意这两个配置同样可以通过set_config/config_context在运行时修改。三、测试与 CI 相关的环境变量这一组变量控制 scikit-learn 测试套件的可复现性与覆盖范围是第三方包维护者和 CI 配置的关键。3.1SKLEARN_SEED全局随机数种子设置运行测试时全局随机数生成器的种子。默认行为可在 sklearn/init.py 的setup_module中看到若未设置该变量会从np.random.uniform()随机取一个值然后同时np.random.seed(_random_seed)和random.seed(_random_seed)并打印I: Seeding RNGs with ...。scikit-learn 的测试约定是每个测试应显式使用自己的独立 RNG 实例而不是依赖 numpy 或 Python 标准库的 RNG 单例从而保证测试结果与执行顺序无关。但个别测试可能忘记显式播种SKLEARN_SEED正是用来控制这些单例初始状态的兜底手段。3.2SKLEARN_TESTS_GLOBAL_RANDOM_SEEDglobal_random_seedfixture 的种子控制这是测试可复现性机制的核心。使用global_random_seedfixture 的测试都承诺对于 099含之间的任意种子值测试都应确定性通过。取值规则来自文档取值行为SKLEARN_TESTS_GLOBAL_RANDOM_SEED42用固定种子 42 运行SKLEARN_TESTS_GLOBAL_RANDOM_SEED40-42用 40、41、42 三个种子依次运行SKLEARN_TESTS_GLOBAL_RANDOM_SEEDall用 099 全部 100 个种子运行耗时很长只建议用于单个测试未设置确定性使用种子 42种子范围被限制在 [0, 99]因为不可能写出对任意种子都成立的测试限制范围是为了避免 CI 上随机失败。源码层面fixture 的参数化由sklearn/conftest.py的pytest_generate_tests实现sklearn/conftest.py默认random_seeds [42]若变量为all则取list(range(100))若包含-则解析为区间最后校验所有种子落在 [0, 99]越界直接抛ValueError。只要测试函数签名中包含global_random_seedpytest 就会自动按此参数化。在 nightly CI 构建中这个变量会在上述范围内随机抽取让整套测试在不同种子下滚动运行——既保证长时间内覆盖多种子又控制单次全量测试的时长从而检验断言不依赖特定种子。而 PR 的 CI 配置不应设置此变量保持默认 42避免贡献者成为与自身改动无关的种子敏感回归的第一个受害者——正如文档所说只有盯着 nightly 构建的维护者才会被这个变量烦扰。编写使用该 fixture 的新测试时本地用以下命令验证其对所有合法种子都确定性通过SKLEARN_TESTS_GLOBAL_RANDOM_SEEDall pytest -v -k test_your_test_name仓库的 CI 脚本 build_tools/github/test_script.sh 也展示了组合用法当用-k选择特定测试运行时会同时把SKLEARN_TESTS_GLOBAL_RANDOM_SEED设为all。3.3SKLEARN_SKIP_NETWORK_TESTS当变量值为0时启用需要网络访问的测试未设置或设为非 0 值时跳过网络测试。默认是跳过。在sklearn/conftest.py中该变量同时控制数据集下载 fixture 的行为download_if_missing environ.get(SKLEARN_SKIP_NETWORK_TESTS, 1) 0sklearn/conftest.py且pytest_collection_modifyitems会在收集阶段跳过/标记所有依赖网络数据的测试sklearn/conftest.py。3.4SKLEARN_RUN_FLOAT32_TESTS默认未设置时使用global_dtypefixture 的测试只跑 float64 数据设为1时同时跑 float32 数据。源码见 sklearn/conftest.pyglobal_dtypefixture 参数化为[np.float32, np.float64]其中 float32 参数带有pytest.mark.skipif(environ.get(SKLEARN_RUN_FLOAT32_TESTS, 0) ! 1, ...)标记。CI 中甚至支持通过提交信息触发例如 build_tools/github/test_script.sh 中if [[ $COMMIT_MESSAGE ~ \[float32\] ]]; then export SKLEARN_RUN_FLOAT32_TESTS1; fi。3.5SKLEARN_WARNINGS_AS_ERRORS把警告升级为错误设置后测试和文档构建中的警告会被当作错误处理。默认未设置或为0不启用CI 构建常设1用于捕获依赖库如 numpy、scipy发出的弃用警告并促使代码适配。与-Wsphinx-build参数只捕获 rst 文件语法警告不同SKLEARN_WARNINGS_AS_ERRORS1的文档构建检查的是运行示例时是否产生警告。底层机制sklearn/utils/_testing.py的_get_warnings_filters_info_listsklearn/utils/_testing.py维护一份WarningInfo列表默认把DeprecationWarning、FutureWarning、VisibleDeprecationWarning升级为error同时对第三方库如 pyamg、pytest-cov、pandas、dateutil、joblib、seaborn、scipy 等的已知无害警告配以ignore过滤器——因为警告来自第三方库时我们无能为力。turn_warnings_into_errors()与get_pytest_filterwarning_lines()都基于这份列表sklearn/utils/_testing.pypytest 侧则在sklearn/conftest.py的pytest_configure中把过滤行注入filterwarnings配置sklearn/conftest.py。四、构建与调试相关的环境变量4.1SKLEARN_ENABLE_DEBUG_CYTHON_DIRECTIVES设为非 0 值时构建时 Cython 的boundscheck指令被设为True用于定位段错误segfault。这是 Cython 的边界检查开启后数组越界访问会抛出 Python 异常而不是静默产生非法内存访问。在 Meson 构建系统中该变量通过sklearn/meson.build在编译期被读取并作为-X boundscheck参数传给 Cythonsklearn/meson.build同时注释说明这是为兼容 setuptools 构建保留的临时方案未来应迁移为 meson option 或 buildtype。4.2SKLEARN_SKIP_OPENMP_TEST设为任意值时跳过检查 scikit-learn 是否以 OpenMP 并行支持构建的测试。对应的测试在 sklearn/tests/test_build.py通过sklearn.utils._openmp_helpers._openmp_parallelism_enabled()检查若失败会给出包含SKLEARN_SKIP_OPENMP_TEST提示的错误信息。4.3SKLEARN_TEST_NO_OPENMPCI 中设为true时用于在 macOS 上不带 OpenMP 支持构建并测试 scikit-learn。相关逻辑见 build_tools/github/install.sh主要服务于验证无 OpenMP 环境下库的可移植性。此外sklearn/__init__.py在导入时还会处理与 OpenMP 运行时相关的 macOS 兼容性设置KMP_DUPLICATE_LIB_OK、KMP_INIT_AT_FORK等sklearn/init.py。五、总结与最佳实践速查类别环境变量默认值关键用途性能SKLEARN_ASSUME_FINITE关跳过输入有限性校验换取速度性能SKLEARN_WORKING_MEMORY1024 MiB限制分块计算的临时内存性能SKLEARN_PAIRWISE_DIST_CHUNK_SIZE256成对距离归约的分块大小用 2 的幂调优测试SKLEARN_SEED随机控制测试全局 RNG 单例初始状态测试SKLEARN_TESTS_GLOBAL_RANDOM_SEED42global_random_seedfixture 参数化42/区间/all测试SKLEARN_SKIP_NETWORK_TESTS跳过设为0启用网络测试与数据集下载测试SKLEARN_RUN_FLOAT32_TESTS仅 float64设为1额外跑 float32测试/CISKLEARN_WARNINGS_AS_ERRORS关测试与文档构建中警告升级为错误构建SKLEARN_ENABLE_DEBUG_CYTHON_DIRECTIVES关开启 Cython boundscheck 定位段错误构建SKLEARN_SKIP_OPENMP_TEST不跳过跳过 OpenMP 构建检查测试构建SKLEARN_TEST_NO_OPENMP关macOS 上无 OpenMP 构建测试最佳实践小结所有SKLEARN_*环境变量都必须在import sklearn之前设置因为默认值在导入时即被固化到_global_config运行时微调优先使用config_context临时、自动恢复而非set_config全局、永久避免污染其他代码路径编写新测试时只要涉及随机性就使用global_random_seedfixture并本地跑SKLEARN_TESTS_GLOBAL_RANDOM_SEEDall验证多种子确定性第三方包维护者复跑 scikit-learn 测试时保持默认种子 42、跳过网络测试即可获得确定性且不依赖网络的结果遇到难复现的段错误时可用SKLEARN_ENABLE_DEBUG_CYTHON_DIRECTIVES1重新构建定位。更详细的set_config/config_context参数说明可直接查看 sklearn/_config.py测试 fixture 的参数化逻辑参见 sklearn/conftest.py警告过滤器清单见 sklearn/utils/_testing.py。 /output_article【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表