KoBERT 모델을 colab을 통하여 fine-tuning 하여 이진분류 모델을 만들었었다. 하지만, 웹 서비스에 적용하기 위해서는 local 환경에서 세팅을 할 수 있어야 하므로 로컬에서 세팅을 하기위해 애를 먹었다. 구글링을 해보면 colab을 통해 koBERT 실습을 한 케이스는 많이 볼 수 있지만 직접 local 환경에서 세팅을 한 경우는 보지 못하였다. 오늘은 그에 대해서 적어보려고한다.
Docker란?

Docker는 애플리케이션을 개발, 배포 및 실행하기 위한 플랫폼 및 도구 모음이다.
주요 목적은 소프트웨어를 컨테이너 라고 불리는 표준화된 유닛 내에서 패키징하여, 코드가 일관된 환경에서 실행될 수 있도록 하는 것이다. Docker의 핵심 개념과 특징은 다음과 같다.
1. 컨테이너
Docker 컨테이너는 애플리케이션과 그 애플리케이션이 의존하는 라이브러리 및 기타 요소들을 함께 묶는 경량화된 실행 환경이다.
컨테이너는 각각 독립된 환경을 제공하기 때문에 다른 애플리케이션 또는 시스템 설정과 충돌 없이 실행된다.
2. 이식성
Docker 컨테이너는 어디서나 동일하게 작동합니다. 개발자의 랩톱에서 작동하는 컨테이너는 클라우드나 서버 환경에서도 똑같이 작동한다. 이는 "한 번 빌드하면, 어디서든 실행된다(Write Once, Run Anywhere)"는 이점을 제공한다.
3. 경량화 및 빠른 시작
Docker 컨테이너는 가상 머신보다 훨씬 가볍고 빠르게 시작된다. 이는 Docker가 호스트 OS의 커널을 공유하고, 전체 운영 체제를 가상화하지 않기 때문이다.
4. Docker 이미지
Docker 컨테이너는 이미지에서 생성된다. 이 이미지는 애플리케이션의 실행에 필요한 모든 것을 포함하는 템플릿 역할을 한다. 이미지는 레이어로 구성되어 있으며, 이 레이어들은 읽기 전용이다. 컨테이너가 시작되면, 이미지 위에 쓰기 가능한 레이어가 추가된다.
5. Docker Hub 및 레지스트리
Docker Hub는 공개적으로 사용할 수 있는 Docker 이미지들을 저장하는 중앙집중식 서비스이다.
사용자는 자신의 이미지를 Docker Hub에 업로드하거나 다른 사람이 만든 이미지를 다운로드할 수 있다.
6. 개발 및 배포 단순화
Docker는 개발부터 테스트, 그리고 프로덕션에 이르기까지 소프트웨어 배포의 복잡성을 줄여준다.
KoBERT 이미지 가져오기
운이좋게 준커(https://velog.io/@kjgi73k/posts)님이 설정해놓은 도커 환경을 가져와서 쓸수 있었다. 도커 환경을 담고있는 이미지 파일을 가져오는 방법을 서술하겠다.
1. Docker Hub
위에서 말한 Docker Hub에 hamsss/kobert_env를 검색하여 이미지 파일을 받아 사용할 수 있다.

2. docker run hamsss/kobert_env 명령어
위의 명령어를 통해 hamsss/kobert_env 이미지를 받고 컨테이너를 생성 및 실행시켜준다.
GPU driver 연결
딥러닝을 하기 위해서는 도커가 GPU를 인식할 수 있도록 NVIDIA Container Toolkit을 이용하여 연결해주어야한다.
NVIDIA Container Toolkit은 자동으로 base machine의 GPU dirver를 인식하여 도커 컨테이너가 실행되면 연결시켜준다.
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
위 과정을 통해서 hamsss/kobert_env 컨테이너를 생성하고
docker run -it --gpus all hamsss/kobert_env
명령어를 통해 컨테이너를 실행한다.
CUDA Version이 궁금해서
nvidia-smi
명령어를 통해 CUDA Version을 확인해보면 12.6 버전인것을 볼 수 있었다. RTX3070 GPU를 사용하는데 저 버전이 호환이 되는것같다.

이 후에 나는 VSCode의 Remote Development Extension을 설치하고

vscode로 도커 컨테이너에 접속하여 이 컨테이너 내부에서 개발을 진행 할 수 있었다.

이 코드를 통해 True가 뜨면 CPU를 사용할 수 있다.
느낀점
docker의 편리성에 대해서는 주변에서 자주 들어봤지만 직접 사용해본적은 처음이었다. 개발에 필요한 환경 그대로를 이미지로 만들어서 사용할 수 있기때문에 이식성이 좋고 독립된 환경을 제공하기 때문에 시스템과의 충돌없이 개발을 할 수 있다는게 정말 좋은 것 같다. 아직 Docker에 능숙하지 않은것같아서 앞으로 Docker를 사용하여 개발하여 친숙해질 수 있도록 노력해야겠다.