示例工程【免费下载链接】tutorialsPyTorch tutorials.项目地址https://gitcode.com/gh_mirrors/tuto/tutorials点击查看免费下载本篇指南基于 PyTorch tutorials 仓库中的 recipes_source/xeon_run_cpu.rst 编写系统讲解 Intel® Xeon® 可扩展处理器上影响 PyTorch 推理性能的关键配置并深入介绍仓库提供的torch.backends.xeon.run_cpu启动脚本它通过线程亲和性、Intel® OpenMP 预加载、NUMA 绑定与 TCMalloc/JeMalloc 内存分配器预加载等机制帮助用户在单实例与多实例场景下获得接近峰值的 CPU 推理性能。读完本文你将掌握lscpu/numactl/taskset的用法、OpenMP 与内存分配器的选型安装以及run_cpu脚本全部参数的含义与典型命令行组合。优化概览为什么需要 run_cpu 脚本在 Intel® Xeon® 可扩展处理器上执行 PyTorch 推理时有多项配置会影响最终性能其中最主要的是两类线程管理配置线程亲和性thread affinity并预加载 Intel® OpenMP 运行时库libiomp内存管理配置 NUMA 绑定NUMA binding并预加载优化内存分配库TCMalloc、JeMalloc。torch.backends.xeon.run_cpu脚本将上述两类优化封装为统一入口同时还提供计算资源分配的调优参数覆盖单实例与多实例两种场景帮助用户针对具体负载试出资源利用的最优组合。该脚本的用法通过python -m torch.backends.xeon.run_cpu调用属于 PyTorch 标准安装自带的torch.backends后端工具。理解 NUMA多插槽服务器的内存访问模型随着单插槽内 CPU 核数不断增加多个核心共享内存控制器会导致内存访问竞争程序可能因内存总线繁忙而停滞。为此引入了非一致性内存访问Non-Uniform Memory AccessNUMA与一致性内存访问UMA所有内存对所有核心访问速度相同不同NUMA 将内存划分为多个组每组内存直接挂接在某个插槽的集成内存控制器上成为该插槽的本地内存核心访问本地内存远快于访问远端内存因此避免跨插槽计算、将内存访问尽量限定在本地是提升多路服务器性能的关键。在 Linux 上可通过lscpu命令查看机器上的核心数、插槽数以及 NUMA 分布。以下是在一台搭载 Intel® Xeon® CPU Max 9480 的机器上执行lscpu的输出示例$ lscpu ... CPU(s): 224 On-line CPU(s) list: 0-223 Vendor ID: GenuineIntel Model name: Intel (R) Xeon (R) CPU Max 9480 CPU family: 6 Model: 143 Thread(s) per core: 2 Core(s) per socket: 56 Socket(s): 2 ... NUMA: NUMA node(s): 2 NUMA node0 CPU(s): 0-55,112-167 NUMA node1 CPU(s): 56-111,168-223 ...对照该输出可以得出三条关键结论机器检测到 2 个插槽每个插槽含 56 个物理核开启超线程Hyper-Threading后每个物理核可处理 2 个线程即每个插槽有 56 个逻辑核整机共 224 个 CPU 核心物理核通常排在逻辑核之前核心 0-55 是第一个 NUMA 节点的物理核核心 56-111 是第二个 NUMA 节点的物理核逻辑核随后编号核心 112-167 对应第一个 NUMA 节点的逻辑核核心 168-223 对应第二个 NUMA 节点的逻辑核。实践建议运行计算密集的 PyTorch 程序时通常应避免使用逻辑核超线程核以获得更好的性能。使用 numactl 控制 NUMA 策略Linux 提供numactl工具允许用户为进程或共享内存设置 NUMA 策略即以指定的 NUMA 调度或内存放置策略运行进程。同一插槽内的核心共享高速缓存因此避免跨插槽计算、将内存访问限定在本地是性能优化的基本原则。numactl在较新的 Linux 发行版中通常已预装若缺失可手动安装Ubuntu$ apt-get install numactlCentOS$ yum install numactl使用 taskset 设置 CPU 亲和性Linux 的taskset是另一款实用工具可设置或查询运行中进程的 CPU 亲和性。大多数 Linux 发行版已预装若缺失Ubuntu$ apt-get install util-linuxCentOS$ yum install util-linux使用 Intel® OpenMP 运行时库OpenMP 是一种多线程并行实现主线程一系列连续执行的指令派生指定数量的子线程系统将任务划分给这些线程并发执行运行时环境负责把线程分配到不同处理器。用户可通过环境变量控制 OpenMP 行为以适应具体负载这些设置由 OMP 库读取并执行。默认情况下PyTorch 使用 GNU OpenMP 库GNU libgomp进行并行计算。在 Intel® 平台上Intel® OpenMP 运行时库libiomp提供 OpenMP API 规范支持相比 libgomp 通常能带来更多性能收益。安装方式$ pip install intel-openmp或$ conda install mkl选择优化的内存分配器内存分配器同样显著影响性能更高效的内存使用能减少不必要的分配/销毁开销从而加快执行。实践经验表明对于深度学习负载TCMalloc或JeMalloc通过尽可能复用内存通常比默认的malloc操作获得更好的性能。安装 TCMallocUbuntu$ apt-get install google-perftoolsCentOS$ yum install gperftoolsconda 环境$ conda install conda-forge::gperftools安装 JeMallocUbuntu$ apt-get install libjemalloc2CentOS$ yum install jemallocconda 环境$ conda install conda-forge::jemallocQuick Startrun_cpu 脚本的典型用法以下四组命令覆盖最常见的启动场景程序参数通过program.py [program_args]透传1. 单实例、单核推理仅使用 Core #0$ python -m torch.backends.xeon.run_cpu --ninstances 1 --ncores-per-instance 1 program.py [program_args]2. 单实例、绑定单个 CPU 节点NUMA socket$ python -m torch.backends.xeon.run_cpu --node-id 0 program.py [program_args]3. 多实例推理在 112 核 CPU 上运行 8 个实例每个实例 14 核$ python -m torch.backends.xeon.run_cpu --ninstances 8 --ncores-per-instance 14 program.py [program_args]4. 吞吐模式每个 CPU 节点上的全部核心组成一个实例$ python -m torch.backends.xeon.run_cpu --throughput-mode program.py [program_args]关于“实例”的说明此处的 “instance” 并非指云主机实例。该脚本以单个进程运行进程内部基于多个线程派生出多个 “instances”在此语境下 “instance” 相当于一组线程的集合。run_cpu 脚本参数详解可通过如下命令查看完整参数列表与用法说明$ python -m torch.backends.xeon.run_cpu –h usage: run_cpu.py [-h] [--multi-instance] [-m] [--no-python] [--enable-tcmalloc] [--enable-jemalloc] [--use-default-allocator] [--disable-iomp] [--ncores-per-instance] [--ninstances] [--skip-cross-node-cores] [--rank] [--latency-mode] [--throughput-mode] [--node-id] [--use-logical-core] [--disable-numactl] [--disable-taskset] [--core-list] [--log-path] [--log-file-prefix] program [program_args]位置参数positional argumentsknob说明program待启动程序/脚本的完整路径program_args传递给待启动程序/脚本的输入参数通用选项knob类型默认值说明-h,--help--显示帮助信息并退出-m,--module--将每个进程解释为以 “python -m” 方式执行的 Python 模块--no-pythonboolFalse不在程序前拼接 “python”直接执行适用于非 Python 脚本--log-pathstr指定日志文件目录默认空串表示不写日志文件--log-file-prefixstrrun日志文件名的前缀启用或禁用优化的选项knob类型默认值说明--enable-tcmallocboolFalse启用TCMalloc内存分配器--enable-jemallocboolFalse启用JeMalloc内存分配器--use-default-allocatorboolFalse使用默认内存分配器既不使用TCMalloc也不使用JeMalloc--disable-iompboolFalse默认在已安装的情况下使用 Intel® OpenMP 库设置该标志则禁用内存分配器的自动选择逻辑内存分配器会影响性能。若用户未显式指定期望的分配器run_cpu脚本会按TCMalloc JeMalloc PyTorch 默认分配器的顺序探测系统中已安装的分配器并采用第一个匹配到的。用户可在安装环节按此优先级规划或直接通过--enable-tcmalloc/--enable-jemalloc/--use-default-allocator显式指定。实例数量与计算资源分配的选项knob类型默认值说明--ninstancesint0实例数量--ncores-per-instanceint0每个实例使用的核心数--node-idint-1多实例时使用的节点 ID默认使用全部节点--core-liststr指定核心列表格式为core_id, core_id, ....或核心范围core_id-core_id默认使用全部核心--use-logical-coreboolFalse默认只使用物理核设置该标志启用逻辑核--skip-cross-node-coresboolFalse防止工作负载运行在跨 NUMA 节点的核心上--rankint-1指定实例索引为该 rank 分配ncores_per_instance否则按顺序依次分配给各实例--multi-instanceboolFalse在多插槽 CPU 服务器上快速启动多实例负载的快捷开关--latency-modeboolFalse延迟模式快捷开关使用全部物理核每个实例 4 核--throughput-modeboolFalse吞吐模式快捷开关使用全部物理核每个实例绑定 1 个 NUMA 节点--disable-numactlboolFalse默认使用numactl命令控制 NUMA 访问设置该标志则禁用--disable-tasksetboolFalse禁用taskset命令的使用脚本设置的环境变量run_cpu脚本会为被启动的进程设置以下环境变量环境变量取值LD_PRELOAD依据设置的选项可能将lib/libiomp5.so、lib/libjemalloc.so、lib/libtcmalloc.so追加到LD_PRELOADKMP_AFFINITY若预加载了 libiomp5.soKMP_AFFINITY会被设置为granularityfine,compact,1,0KMP_BLOCKTIME若预加载了 libiomp5.soKMP_BLOCKTIME被设置为1OMP_NUM_THREADS取值为ncores_per_instanceMALLOC_CONF若预加载了 libjemalloc.soMALLOC_CONF被设置为oversize_threshold:1,background_thread:true,metadata_thp:auto环境变量优先级脚本会尊重用户预先设置的环境变量。例如如果在运行脚本前已设置了上述环境变量脚本不会覆盖这些值。因此可通过预先 export 自定义KMP_AFFINITY、OMP_NUM_THREADS等变量来覆盖脚本默认行为。结合仓库的纵深理解参数与底层工具的对应关系run_cpu脚本对numactl与taskset的启用/禁用开关直接对应仓库中 recipes_source/xeon_run_cpu.rst 所介绍的 NUMA 绑定与线程亲和性原理--disable-numactl关闭 NUMA 策略控制相当于不再执行numactl --cpunodebind/--membind类绑定--disable-taskset则关闭 CPU 亲和性设置。脚本通过LD_PRELOAD机制注入libiomp5.so、libjemalloc.so、libtcmalloc.so与 recipes_source/recipes/tuning_guide.py 中 “CPU specific optimizations” 一节描述的手工优化手段export LD_PRELOADpath/libiomp5.so:$LD_PRELOAD、KMP_AFFINITYgranularityfine,compact,1,0、KMP_BLOCKTIME1等完全一致——脚本的价值在于把这一系列手工设置自动化、参数化避免用户逐一 export。与手动优化命令的对照如果你不想使用脚本仓库的调优指南还给出了等价的底层命令可作为理解脚本行为的参考NUMA 绑定将脚本绑定到第 N 个 NUMA 节点避免跨插槽内存访问$ numactl --cpunodebindN --membindN python pytorch_scriptIntel OpenMP 库预加载$ export LD_PRELOADpath/libiomp5.so:$LD_PRELOAD $ export KMP_AFFINITYgranularityfine,compact,1,0 $ export KMP_BLOCKTIME1内存分配器预加载$ export LD_PRELOADjemalloc.so/tcmalloc.so:$LD_PRELOADOMP_NUM_THREADS决定 OpenMP 计算使用的线程数是影响并行计算性能最直接的开关KMP_AFFINITY将 OpenMP 线程绑定到物理处理单元KMP_BLOCKTIME则设置线程在完成并行区域后、进入休眠前等待的毫秒数设置为 1 或 0 通常能获得良好性能。这些语义同样被run_cpu脚本继承并通过--ncores-per-instance、--use-logical-core等参数以更易用的方式暴露。在项目中的定位该教程在仓库的 recipes_index.rst 中被归类为 “Performance”Model-Optimization 标签条目卡片描述为 “How to use run_cpu script for optimal runtime configurations on Intel® Xeon CPUs”与同类的 Performance Tuning Guide 共同构成 CPU 性能优化主题。建议将本文与 tuning guide 的 CPU 章节NUMA 控制、OpenMP 利用、内存分配器切换配合阅读前者提供自动化脚本后者提供底层原理与手工替代方案。结论本文围绕 Intel® Xeon® 可扩展处理器上的 PyTorch 推理优化系统梳理了三类关键技术NUMA 访问控制通过numactl/taskset将计算与内存访问限定在本地节点避免跨插槽开销Intel® OpenMP 运行时库以libiomp5.so替代默认 GNU libgomp配合KMP_AFFINITY、KMP_BLOCKTIME获得更好的多线程并行效果优化内存分配器TCMalloc/JeMalloc通过内存复用减少分配开销。torch.backends.xeon.run_cpu脚本将上述优化自动化自动配置线程亲和性、预加载 Intel OpenMP、绑定 NUMA、按优先级探测内存分配器并以--ninstances、--ncores-per-instance、--node-id、--core-list、--latency-mode、--throughput-mode等参数覆盖单实例与多实例场景帮助用户针对具体负载快速尝试最优的资源分配组合。掌握该脚本的参数语义与底层机制后即可在 Intel® Xeon® 平台上显著提升 PyTorch 应用的推理效率。赞分享示例工程【免费下载链接】tutorialsPyTorch tutorials.项目地址https://gitcode.com/gh_mirrors/tuto/tutorials点击查看免费下载相关推荐Intel® Extension for PyTorch* v2.6.0cpu为英特尔®至强®6平台带来全面AI优化Intel® Extension for PyTorch v2.6.0cpu为英特尔®至强®6平台带来全面AI优化 Intel® Extension forIntel® Deep Learning Streamer (Intel® DL Streamer) 使用教程Intel® Deep Learning Streamer Intel® DL Streamer 使用教程 1. 项目介绍 Intel® Deep Learni音视频计算机视觉深度学习【亲测免费】 Intel® Performance Counter Monitor (Intel® PCM) 使用教程Intel® Performance Counter Monitor Intel® PCM 使用教程 1. 项目介绍 Intel® Performance Co运维上一篇OPA 错误排查指南Rego 解析、编译与求值三阶段错误分类与修复实战下一篇明日方舟自动化工具完整指南让 arknights-mower 承包你的长草日常创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考