anaconda 4.8.3 버전을 기준으로 작성했습니다.

conda가 뭐지?

운이 좋게 이번 방학에 KISTI 슈퍼컴퓨팅인프라센터에서 알바를 하게 되었다. 슈퍼컴퓨터의 OS는 당연히 linux이고 Centos를 사용하고 있었다. 개발을 하던 도중 깔려있지 않은 파이썬 패키지를 발견했고 설치하려고 pip install {패키지명}을 입력하는 찰나... 옆에 계신 박사님께서 소스라치게 놀라며

"어... pip 안돼~!!"

라고 하셨다(...) 그리고 conda install -c conda-forge를 사용하라고 하셨다. 자동으로 해당 환경에 이미 설치되어 있는 패키지들과의 호환성을 체크해주고 하여튼 아주 강력한 친구라고 한다. 필자는 conda가 그냥 jupyter를 쓰기 편하게 해주는 친구인 줄 알았는데 생각보다 훨씬 강력한 녀석일 수 있겠다 라는 생각이 들었다. 그래서 conda에 대해서 알아보기로 했다.

진리의 공식문서 읽기

문서에 따르면 conda는 Python, R, Ruby, Lua, Scalca, Java, Javascript, C/C++, FORTRAN 등 많은 언어들의 의존성, 패키지, 환경을 관리해준다고 한다. python만 가능한 줄 알았는데 그게 아니였다.. conda는 파이썬을 위해서 개발되었지만 이제는 어떤 언어든지 사용이 가능하다고 한다. conda와 함께라면 패키지들의 버전 이슈를 걱정할 필요가 없게 된다고 한다. conda의 설정을 변경하지 않는다면 repo.anaconda.com에 존재하는 패키지들을 설치하고 관리할 수 있다고 한다. 그리고 conda는 Travis CI 같은 배포툴과 함께 빠르게 변화하는 시스템의 테스트와 배포를 자동화 할 수 있다. 어쨌든 공식문서에는 항상 본인들의 우수성을 뽐내기 마련이다. 대충 읽어봤으니 이제는 공식 문서에서 제공하는 20분짜리 튜토리얼을 따라해보자

Getting Started With Conda

버전 체크와 업데이트

anaconda prompt를 실행하고 conda --version 을 통해서 버전을 체크할 수 있다. 필자는 4.8.2 버전을 설치했다. conda update conda 를 통해서 conda를 업데이트 해보자. 문서에서는 항상 최신버전으로 유지할 것은 권고하고 있다. 개발자들은 항상 최신버전을 사용하는 것을 무서워할 수 밖에 없는데.. 어쩄든 업데이트 후 다시 버전을 체크해보니 4.8.3 버전으로 업데이트 되었다.

특정 버전으로 업데이트 하는 명령어는 다음과 같다.
conda update anaconda={특정버전}

환경 관리

환경 활성화/비활성화

conda에서는 환경(environment)을 만들 수 있다. 사실 anaconda prompt를 실행하면 이미 (base)라는 환경(environment)가 activate되어 있다. 그래서 conda deactivate 를 입력하면 윈도우 기준 일반 cmd처럼 C:\로 시작하는 path가 나온다.

  • 요렇게 deactivate하면 cmd로 나가고 activate하면 다시 base로 들어온다

환경 path 체크하기

where python 명령어를 입력해보자 !

환경 생성

어쨌든 환경을 생성해보자 conda create --name prayme biopython 입력! 환경 생성이 완료되고 conda activate prayme 입력! 하면 환경이 바뀐다

환경 목록 확인

conda info --envs 로 존재하는 환경의 리스트를 확인할 수 있다. 리스트들의 중간에 * 표시가 된 녀석은 현재 activate 되어있는 환경이다.

환경삭제

conda env remove -n prayme 를 통해 환경을 삭제할 수 있다.

환경 내보내기 (다른 시스템에서 사용하기)

환경을 내보내려면 conda-pack이 설치되어 있어야한다. conda-pack을 설치하고 다음 명령어를 입력한다.

  • conda pack -n [환경이름] -o [파일명]

그러면 현재 위치한 디렉토리에 지정한 파일이 생성된다.

환경 가져오기

conda pack으로 압축한 파일을 /.conda/envs/{환경이름} 에 압축을 해제하면 된다. 윈도우에서 별다른 설정을 하지 않은 경우에는 C:\Users\{사용자이름}\Anaconda3\envs\ 에 압축을 해제하면 된다.

파이썬 관리

환경을 생성할 때 새로운 환경에 설치되는 파이썬의 버전은 설치된 anaconda에 정의된 버전을 따른다. 그런데 더 낮은 버전을 사용하고 싶으면 어떻게 할까?
conda create --name turtle python=3.5 이렇게 하면된다.

패키지 관리

어떤 패키지들이 설치되어 있는지 그리고 어떤 패키지를 설치할 수 있는지 확인 하는 방법을 보자
conda search beautifulsoup4 를 입력하면 anaconda repository에서 설치할 수 있는 모든 패키지 리스트들이 출력된다. conda install beautifulsoup4 를 입력해서 설치하고 conda list 로 확인하자

Conda Concepts - Conda Channel

알고보니 conda-forge는 conda의 channel이었다. 이녀석이 뭔지 알아보기 위해서 문서를 읽어보자

conda channel이란?

conda chnnel은 패키지들이 저장되어있는 위치이다. 패키지들을 호스팅하고 관리하기 위한 방법으로 사용된다. 콘다 패키지들은 콘다 패키지 디렉토리 URL인 원격 채널로부터 다운로드가 된다. 만약 채널을 커스터마이징하지 않으면 https://repo.anaconda.com/pkgs/에서 패키지들을 자동으로 다운로드하고 업데이트한다. 다운로드하고 업데이트하는 채널을 수정할 수 있는데 내가 포스팅 초반에 언급했던 -c conda-forge 처럼 수정할 수 있다. 이제 알게 되었지만 -c는 --channel과 같은 뜻이라고 한다.

conda-forge란?

conda-forge는 수천명의 기여자로 구성되어 있는 커뮤니티 채널이다. conda-forge는 PyPI와 비슷하지만 통합된 자동화 빌드 인프라와 더 많은 레시피 검토가 이루어진다.

여러 채널 검토하기

나는 conda install -c conda-forge 로 하나의 채널만 검토했지만 conda install -c {채널명} -c {채널명} 으로 여러개의 채널을 거칠 수도 있다. 서로 다른 채널에서 같은 패키지를 가지고 있을 수 있다. 때문에 콘다는 채널간의 충돌을 핸들링해야만 한다.

채널 충돌 핸들링

당연하게도 기본 채널만 사용하면 채널간의 충돌은 없다. 또한 설치하려는 패키지들이 모든 채널에 존재하지 않으면 채널간의 충돌은 없다. 그러면 채널 충돌 핸들링 방법을 살펴보자

콘다는 채널 우선 순위를 내림차순으로 탐색하며 패키지를 가져온다.

따라서 채널 목록의 가장 아래에 채널을 배치해서 안전하게 기본 채널에 없는 추가 패키지들을 설치하고 기존에 존재하는 core 패키지들의 세팅을 덮어쓰지 않을 수 있다.

콘다가 모든 채널에서 같은 이름의 패키지들을 수집하는 과정을 살펴보자

  1. 패키지들을 채널 우선 순위에 대하여 내림차순으로 정렬한다.
  2. (동일 채널 우선 순위에 있는) 패키지 뭉치(tied packages) 들을 패키지 버전에 대하여 내림차순으로 정렬한다. 만약 Numpy 1.13.1 과 1.12.0 버전이 있다면 1.13.1 버전이 더 위에 위치하게 된다.
  3. (동일 채널 우선 순위에 있고 같은 버전인) 아직 패키지 뭉치(still-tied packed) 인 녀석들을 build number에 대하여 내림차순으로 정렬한다.
  4. 정렬된 리스트에서 가장 위에 있는 패키지들 설치한다.

default 채널보다 conda-forge를 사용하는 네가지 이유

  1. 패키지들이 더 최신 버전일 가능성이 높다.
  2. 패키지 수가 더 많다.
  3. openblas로 의존성 관리 하는 것이 좋다. (defaults는 mkl)
  4. C extension, C wrapper 패키지 같은 컴파일된 라이브러리가 필요한 패키지들을 설치할 때 호환성이 안맞을 가능성을 낮춰준다.

conda-forge 채널 추가하기

아나콘다에서는 거의 무조건 conda-forge 채널을 추가하여 설피하는 듯 하다. 그래서 매번 conda install -c conda-forge 를 하기 귀찮으니까 conda-forge를 primary priority로 추가하자.

conda config --add channels conda-forge 로 채널을 추가하고 conda config --show channels 로 등록된 채널들을 확인해보자.

혹시나 가장 낮은 우선순위의 채널을 추가하고 싶다면 conda config --append channels {채널명} 을 입력하고 채널을 삭제하고 싶다면 conda config --remove channels {채널명} 을 입력하자

유용한 문서

Anaconda 4.6 Version Cheat Sheet

참고 문서

Stack Overflow / Should conda, or conda-forge be used for Python environments?

profile
노력하는 자는 즐기는 자를 이길 수 없다

0개의 댓글