0%

Docker 컨테이너에서 모델 훈련하기

AWS EC2 인스턴스에 있는 Docker 컨테이너에서 딥러닝 모델을 훈련하는 과정에 대해서 정리합니다.


EC2 인스턴스 생성하기

먼저 커맨드라인에서 AWS에 접속하여 사용할 EC2 인스턴스를 생성한다. 만약 생성하는 방법을 모른다면 EC2 인스턴스 생성하기에서 확인할 수 있다.

1
2
# IAM계정 로그인
aws configure
1
2
# EC2 인스턴스 생성
aws ec2 run-instances --image-id '인스턴스 이미지' --count '인스턴스 수' --instance-type '인스턴스 타입' --key-name '키 페어 이름' --security-groups '보안 그룹 이름'

EC2 인스턴스에 접속하기

다음으로는 생성한 인스턴스에 접속한다. 해당 인스턴스의 인바운드 규칙이 SSH 접속이기 때문에 아래의 코드를 입력한다.

1
2
chmod 400 '키 페어 이름.pem'  # SSH 퍼미션 변경
ssh -i '키 페어 이름.pem' ec2-user@ '헤당 인스턴스 PublicDnsName'

chmod 400은 해당 파일의 소유주만 읽을 수 있도록 권한을 변경하는 것이다. 해당 인스턴스 PublicDnsName는 인스턴스의 정보에서 찾을 수 있다. 만약 PublicDnsName를 모른다면 아래의 코드를 입력해서 복사해오면 된다.

1
aws ec2 describe-instanses

해당 인스턴스 접속에 성공하면 프롬프트가 인스턴스 ID로 변경된다.

1
[ec2-user@ip-**-**-*-*** ~]$ # 인스턴스에 접속된 프롬프트

EC2 인스턴스에 훈련 데이터 가져오기

이제 인스턴스에 S3에 저장해둔 훈련데이터를 가져올 것이다. 인스턴스는 가상 서버이기 때문에 S3에 접속하려면 다시 IAM 계정에 로그인해야 한다.

1
2
# IAM계정 다시 로그인
aws configure

그 다음에는 아래의 코드를 입력하여 훈련데이터가 들어있는 버킷을 인스턴스에 복사해온다.

1
aws s3 sync s3://;'가져올 버킷 이름' /home/ec2-user

그러면 커맨드라인에 아래와 같이 다운되었다고 나올 것이다.

1
2
3
4
5
6
download: s3://mnist-data-60000/Dockerfile to ./Dockerfile
download: s3://mnist-data-60000/model.py to ./model.py
download: s3://mnist-data-60000/test_y.pickle to ./test_y.pickle
download: s3://mnist-data-60000/train_y.pickle to ./train_y.pickle
download: s3://mnist-data-60000/test_x.pickle to ./test_x.pickle
download: s3://mnist-data-60000/train_x.pickle to ./train_x.pickle

인스턴스 디렉토리를 확인하여 잘 다운되었는지 확인해보자.

1
2
> ls
Dockerfile model.py test_x.pickle test_y.pickle train_x.pickle train_y.pickle

EC2 인스턴스에 도커 설치하기

이제 인스턴스에 도커를 설치해야 한다. 아래의 코드를 입력하여 도커를 설치해보자.

1
2
3
4
sudo yum update -y
sudo yum install docker
sudo service docker start
sudo usermod -a -G docker ec2-user

도커가 정상작동하기 위해서는 인스턴스를 재부팅해야 한다. 아래의 코드를 입력하여 EC2 인스턴스를 재부팅한다.

1
2
aws ec2 reboot-instances --instance-ids '인스턴스  ID' # 그냥 logout만 입력해도 된다.
ssh -i '키 페어 이름.pem' ec2-user@ '헤당 인스턴스 PublicDnsName'

그 다음 아래의 코드를 입력하면 도커가 정상작동하는 것을 확인할 수 있다.

1
docker info

docker image 빌드하고 컨테이너 생성하기

인스턴스 재부팅이 완료되었다면 저장해두었던 도커파일을 빌드하여 컨테이너를 생성해보자. 아래의 코드를 입력하여 도커파일을 빌드한다.

1
docker build -t train:0.0 .

위 코드는 현재 디렉토리에 있는 도커파일을 train:0.0라는 이름으로 빌드한다. 뒤에 (띄어쓰기).는 현재 디렉토리를 나타낸 것이다. 그렇기 때문에 위 코드를 입력할 때 잊지 말고 같이 입력해야 한다. 이미지 빌드가 완성되면 아래의 코드를 입력하여 확인할 수 있다.

1
2
3
4
5
docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
train 0.0 947c77773268 8 seconds ago 2.05GB
ufoym/deepo tensorflow-py36-cpu 437bbe6aecab 5 weeks ago 1.79GB

위와 같이 나왔다면 이미지 빌드에 성공한 것이다. 이제 train:0.0을 사용하여 컨테이너를 생성할 것이다. 아래의 코드를 입력해보자.

1
docker run -v /home/ec2-user:/app train:0.0

위 코드에 대해 살펴보자면 먼저 -v는 호스트의 디렉토리를 생성할 컨테이너 디렉토리로 마운트하는 것이다. /home/ec2-user은 EC2 인스턴스의 디렉토리이고, /app은 컨테이너 디렉토리이다. (도커파일에서 컨테이너 디렉토리를 /app으로 설정하였다 ) 그 다음 사용할 이미지 이름과 태그를 입력하면 도커 컨테이너가 작동한다.

훈련 결과 확인하기

컨테이너가 작동되면 커맨드라인에 아래와 같이 훈련이 진행되는 상황이 보인다.

1
2
3
4
5
6
7
8
Epoch 1/100
600/600 [==============================] - 55s 92ms/step - loss: 0.1782 - accuracy: 0.9444 - val_loss: 6.7693 - val_accuracy: 0.9827
Epoch 2/100
600/600 [==============================] - 55s 91ms/step - loss: 0.0519 - accuracy: 0.9840 - val_loss: 5.7595 - val_accuracy: 0.9855
Epoch 3/100
600/600 [==============================] - 55s 91ms/step - loss: 0.0357 - accuracy: 0.9886 - val_loss: 8.1897 - val_accuracy: 0.9838
.heco
.

이것은 우리가 명령했던 model.py가 잘 작동하고 있다는 의미이며, 학습이 끝나면 가중치, 모델 스트럭쳐와 같은 모델 정보들을 EC2 인스턴스에 저장한다. 모델 정보는 mnist_convNet이라는 폴더로 저장된다. (model.py의 마지막 줄에서 폴더 이름 수정 가능하다)

아래의 코드를 입력하여 EC2 인스턴스의 디렉토리를 확인해보자.

1
2
3
4
ls

Dockerfile model.py test_y.pickle train_y.pickle
mnist_convNet test_x.pickle train_x.pickle

훈련 결과 S3에 저장하기

훈련이 끝났다. 이제 훈련이 완료된 모델 정보를 S3의 버킷에 저장해야 한다. 아래의 코드를 입력해보자.

1
tar cvf `저장할 이름.tar` mnist_convNet

위 코드는 mnist_convNet폴더를 하나로 묶어준다. 이후 해당 파일을 S3 버킷에 복사하면 된다.

1
aws s3 cp `저장한 이름.tar` s3://'저장할 버킷 이름'

그럼 아래와 같이 훈련 결과가 S3에 저장된 것을 확인할 수 있다.

AWS6_1

이제 AWS를 사용하여 모델 훈련까지 완료하였다. 다음 글에서는 훈련된 모델에 사용하는 방법에 대해서 살펴볼 것이다.