GPU acceleration
출처: 문서
본문
GPU 가속
머신러닝(ML) 노드가 있는 OpenSearch 클러스터에서 자연어 처리(NLP) 모델을 실행할 때, 그래픽 처리 장치(GPU) 가속을 사용하면 ML 노드에서 더 나은 성능을 얻을 수 있어요. GPU는 클러스터의 CPU와 함께 작동해서 모델 업로드와 학습 속도를 높여 준답니다.
지원되는 GPU
ML 노드는 다음 GPU 인스턴스를 지원해요:
GPU 성능이 필요하다면 Amazon Elastic Compute Cloud(Amazon EC2)를 통해 GPU 인스턴스를 프로비저닝할 수 있어요. GPU 인스턴스를 프로비저닝하는 방법에 대한 자세한 내용은 Recommended GPU Instances를 참고하세요.
지원되는 이미지
CUDA 11.6이 포함된 Docker 이미지와 Amazon Machine Images(AMI) 모두에서 GPU 가속을 사용할 수 있어요.
PyTorch
GPU 가속 ML 노드가 ML 모델과 함께 작동하려면 PyTorch 1.12.1이 필요해요.
GPU 가속 ML 노드 설정하기
GPU에 따라 GPU 가속 ML 노드를 수동으로 프로비저닝하거나 자동화된 초기화 스크립트를 사용해서 프로비저닝할 수 있어요.
NVIDIA ML 노드 준비하기
NVIDIA는 CUDA를 사용해서 노드 성능을 높여요. CUDA를 활용하려면 드라이버에 /dev 디렉터리 안에 nvidia-uvm 커널이 포함되어 있는지 확인해야 해요. 커널이 있는지 확인하려면 ls -al /dev | grep nvidia-uvm을 입력하세요.
nvidia-uvm 커널이 존재하지 않으면 nvidia-uvm-init.sh를 실행하세요:
#!/bin/bash
## Script to initialize nvidia device nodes.
## https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-verifications
/sbin/modprobe nvidia
if [ "$?" -eq 0 ]; then
# Count the number of NVIDIA controllers found.
NVDEVS=`lspci | grep -i NVIDIA`
N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`
N=`expr $N3D + $NVGA - 1`
for i in `seq 0 $N`; do
mknod -m 666 /dev/nvidia$i c 195 $i
done
mknod -m 666 /dev/nvidiactl c 195 255
else
exit 1
fi
/sbin/modprobe nvidia-uvm
if [ "$?" -eq 0 ]; then
# Find out the major device number used by the nvidia-uvm driver
D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`
mknod -m 666 /dev/nvidia-uvm c $D 0
mknod -m 666 /dev/nvidia-uvm-tools c $D 0
else
exit 1
fi
패키지 버전의 OpenSearch를 사용해서 OpenSearch를 네이티브로(Docker 없이) 실행하는 경우, systemd가 OpenSearch의 GPU 접근을 차단할 수 있어요. 모델을 가속하려면 정상적으로 설치된 CUDA Toolkit과 /dev 아래의 NVIDIA 디바이스에 대한 접근 권한이 필요해요.
OpenSearch가 GPU를 사용할 수 있도록 하려면 다음 설정을 추가해서 systemd 서비스를 업데이트하세요:
systemctl edit opensearch.service
[Service]
DevicePolicy=auto
/dev 아래에 nvidia-uvm이 존재하는지 확인한 후에는 클러스터 안에서 OpenSearch를 시작할 수 있어요.
AWS Inferentia ML 노드 준비하기
AWS Inferentia에서 실행 중인 Linux 운영 체제에 따라 다음 명령어와 스크립트를 사용해서 ML 노드를 프로비저닝하고 클러스터 안에서 OpenSearch를 실행할 수 있어요.
먼저 클러스터에 OpenSearch를 다운로드하고 설치하세요.
그다음 OpenSearch를 내보내고 환경 변수를 설정하세요. 이 예제에서는 OpenSearch를 opensearch-2.5.0 디렉터리로 내보내므로 OPENSEARCH_HOME = opensearch-2.5.0이 돼요:
echo "export OPENSEARCH_HOME=~/opensearch-2.5.0" | tee -a ~/.bash_profile
echo "export PYTORCH_VERSION=1.12.1" | tee -a ~/.bash_profile
source ~/.bash_profile
다음으로 prepare_torch_neuron.sh라는 이름의 셸 스크립트 파일을 만드세요. Linux 운영 체제에 맞게 다음 예제 중 하나를 복사해서 사용자 지정할 수 있어요:
스크립트를 실행한 후에는 현재 터미널을 종료하고 새 터미널을 열어서 OpenSearch를 시작하세요.
GPU 가속은 Ubuntu 20.04와 Amazon Linux 2에서만 테스트되었어요. 하지만 다른 Linux 운영 체제도 사용할 수 있어요. {: .note}
Ubuntu 20.04
. /etc/os-release
sudo tee /etc/apt/sources.list.d/neuron.list > /dev/null <<EOF
deb https://apt.repos.neuron.amazonaws.com ${VERSION_CODENAME} main
EOF
wget -qO - https://apt.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB | sudo apt-key add -
# Update OS packages
sudo apt-get update -y
################################################################################################################
# To install or update to Neuron versions 1.19.1 and newer from previous releases:
# - DO NOT skip 'aws-neuron-dkms' install or upgrade step, you MUST install or upgrade to latest Neuron driver
################################################################################################################
# Install OS headers
sudo apt-get install linux-headers-$(uname -r) -y
# Install Neuron Driver
sudo apt-get install aws-neuronx-dkms -y
####################################################################################
# Warning: If Linux kernel is updated as a result of OS package update
# Neuron driver (aws-neuron-dkms) should be re-installed after reboot
####################################################################################
# Install Neuron Tools
sudo apt-get install aws-neuronx-tools -y
######################################################
# Only for Ubuntu 20 - Install Python3.7
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get install python3.7
######################################################
# Install Python venv and activate Python virtual environment to install
# Neuron pip packages.
cd ~
sudo apt-get install -y python3.7-venv g++
python3.7 -m venv pytorch_venv
source pytorch_venv/bin/activate
pip install -U pip
# Set pip repository to point to the Neuron repository
pip config set global.extra-index-url https://pip.repos.neuron.amazonaws.com
#Install Neuron PyTorch
pip install torch-neuron torchvision
# If you need to trace the neuron model, install torch neuron with this command
# pip install torch-neuron neuron-cc[tensorflow] "protobuf==3.20.1" torchvision
# If you need to trace neuron model, install the transformers for tracing the Huggingface model.
# pip install transformers
# Copy torch neuron lib to OpenSearch
PYTORCH_NEURON_LIB_PATH=~/pytorch_venv/lib/python3.7/site-packages/torch_neuron/lib/
mkdir -p $OPENSEARCH_HOME/lib/torch_neuron; cp -r $PYTORCH_NEURON_LIB_PATH/ $OPENSEARCH_HOME/lib/torch_neuron
export PYTORCH_EXTRA_LIBRARY_PATH=$OPENSEARCH_HOME/lib/torch_neuron/lib/libtorchneuron.so
echo "export PYTORCH_EXTRA_LIBRARY_PATH=$OPENSEARCH_HOME/lib/torch_neuron/lib/libtorchneuron.so" | tee -a ~/.bash_profile
# Increase JVm stack size to >=2MB
echo "-Xss2m" | tee -a $OPENSEARCH_HOME/config/jvm.options
# Increase max file descriptors to 65535
echo "$(whoami) - nofile 65535" | sudo tee -a /etc/security/limits.conf
# max virtual memory areas vm.max_map_count to 262144
sudo sysctl -w vm.max_map_count=262144
Amazon Linux 2
# Configure Linux for Neuron repository updates
sudo tee /etc/yum.repos.d/neuron.repo > /dev/null <<EOF
[neuron]
name=Neuron YUM Repository
baseurl=https://yum.repos.neuron.amazonaws.com
enabled=1
metadata_expire=0
EOF
sudo rpm --import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUB
# Update OS packages
sudo yum update -y
################################################################################################################
# To install or update to Neuron versions 1.19.1 and newer from previous releases:
# - DO NOT skip 'aws-neuron-dkms' install or upgrade step, you MUST install or upgrade to latest Neuron driver
################################################################################################################
# Install OS headers
sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r) -y
# Install Neuron Driver
####################################################################################
# Warning: If Linux kernel is updated as a result of OS package update
# Neuron driver (aws-neuron-dkms) should be re-installed after reboot
####################################################################################
sudo yum install aws-neuronx-dkms -y
# Install Neuron Tools
sudo yum install aws-neuronx-tools -y
# Install Python venv and activate Python virtual environment to install
# Neuron pip packages.
cd ~
sudo yum install -y python3.7-venv gcc-c++
python3.7 -m venv pytorch_venv
source pytorch_venv/bin/activate
pip install -U pip
# Set Pip repository to point to the Neuron repository
pip config set global.extra-index-url https://pip.repos.neuron.amazonaws.com
# Install Neuron PyTorch
pip install torch-neuron torchvision
# If you need to trace the neuron model, install torch neuron with this command
# pip install torch-neuron neuron-cc[tensorflow] "protobuf<4" torchvision
# If you need to run the trace neuron model, install transformers for tracing Huggingface model.
# pip install transformers
# Copy torch neuron lib to OpenSearch
PYTORCH_NEURON_LIB_PATH=~/pytorch_venv/lib/python3.7/site-packages/torch_neuron/lib/
mkdir -p $OPENSEARCH_HOME/lib/torch_neuron; cp -r $PYTORCH_NEURON_LIB_PATH/ $OPENSEARCH_HOME/lib/torch_neuron
export PYTORCH_EXTRA_LIBRARY_PATH=$OPENSEARCH_HOME/lib/torch_neuron/lib/libtorchneuron.so
echo "export PYTORCH_EXTRA_LIBRARY_PATH=$OPENSEARCH_HOME/lib/torch_neuron/lib/libtorchneuron.so" | tee -a ~/.bash_profile
# Increase JVm stack size to >=2MB
echo "-Xss2m" | tee -a $OPENSEARCH_HOME/config/jvm.options
# Increase max file descriptors to 65535
echo "$(whoami) - nofile 65535" | sudo tee -a /etc/security/limits.conf
# max virtual memory areas vm.max_map_count to 262144
sudo sysctl -w vm.max_map_count=262144
스크립트 실행이 끝나면 설정이 적용되도록 새 터미널을 여세요. 그다음 OpenSearch를 시작하세요.
이제 OpenSearch가 GPU 가속 클러스터 안에서 실행되고 있을 거예요. 하지만 프로비저닝 중에 오류가 발생하면 GPU 가속기 드라이버를 수동으로 설치할 수 있어요.
ML 노드 수동으로 준비하기
앞의 두 스크립트가 GPU 가속 노드를 제대로 프로비저닝하지 못했다면 AWS Inferentia용 드라이버를 수동으로 설치할 수 있어요:
-
선택한 Linux 운영 체제를 기반으로 AWS 가속기 인스턴스를 배포하세요. 방법은 PyTorch Neuron Setup을 참고하세요.
-
Neuron 라이브러리를 OpenSearch로 복사하세요. 다음 명령어는
opensearch-2.5.0이라는 이름의 디렉터리를 사용해요:OPENSEARCH_HOME=~/opensearch-2.5.0 -
PYTORCH_EXTRA_LIBRARY_PATH경로를 설정하세요. 이 예제에서는 OPENSEARCH_HOME 폴더에pytorch가상 환경을 만들어요:PYTORCH_NEURON_LIB_PATH=~/pytorch_venv/lib/python3.7/site-packages/torch_neuron/lib/ mkdir -p $OPENSEARCH_HOME/lib/torch_neuron; cp -r $PYTORCH_NEURON_LIB_PATH/ $OPENSEARCH_HOME/lib/torch_neuron export PYTORCH_EXTRA_LIBRARY_PATH=$OPENSEARCH_HOME/lib/torch_neuron/lib/libtorchneuron.so
4. (선택 사항) 가속기 인스턴스의 GPU 사용량을 모니터링하려면 [Neuron tools](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/tools/neuron-sys-tools/index.html)를 설치하세요. 이 도구를 설치하면 인스턴스 안에서 모델을 사용할 수 있어요:
```bash
# Install Neuron Tools
sudo apt-get install aws-neuronx-tools -y
# Add Neuron tools your PATH
export PATH=/opt/aws/neuron/bin:$PATH
# Test Neuron tools
neuron-top
-
모델을 업로드할 충분한 메모리를 확보하려면 JVM 스택 크기를
>+2MB로 늘리세요:echo "-Xss2m" | sudo tee -a $OPENSEARCH_HOME/config/jvm.options -
OpenSearch를 시작하세요.
문제 해결
ML 모델을 다루는 데 필요한 데이터 양 때문에 클러스터에서 OpenSearch를 실행하려고 할 때 다음과 같은 max file descriptors 또는 vm.max_map_count 오류를 만날 수 있어요:
[1]: max file descriptors [8192] for opensearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
max file descriptors 오류를 해결하려면 다음 명령어를 실행하세요:
echo "$(whoami) - nofile 65535" | sudo tee -a /etc/security/limits.conf
vm.max_map_count 오류를 수정하려면 다음 명령어를 실행해서 값을 262114로 늘리세요:
sudo sysctl -w vm.max_map_count=262144
다음 단계
사전 학습된 Hugging Face 모델과 함께 AWS Inferentia를 사용하는 GPU 가속 클러스터를 시도해 보고 싶다면 Pretrained BERT Tutorial을 참고하세요.