libnuma详解-A NUMA API for LINUX-Affinity Binding

参考资料

http://developer.amd.com/wordpress/media/2012/10/LibNUMA-WP-fv1.pdf

numa(3) - Linux manual page

numa(3): NUMA policy library - Linux man page

libnuma详解(A NUMA API for LINUX)_叶子心情你不懂的博客-CSDN博客_libnumalibnuma详解(A NUMA API for LINUX)_叶子心情你不懂的博客-CSDN博客_libnumalibnuma详解(A NUMA API for LINUX)_叶子心情你不懂的博客-CSDN博客_libnuma

numa内核和外延

numa安装

sudo apt install libnuma-dev
czl@czl-Vostro-3268:~$ sudo apt install libnuma-dev
[sudo] czl 的密码: 
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
下列【新】软件包将被安装:
  libnuma-dev
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 29 个软件包未被升级。
需要下载 32.3 kB 的归档。
解压缩后会消耗 166 kB 的额外空间。
获取:1 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libnuma-dev amd64 2.0.11-2.1ubuntu0.1 [32.3 kB]
已下载 32.3 kB,耗时 1秒 (40.2 kB/s)  
正在选中未选择的软件包 libnuma-dev:amd64。
(正在读取数据库 ... 系统当前共安装有 190232 个文件和目录。)
正准备解包 .../libnuma-dev_2.0.11-2.1ubuntu0.1_amd64.deb  ...
正在解包 libnuma-dev:amd64 (2.0.11-2.1ubuntu0.1) ...
正在设置 libnuma-dev:amd64 (2.0.11-2.1ubuntu0.1) ...
正在处理用于 man-db (2.8.3-2ubuntu0.1) 的触发器 ...
czl@czl-Vostro-3268:~$ 

查看内容,核心是libnuma.a和libnuma.so

$ dpkg -L libnuma-dev
/.
/usr
/usr/include
/usr/include/numa.h
/usr/include/numacompat1.h
/usr/include/numaif.h
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libnuma.a
/usr/share
/usr/share/doc
/usr/share/doc/libnuma-dev
/usr/share/doc/libnuma-dev/copyright
/usr/share/man
/usr/share/man/man3
/usr/share/man/man3/numa.3.gz
/usr/lib/x86_64-linux-gnu/libnuma.so
/usr/share/doc/libnuma-dev/README
/usr/share/doc/libnuma-dev/TODO
/usr/share/doc/libnuma-dev/changelog.Debian.gz
/usr/share/man/man3/numa_all_nodes.3.gz
/usr/share/man/man3/numa_alloc.3.gz
/usr/share/man/man3/numa_alloc_interleaved.3.gz
/usr/share/man/man3/numa_alloc_interleaved_subset.3.gz
/usr/share/man/man3/numa_alloc_local.3.gz
/usr/share/man/man3/numa_alloc_onnode.3.gz
/usr/share/man/man3/numa_available.3.gz
/usr/share/man/man3/numa_bind.3.gz
/usr/share/man/man3/numa_error.3.gz
/usr/share/man/man3/numa_exit_on_error.3.gz
/usr/share/man/man3/numa_free.3.gz
/usr/share/man/man3/numa_get_interleave_mask.3.gz
/usr/share/man/man3/numa_get_interleave_node.3.gz
/usr/share/man/man3/numa_get_membind.3.gz
/usr/share/man/man3/numa_get_run_node_mask.3.gz
/usr/share/man/man3/numa_interleave_memory.3.gz
/usr/share/man/man3/numa_max_node.3.gz
/usr/share/man/man3/numa_no_nodes.3.gz
/usr/share/man/man3/numa_node_size.3.gz
/usr/share/man/man3/numa_node_to_cpus.3.gz
/usr/share/man/man3/numa_police_memory.3.gz
/usr/share/man/man3/numa_preferred.3.gz
/usr/share/man/man3/numa_run_on_node.3.gz
/usr/share/man/man3/numa_run_on_node_mask.3.gz
/usr/share/man/man3/numa_set_bind_policy.3.gz
/usr/share/man/man3/numa_set_interleave_mask.3.gz
/usr/share/man/man3/numa_set_localalloc.3.gz
/usr/share/man/man3/numa_set_membind.3.gz
/usr/share/man/man3/numa_set_preferred.3.gz
/usr/share/man/man3/numa_set_strict.3.gz
/usr/share/man/man3/numa_setlocal_memory.3.gz
/usr/share/man/man3/numa_tonode_memory.3.gz
/usr/share/man/man3/numa_tonodemask_memory.3.gz

如果是查看deb包内容,则使用命令:

dpkg-deb -c package.deb

NUMA的拓扑结构介绍:

2-socket Intel NUMA topology。CPU 0和CPU 1表示物理处理器包,而不是单个核心,并且作为内存模块的相应数量的NUMA内存节点被部署在对应的处理器的相邻的DIMM卡槽中。

在这里插入图片描述

4-socket Intel E5-4600 NUMA node architecture

在这里插入图片描述

4-socket AMD NUMA node architecture。每个物理处理器包都有两个NUMA节点。

在这里插入图片描述

图4说明了NUMA节点局部性的介绍(其中NUMA节点被认为是给定核心的本地节点)。在本例中,对于物理处理器CPU 0中的core 0,紧挨着该处理器socket的内存被认为是本地NUMA节点。对于core 1,它是物理处理器CPU 1的一部分,被认为是本地的NUMA节点是挂在CPU 1上的节点。每个物理处理器最多可以有8个物理内核和Intel Xeon E5-2600系列处理器,每个socket最多可以有16个逻辑处理器(启用超线程)。为了便于演示,只显示了每个处理器socket上的第一个物理核心
在这里插入图片描述

图5表示了另一种可视化相对NUMA节点局部性的方法。在这里,我们来看另一个简化的示例,其中每个位于socket(表示为CPU 0和CPU 1)中的top-bin E5-2600系列物理处理器都有8个核。出于本示例的目的,每个处理器核都从1到8进行编号,尽管在启动后核心编号策略会发生变化。我们可以看到CPU 0上的第一个核(用绿色表示)是NUMA节点0的本地核。这意味着最靠近CPU 0填充的DIMM插槽是本地的,而最靠近CPU 1填充的DIMM插槽(红色的NUMA node 1)是远程的。这是因为要从CPU 0上的核心1到达NUMA节点1,内存请求必须遍历CPU间QPI链路,并使用CPU 1的内存控制器来访问这个远程节点。额外的跳跃增加了远程NUMA节点内存访问的延迟。

在这里插入图片描述

我们看到了相同的系统,但是现在Linux已经列出了内核。注意,每个核心现在都表示为一个不同的OS CPU,这是Linux引用逻辑处理器的方式。还需要注意的是,第一个OS CPU(0)是第一个物理处理器包上的第一个核心。现在注意,OS CPU 1是第二个物理处理器包上的第一个核心。这种模式在所有可用的内核上都延续,因此对于Intel 2P系统,所有偶数编号的OS cpu都在第一个物理处理器包上,而所有奇数编号的OS cpu都在第二个物理处理器包上。同样重要的是要注意,对于任何特定的NUMA节点,哪些内核是本地的,以及OS cpu和NUMA节点是从0开始编号的。

在这里插入图片描述

图9中表示的核心枚举模式显示了同一个启用超线程的2套接字处理器Intel xeon系统。字符前的第一个数字表示分配给实际内核的OS CPU号。字符后面的第二个数字表示分配给超线程同级线程的OS CPU数字。在Linux内核引导的核心枚举阶段,首先在填充的物理处理器包之间以循环的方式枚举所有真正的内核。一旦枚举了所有的真实核,超线程的兄弟核也会以类似的方式枚举,在填充的处理器包之间循环。对于一个带有Intel Xeon 8核处理器的2P 16核系统的示例,在启用超线程时总共枚举了32个逻辑处理器。
在这里插入图片描述

注意,每个物理处理器包都有两个与之关联的NUMA节点。此外,每个物理处理器被分成两组,每组8个核。与单个NUMA节点关联的核心是按顺序枚举的。在图11中,我们看到OS CPU 0 8是NUMA节点0的一部分。同一物理处理器包上编号为OS CPU 9 15的第二组核心对于NUMA节点1来说是本地的。需要注意的是,转移到下一个套接字需要从32开始枚举核心。第四个物理处理器包使用OS CPU 16启动核心枚举并继续进行

在这里插入图片描述

NUMA策略是由几个子系统共同努力提供的。内核管理进程或特定内存映射的内存策略。这个内核可以通过三个新的系统调用来控制。可以从应用程序中调用一个名为libnuma的用户空间共享库。推荐使用libnuma API 来使程序实现NUMA策略。它提供了比直接使用系统调用更友好和抽象的接口。本文仅描述这个高级接口。

当不应该修改应用程序时,管理员可以使用numactl命令行实用程序设置一些策略。这不如直接从应用程序控制策略灵活

用户库和应用程序包含在numactl RPM中,它是SUSE LINUX Enterprise Server 92的一部分。此外,包中还有一些实用程序,如numastat,用于收集关于内存分配的统计信息,numademo用于显示不同策略对系统的影响。这个包还包含所有函数和程序的手册页。
编程用例:

#include <stdlib.h>
#include <stdio.h>
#include <numa.h>

int main(void)
{
    if(numa_available() < 0)
    {
   	printf("Your system does not support NUMA API.\n");
	return -1;
    }

    printf("%s line %d, we have numa node %d.\n", __func__, __LINE__, numa_max_node());

    return 0;
}

查找文件所属的包:

$ apt-file search libnuma.a
  libnuma-dev: /usr/lib/x86_64-linux-gnu/libnuma.a
$ apt-file search numactl
numactl: /usr/bin/numactl
numactl: /usr/share/doc/numactl/DESIGN
numactl: /usr/share/doc/numactl/README
numactl: /usr/share/doc/numactl/README.Debian
numactl: /usr/share/doc/numactl/TODO
numactl: /usr/share/doc/numactl/changelog.Debian.gz
numactl: /usr/share/doc/numactl/copyright
numactl: /usr/share/man/man8/numactl.8.gz
r-cran-nws: /usr/lib/R/site-library/nws/examples/sleigh/numactl.R

cpu affnity control

CPU affinity Control可以使用taskset工具,将进程绑定在指定CPUS上执行。

How to run program or process on specific CPU cores on Linux

测试将一个忙进程绑定到CPU1上执行,指定CPU上CPU利用率100%,其他CPU上正常。

参考:

处理器从单核到多核的演化过程_papaofdoudou的博客-CSDN博客


结束

<think>好的,用户遇到了一个错误,运行Ollama命令时提示“Error: unknown flag: --numa”。我需要分析这个问题并提供解决方案。首先,用户使用的命令是: `ollama run deepseek-r1:32b --numa --num_threads %OLLAMA_NumThreads% --batch_size 64 --verbose` 错误是未知的--numa标志。这说明用户可能在命令中使用了不被支持的参数。 首先,我要回忆Ollama的命令行选项。Ollama的run命令通常用于启动模型,而它的参数可能有限。根据官方文档,Ollama支持的参数可能包括--verbose,但--numa--num_threads可能不是标准参数。用户可能混淆了不同框架或工具的选项。 接下来,我需要确认Ollama是否支持这些参数。查阅Ollama的文档或帮助信息,可以通过运行`ollama run --help`来查看可用选项。假设用户没有这么做,可能不知道哪些参数有效。例如,Ollama可能允许通过环境变量设置线程数,而不是命令行参数。 另外,注意到用户使用了`%OLLAMA_NumThreads%`,这看起来像是在Windows中使用环境变量的方式,但Ollama是否支持这样的变量替换?或者用户应该直接设置环境变量,而不是在命令行中引用? 针对--numa的问题,NUMA(非统一内存访问)通常与多CPU系统相关,但Ollama可能没有直接支持该选项,或者需要特定配置。用户可能误用了其他深度学习框架的参数,比如TensorFlow或PyTorch中的设置。 接下来,我需要建议用户检查可用的参数。例如,运行`ollama run --help`来查看支持的选项。如果--numa不在其中,就需要删除该参数。同时,关于线程数的设置,可能应该使用环境变量而不是命令行参数,比如在运行命令前设置`set OLLAMA_NUM_THREADS=8`(Windows)或`export OLLAMA_NUM_THREADS=8`(Linux/Mac),然后在命令中省略--num_threads参数。 另外,用户提到的--batch_size可能也不是Ollama run的直接参数。可能需要通过模型的配置文件或不同的命令选项来设置。建议用户查阅Ollama的官方文档,确认如何正确设置线程数和批次大小。 总结解决方案步骤: 1. 移除不支持的--numa参数。 2. 检查Ollama支持的参数,使用正确的环境变量设置线程数。 3. 确保其他参数如--batch_size和--verbose的正确性。 4. 提供示例修正后的命令,并说明如何设置环境变量。 此外,用户可能需要了解如何通过Ollama的配置或模型文件调整高级参数,比如在Modelfile中指定选项。最后,建议用户参考官方文档或社区支持以获取更多帮助。</think>$\boxed{Ollama参数问题解决方案}$ 1. **错误根源定位**: ```mermaid graph LR A[无效参数--numa] --> B{可能混淆来源} B --> C[其他AI框架参数] B --> D[过时的Ollama版本] B --> E[模型特定要求] ``` 2. **参数修正指南**: ```bash # 正确的基础命令结构(Windows PowerShell环境) $env:OLLAMA_NUM_THREADS = 8 # 先设置环境变量 ollama run deepseek-r1:32b --verbose ``` 3. **高级配置通道**: ```text 通过Modelfile配置(需创建模型副本): FROM deepseek-r1:32b PARAMETER num_threads ${OLLAMA_NUM_THREADS} PARAMETER batch_size 64 ``` $\boxed{关键参数对照表}$ | 错误参数 | 合法替代方案 | 作用域 | |----------------|-----------------------------|---------------| | --numa | 系统自动管理/NVIDIA MPS | 硬件优化层 | | --num_threads | $env:OLLAMA_NUM_THREADS | 进程级控制 | | --batch_size | 模型配置文件指定 | 推理运算层 | **验证步骤**: ```powershell # 查看可用参数列表 ollama run --help | Select-String "Available Commands" # 检查环境变量生效情况 Write-Output "当前线程数: $env:OLLAMA_NUM_THREADS" ``` 建议升级到Ollama 0.1.23+版本后尝试,是否需要指导如何通过Windows注册表进行NUMA优化配置? 💻
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值