【8】 Conda custom channel 구축과 운영 : kt NexR 기술블로그 ‘21 테크리포트

생성일
2021/12/07 04:33
태그
2021년
상반기
테크리포트
kt NexR
기술블로그
글쓴이
rowan.song
속성
ktNexR_techreport_Conda custom channel 구축과 운영.pdf
속성 1

I. 서론

배경

NEB 프로젝트를 진행하면서 NEB가 보안성을 위해 폐쇄망에 구축될 경우, 고객들이 사용할 수 있는 내부망 Conda 패키지 서버(Custom Channel)가 필요 할 수도 있다는 요구사항이 있었습니다. 한번도 사용해보지 않은 Conda에 대해 공부할 겸, 위의 NEB 요구사항에 대해 스스로 대비해놓기 위해 리서치를 시작했습니다.

목표

Conda 에 대해 이해한 후 로컬 환경에서 Conda Custom Channel을 구축하고 운영을 해보는 것이 목적입니다.

II. 선행조사 및 작업

Conda란?

Package, dependency and environment management for any language—Python, R, Ruby, Lua, Scala, Java, JavaScript, C/ C++, FORTRAN, and more.
Conda는 Windows, macOS, Linux 에서 실행되는 오픈 소스 패키지 관리 시스템 및 환경관리 시스템입니다.
우리가 흔하게 알고 있는 yum, apt, chocolately 와 같은 패키지 매니저의 기능에다가, python 에 있는 가상환경(venv) 개념까지 같이 제공한다고 이해하시면 얼추 맞습니다.

Conda 설치

Conda를 설치하기 위해서는 Anaconda를 설치하거나, Miniconda를 설치하면 됩니다.
Anaconda는 기본적으로 포함된 패키지가 많기때문에 용량이 크고 Custom Channel 에 필요하지 않은 패키지가 다수 포함되어있으므로 Miniconda를 설치하도록 하겠습니다.
■ Miniconda 설치(권장)
Python 설치 Miniconda는 Python 2.7, 3.7, 3.8, 3.9 를 지원하고 있습니다. 만약 해당 파이썬 버전이 없거나 낮은 버전이 설치되어있다면 필요한 파이썬을 먼저 설치합니다. 아래는 제 로컬환경이 3.6.8버전이어서 현재 최신버전인 3.9.5 버전을 설치하는 과정입니다.
Install Python 3.9.5
sudo dnf install wget yum-utils make gcc openssl-devel bzip2-devel libffi-devel zlib-devel yum -y install wget wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz tar -xvf Python-3.9.5.tar.xz cd Python-3.9.5 sudo ./configure --with-system-ffi --with-computed-gotos --enable-loadable-sqlite-extensions sudo make -j sudo make altinstall
Miniconda 다운로드
miniconda 설치
Install
bash Miniconda3-latest-Linux-x86_64.sh
Miniconda 설치 확인
Verify
conda list
■ Anaconda 설치
사전 필요 패키지 설치 Anaconda 설치에 필요한 패키지를 설치합니다.
RedHat
yum install libXcomposite libXcursor libXi libXtst libXrandr alsa-lib mesa-libEGL libXdamage mesa-libGL libXScrnSaver
Anaconda 다운로드
Anaconda 설치파일 실행
Install
bash ~/Downloads/Anaconda3-2020.02-Linux-x86_64.sh
Anaconda 설치 확인
Verify
conda list

Conda Custom Channel 구축

Conda의 설치가 완료되었으면, 본격적으로 Custom Channel을 구축해보겠습니다.
conda-build 설치 Custom Channel 구축에 필요한 패키지를 설치합니다.
install conda-build
conda install conda-build
Channel로 설정할 폴더 하위에 플랫폼 디렉토리 생성 후 패키지 구성 Custom Channel로 설정할 폴더를 만들고, 채널에서 서빙할 패키지에 대한 준비를 합니다. 아래 코드는 linux-64 의 numpy 패키지 한개만 다운로드 하여 구성하는 코드입니다.
conda index 실행 위에서 생성한 channel 폴더에서 conda index 명령을 실행하면 conda가 channel에 필요한 기초파일을 생성함과 동시에 각 폴더내부에 repodata.json 파일을 생성합니다.
generates repodata.json
conda index channel/
Test Custom Channel이 잘 만들어졌는지 확인해보기 위해 테스트를 수행합니다. file:// 프로토콜을 이용해서 channel 디렉토리를 채널로 지정하여 테스트합니다.
Test
conda search -c file:///home/rowan/repos/study/techreport/conda/channel/ --override-channels
** --override-channels 옵션을 사용하면 conda가 지정된 채널(-c 옵션으로 지정한 채널)만 검색하고, default channel 또는 .condarc파일에 나열된 채널은 검색하지 않습니다.

Create Test venv and Test Install Package

위의 과정을 거쳐 만든 custom channel을 테스트하기 위해서 가상환경을 하나 생성하고 numpy를 설치해보겠습니다.
set Default Channel
conda create --name testEnv conda activate testEnv conda install numpy -c file:///home/rowan/repos/study/techreport/conda/channel/ --override-channels
위의 명령어를 실행하면 다음과 같은 오류가 발생합니다.
다시 채널로 돌아가 numpy 패키지의 repodata.json파일을 살펴보면, numpy는 7개의 패키지에 종속적임을 확인할 수 있습니다.
종속된 패키지때문에 발생한 문제로 보이기때문에 해당 패키지 파일을 가져와서 준비합니다. 또한 numpy는 파이썬 3.7버전 이상 3.8버전 미만에 대해 종 속관계를 가지므로, 테스트 가상환경에 파이썬 3.7 버전도 같이 설치합니다.
종속성 패키지를 넣으면 numpy가 설치될 줄 알았으나, 아래와 같은 오류가 발생하였습니다.
조사해본 결과, 다른 channel(conda-forge)에서 복사해온 패키지를 conda index를 통해 repodata.json을 생성하면 내가 현재 구축해놓은 cutom channel에 존재하는 패키지를 기준으로 종속성이 계산되고 Tree가 생성되기 때문에 설치가 불가능한 것이었습니다. 문제를 알았기 때문에 conda-forge 채널에 있는 종속성 패키지를 전부 찾아 설치 후, custom channel의 numpy를 설치시도하니 설치가 됨을 확인할 수 있었습니다.

III. 운영

위에서 테스트해본 바와 같이 channel에서 패키지별로 복사해와서 custom channel을 구축하면 오류가 발생하므로, wget을 이용하여 서비스중인 채널의 repodata.json을 포함하여 custom channel에서 서빙할 os폴더의 패키지파일을 복사해와서 운영합니다. 미러링 해오는 channel에 존재하는 모든 패키지가 없어도, 없는 패키지 파일이 설치실행될 경우 패키지가 없어서 오류가 발생할 뿐이지 종속성에 대한 오류는 발생하지 않기 때문입니다. 아래는 tsinghua대학의 channel을 링크를 저장해놓고 wget으로 미러링해오는 예입니다.
#!/bin/bash for link in cat links.txt; do wget -m -np -nH --cut-dirs=1 -e robots=off -R "index.html*" $link done
wget 옵션에 대한 설명 ** -m : 미러링에 적합한 옵션. -r -N l inf - no-remove-listing 옵션의 alias 옵션 ** -np: 상위 디렉토리로 올라가지않음 ** -nH: host-prefixed 디렉토리 생성 비활성화 ** -cut-dirs: number directory component 무시. 재귀 ** -e robots=off : robots.txt 무시 ** -R: reject 할 목록

IV. 결론

NEB에서는
1.
conda channel중 제일 이용하는 사람이 많은 conda-forge를 mirroring하되,
2.
single user server의 OS인 Ubuntu에 해당하는 linux-64폴더에 존재하는 패키지를 mirroring하고
3.
현재 분석환경에서 가장 많이 사용되는 python3 커널에 대해 분석환경을 제공할 예정이기 때문에 python3 버전에 맞는 py36~py39버전에 해당하는 패키지를 mirroring
하면 된다는 결론에 도달했습니다.
로컬에서 위 3가지 조건에 대해서 미러링해보니 9시간동안 3900여개의 파일에 대해서 19기가바이트 용량의 패키지를 다운받을 수 있었습니다.

V. 후속연구/차후계획

만약 추후에 channel을 구축하게 될 경우 미러링을 하는 방법에 대해서 구축하는 방법에 대해 찾아봐야할 듯 합니다. 그리고 종속성을 어떻게 conda가 구축하는지에 대해서도 알아보고 싶습니다.
【8】 Conda custom channel 구축과 운영 : kt NexR 기술블로그 ‘21 테크리포트
Reference
본 기술블로그에 게재되는 모든 컨텐츠의 저작권은 케이티넥스알(kt NexR)에서 가지고 있으며, 동의 없는 컨텐츠 수정 및 무단 복제는 금하고 있습니다. 컨텐츠(글/사진/영상 등)를 공유하실 경우 반드시 출처를 밝혀주시기 바랍니다. Copyright(c) 2021 kt NexR, Inc. All Rights Reserved.