레이블이 docker인 게시물을 표시합니다. 모든 게시물 표시
레이블이 docker인 게시물을 표시합니다. 모든 게시물 표시

2018년 7월 10일 화요일

Anvi'o의 사소한 문제점 개선하기

지난주부터 Anvi'o(Advanced analysis and visualization platform for 'omics data)에 관심을 갖고서 설치 및 테스트를 진행하고 있다. 설치와 사용이 쉽고 project page에서 풍부한 문서를 제공하고 있어서 초심자도 무난하게 사용할 수 있다. 오늘은 실제 부딪혔던 사소한 문제와 그 해결책에 대한 경험을 정리하고자 한다. 돌이켜보니 그렇게 큰 좌절은 아니었었다.

설치 방법

Homebrew, conda, 직접 설치, 혹은 docker 등 몇 가지 방법 중에서 원하는 것을 택하면 된다. 나는 처음에 conda를 이용하여 아주 쉽게 설치를 했으나 프로젝트 페이지에서 설명한 몇 가지 스크립트가 아예 깔리지 않은 것을 발견하였다. 왜 이런 일이 발생했는가? 그 이유는 다음과 같다.

  • Anvi'o의 실행에는 python 3이 필요하다. 이것을 미처 모르고 python 2.7 기반의 conda environment에 Anvi'o를 설치했던 것이다.
  • 프로젝트 페이지에 설명된 기능은 최신판인 v5.1을 기준으로 한 것이다. 예를 들어 function enrichment analysis와 ANI 분석 같은 것은 예전 버전에는 구현되지 않았다. 아쉽게도 Anvi'o의 bioconda 패키지는 v4.0이다.
다른 workflow가 잘 도는 것을 확인했음에도 불구하고 ANI 계산용 스크립트인 anvi-compute-ani가 아예 존재하지 않았다. 왜 그런지 탐구해 보니 위에서 나열한 두 번째 이유에 의한 것이었다. 그래서 docker image를 사용한다면 번거로운 설치 과정을 거치지 않고도 anvi'o의 모든 기능을 사용할 수 있을 것으로 생각했었다. 그러나...

Anvi'o docker image의 사소한 문제

Docker의 정의를 내린다면 "an open platform for distributed applications for developers and sysadmins"라 할 수 있다. Docker가 어떻게 돌아가는지를 깊게 이해하지 못해도 개발자가 배포한 이미지를 가져와서("docker pull <이미지 이름>") 컨테이너를 생성하는 것("docker run <이미지 이름>")으로 실행한다는 것 정도만 기억하면 족하다. 도커 컨테이너는 이미지가 실행된 상태를 뜻한다. 사실은 문제 해결을 위해서는 이보다 조금은 더 깊은 지식이 필요하다.

$ docker run --rm -p 8080:8080 -v /home/merenbey/my_data:/my_data -it meren/anvio:latest
:: anvi`o ::  / >>>

위와 같이 실행하여 anvi'o의 최신판 v5.1의 이미지를 실행하였다. 기본적인 pangenome 분석은 해 놓았고, 이어서 anvi-compute-ani을 실행하여 ANI 분석을 시도하였는데 다음과 같은 에러가 발생하는 것이었다.
Config Error: PyANI returned with non-zero exit code, there may be some errors. please check the log file for details.
 실제 ANI의 계산은 PyANI(average_nucleotide_identity.py)에 의해 이루어진다. 왜 이런 에러가 발생하는 것일까? PyANI의 로그 파일을 열어보았다. vim 등의 기본 에디터가 없어서 좀 불편한다.


pandas가 없다고? pip를 이용하여 설치된 python library를 확인하려는데 pip도 없다. 이걸 어떻게 해야 하나? 컨테이너 안에서 apt-get, pip... 이런 것을 깔아야 되나? 컨테이너에서 빠져나오면 이런 설정 사항은 다 없어지는데? 약간의 삽질을 하다가 이런 문제가 생긴 원인을 발견하였다. Anvi'o에 딸린 모든 python 스크립트는  python 3을 기반으로 한다. 따라서 pip3는 존재한다. /usr/local/bin/anvi-compute-ani를 열어보면 첫 줄(흔히 shebang line이라 부름)에는 다음과 같이 씌여있다.
#!/usr/bin/python3
그러나 Anvi'o 컨테이너의 default python interpreter는? 커맨드라인에서 python -V을 치면 Python 2.7.12가 출력된다. 그렇다면 /usr/local/bin/average_nucleotide_identity.py의 shebang line은?
#!/usr/bin/env python
그렇다. PyANI 스크립트는 시스템 기본 버전인 python 2.7의 위치에서 pandas를 찾으려고 애를 쓰는 것이다!  pip3 freeze를 해 보면 python 3.x의 pandas가 잘 존재함을 확인할 수 있다. PyANI가 python3을 사용해서 돌게만 만들면 모든 문제가 해결될 것으로 생각하여 average_nucleotide_identity.py 스크립트를 편집하려 했는데, 문제는 docker container에는 편집기로 쓸만한 것이 없다는 것이다. vim을 설치하려니 apt-get update부터 시작해야 한다. 만약 호스트 터미널로 되돌아가면 컨테이너 내에 설치했던 프로그램은 전부 사라질 것이다. 이를 유지하는 방법은 나중에 생각해 보기로 하자.

다소 번거롭지만 vim을 설치하여 /usr/local/bin/average_nucleotide_identity.py의 첫 줄을 #!/usr/bin/env python로 수정한 다음 anvi-compute-ani를 실행해 보았다. 이번에는 아무런 에러가 없이 잘 진행이 되었고 ani-display-pan으로 그 결과를 확인하였다. 웹브라우저를 연 뒤 Layer 탭으로 가서 ANI 관련 사항을 체크한 뒤 그림을 다시 그려야 ANI heatmap이 보인다. Layer는 anvi'o의 시각화에서 매우 중요한 개념이므로 관련 문서를 찾아서 철저히 읽어봐야 되겠다. 데이터 파일이 있는 디렉토리에 shebang line을 수정한 average_nucleotide_identity.py 스크립트를 준비해 둔 다음 컨테이너 내에서 이를 /usr/local/bin/ 위치에 복사하는 것도 일종의 꼼수가 되겠다.

average_nucleotide_identity.py을 고치기가 귀찮다면 /usr/bin/python3를 /usr/bin/python이란 이름으로 바꾸어도 된다. 어차피 python 2.7은 필요가 없고, 컨테이너를 나가면 아무런 흔적을 남기지 않기 때문이다.

Docker 내부에 프로그램 설치하고 재활용하기

다음 웹페이지에서 힌트를 얻었다. 두번째의 PDF 파일은 무작정 따라하면서 기본 개념을 익히는데 도움이 될 것으로 생각한다. 그런데 여기에서 지시한대로 따라하면 docker import가 잘 되지 않는다. 세번째 자료도 매우 잘 작성되어서 도움이 많이 될 것이다.

[pyrasis.com] Docker 기본 사용법 추천!

docker run으로 Anvi'o 컨테이너를 생성하여라. 그 안에서 apt-get update, apt-get install vim을 하여 필요한 프로그램을 설치하고 /usr/local/bin/average_nucleotide_identity.py도 편집을 하여라. 그 다음 별도의 터미널 창에서 docker ps를 하여 현재 돌고 있는 Anvi'o 컨테이너의 ID를 확인한다. 이제 docker commit 명령을 실행할 단계이다.
# docker commit e47956140b67 my_docker_image
Image의 이름으로 쓸 수 있는 문자에는 한계가 있다. 오직 [a-z0-9-_.]만 허용이 된다. 이렇게 하여 나만의 docker image를 만든 것이다. 이를 실행하려면 docker run [options] my_docker_image를 하면 된다. 그 안에서는 vim도 실행이 되고, average_nucleotide_identity.py도 변경된 shebang line을 유지하고 있다.

아직도 docker run --rm의 의미를 이해하지 못하고 있다!

--rm 옵션은 컨테이너가 종료되었을 때 이를 자동으로 제거한다. 이 옵션이 없으면 현재 실행 중이 컨테이너의 변경 상태(패키지 설치, 파일 생성 및 변경 등)가 다음번에 docker run을 실행할 때에도 유지될 것 같은데 실제로는 그렇지 않다. 내가 아직도 docker에 대한 기본 이해가 부족한 것이다.

2017년 9월 22일 금요일

Docker를 통해 배우는 Galaxy와 Plasmid Profiler

Galaxy는 웹 기반의 오픈소스형 생명정보 분석용 플랫폼이다. 2009년에 미국 Cold Spring Harbor Laboratory에서 열린 Genome Informatics Meeting에 참석했다가 이를 처음으로 접하고 참 흥미로운 소프트웨어라고 생각을 했었다. 그 이후로 발전에 발전을 거듭하여 대용량의 NGS data를 다루는 사람이라면 누구나 손쉽게 접근할 수 있는 서비스가 되었다. 다양한 생명정보학 분석 도구가 이미 내장되어 있는데다가 Tool Shed를 이용하여 사용자가 구동하기를 원하는 개별적인 프로그램을 적재할 수 있고 워크플로우 구성도 가능하다.

내가 주로 다루는 미생물 유전체 시퀀싱 데이터는 리눅스 기반의 몇 가지 공개 소프트웨어와 CLC Genomics Workbench(Genome Finishing Module 및 Microbial Genomics Module)에서 충분히 소화가 가능했기에 갤럭시에는 별로 관심을 갖기 않았었다. 그런데 최근 감염균의 whole genome sequencing data에 포함된 플라스미드 서열을 조립하지 않고 incompatibility group으로 구분하고 항생물질 내성 유전자 프로필을 구성하는 소프트웨어인 Plasmid Profiler를 테스트하면서 갤럭시를 쓰지 않을 수 없었다. 갤럭시를 로컬 시스템에 설치하는 것은 꽤 부담이 되는 일이다. 그러나 갤럭시와 그 내부에서 워크플로우 형태로 실행 가능한 Plasmid Profiler를 Docker 이미지로 제공하여 정말 쉽게 체험을 할 수 있도록 만들어 놓았다. 개발자가 제공한 샘플 데이터와 내 데이터를 사용하여 그저께부터 벌써 몇번째 실행을 하고 있는지 모른다. Docker라는 도구의 편의성도 놀랍지만 갤럭시도 의외로 사용법이 쉬웠다.

Docker란 도대체 무엇인가? 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 호스트 OS 위에 게스트 OS가 올라가는 VirtualBox 같은 무거운 방식은 잊어버리자. 도커에 대해서 아무 아이디어가 없는 사람은 다음의 웹문서 삼종세트를 읽어보기 바란다.

  1. 초보를 위한 도커 안내서 - 도커란 무엇인가?
  2. 초보를 위한 도커 안내서 - 설치하고 컨테이너 실행하기
  3. 초보를 위한 도커 안내서 - 이미지 만들고 배포하기
갤럭시 도커 이미지PlasmidProfiler-Galaxy 도커 이미지는 각각의 링크를 참조하기 바란다. Plasmid Profiler를 실행하는 것은 너무나 쉽다. 도커를 먼저 설치한 뒤, 다음과 같이 입력하면 그만이다. 첫 실행에서 이미지 파일을 내려받아서 실행을 하게 된다. 실행 중이 도커의 인스턴스를 '컨테이너'라 한다(내가 용어를 정확하게 이해하고 있는지는 아직 자신이 없다). 다운로드한 이미지는 시스템 어딘가에 저장이 되므로 다음번 docker run에서는 좀더 빨리 실행이 된다.
docker run -t -p 48888:80 phacnml/plasmidprofiler_0_1_6  
그러면 웹 브라우저에서 48888 포트를 열면 된다. 다음은 최종 결과물의 스크린샷이다.


내가 실제로 사용한 명령어는 다음과 같다. 이렇게 하면 Plasmid Finder의 결과 파일들이 로컬 파일시스템(/data/apps/galaxy_storage/)에 그대로 저장이 된다. 이를 일부러 지우지 않으면 도커를 중단하고 다음에 다시 실행하여도 보존된 파일을 갤럭시 히스토리 내에서 볼 수 있다. /export는 도커 컨테이너 내에서의 경로이다.
docker run -t -p 48888:80 -v /data/apps/galaxy_storage/:/export/ phacnml/plasmidprofiler_0_1_6

Plasmid Profiler의 작동 설명

플라스미드는 모자이크 구조를 하는 경우가 많고 반복 서열과 mobile element의 함량이 많아서 whole genome sequencing 결과물에서 염색체 서열과 구별하기가 매우 어렵다. PLACENET이나 plasmidSPAdes와 같이 plasmid의 서열만을 추출하려는 프로그램도 존재하지만 그렇게 만족스런 수준은 아니다. Plasmid Profiler는 아예 de novo assembly를 배제하고서 시퀀싱 샘플에 포함된 플라스미드의 유형과 내성 유전자 콘텐츠를 비교하는 것을 목표로 한다.

입력물은 (1) NGS short read data, (2) 플라스미드 서열 데이터, 그리고 (3) replicon sequence + 관심대상 유전자 서열(주로 항생제 내성 유전자)의 세 가지이다. (2)와 (3)은 도커 이미지에 내장된 상태이지만 항생제 내성 유전자는 사용자가 용도에 맞게 추가해야 한다. 기본적으로 포함된 파일에는 5개의 carbapenemase 유전자만 들어있다. (2)번의 플라스미드 서열 데이터(pp_plasmid_database.fasta)는 NCBI에서 다운로드한 Gammaproteobacteria의 플라스미드 서열 2797개를 완성도와 유사도 측면에서 추려서 대표적인 서열만 모은 것이다. (3)번 데이터(plasmidfinder_plusAMR.fasta)는 덴마크 Center for Genomic Epidemiology에서 배포하는 PlasmidFinder DB에서 유래한 replicon sequence 파일에 항생제 내성 유전자 서열을 덧붙인 것이다. 여기서 말하는 replicon이란 흔히 쓰이는 개념인 '자가복제 가능한 서열'이 아니라, 플라스미드의 incompatibility group을 나누는데 기준이 될 수 있는 염기서열이다.

Plasmid Finder의 첫번째 단계에서는 KAT를 사용하여 Gammaproteobacteria의 플라스미드 서열에 해당하는 것(k-mer 기반)만을 선별한다. 그 다음에는 read를 SRST2로 처리하여 curated plasmid sequence, 즉 (1)번 데이터에서 hit를 모은다. 여기서 조금 혼동스러운 것은 이 과정의 결과로서 얻어지는 것이 input read의 모임이 아니라 plasmid database의 hit되는 영역이라는 것이다(이것은 착각이었다. 9월 27일자 추가 사항을 참고). 다음 단계로 넘어가는 서열(history panel에서 "Fasta Extract Sequence on collection ###..."로 표시)의 ID가 다음과 같다는 점에서 확인 가능하다. input read를 조립하지 않고 단지 매핑만 하므로, reference plasmid DB에서 매핑된 영역을 추출하여 다음 단계로 넘기는 것으로 판단된다. 
>550__KU665642.1__KU665642.1__00132 no
>510__KF874498.1__KF874498.1__00168 no
>514__KU295133.1__KU295133.1__00182 no
>686__KJ146688.1__KJ146688.1__00190 no ...

2017년 9월 27일 그리고 이후에 추가한 사항

그게 아니었다. SRST2에서 확인된 plasmid DB의 hit sequence를 그대로 가져오는 것이었다. 이것은 서열 ID와 길이를 서로 맞추어 봄으로써 확인한 것이다. Plasmid Profiler flowchart의 step 3에도 나와있듯이 여기에서 하는 일은 "Identify plasmid hits per isolate from individualized databases (SRST2)"인 것이다.  //추가 사항은 여기까지이다.

다음 과정을 살펴보자. 바로 이전 단계에서 얻어진 서열을 BLAST DB로 전환한 뒤 (3)번 서열을 query로 하여 MegaBLAST를 실시한다. 그러면 어떤 내성 유전자가 있는지, 플라스미드는 어떻게 그룹을 지어야 하는지를 알 수 있다. 마지막 단계에서는 R package를 돌려서 dendrogram이 포함된 heatmap으로서 결과를 작성한다.

아직 결과물이 100% 마음에 드는 것은 아니다. 특히 샘플이 가진 모든 내성 유전자 목록을 보여주지 못한다는 것이 가장 큰 한계점으로 여겨진다. Hit된 reference plasmid가 갖는 best hit AMR(antimicrobial resistance) gene만 보여지게 만들었기 때문이다. 현 단계에서 Plasmid Profiler 논문은 bioRxiv에만 공개된 상태이니 만약 전문 학술지에 정식으로 게재가 되면 성능 개선이 이루어질지도 모르는 일이다.