회사에서 한국지능정보사회진흥원(NIA)의 인공지능 학습용 데이터 구축 사업을 진행하고 있었다. AIHUB에 올라갈 데이터를 수집부터 정제, 가공까지 전쟁과도 같았던 그 6개월을 지나와서 어찌어찌 데이터가 완성되었다. 이제 구축한 데이터로 인공지능 모델을 학습하는 작업만이 남아있었다. 그런데 청천벽력 같은 소식을 들었다.
"모델링 작업 도커 이미지로 말아서 올려주셔야 해요"
분명 한국말인데(사실 영어 단어이다)'모델링' 과 '해요' 외에 이해되는 단어가 없었다.
문과 출신으로 컴퓨터공학 베이스가 부족한 것도 있지만, 연구실이나 데이터 분석 업무 및 모델 학습할 사용해 본 툴(?)은 아니었다. 취업 준비할 때 Job Description에서 본 것이 전부였다.
내 지식과 경험의 부족함은 차치하고 당장 이걸 만들어서 제출해야 한다는데 눈앞이 깜깜했다. 이에 온갖 블로그, 유튜브 강의를 찾아보면서 Docker가 무엇이고, 내가 결국 뭘 해야 하는지 찾아보았다. 이 글은 그 과정에서 내가 이해한 도커의 개념들을 실제로 내가 한 작업에 대입해서 정리한 글이다. 따라서 조금 부정확한 정보들이 있을 수 있다.
도커는 애플리케이션을 컨테이너라는 격리된 환경에 패키징하는 기술이다. 이를 통해 '내 컴퓨터에서는 되는데…'라는 유명한 문제를 해결할 수 있다. 도커는 개발부터 배포까지 일관된 환경을 제공하여, 소프트웨어가 어디서나 동일하게 실행될 수 있도록 해주는 툴이다.
도커 이미지는 애플리케이션과 그 실행에 필요한 모든 것을 담은 패키지이다. 이 이미지는 실행되어야 할 코드, 런타임, 라이브러리 등을 포함하여 애플리케이션을 실행하는 데 필요한 모든 요소를 담고 있다. 작업이 필요한 서비스나 프로젝트 코드들이 실행될 수 있게 실행 가능한 환경을 말 그대로 환경 이미지 캡처해 놓는 것이다.
결국 나는 모델을 학습할 수 있는 도커 이미지를 만들고 저장해서 올려야 하는 것이었다. 이 작업이 필요한 이유는 우리가 학습한 모델을 같은 환경에서 다시 학습해 보면서 같은 결과가 나오는지 검증이 필요하기 때문이다.
도커 이미지는 Docker hub에서 다른 사람들이 만들어 놓은 것을 pull해서 가져올 수 있고, 내가 만든 이미지도 docker hub에 올려서 직접 가져올 수 있다.
위 페이지는 내가 이번 프로젝트에 사용할 환경들을 가볍게 설치한 도커 이미지를 Docker hub에 올려둔 것이다. Docker hub에 이미지를 올려두면 어느 곳에서든 불러와서 작업할 수 있고, 미리 나나 다른 사람들이 환경들을 미리 세팅해 놓은 이미지를 활용하면 처음부터 환경 세팅을 다시 할 필요가 없어서 편하다. 예를 들어 우분투 22.04 환경에 파이썬이 설치된 이미지가 필요하다면 처음부터 우분투와 파이썬을 설치할 필요 없이, docker hub에서 이미 우분투와 파이썬을 설치한 이미지를 불러오기만 하면 되는 것이다.
Dockerfile은 도커 이미지를 만들기 위한 레시피라고 할 수 있다. 이 파일에는 애플리케이션을 실행하는 데 필요한 모든 지침이 포함되어 있습니다. 마치 요리법을 따라 음식을 만들 듯, Dockerfile을 사용해 도커 이미지를 생성할 수 있다.
아래는 내가 작성한 도커 파일 예시이다.
코드를 돌릴 conda 환경이나 GPU setting은 ubuntu_docker_test에 이미 설정해 두어서 데이터와 소스코드들을 받아둔 현재 위치를 docker 이미지에 COPY 명령어를 통해 마운트 시키는 작업을 진행한다. 그 이후 코드가 돌아갈 위치를 WORKDIR 명령어로 소스코드가 있는 fine-tuning 폴더로 이동하는 작업까지 진행하도록 지침을 준 것이다.
# ubuntu_docker_test 불러오기 - 환경설정 완료된 도커 이미지
FROM minwoodavid/ubuntu_docker_test ./
#현재 폴더를 도커 이미지 내 home/ner 폴더에 복사
COPY ./ home/ner/
#실행 위치 fine-tuning 폴더로 이동
WORKDIR /home/ner/fine-tuning
도커 이미지를 빌드할 때 dockerfile에 있는 지침들이 위에서부터 차례대로 돌아가면서 이미지가 생성된다. 중간에 에러가 발생하면 실행된 부분까지 이미지가 생성(build)되는 것이 아니라, 도커파일에 있는 지침들이 모두 실행이 완료되었을 때 도커 이미지가 생성되게 된다.
도커 이미지를 실행(run)하면 '도커 컨테이너'가 생성된다. 컨테이너는 이미지의 실행 인스턴스로, 독립적으로 작동하는 애플리케이션을 담고 있다. 컨테이너는 가볍고 빠르며, 격리된 환경에서 이미지가 실행되어 원하는 작업을 진행할 수 있다. 도커 이미지에 조성된 환경에서 돌아갈 수 있는 작업이 명령어를 통해 실행될 수 있다.
이번 프로젝트에서 만든 docker 이미지는 Ubuntu 20.04 버전을 기반으로 생성된 이미지로, 실행했을 때 도커 컨테이너가 터미널 형태로 생기는 것을 확인할 수 있었다.
정리해 보면, Docker는 실제 서비스나 프로젝트에서 돌아가야 할 환경을 저장하고 제공하여 어느 곳에서든 동일하게 작업 진행이 가능하게 한다. 이 작업은 Dockerfile에 지침들을 적어두고 이 지침을 토대로 docker image를 build하고, 생성된 image를 실행하여 작업이 진행될 인스턴스 형태의 docker container가 생성된다.
인공지능 모델을 학습할 때, 이후에 docker를 많이 활용할지 어떻게 활용될지는 아직 정확히 모르겠다. 하지만 여러 환경에서 같은 코드를 돌린다거나, 한 개의 서버에서 여러 작업이 동시에 돌아가도록 관리할 때, 개발 환경과 운영 환경의 차이를 최소화하여 일관된 작업 환경을 제공할 수 있기에 유용하게 사용될 것 같다.