Привязка NUMA
Создано: 25 июля 2025 г. | Последнее обновление: 6 мая 2026 г.
В системах NUMA (неоднородный доступ к памяти) обращение к памяти на удалённых узлах NUMA приводит к дополнительной задержке. PyTorch предоставляет средства привязки NUMA, позволяющие повысить локальность памяти, привязывая рабочие процессы к процессорам рядом с назначенными им устройствами-ускорителями.
На практике привязка NUMA обычно повышает общую производительность на 1–10 %, однако для некоторых рабочих нагрузок прирост может быть гораздо значительнее или отсутствовать вовсе.
Чтобы включить привязку NUMA, используйте флаг --numa-binding с torchrun, например:
torchrun --numa-binding=node --nproc_per_node=8 train.py
Также можно передать NumaOptions в LaunchConfig при использовании elastic_launch.
Доступные режимы привязки см. в разделе AffinityMode.
-
class torch.numa.binding.AffinityMode(value)[исходный код] -
Перечисление.
-
NODE = 'node' -
Каждый рабочий процесс и его потоки будут привязаны ко всем процессорам узла NUMA, на котором находится устройство-ускоритель с локальным индексом, равным локальному рангу рабочего процесса. Если вы не уверены, какой вариант выбрать, используйте этот.
Пример: Если устройство 3 находится на узле NUMA 1, рабочий процесс с локальным рангом 3 сможет выполняться только на процессорах узла NUMA 1.
-
SOCKET = 'socket' -
Каждый рабочий процесс и его потоки будут привязаны ко всем процессорам всех узлов NUMA сокета, на котором находится устройство-ускоритель с локальным индексом, равным локальному рангу рабочего процесса.
Пример: Если в сокете 0 находятся устройство 3 и узлы NUMA 0–1, рабочий процесс с локальным рангом 3 будет привязан к процессорам узлов NUMA 0–1.
Если на каждом сокете в любом случае имеется только один узел NUMA, этот вариант эквивалентен NODE.
-
EXCLUSIVE = 'exclusive' -
Каждый рабочий процесс и его потоки будут привязаны к эксклюзивному набору процессоров узла NUMA, на котором находится устройство-ускоритель с локальным индексом, равным локальному рангу рабочего процесса. Процессоры узла NUMA равномерно распределяются между всеми устройствами этого узла, поэтому ни один процессорный ядро не используется несколькими рабочими процессами.
Пример: Если на узле NUMA 1 имеется 16 физических ядер и устройства 2 и 3, рабочий процесс с локальным рангом 2 будет привязан к ядрам 0–7, а рабочий процесс с локальным рангом 3 — к ядрам 8–15.
-
CORE_COMPLEX = 'core-complex' -
Каждый рабочий процесс и его потоки будут привязаны к одному кластеру ядер (группе ядер с общей кэш-памятью L3) на узле NUMA, на котором находится устройство-ускоритель с локальным индексом, равным локальному рангу рабочего процесса. По возможности каждый рабочий процесс привязывается к отдельному кластеру ядер.
Пример: Если на узле NUMA 1 есть два кластера ядер (ядра 0–7 используют общую кэш-память L3, а ядра 8–15 — другую) и устройства 2 и 3, рабочий процесс с локальным рангом 2 будет привязан к ядрам 0–7, а рабочий процесс с локальным рангом 3 — к ядрам 8–15.
-
-
class torch.numa.binding.NumaOptions(affinity_mode: torch.numa.binding.AffinityMode, should_fall_back_if_binding_fails: bool = False)[исходный код] -
-
affinity_mode: AffinityMode
-
should_fall_back_if_binding_fails: bool = False -
Если
True, исключения, возникающие непосредственно при привязке NUMA, будут подавляться, а не вызывать ошибку.Исключения не ожидаются, поэтому не используйте этот параметр без необходимости. Он предназначен исключительно для снижения риска сбоев при массовом развёртывании привязки NUMA.
-
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/elastic/numa.html