Numba 环境变量完全指南:从 `.numba_config.yaml` 到 `NUMBA_*` 全量配置解析
编译器高性能计算【免费下载链接】numbaNumPy aware dynamic Python compiler using LLVM项目地址https://gitcode.com/gh_mirrors/nu/numba点击查看免费下载Numba 通过一组以NUMBA_前缀开头的环境变量允许开发者在不修改代码的前提下动态改变 JIT 编译、调试输出、并行执行、缓存与 CUDA 行为同时支持通过名为.numba_config.yaml的配置文件持久化长期偏好。本文以 docs/source/reference/envvars.rst 为骨架结合 numba/core/config.py 等源码实现系统梳理全部配置项的取值、默认值与底层生效机制帮助你按需调控 Numba 的编译管线、调试信息和运行时线程模型。一、配置加载机制环境变量与配置文件如何协作Numba 的绝大多数配置项默认取值为整数且为0文档中未特别说明时均如此。为了长期保存偏好Numba 支持使用 YAML 格式的配置文件其加载逻辑全部集中在 numba/core/config.py 的_EnvReloader.update()第 116–156 行中两条规则非常清晰配置文件位于解释器启动目录文件必须命名为.numba_config.yaml且存在于 Python 解释器被调用的当前目录。使用该功能的前提是环境中已安装pyyaml若文件存在但缺少 YAML 解析能力Numba 会发出警告提示安装pyyaml。优先级环境变量 配置文件配置文件先被读取随后代码遍历os.environ中所有以NUMBA_开头的变量并覆盖同名配置源码第 143–146 行的clobber逻辑。因此配置文件适合固化长期偏好环境变量适合临时覆盖。配置文件内容是去掉NUMBA_前缀后的变量名到值的 YAML 字典。例如永久开启开发者模式与 CFG 打印developer_mode: 1 dump_cfg: 1又比如终端为黑底时可永久设置适合深色背景的错误配色color_scheme: dark_bg从源码看文件中的键会被统一转换为NUMBA_ k.upper()再参与后续解析第 140–141 行因此键名大小写不敏感。变量解析的容错行为所有变量均通过_readenv(name, ctor, default)统一解析第 180–192 行先取环境变量若未定义则返回默认值若定义但无法用构造函数解析则发出RuntimeWarning并回退到默认值不会导致程序崩溃。此外numba/core/compiler.py 在每次编译时会调用config.reload_config()重新读取环境支持进程内按需刷新配置。二、JIT 标志全局覆盖NUMBA_BOUNDSCHECKNUMBA_BOUNDSCHECK是唯一被归入 Jit flags 的全局开关用于全局覆盖jit装饰器的boundscheck标志设为1全局启用数组越界检查设为0全局禁用未设置或为空字符串回退到jit(boundscheck...)传入的装饰器标志。其实现位于 numba/core/base.pyenable_boundscheck属性会优先返回config.BOUNDSCHECK若其不为None否则使用函数自身的_boundscheck标志。文档同时提醒受 Numba 自身限制越界检查产生的异常信息与 NumPy 不完全一致若设置NUMBA_FULL_TRACEBACKS1终端会打印包含轴axis、索引index与形状shape信息的完整异常消息。三、调试与输出控制编译过程完全可视化这类变量决定 JIT 函数编译期间打印何种信息是排查 Numba 内部行为最常用的入口。先看控制错误报告体验的基础项变量取值/默认作用NUMBA_DEVELOPER_MODE整数默认0开发者模式产生完整 traceback并关闭帮助提示NUMBA_FULL_TRACEBACKS整数默认跟随NUMBA_DEVELOPER_MODE异常时输出完整 tracebackNUMBA_SHOW_HELP整数默认0出错时显示获取帮助的资源信息NUMBA_DISABLE_ERROR_MESSAGE_HIGHLIGHTING整数默认0禁用错误消息高亮CI 上跑测试套件时常用NUMBA_DISABLE_PERFORMANCE_WARNINGS整数默认0关闭NumbaPerformanceWarning类性能警告错误消息配色方案NUMBA_COLOR_SCHEME该变量字符串类型默认no_color改变错误报告配色需要安装colorama包才能生效。合法取值no_color不加颜色仅使用粗体字重默认dark_bg适合深色背景终端light_bg适合浅色背景终端blue_bg适合蓝色背景终端jupyter_nb适合 Jupyter Notebook 环境。这正是前文配置文件示例中color_scheme: dark_bg的应用场景——把配色偏好固化进.numba_config.yaml。dump 系列逐层查看编译中间产物Numba 编译器依次经过 字节码 → 控制流图CFG→ Numba IR → SSA 形式 → LLVM IR → 优化后的 LLVM IR → 原生汇编每一层都有对应的 dump 开关变量默认输出内容NUMBA_DUMP_BYTECODE跟随DEBUG_FRONTENDPython 字节码NUMBA_DUMP_CFG跟随DEBUG_FRONTEND控制流图NUMBA_DUMP_IR跟随DEBUG_FRONTENDNumba 中间表示IRNUMBA_DUMP_SSA跟随DEBUG_FRONTEND/DEBUG_TYPEINFER转换到静态单赋值SSA形式后的 IRNUMBA_DUMP_LLVM跟随DEBUG未优化的 LLVM 汇编通常极冗长推荐用DUMP_OPTIMIZEDNUMBA_DUMP_FUNC_OPT跟随DEBUGLLVM 函数优化 pass 之后、模块优化 pass 之前的汇编主要用于 Numba 自身开发NUMBA_DUMP_OPTIMIZED跟随DEBUG全部优化 pass 完成后的 LLVM 汇编含原始函数及以wrapper.开头的 CPython 兼容包装函数函数通常已被内联进包装函数NUMBA_DUMP_ASSEMBLY跟随DEBUG编译函数的原生汇编代码NUMBA_DUMP_ANNOTATION默认0编译函数的类型标注NUMBA_HIGHLIGHT_DUMPS默认0配合已安装的pygments对 Numba IR、LLVM IR 与汇编 dump 做语法高亮其中DEBUG_FRONTEND、DEBUG_TYPEINFER、DEBUG是更粗粒度的总开关NUMBA_DEBUG打印编译过程全部可能的调试信息、NUMBA_DEBUG_FRONTEND打印前端操作直到生成 Numba IR 的调试信息、NUMBA_DEBUG_TYPEINFER打印类型推断调试信息。NUMBA_TRACE非零时跟踪函数进入/退出及参数、返回值则对应运行期调用跟踪。IR 按 pass 打印NUMBA_DEBUG_PRINT_AFTERNUMBA_DEBUG_PRINT_AFTER字符串默认none可在指定 pass 之后打印 Numba IR用于定位某个 pass 对 IR 的改动。合法值任意 pass 名称取自该类.name()方法返回的名字多个 pass 名以逗号分隔如foo_pass,bar_pass令牌all在所有 pass 之后打印。对应的NUMBA_DEBUG_PRINT_BEFORE与NUMBA_DEBUG_PRINT_WRAP也在源码 config.py 中注册分别用于 pass 前打印与前后包裹打印。NRT 运行时调试内存与引用计数针对 Numba 运行时NRT的引用计数提供三组变量NUMBA_DEBUG_NRT非零时打印运行时引用计数操作调试信息同时开启 NRT 分配区域的标记字节填充——分配时写0xCB、释放时写0xDE用于排查内存泄漏NUMBA_DEBUG_NRT_STACK_LIMIT配合NUMBA_DEBUG_NRT使用打印生成引用计数操作时调用栈的n帧便于定位产生这些操作的代码注意它改变 ABI 调用接口不是缓存友好的使用后需要清理缓存并重新编译默认0NUMBA_NRT_STATS非零时启用 NRT 统计计数器计数器在导入 Numba 时进程级开启且为原子操作。调试器、分析器与覆盖率NUMBA_DEBUGINFO非零时把jit的debug选项默认值设为开启全应用调试会显著增加每个编译函数的内存占用默认值等于NUMBA_ENABLE_PROFILING的值NUMBA_EXTEND_VARIABLE_LIFETIMES非零时把变量生命周期延长到其所在基本块的末尾配合NUMBA_DEBUGINFO便于值的内省默认0NUMBA_GDB_BINARY指定 Numba gdb 支持使用的gdb二进制可给完整路径/path/to/binary或仅二进制名按标准路径规则搜索默认gdbNUMBA_ENABLE_PROFILING开启 LLVM 的 JIT events 以支持对 jitted 函数的性能剖析在某些 profiler 下自动启用NUMBA_ENABLE_SYS_MONITORING控制 Numba 对 Pythonsys.monitoring的支持默认关闭0开启后允许使用sys.monitoring的剖析工具当前测试过cProfile其他工具不保证与 Numba 代码协同工作仅 Python 3.12 有效否则无效果NUMBA_CHROME_TRACE定义后启用 chrome tracing值为输出的 json 文件路径可用 Chromium 系浏览器在chrome://tracing/打开不支持多进程应用NUMBA_LLVM_PASS_TIMINGS设为1时记录 LLVM pass 耗时默认0NUMBA_JIT_COVERAGE设为1时 JIT 编译器向覆盖率工具报告已编译的源码行默认0NUMBA_DISABLE_TYPEINFER_FAIL_CACHE设为真值时禁用类型推断中失败函数解析的缓存默认 false。不推荐常规使用——该缓存仅应在调试时临时关闭依赖禁用缓存的行为不受支持可能在未来版本中失效。并行parfors相关调试针对njit(parallelTrue)的并行变换提供细化输出NUMBA_DEBUG_ARRAY_OPT打印与parallelTrue相关的数组处理调试信息NUMBA_DEBUG_ARRAY_OPT_RUNTIME打印运行时调度器调试信息NUMBA_DEBUG_ARRAY_OPT_STATS打印统计信息——多少算子/调用被转换为并行 for 循环、多少被融合NUMBA_PARALLEL_DIAGNOSTICS设为 1–4 的整数时向 STDOUT 输出并行变换诊断信息值越大越详细。四、编译选项优化级别、向量化与 CPU 目标优化级别NUMBA_OPTNUMBA_OPT控制优化级别通常直接传给 LLVM合法值为0、1、2、3大致对应命令行编译工具的-O{value}另有 Numba 特有取值max其效果是在引用计数操作剪枝 pass 前后均以优化级别 3 运行某些场景能提升性能某些场景反而变差编译时间亦受影响。默认值为3。源码实现值得关注config.py 中的_OptLevel类继承自int但保留原始值通过is_opt_max属性识别max_process_opt_level会对非法值如4、-O2抛出ValueError提示仅支持0, 1, 2, 3, max。这让NUMBA_OPTmax在整型上下文中仍可安全参与运算。向量化与指令集NUMBA_LOOP_VECTORIZE非零时启用 LLVM 循环向量化默认1NUMBA_SLP_VECTORIZE非零时启用 LLVM 超字级并行SLP向量化。文档与源码config.py一致指出该特性曾自 issue #8705 起偶发导致 LLVM 错误编译因此默认关闭0NUMBA_ENABLE_AVX非零时在 LLVM 中启用 AVX 优化。默认由avx_default()第 379–395 行动态决定先检查操作系统是否支持 AVX解析/proc/cpuinfo的flags再排除corei7-avx、core-avx-i、sandybridge、ivybridge及虚拟机会误报的nocona等已知会因 AVX 变慢的 CPU 名。即 Sandy Bridge/Ivy Bridge 上默认关闭NUMBA_DISABLE_INTEL_SVML非零且 Intel SVML 可用时禁用 SVML。默认值在 32 位平台上为开启IS_32BITS。CPU 目标覆盖与可移植缓存NUMBA_CPU_NAME/NUMBA_CPU_FEATURES覆盖 CPU 与 CPU 特性检测二者会传给 LLVM 配置编译目标。设置NUMBA_CPU_NAMEgeneric时选用该架构的通用 CPU 模型且特性列表默认置空特性格式为feature1,-feature2启用、-禁用例如sse,sse2,-avx,-avx2。可用llc -marchx86 -mattrhelp列出所有可用选项。实用技巧设置NUMBA_CPU_NAMEgeneric可强制所有jit(cacheTrue)函数生成可移植代码同一架构与操作系统内可移植NUMBA_DISABLE_JIT非零时彻底禁用 JIT——jit装饰器退化为 no-op被装饰函数直接调用原始 Python 函数源码 decorators.py 中config.DISABLE_JIT生效适合在 Python 调试器下逐行调试NUMBA_FUNCTION_CACHE_SIZE覆盖内存中保留最近反序列化函数的缓存大小用于 Dask 这类会重复反序列化函数的场景——即使函数不再被引用也保留一定数量以防再次出现。注意它与编译缓存无关实现并非严格 LRU默认128。引用计数剪枝与内存管理NUMBA_LLVM_REFPRUNE_PASS开启 LLVM pass 级别的引用计数剪枝并关闭 Numba 基于正则的实现默认1开启NUMBA_LLVM_REFPRUNE_FLAGS在NUMBA_LLVM_REFPRUNE_PASS开启时配置剪枝子 pass逗号分隔、大小写不敏感合法组合all启用全部子 pass等价于per_bb, diamond, fanout, fanout_raise默认值即allper_bb基本块内剪枝与旧的正则实现相同diamond菱形模式的基本块间剪枝——单入口单出口 CFG 子图入口有 incref、出口对应 decreffanout扇出模式剪枝——单入口多出口 CFG 子图入口 incref、每个出口对应 decreffanout_raise同fanout但允许子图出口节点抛异常而无对应 decrefNUMBA_USE_LLVMLITE_MEMORY_MANAGER控制是否启用 llvmlite 内建内存管理器。默认在 64 位 ARM 平台Apple Silicon macOS、AArch64 Linux启用——那里为保证 ABI 合规大代码模型下 GOT 与文本段放置要求必须使用可显式设1/0强制覆盖仅供调试或临时规避问题默认None跟随系统默认。五、编译缓存选项位置、定位器与调试NUMBA_DEBUG_CACHE非零时打印 JIT 编译缓存的操作信息默认跟随DEBUGNUMBA_CACHE_DIR覆盖缓存目录位置值为合法目录路径。未定义时 Numba 按以下顺序选择见 docs/source/reference/envvars.rst 与缓存实现 numba/core/caching.py树内缓存In-tree把缓存放在源文件旁的__pycache__目录中与.pyc的存放方式一致用户级缓存User-wide用appdirs.user_cache_dir放到用户应用目录IPython 缓存放到IPython.paths.get_ipython_cache_dir()返回目录下的numba_cache。NUMBA_CACHE_LOCATOR_CLASSES覆盖默认缓存定位器类及其顺序逗号分隔的类名列表。内置定位器caching.py 中默认顺序为UserProvidedCacheLocator, InTreeCacheLocator, UserWideCacheLocator, IPythonCacheLocator, ZipCacheLocator包括InTreeCacheLocator在源文件旁的__pycache__中缓存InTreeCacheLocatorFsAgnostic同InTreeCacheLocator但对文件系统时间戳精度差异不敏感文档中标注已弃用建议用InTreeCacheLocatorUserWideCacheLocator缓存在用户级应用目录IPythonCacheLocator缓存在 IPython 专属目录ZipCacheLocator为 zip 文件中的函数提供缓存。自定义定位器可用完整模块路径指定如mymodule.MyCustomLocator。源码 caching.py 显示含.的类名按package.module.Klass动态导入否则从caching模块全局命名空间中查找失败会抛出带NUMBA_CACHE_LOCATOR_CLASSES env variable提示的RuntimeError未定义时使用默认定位器顺序。六、GPUCUDA支持选项NUMBA_DISABLE_CUDA非零时禁用 CUDA 支持默认在 32 位平台自动为1NUMBA_FORCE_CUDA_CC强制 CUDA 计算能力为给定版本major.minor字符串无视实际设备。源码_parse_ccconfig.py用正则(\d)\.(\d)校验格式非法输入抛ValueErrorNUMBA_CUDA_DEFAULT_PTX_CCcuda.compile_ptx编译 PTX 时默认目标计算能力major.minor默认5.0——即当前支持的最新 CUDA 工具包12.4中最低的非弃用计算能力NUMBA_ENABLE_CUDASIM设置后不编译/执行 GPU 代码改用 CUDA Simulator用于调试NUMBA_CUDA_ARRAY_INTERFACE_SYNC是否对通过 CUDA Array Interface 导入对象的流做同步默认1设为0时不进行任何同步由 Numba 与其他 CUDA 库的使用者自行保证流同步正确性NUMBA_CUDA_LOG_LEVEL调试用。无其他日志配置时作为 CUDA API 调用的日志级别默认CRITICAL设为DEBUG可在标准错误上跟踪全部 API 调用NUMBA_CUDA_LOG_API_ARGS设为1时CUDA API 日志除函数名外还包含 Driver API 调用的参数值默认0NUMBA_CUDA_DRIVERCUDA driver 库所在目录路径通常无需设置Numba 可在标准位置找到仅在驱动位于非标准位置时使用NUMBA_CUDA_LOG_SIZECUDA driver API 操作日志缓冲区大小默认1024当 API 错误输出过大被截断如多个长函数名时调大NUMBA_CUDA_VERBOSE_JIT_LOGCUDA driver 是否输出冗长日志消息默认1常规无需修改NUMBA_CUDA_PER_THREAD_DEFAULT_STREAM设为1时默认流为 per-thread 默认流0时为 legacy 默认流默认0。仅在使用 Numba 内部 CUDA 绑定ctypes 绑定时生效使用 NVIDIA 绑定时应改用CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAMNUMBA_CUDA_LOW_OCCUPANCY_WARNINGS网格过小时发出低占用警告默认1开启。判定启发式为gridsize 2 * (SM 数)注意没有警告不代表网格相对 SM 数合理。禁用该警告可减少 JIT 编译期间查询设备 SM 数的 CUDA API 调用NUMBA_CUDA_WARN_ON_IMPLICIT_COPYkernel 以主机内存启动、被迫在设备间复制数据时发出警告默认1NUMBA_CUDA_USE_NVIDIA_BINDING设为1时改用 NVIDIA CUDA Python binding 调用 driver API而非自带 ctypes 绑定默认0关闭因为 NVIDIA 绑定目前缺少对 Per-Thread Default Stream 与 profiler API 的支持。源码 config.py 的validate()还会在请求 NVIDIA 绑定但无法导入cuda时告警并回退且若同时请求 per-thread 默认流会提示改用CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAMNUMBA_CUDA_INCLUDE_PATHCUDA 头文件位置用于将 CUDA C/C 源码链接进 Python kernelLinux 默认/usr/local/cuda/includeWindows 默认$env:CUDA_PATH\include。七、线程控制并行执行的核心旋钮NUMBA_NUM_THREADS线程池大小设置后CPU 并行目标的线程池线程数即取该值必须大于 0与OMP_NUM_THREADS、MKL_NUM_THREADS相互独立。默认值为运行时确定的 CPU 核数可通过numba.config.NUMBA_DEFAULT_NUM_THREADS访问。源码 config.py 的num_threads_default()依次尝试os.sched_getaffinity(0)取亲和性 CPU 数至少为 1、os.cpu_count()最终兜底为 1且一旦线程已启动parallel._is_initialized再修改NUMBA_NUM_THREADS会抛出RuntimeError。运行期还可通过numba.set_num_threads动态调整。NUMBA_THREADING_LAYER选择并发执行库控制 CPU 并行目标vectorize(targetparallel)、guvectorize(targetparallel)与njit(parallelTrue)的并发执行库字符串类型默认default。合法值default按运行时可用性自动选择safefork 与线程均安全需要 TBB 包forksafefork 安全threadsafe线程安全tbb基于 Intel TBBomp基于 OpenMPworkqueue内建的工作共享任务调度器。源码 numba/np/ufunc/parallel.py 展示了完整选择逻辑threadsafe在任意平台优先 TBB、非 macOS 下可用 OMPforksafe在 Linux 上因 GNU OpenMP 非 fork 安全而排除 OMPsafe仅用 TBB。选中后会通过ll.add_symbol注册numba_parallel_for等符号并启动线程。NUMBA_THREADING_LAYER_PRIORITY后端优先级控制上述三类后端的优先级顺序字符串类型默认tbb omp workqueue优先级自左向右递减合法值是三者的任意排列。源码 config.py 将其按空白拆分为列表并在 parallel.py 中校验——长度必须为 3 且集合恰为{tbb, omp, workqueue}否则抛ValueError。八、快速对照速查表类别关键变量默认值JIT 标志NUMBA_BOUNDSCHECK未设置跟随jit标志错误报告NUMBA_COLOR_SCHEMEno_color调试总开关NUMBA_DEBUG/NUMBA_DEBUG_FRONTEND/NUMBA_DEBUG_TYPEINFER0IR 打印NUMBA_DUMP_IR/NUMBA_DUMP_SSA/NUMBA_DEBUG_PRINT_AFTER跟随DEBUG_FRONTEND/noneLLVM 输出NUMBA_DUMP_LLVM/NUMBA_DUMP_OPTIMIZED/NUMBA_DUMP_ASSEMBLY跟随DEBUGNRT 调试NUMBA_DEBUG_NRT/NUMBA_DEBUG_NRT_STACK_LIMIT/NUMBA_NRT_STATS0优化NUMBA_OPT3向量化NUMBA_LOOP_VECTORIZE/NUMBA_SLP_VECTORIZE1/0CPU 目标NUMBA_CPU_NAME/NUMBA_CPU_FEATURES自动检测 / 空缓存NUMBA_CACHE_DIR/NUMBA_CACHE_LOCATOR_CLASSES/NUMBA_FUNCTION_CACHE_SIZE自动三级定位 / 默认定位器 /128并行诊断NUMBA_DEBUG_ARRAY_OPT*/NUMBA_PARALLEL_DIAGNOSTICS0线程NUMBA_NUM_THREADS/NUMBA_THREADING_LAYER/NUMBA_THREADING_LAYER_PRIORITYCPU 核数 /default/tbb omp workqueueCUDANUMBA_DISABLE_CUDA/NUMBA_ENABLE_CUDASIM/NUMBA_FORCE_CUDA_CC32 位平台为1/0/ 未设置九、实践建议与延伸阅读排查编译问题从NUMBA_DUMP_OPTIMIZED1看最终 LLVM IR比NUMBA_DUMP_LLVM1更易读定位具体 pass 改动用NUMBA_DEBUG_PRINT_AFTERpass_name定位引用计数泄漏依次打开NUMBA_DEBUG_NRT1与NUMBA_DEBUG_NRT_STACK_LIMITn调试 Python 逻辑NUMBA_DISABLE_JIT1让代码回退到纯 Python配合调试器逐行执行并行行为调优用NUMBA_PARALLEL_DIAGNOSTICS4观察 parfors 变换细节用NUMBA_THREADING_LAYERtbb显式锁定后端用NUMBA_NUM_THREADS控制线程数CI/自动化场景设置NUMBA_DISABLE_ERROR_MESSAGE_HIGHLIGHTING1与NUMBA_COLOR_SCHEMEno_color避免终端控制字符干扰日志。更多细节可继续阅读 参考手册首页、故障排除指南 与 架构说明环境变量在源码层面的完整定义见 numba/core/config.py缓存定位器实现见 numba/core/caching.py线程层选择逻辑见 numba/np/ufunc/parallel.py。赞分享编译器高性能计算【免费下载链接】numbaNumPy aware dynamic Python compiler using LLVM项目地址https://gitcode.com/gh_mirrors/nu/numba点击查看免费下载相关推荐F3D 3D查看器极速预览与专业渲染的完美结合F3D 3D查看器极速预览与专业渲染的完美结合 在三维设计、工程建模和科学可视化领域快速预览3D模型的需求无处不在。无论是设计师需要查看CAD图纸还是开发后端终极PDFMathTranslate环境变量配置指南从DEEPL_AUTH_KEY到OPENAI_MODEL完全解析终极PDFMathTranslate环境变量配置指南从DEEPL_AUTH_KEY到OPENAI_MODEL完全解析 PDFMathTranslate是一款基AI 应用人工智能NLPOCR终极Stern配置指南从文件到环境变量的完整解析终极Stern配置指南从文件到环境变量的完整解析 Stern是一款强大的Kubernetes多Pod和容器日志查看工具能够帮助开发者轻松追踪和分析Kuber云原生运维CLI可观测性创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考