텐서플로우 NUMA 경고 해결 방법


텐서플로우 NUMA node 경고 해결 방법
GPU 기반에서 실행되는 텐서플로우에서는 NUMA node와 관련하여 경고 정보가 나타날 수 있습니다. NUMA node 정보가 올바르지 않았을 경우 안내 정보가 나타나게 되는데, 원인과 해결 방법에 대해서 설명드립니다.

증상

아래의 내용은 GPU 기반의 텐서플로우를 실행한 로그 입니다.

I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:998] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x55a5691b66e0 executing computations on platform CUDA. Devices:
 I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): Tesla K80, Compute Capability 3.7

실행 로그 중에서 상단 부분에서 아래와 같은 내용의 로그가 있습니다.

successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

SysFS 로부터 NUMA node 정보를 확인했지만, 그 값은 -1 입니다. 이 값은 NUMA node 값이 되어야 하기 때문에 0으로 리턴되는 내용입니다.

NUMA 개념

NUMA는 Non-Uniformed Memory Access(불균일 기억장치 접근)의 약자입니다. 이 기술은 일반적으로 CPU 소켓이 하나가 있는 데스크탑이 아니고, 여러개의 CPU 소켓을 가지고 있는 서버에서 메모리에 효과적으로 접근하기 위해서 사용되는 기술입니다.

만약 여러개의 CPU 소켓이있는 환경에서, 하나의 프로세서가 전체 메모리에 접근하게 될 경우 메모리 버스를 점유하게 되고 다른 프로세스들은 대기하여야 하는 상황이 발생합니다.

이 같은 문제를 해결하기 위해서, 각 CPU 마다 지역 전용적으로 사용하는 지역 메모리(Local Memory)으로 할당하고, 지역 메모리를 사용하는 CPU 코어들을 묶어서 하나의 NUMA 노드로 할당하게 됩니다.

하드웨어로 구성된 NUMA 노드 정보를 확인해 보도록 하겠습니다. 다음 명령어로 numactl 패키지를 설치후 실행합니다.

$ sudo apt install numactl
$ sudo numactl --hardware

available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 20 21 22 23 24 25 26 27 28 29
node 0 size: 64473 MB
node 0 free: 38822 MB
node 1 cpus: 10 11 12 13 14 15 16 17 18 19 30 31 32 33 34 35 36 37 38 39
node 1 size: 64486 MB
node 1 free: 46622 MB
node distances:
node   0   1 
  0:  10  21 
  1:  21  10

위의 명령어 실행결과 2개의 NUMA 노드로 구성될 수 있다는 것을 보여줍니다. 서버의 실제 하드웨어 사진은 아래와 같습니다.

여러개의 GPU가 있을 경우, 메모리와 CPU를 효과적으로 사용하기 위해서 GPU 또한 NUMA 노드로 함께 구성할 수 있습니다.

해결 방법

successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

위의 정보가 나타난 이유는 NUMA 노드 정보가 -1으로, 노드 정보를 확인 할 수 없다는 값이 저장되어 있습니다. PCI 장치에 대한 노드 정보는 아래의 파일에 기록되어 있습니다.

/sys/bus/pci/devices/…/numa_node

이 파일의 값을 수정하면서, 올바른 NUMA 노드로 수정 할 수 있습니다. 텐서플로우에서는 NUMA 노드 정보가 올바르지 않을 경우, 0으로 리턴되기 때문에 0으로 수정해 주시면 됩니다.

파일을 수정하기 위해서 먼저 다음 명령어로 하드웨어 주소를 확인합니다.

$ lspci | grep -i nvidia
ff:09.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)

그리고 다음과 같이 NNNNN 값을 위의 주소 값으로 수정하는 명령어를 실행합니다.

$ echo 0 | sudo tee -a /sys/bus/pci/devices/NNNNN/numa_node

그리고 다시 텐서플로우를 실행하면 NUMA 노드와 관련된 메세지가 없어졌음을 확인 할 수 있습니다.

하지만 재부팅 되면, 설정 내용이 초기화 될 수 있있습니다. 따라서 근본적인 수정하기 위해서는 하드웨어 구성 및 설정등을 확인해 보셔야 합니다.

이외의 다양한 에러 및 경고들을 해결하기 위해서는 아래의 글을 참고해 주시기 바랍니다.

( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)