다양한 스토리를 담고 있는 연재를 만나보세요.
[초심자를 위한 생물학+정보학] 알파폴드의 설치와 사용: 깃, 도커, 그리고 엔비디아 - 57
Bio통신원(고주온)
지난 번 연재에서 알파폴드의 설치 및 사용에 대해 언급했는데, 시간이 지나면서 알파폴드가 다량체 판 (AlphaFold-multimer version)으로 갱신되면서 전반적인 설치와 사용법도 바뀌게 되었다. 이 내용에 대해서는 bioRxiv에 논문1으로 게재되었으며, 설치와 사용에 관련된 자세한 내용은 깃허브 (GitHub)의 알파폴드2를 참고하면 된다. 이번 연재에서 다루는 알파폴드는 갱신판을 기준으로 진행하고자 한다.
알파폴드의 설치로 들어가기에 앞서, 딥마인드 (Deepmind)에서 발표한 알파폴드2 (AlphaFold v2.0)에서 채택한 도커 (Docker)와 심화 학습을 위한 도구로서의 엔비디아 (NVIDIA) 그래픽 처리 장치 (Graphics Processing Unit, GPU)에 대해서 간단히 알아 보자.
소프트웨어 영역에서의 도커는 리눅스 컨테이너를 기반으로 하여, 특정한 서비스를 묶어서 배포하는 데 용이하도록 만든 오픈소스 가상화 플랫폼 (open-source virtualization platform)을 의미한다. 도커는 기본 운영체제 (operating system, OS)에 다른 운영체제를 추가로 얹어서 가상화하는 방식과 달라서 하드웨어 자원의 부담이 적고, 실행 환경을 쉽고 빠르게 구축할 수 있으며, 실행에 필요한 컨테이너 (container)들이 분리되어 운용되기 때문에 안전한 장점이 있다. 다만, 데몬 (daemon) 형식으로 운용되므로 설치가 약간 까다롭게 느껴질 수는 있다.
알파폴드는 심화 학습을 통한 단백질 구조 예측 도구로서 방대한 자료에 대하여 대규모이면서도 집중적인 학습이 필요하다. 따라서 단순 연산의 병렬화가 용이한 그래픽 처리 장치를 사용하도록 설계되었다. 본 연재에서는 알파폴드에 적용 가능한 엔비디아의 그래픽 처리 장치를 이용하여 도구를 설치하고 실행하고자 한다.
=== 사용 (가능한) 리눅스 시스템 (최소) 사양 ===
- CPU: Intel i5 (4 cores, 8 threads)
- RAM: 32 Gb
- GPU: RTX 3060 (vRAM 6 Gb*)
- storage: 4 Tb
---
- OS: Ubuntu 20.04 LTS
===
알파폴드 실행을 위한 하드웨어 사양 가운데 프로그램 실행에 가장 큰 영향을 주는 것은 그래픽 처리 장치라고 할 수 있다. 특히 그래픽 카드의 저장 용량 (RAM)은 소화할 수 있는 단백질의 크기와 직접 관련이 있는데, 단량체 단백질의 아미노산 개수가 400을 넘어가면 6 Gb 이상*을 요구하면서 오류를 출력하므로 가능한 한 큰 용량의 제품을 사용하는 것이 좋다 (RTX 3060에도 vRAM 12 Gb 제품이 있음). 또한 그래픽 카드의 모델 사양에 따라 요구하는 메오리의 용량이 반비례하는 측면이 있다는 점도 참고하는 것이 좋겠다. 참고로 위의 최소 사양의 시스템을 사용하여 아미노산 300 개로 이루어진 세포막 단백질의 구조 예측에는 약 1 시간 가량이 소요된다.
알파폴드 설치의 전체적인 과정은 대략 다음과 같다.
===
# 깃 (git)을 이용한 알파폴드 클로닝
# 알파폴드 데이터베이스 설치
# 도커 설치
# 그래픽 처리 장치 (GPU) 드라이버 구성
# GPU 사용을 위한 엔비디아 컨테이너 툴킷 설치
# 알파폴드 도커 이미지 설정
# 알파폴드 실행
===
여기서, 몇 가지 반드시 주의해야 할 사항들을 짚고 가야겠다.
=== 주의 사항 ===
a) 도커는 docker-ce를 설치하는데, 인증 방식과 일반 사용자 승인에 대한 주의가 필요하다.
b) 알파폴드 데이터베이스는 반드시 알파폴드 기본 디렉터리 외부에 둔다.
c) 엔비디아 CUDA는 11.1 버전을 사용한다.
d) 알파폴드 설치에 필요한 도구: docker, git, aria2 등
===
도커에는 docker.io와 docker-ce, docker-ee 등이 있는데, 본 연재에서는 자세한 설명을 생략한다 (a). 그리고, 알파폴드 데이터베이스는 알파폴드 기본 디렉터리 (예컨대, /data/SW/alphafold/) 내에 두면, 알파폴드 실행을 위한 도커 이미지를 생성할 때 2 Tb가 넘는 용량이 포함되어 쓸데없이 자원을 낭비하게 되므로 알파폴드 기본 디렉터리 외부에 두는 것이 좋다 (b). 그래픽 처리 장치 드라이버인 엔비디아 CUDA는 원래 11.0 버전을 사용하게 되어 있는데, 본 시스템 하에서는 알파폴드 도커 이미지 생성 시에 오류를 출력하기 때문에 부득이 11.1 버전을 사용하였다 (c). 그리고, 알파폴드 및 데이터베이스 설치 및 사용에 필요한 추가 도구들이 있으므로, 알파폴드 설치 전에 (which 등의 명령어를 이용하여) 확인해 보고 필요 시 우선적으로 설치하고 작업을 진행한다 (d).
--- e.g. ---
$ which git
$ sudo apt install git <-- (1)
$ which aria2c
$ sudo apt install aria2 <-- (2)
---
깃 (Git)은 일종의 분산형 버전 관리 도구로서 리눅스의 창시자인 리누스 (Linus Torvalds)가 개발한 시스템이다. 깃은 알파폴드 설치에 필요한 도구이다 (1). 자세한 설명은 생략한다. 또한, aria2는 데이터베이스를 내려 받는 데 필요하다 (2).
참고로, 도커를 알파폴드 데이터베이스를 내려 받는 동안에 설치하는 것은 데이터베이스를 처음 내려 받는 경우, 대용량이라서 네트워크 여건에 따라 하루 이상이 걸리기도 하므로 이 시간을 이용하고자 한 것이다. 따라서, 여러 작업을 여러 터미널 (x-term)에서 수행하게 될 것이다.
# 깃 (git)을 이용한 알파폴드 클로닝 (작업 디렉터리 예시: /data/SW/)
---
$ git clone https://github.com/deepmind/alphafold.git
---
위의 명령을 실행하면 실행한 디렉터리 아래에 alphafold라는 이름의 디렉터리 (/data/SW/alphafold)가 생성되면서 알파폴드의 기본 사항들이 설치된다. 이 디렉터리를 알파폴드 기본 디렉터리로 부르자.
# 알파폴드 데이터베이스 설치 (예시: /data/db/AFDB/)
앞서 언급한 바와 같이 알파폴드 기본 디렉터리 외부에 데이터베이스 디렉터리를 만들고 그 디렉터리에 다음과 같이 전체 데이터베이스를 내려 받는다. 아래의 명령어는 알파폴드 기본 디렉터리 (/data/SW/alphafold/)에서 실행한다.
---
$ scripts/download_all_data.sh /data/db/AFDB/
---
여기서 /data/db/AFDB/는 알파폴드 데이터베이스를 설치할 디렉터리를 의미한다. 사용자가 임의로 정할 수 있다. 다만, 알파폴드 기본 디렉터리 내에는 두지 말자. 왜냐하면 앞에서도 언급한 바와 같이 2 Tb가 넘는 대용량의 데이터베이스를 알파폴드 기본 디렉터리 아래에 설치하면, 도커 이미지를 설치할 때 데이터베이스를 포함하는 거대한 이미지를 생성하여 기본 이미지 저장 위치인 /var/lib/docker/에 두게 되는데, 이렇게 되면 시스템의 루트 디렉터리 (/)의 용량을 모두 사용하게 되어 시스템의 운영에 치명적인 문제를 일으키게 된다. 빠른 데이터베이스의 설치를 원한다면, scripts 디렉터리 내의 스크립트를 사용하여 동시에 여러 터미널에서 여러 데이터베이스 (총 8 개)를 내려받을 수 있다.
---
$ scripts/download_bfd.sh /data/db/AFDB/
.
.
---
또한, 필요에 따라서는 아래와 같이 축소된 데이터베이스를 사용할 수도 있다.
---
$ scripts/download_all_data.sh /data/db/AFDB/ reduced_dbs
---
# 도커 설치
다음과 같이 도커를 설치한다.
---
$ sudo apt update <-- (1)
$ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release <-- (2)
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor
-o /usr/share/keyrings/docker-archive-keyring.gpg <-- (3)
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null <-- (4)
$ sudo apt update <-- (5)
$ sudo apt install docker-ce docker-ce-cli containerd.io <-- (6)
$ sudo docker run hello-world <-- (7)
---
우선, 설치 가능한 도구들의 목록을 갱신한다 (1). 그리고 https를 통하여 도커 저장소 (docker repository)를 사용할 수 있도록 하기 위해 필수 패키지를 설치한 후 (2), 도커와 암호화 통신을 위한 GPG 키를 추가한다 (3). 설치할 시스템에 해당하는 도커 저장소를 추가하여 apt로 도커를 설치할 수 있게 한다 (4). 다시 도구 목록을 갱신한 다음 (5), docker-ce, docker-ce-cli, 그리고 containerd.io를 설치한다 (6). 끝으로 docker의 hello-world를 실행하여 설치를 확인한다 (7). 여기까지는 도커 시스템을 설치하는 내용이며, 이후 도커를 실제로 이용하는 사용자는 현재 로그인한 일반 사용자이므로 다음과 같이 도커를 사용할 수 있는 사용자를 추가해 준다.
- 도커 설치 후 일반 사용자를 위한 추가 작업
---
$ sudo groupadd docker <-- (1)
$ sudo usermod -aG docker $USER <-- (2)
---
사용자 그룹에 docker를 추가하고 (1), 현재 사용자 계정 (여기서 $USER는 john 등의 현재 로그인한 사용자 계정)을 도커 사용자 그룹에 추가한다 (2). 이후, 로그아웃한 다음 다시 로그인하거나, 아래의 명령을 수행한다.
---
$ newgrp docker
---
이제 다음의 명령을 실행하여, 일반 사용자로서 도커를 사용할 수 있음을 확인한다.
---
$ docker run hello-world
---
여기까지 오면, 일단 도커의 설치는 끝난 셈이다. 그런데, 여기서 유의해야 할 사항이 하나 있다. 이 내용은 시스템의 루트 (/) 디렉터리의 용량이 충분하다면 고려하지 않아도 된다. 참고로, 알파폴드의 도커 관련 내용의 크기는 14 Gb 내외이다.
도커 설치 후 사용하면서 만들어지는 도커 관련 내용들 (이미지, 컨테이너, 볼륨 등)은 기본적으로 /var/lib/docker/ 아래에 저장된다. 따라서, 시스템의 루트 (/) 디렉터리의 용량이 충분히 여유롭지 않다면, /etc/systemd/system/docker.service.d/override.conf 파일을 만들어 아래와 같은 내용을 저장한 후, 도커를 재시작하여 작업을 진행한다.
---
ExecStart=/usr/bin/dockerd -g /data00/lib/docker -H fd:// -H tcp://127.0.0.1:2375
---
여기서 /data00/lib/docker는 사용자가 새로 만들어 지정하는 도커 저장소를 의미한다. 필요 시, 도커의 재시작은 다음과 같이 하면 된다.
---
$ sudo service docker stop
$ sudo service docker restart
---
지금부터는 알파폴드 사용을 위한 그래픽 처리 장치를 설정하고 알파폴드 도커 이미지를 구성하여 실제 알파폴드를 사용해 보자.
# 그래픽 처리 장치 (GPU) 드라이버 구성
기본적으로 알파폴드에서 필요한 엔비디아 그래픽 처리 장치 드라이버에 대한 내용은 아래 URL을 참조하면 된다.
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html
알파폴드에 필요한 엔비디아 드라이버는 다음과 같이 설치한다.
우선, https://www.nvidia.com/Download/index.aspx?lang=en-us에서 해당 하드웨어의 조건에 맞는 드라이버를 내려받는다. 본 시스템에서는 NVIDIA-Linux-x86_64-470.94.run을 사용하였다. 내려 받은 엔비디아 드라이버가 있는 디렉터리에 가서 다음과 같이 설치하고 확인한다.
---
$ sudo sh NVIDIA-Linux-x86_64-470.94.run <-- (1)
$ which nvidia-smi <-- (2)
/usr/bin/nvidia-smi
$ nvidia-smi <-- (3)
Mon Dec 20 03:28:26 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.94 Driver Version: 470.94 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
.
.
.
$
---
먼저 내려 받은 엔비디아 드라이버 설치 파일을 실행한 다음 (1), 제대로 설치 되었는지 확인하고 (2) nvidia-smi 명령을 실행하여 설치된 엔비디아 그래픽 처리 장치를 확인한다 (3).
# GPU 사용을 위한 엔비디아 컨테이너 툴킷 설치
엔비디아 드라이버의 설치를 확인한 다음에는 이를 도커 에서 사용하기 위하여 아래와 같이 엔비디아 컨테이너 툴킷을 설치한다.
---
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ curl -s -L https://nvidia.github.io/nvidia-container-runtime/experimental/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
$ sudo apt update
$ sudo apt install -y nvidia-docker2
$ sudo service docker restart
$ docker run --rm --gpus all nvidia/cuda:11.1-base nvidia-smi
---
위 내용의 마지막 행은 도커에서 사용하기 위해 설치한 엔비디아 컨테이너를 확인하기 위한 작업으로 앞에서 nvidia-smi 명령을 실행했을 때와 동일한 결과를 출력하면 엔비디아 컨테이너 툴킷이 정상적으로 설치된 것이다.
# 알파폴드 도커 이미지 설정
이 작업은 알파폴드 데이터베이스가 모두 설치된 것을 확인한 후에 실행한다. 전체 데이터베이스를 내려받은 경우, 자료들은 총 9 개의 디렉터리 (bfd, mgnify, params, pdb70, pdb_mmcif, pdb_seqres, uniclust30, uniprot, uniref90)에 설치된다. 참고로, 데이터베이스 설치 스크립트에는 압축 파일로 내려받아 압축을 푸는 과정이 포함되어 있기 때문에 모든 절차가 완료된 것을 확인해야 한다.
데이터베이스를 확인한 후, 다음과 같이 알파폴드 도커 이미지를 만든다.
---
$ docker build -f docker/Dockerfile -t alphafold . <-- (1)
$ pip3 install -r docker/requirements.txt <-- (2)
---
알파폴드 기본 디렉터리 (예시: /data/SW/alphafold/)에서 docker/Dockerfile을 적용하여 알파폴드 도커 이미지를 생성한다 (1). 이때, 오류가 출력될 수도 있다. 이 경우에는, 알파폴드 기본 디렉터리 내의 docker 디렉터리에 있는 Dockerfile에서 15번째 줄과 68번째 줄 등 2 부분의 내용을 다음과 같이 변경한 후, 다시 동일한 명령을 실행하여 도커 이미지를 만든다.
--- docker/Dockerfile ---
## line 15
ARG CUDA=11.0 --> ARG CUDA=11.1
.
.
.
## line 68
jaxlib==0.1.69+cuda${CUDA/./} --> jaxlib>=0.1.69+cuda${CUDA/./}
---
이후, 알파폴드 이미지의 요구 사항을 맞춰 준다 (2).
# 알파폴드의 실행
이제 설치된 알파폴드에 사용자가 관심있는 단백질의 아미노산 서열이 들어 있는 FASTA 포맷 파일을 적용하여 분석을 실행한다.
---
$ python3 docker/run_docker.py --fasta_paths=INPUT.faa --max_template_date=2021-12-31 --data_dir=/data/db/AFDB/ --model_preset=monomer --output_dir=/data/AFout/
---
여기서 INPUT.faa, /data/db/AFDB/, /data/AFout/ 등은 각각 입력 아미노산 서열 FASTA 파일, 알파폴드 데이터베이스 디렉터리, 그리고 사용자가 미리 만들어 놓은 결과 출력 디렉터리이다. 입력 FASTA 파일은 알파폴드 기본 디렉터리에 위치하며, 나머지 디렉터리들은 절대 경로를 입력해야 한다. 그리고, 명령줄의 monomer는 단량체 구조 예측을 위한 항목이다. 더 자세한 사용법은 처음 언급했던 알파폴드의 GitHub를 참고하기 바란다.
https://github.com/deepmind/alphafold/
--------------------------------------------
1. https://www.biorxiv.org/content/10.1101/2021.10.04.463034v1
2. https://github.com/deepmind/alphafold
- "초심자를 위한 생물학+정보학"은 아래 PDF 다운 받으셔서 읽는 것도 가능합니다. -
본 기사는 네티즌에 의해 작성되었거나 기관에서 작성된 보도자료로, BRIC의 입장이 아님을 밝힙니다. 또한 내용 중 개인에게 중요하다고 생각되는 부분은 사실확인을 꼭 하시기 바랍니다.
[기사 오류 신고하기]
(http://bioprofiler.tistory.com) IBM-XT시절부터 개인용 컴퓨터를 사용하였으나, 강산이 변한 지금도 어제 코딩한 내용을 오늘 기억하지 못하는 자유인. 박사학위는 분자유전학 분야로 받았으며, 물리학과 화학에 관심만 있음. 현재 대학 교수로 재직 중.
다른 연재기사 보기
전체 보기