alt text

최근에 부쩍 오픈소스로 테스트할일이 생겨 ‘git clone + conda 가상환경 세팅’ 세트메뉴로 배를 채우고 있습니다. 프로젝트마다 요구하는 패키지들도 너무 다르고 패키지 관리를 보다 수월하게 하고 싶을 때 우린 패키지 관리 도구를 사용합니다. 패키지를 관리하는 가장 쉬운 방법 중 하나는 각 프로젝트마다 특화된 환경, 즉 가상환경을 만드는 것이죠.

예전에 가상환경을 관리할 땐 파이썬 표준 패키지인 venv를 사용하곤 했는데 최근 것허브 설치 가이드라인들은 거의 다 conda를 이용한 패키지 관리를 권유하는 것 같습니다.

conda로 먼저 myenv라는 이름의 가상환경을 만들어봅시다. 대게 다음 두 가지 옵션 중 하나를 사용하게 됩니다.

conda create -n 환경이름 python=3.10
conda env create -f environment.yml

첫 줄은 파이썬 버전을 명시하며 가상환경을 만드는 방법입니다. 여기서 -n은 가상환경 이름을 지정하는 옵션입니다.

여기서 두 번째 형태를 더 자주 사용하게 될 수도 있습니다. 바로 가상환경에 필요한 패키지들을 정리한 yml 파일을 지정하여 생성하는 방법입니다. 이전 방법과 달리 가상환경명 myenv가 보이지 않네요..? yml 파일을 더 자세히 들여다보겠습니다.

name: myenv          # 생성될 환경의 이름
channels:
  - defaults                  # 패키지를 다운로드할 경로
dependencies:
  - python=3.9                # 파이썬 버전
  - numpy
  - pandas
  - scikit-learn
  - pip:                      # conda에 없는 건 pip로 설치 가능
    - transformers

네! 바로 그렇습니다. 가상환경에 필요한 패키지 리스트를 포함한 가상환경의 메타데이터가 yml 파일에 적게 됩니다. conda에 없는 패키지는 pip: 을 통해 pip으로 설치해야 할 패키지를 명시할 수 있습니다.

alt text

위 사진은 제가 가상환경을 위한 yml 파일을 작성하다 오류를 일으킨 부분입니다. 사실 torch 패키지가 flash-attn보다 하위에 위치해 있었는데, flash-attn이 torch 패키지에 의존성을 갖기 때문에 torch는 flash-attn보다 먼저 설치되어야 하고, 따라서 위치상 더 위에 위치해야 합니다. 패키지 리스트를 작성할 때 패키지 간 의존성도 고려해야 한다는 사실!

이제 가상환경을 생성했으니 가상환경을 활성화 시켜보겠습니다.

conda activate myenv

conda activate 키워드로 myenv 가상환경에 들어왔습니다. which python3를 터미널에 입력하여 현재 사용 중인 파이썬 인터프리터가 myenv의 파이썬임을 확인해볼 수도 있습니다.

conda deactivate # 가상환경 비활성화
conda env list # conda로 등록된 가상환경 리스트업
conda remove -n 환경이름 --all # 가상환경 삭제

기타 유용한 가상환경 관련 명령어입니다.

근데 간혹 yml 파일따라 가상환경을 설치하면 일부 패키지만 설치되고 중간에 오류를 뱉으며 끝내 일부 패키지들은 설치되지 않는 경우가 있습니다. 이럴때 현재 환경이 environment.yml 과 얼마나 다른지 알면 좋겠죠? 우선 현재 환경에 대한 정보를 담은 current_env.yml 파일을 생성합니다.

conda env export > current_env.yml

그리고 diff 명령어를 사용하면 두 yml 파일 사이를 비교한 결과를 터미널창에서 확인할 수 있습니다. git diff 키워드처럼 current_env.yml 파일에 있으면 prefix +, 없으면 prefix -로 표시해줍니다.

여기서 prefix -가 많다면 가상환경 세팅이 덜 되었다는 의미이므로 conda env update로 current_env.yml을 environment.yml에 맞추게 할 수 있습니다. 하지만 대게 conda env update로 해결이 되지 않아 에러가 발생했을 것이기에, 문제를 해결하고(위에서 예시를 들었던 pip 의존성 문제) conda env update를 실행하면 됩니다.

diff -u environment.yml current_env.yml
conda env update --file environment.yml --prune