Anaconda 사설 로컬 저장소 채널 만들기

프로그래밍 팁 2022. 7. 27. 23:07

 지금 이순간에도 등장하는 새로운 인공지능 알고리즘을 테스트해보고자 라이브러리를 맞추어서 설치해야 하는데 라이브러리 종속성 충돌로 인해 상당히 골치아픈 일이 많을 것입니다. 이 때 라이브러리를 가상 환경에 만들어 제공하는 Anaconda는 굳이 컴퓨터를 리셋하지 않더라도 간단하게 독립된 가상 환경에서 다른 인공지능 알고리즘의 종속성에 구애받지 않아도 되기 때문에 인공지능 라이브러리 관리 프로그램으로 널리 사용되고 있습니다.

 Anaconda는 딥러닝에 필요한 라이브러리를 인터넷을 통해 제공하고 있습니다. 특히 conda-forge 채널은 상당히 많은 라이브러리들을 제공하고 있어 사실상 Anaconda에서 가장 많이 사용되는 저장소이기도 합니다.

 

 그러나 pytorch와 같이 가장 주요한 딥러닝 라이브러리의 경우 용량이 큰데다가 다운로드 받는데에만 상당한 시간이 소요됩니다. 또한 기업 혹은 국가 기관과 같이 보안을 요구하는 곳에서 혹여나 해커에 의해 악성코드가 숨겨진 라이브러리가 유입될 경우 무형 자산의 심각한 손실이 발생하기도 합니다.

 이러한 환경에서는 자주 사용되는 라이브러리를 로컬 공간에 저장해두고 사용하는 방법이 요구됩니다. 같은 망 내에 있는 컴퓨터를 통해 자료를 받기 때문에 다운로드 속도 향상은 물론 검증된 자료만 사설망 내에 활용함으로서 외부로부터 악성 공격의 유입을 막을 수 있습니다.

 이러한 환경을 만들기 위해 Anaconda의 라이브러리 채널을 저장하여 사설 저장소를 구축하는지에 대해 알아보도록 하겠습니다.

 

기본 개념

 

Python - 프로그래밍 언어 中 하나로서 PIP(파이피)를 통해 수많은 라이브러리를 사용할 수 있습니다.

PIP - Python의 라이브러리 설치를 도와주는 패키지 인스톨러로서 명령어만으로 저장소에서 다운로드 하여 설치할 수 있습니다.

ANACONDA - PIP의 최대 단점인 root 호환성 문제 및 서로 다른 버전의 패키지를 요구하는 인공지능 알고리즘들을 별개의 가상환경을 생성하여 관리해주는 사설 패키지 저장소입니다. 단지 원하는 환경을 명령어로 부르는 것 만으로 다른 라이브러리와의 의존성 충돌을 피하는 것 만으로도 개발자들의 생산성 향상에 큰 기여를 하고 있습니다.

CHANNEL - Anaconda의 저장소를 이루는 기본 단위로서, 자신이 원하는 저장소를 선택하여 패키지를 설치할 수 있습니다.

conda-forge - Anaconda의 channel중 하나로서 상당히 많은 패키지들을 제공합니다. 패키지를 설치하고자 할 때는 다음과 같은 명령어를 사용합니다.

 

$ conda install -c conda-forge 패키지명

 

위 명령어에서 -c는 원하는 채널을 설정하는 명령어로 conda-forge 채널에 있는 패키지를 받아오겠다는 명령어입니다.

 

 지금까지 Anaconda 및 채널의 개념에 대해 설명드렸습니다.  이제부터 우리가 직접 Anaconda의 채널을 만들고 이를 외부에 공개하는 방법에 대해 살펴보도록 하겠습니다.

 

1. Channel 저장소를 미러링 하여 가져오기

 자신만을 위한 Channel 저장소를 만들기 위해 저장소에 다운받았던 나의 환경에 있는 패키지를 그대로 사용하는 방법이 있습니다만, 다른 환경에서 설치할 때 의존성 문제가 발생할 수 있으므로 인터넷 상에 공개되어 있는 Channel 저장소를 미러링하여 가져오는 방법에 대해 설명 드리겠습니다.

 

 먼저 Channel 저장소의 패키지들을 로컬 저장소로 복사해주는 패키지인 conda-mirror를 설치합니다.

$ pip install conda-mirror

혹은

$ conda install -c conda-forge conda-mirror

혹은

$ git clone https://github.com/conda-incubator/conda-mirror

 

 다음으로 로컬 저장소로 복사하고자 하는 채널을 미러링 합니다. 이를 위해 사용되는 conda-mirror의 사용 옵션에에 대해 간단히 살펴보도록 합시다.

-h, --help
conda-mirror의 옵션들을 확인하실 수 있습니다.
--upstream-channel UPSTREAM_CHANNEL
로컬 저장소에 복사하고자 하는 채널명 혹은 주소를 입력합니다.
--target-directory TARGET_DIRECTORY
upstream channel에서 미러링할 로컬 저장소의 경로를 설정합니다.
--temp-directory TEMP_DIRECTORY
로컬 저장소의 경로에 저장하기 전 임시로 저장하고자 하는 폴더 경로를 입력합니다.
Windows의 경우 사용자 계정의 Temp 내에 임의로 생성됩니다. 이 경우 폴더 관리가 어려울 수 있습니다.
--platform PLATFORM
미러링 하고자 하는 운영체제의 종류를 선택합니다. {'linux-64', 'linux-32','osx-64', 'win-32', 'win-64'}
-D, --include-depends
받고자 하는 패키지의 조건을 설정할 수 있습니다. 일종의 화의트리스트 기능을 합니다.
--config CONFIG
blacklist 및 whitelist를 설정한 yaml 파일을 불러옵니다.
--num-threads NUM_THREADS
다운로드를 위해 사용할 스레드의 갯수를 입력합니다. 0을 입력할 경우 사용가능한 모든 스레드를 설정합니다.
--minimum-free-space MINIMUM_FREE_SPACE
로컬 저장소의 용량이 제한되어있을 경우 해당 용량이 초과하지 않도록 mb 단위로 설정합니다.
-k, --insecure
SSL 에러 이슈로 에러가 발생할 경우 SSL을 무시하고 사용합니다.

만약 conda-forge에서 linux 64비트 라이브러리 전체를 다운로드 받고자 한다면 다음과 같이 입력합니다.

 

$ conda-mirror --upstream-channel conda-forge --target-directory local_mirror --platform linux-64

 

 conda-forge는 Python의 거의 모든 패키지를 제공한다 해도 무방할 만큼 모두 미러링을 하게 될 경우 상당한 용량을 감당해야 하는 부담감이 있습니다. 우리들이 사용하고자 하는 라이브러리 패키지가 일부이기에 용량만 차지하는 패키지까지 저장해야할 이유가 없지요. 이를 위해 config를 통해 blacklist와 whitelist를 설정하여 원하는 패키지만 설치할 수 있습니다. blacklist란 다운로드를 원치 않는 패키지가 있는 경우 이를 특정고자 할 때 사용하며, whitelist는 특정한 패키지만 다운로드 하고자 할 때 해당 패키지의 상세 내용을 적어 이외의 패키지를 받지 않기 위해 사용합니다. 이를 위해  config에 적용하고자 하는 yaml 파일을 생성합니다.

 

 만약 여러분들이 botocore라는 라이브러리만 얻고자 하고 특정 버전 및 사용하고자 하는 파이썬 버전을 한정하고자 한다면 다음과 같이 내용을 입력합니다.

blacklist:
- name: "*"
whitelist:
- name: botocore
  version: 1.4.10
  build: py34_0

 

 반면, 특정 패키지중 패키지명에 'agpl'이라는 이름이 들어간 패키지를 제외한 모든 패키지를 설치하고자 한다면 다음과 같은 명령어를 입력합니다.

blacklist:
- license: "*agpl*"

 

 다음으로 예제를 실행해봅시다. 이 예제에서는 특정 버전의 git 패키지만 다운로드할 것입니다.

example.yaml

blacklist:
    - name: "*"
whitelist:
  - name: git
    version: ">=2.32"

 

 다음으로 config를 적용하여 원하는 라이브러리를 conda-forge로부터 가져옵니다.

$ conda-mirror --upstream-channel conda-forge --target-directory 로컬폴더 --temp-directory 임시폴더 --platform win-64 --config .\example.yaml

 

  이 명령어를 실행하면 아래의 그림과 같이 2.32버전 이상의 git 라이브러리 패키지가 다운로도 된 것을 확인하실 수 있습니다.

 

2. 사설 로컬 저장소 채널 지정하기

  이번에는 자신이 갖고 있는 패키지 라이브러리를 사설 저장소 채널로 만드는 작업을 진행합니다. 먼저 conda-build 패키지를 설치합니다.

$ conda install conda-build

 

 로컬 저장소 채널로 만들고자 하는 폴더가 들어있는 디렉토리에 위치한 다음 다음과 같은 명령어를 입력합니다.

 

$ conda index 채널명

 

 실행 후 잠시 기다리면 다음과 같이 채널 디랙토리 내에 index 웹페이지 폴더가 생성된 것을 확인하실 수 있습니다.

 

 

3. 웹서버 구축 및 등록하기

 

 custom 채널 디렉토리에 생성된 index 웹페이지를 열면 다음과 같이 미러링 하였던 저장소 목록이 나타나는 것을 확인하실 수 있습니다.

 

 다음으로 외부에서 미러 서버에 접속할 수 있도록 웹 서버를 설치합니다. 웹서버는 Apache를 보편적으로 사용되고 있습니다.

 자신의 운영체제에 맞는 Apache를 설치하여 웹서버를 구축하도록 합니다.

 

https://mainia.tistory.com/5572

 

윈도우10 아파치 웹 서버 설치하기

아파치 Apache 는 아파치 재단에서 만든 웹 서버 입니다. 윈도우뿐만 아니라 Unix, Linux 등의 운영체제에서 쉽게 운영할 수 있도록 만든 소프트웨어 입니다. 웹 어플리케이션을 만들기 위한 가장 기

mainia.tistory.com

https://askforyou.tistory.com/120

 

[linux] 우분투(ubuntu) 아파치(apache) 웹서버 설치 구축(ufw 방화벽 설정)

아파치 웹서버 설치하기 1. 패키지 목록 업데이트 $ sudo apt-get update 2. 아파치 설치 $ sudo apt-get install apache2 3. 설치 진행 화면에서 "y" 입력 후 진행 3. 설치 완료 후 확인 $ sudo service apache2..

askforyou.tistory.com

 

 Apache httpd를 다운로드하신 후 압축을 풀어 원하는 위치에 설치를 진행합니다. 그 다음 httpd.conf 파일을 열어 4군데를 수정하여 자신의 환경에 맞추어 설정합니다. 

 

 

 위의 절차대로 수행한 다음 설정한 주소를 입력하면 Anaconda Repository 사이트 웹페이지가 나타나는것을 확인하실 수 있습니다.

 

 

4. 구축된 Anaconda custom 저장소 접속하기

 지금까지의 과정을 통해 만든 Anaconda custom 저장소의 Library 패키지를 다운로드해봅니다.

 

> conda install -c http://127.0.0.1/custom-cf git

 

 

 축하합니다! 여러분들만의 Anaconda custom 사설 저장소가 완성되었습니다.

 

 

 

 

 

300x250

열차가 멈추지 않는 정원속 간이역 - 경전전 남평역[2022.06.01]

 

지난 2016년 경전선의 경상도 구간이 현대화 되면서 직선으로 쭉쭉 뻗어나가게 되었음에도 전라도 구간의 서부경전선은 아직까지도 큰 변화는 없어보입니다. 평소 다니는 열차가 많지 않고 수요도 적다보니 개량화에 많은 시간이 걸리는듯합니다.


그런 서부경전선에서도 언제부턴가 공사 소리가 들리기 시작하면서 구간 이설 계획이 진행되고 있습니다. 드디어 서부경전선도 빛을 볼 날이 오는 것일까요?


그러한 와중에 마침 광주에 오게될 기회가 생겨 서부경전선에 있는 역들을 둘러보고자 유일하게 나주시에 위치한 남평역을 찾아가보았습니다.

 

 

 

 

남평역 표지판의 기호가 KTX역으로 표시되어 있군요.

 

 

날씨 맑은 6월 첫째날 찾아간 남평역

 

 

남평역은 하나밖에 없으나 구(舊) 명칭을 붙여주는군요.

 

 

남평역에 나들이 온 사람들을 위해 마련된 간이 밴치

 

 

지금도 화장실은 관리가 되고 있는 것으로 보입니다.

 

 

새하얀 남평역의 자태

 

 

역사 내부는 보존되고 있는 듯 합니다.

 

 

시각장애인을 위한 안내점자까지 마련되어 있군요.

 

 

남평역 바로 맞은편에는 뜬금없이 건널목 신호기가 있습니다.

 

 

역 주변을 걷던 도중 어디선가 새소리가 들려옵니다.

 

 

어떤 새인지는 잘 모르겠지만 도심에서는 만나볼 수 없던 종류의 새였습니다.

 

 

방금전에 보았던 건널목은 알고보니 레일바이크 운영을 위해 만든 것이었습니다. 아쉽게도 레일바이크는 개점휴업 상태였습니다.

 

 

최근까지도 사용되었던 것으로 보이는 남평역 역명판

 

 

열차가 멈추던 시절 이 곳에서 사람들이 타고 내렸겠지요

 

 

타는곳으로 가는 길은 울타리로 굳게 닫혀있습니다.

 

 

특이하게도 역에서 내리자마자 보이는 광경은 흡사 정원같아 보였습니다.

 

 

이 역에 열차가 서던 때엔 손님들에게 비밀의정원으로 인도하는 입구같아 보였을 것 같군요. 

 

 

승객은 없지만 나들이 온 사람들이 아름다운 역 풍경을 보며 멍을 때리는 흡사 역멍을 하기 딱 좋은 풍경입니다.

 

 

300x250

도심속 꼬마열차가 다니는 작은 간이역 - 광주선 극락강역[2022.06.01]

어느덧 2022년 6월이 되면서 여름이 찾아왔습니다. 코로나19 바이러스의 오미크론 변이의 거센 파고가 지나가고 그 위세도 점점 약해져가고 있습니다. 그 덕에 세계로 향하는 하늘길이 조금씩 열리기 시작하였고 염원하던 해외여행도 다시 일상이 되어가는 희소식이 들려옵니다.


한편으로는 감염병 전파 확산 방지를 위한 출입국 제한으로 국내 관광지가 다시 재조명받으면서 국내 여행지 발굴도 이루어지고 있습니다. 그 덕에 굳이 해외를 가디 않더라도 기차만 타고 가도 아름다운 풍경을 감상할 수 있는 여행지를 찾아가는 재미는 더해져가는듯 합니다.


이번 여행은 현재 광주선에서 운행중인 통근열차를 타고 중간 정차역인 극락강역에 다녀와보았습니다.





여행의 출발은 광주역에서부터 시작됩니다.


더이상 KTX 종착역이 아니게 되면서 광주역은 방문할 기회가 거의 없었는데 정말 오랜만에 와봅니다.


지난 2019년 경원선에서 만났던 통근열차를 이 곳에서 다시 보게 될 줄이야!


동두천에서만 달리던 통근열차가 이제서야 본래의 역할대로 광주역에서 부활하였습니다.


이번 여행의 목적지인 극락강역에 다녀와봅니다.


동두천에서 마지막으로 봤던 통근열차를 다시 타게 되어 약간은 어색합니다.


열차 내부는 크게 바뀌지는 않았지만 내부가 더 깔끔해졌습니다.


운행 재개 과정에서 신경써서인지 통근열차에서 느끼던 특유의 냄새가 사라졌습니다.


아마도 그 당시의 냄새는 의자 커버에서 비롯된 것 같군요.


연천에서 보았던 통근열차의 시트는 붉은 와인색이었는데 전동열차의 그 시트 색깔로 바뀌어있습니다.


잠시후 열차가 광주역을 출발합니다.


의외로 광주선 주변은 녹지가 많습니다.


광주송정역까지 짫은 구간이지만 의외로 기차여행을 할때의 설레임이 느껴집니다.


어느덧 열차가 극락강역에 도착합니다.

광주행 무궁화호가 극락강역에서 교행대기중이었습니다.


극락강에서 교행을 마친 두 열차는 거의 동시에 출발합니다.


통근열차는 광주역을 출발한지 8분만에 종착역인 광주송정역을 향해 떠납니다.


통근열차가 순식간에 역에서 멀어져갑니다.


열차를 모두 보내자 극락강역의 아담한 모습이 고스란히 드러납니다.


역 구내가 알록달록하게 꾸며져 있습니다.


작은 간이역 공간이 이렇게 알차게 꾸며져있다니


극락강은 영산강의 다른 이름이라고 하는군요


과연 이 곳은 불교에서 이야기하는 극락일까요?


이 작은역을 찾아오는 손님들은 많지 않지만 손님 맞이만큼은 잘 되있는것같습니다.


역 주변에는 근처 큰길과 아파트단지가 있습니다. 그러나 통근열차를 제외한 열차는 거의 대부분 이 역을 통과하기에 인근의 광주송정역을 사용할겁니다.


드디어 맞이방을 둘러봅니다.


역내 맞이방은 상당히 좁은 편이지만


그 좁은 공간도 최대한 많이 꾸며놓고 있었습니다.


우리나라에서 가장 작은 꼬마역


본래 일부 무궁화호 몇 대만이 서다 가던 역이었으나 광주선 셔틀열차의 등장으로 정차 열차가 많아져 역을 찾는 손님들이 조금이나마 편히 올 수 있게 되었습니다.


중앙선 신림역 1일역장이던 펭수가 극락강역에도 찾아왔을까요?


사실 이렇게 작은 이 역이 주목을 받게된 계기는 내일로 여행객들 덕분일것입니다.


예전 코로나가 없던 시절의 내일로가 그리워집니다.


구내 작은 건널목이지만 건널목명까지 지어주고 상당히 신경쓴 모습입니다.


6월 첫째날이지만 날씨는 벌써 한여름같이 덥습니다.


구름이 솜털같이 날리는 날씨에


광주역에서 출발한 열차가 극락강역에 들어옵니다.


광주역으로부터 출발한지 7분만에 승객을 맞이하는 열차는


때양볕 아래 열차를 기다리던 승객을 집어삼키고


정차중이던 열차를 뒤로 하고


아기자기한 자태를 뽐내는 역 주변을 둘러보던 도중

열차는 유유히 서울 용산역을 향해갑니다.


극락강역을 떠난 무궁화호가 광주선을 빠져나올때 즈음 광주송정역에서 출발한 통근열차가 다시 극락강역에 찾아옵니다.


하루에 15번씩 극락강역을 찾아오는 꼬마열차는


오늘도 극락강역을 찾아온 나그네를 집어 삼키고


다시 광주역을 향해 출발합니다.


그렇게 광주역에 도착하면서 저의 광주선 꼬마여행은 끝이 났습니다.


무더운 여름이 찾아오기전 찾아간 극락강역은 상당히 이색적이었습니다. 언젠간 사라질 운명만을 기다리던 간이역들과는 달리 적지만 꾸준히 찾아오는 손님들 덕에 관광지가 된 극락강역의 모습이 마치 간이역으로서의 황금기를 보내는것이니까요.


다음 여행지는 아직 정하지는 않았습니다. 하지만 앞으로도 사라지는 추억들 뿐 아니라 이렇게 아기자기한 추억을 남겨볼 수 있는 추억을 또 한번 만들어보리라 기도봅니다.

300x250