본문 바로가기

[DevOps]/[Docker]

[Docker] Buildx: Multi-Arch images 빌드하기 (linux/amd64, arm64)

728x90

 

[사용중인 모델에 딱 맞는 '가성비 갑' 인스턴스를 찾아서...]

 

일단 프로젝트에 필요해서 썻는데... 너무 비싼데...??

  프로젝트를 하면서 자연어 감정분류 모델로 BERT를 썼다. 이놈을 돌리기 위해 좀 비싼 모델(Linux t2.xlarge )을 사용했는데, 얼마 쓰지 않았는데도 요금 폭탄의 조짐이 보이기 시작했다. 아무래도 아직 취준생 신분이라... 용돈을 까먹으면서 살아가기 때문에 절약할 수 있는 비용은 최대한 절약해야 했다. 이대로 가다간 EC2 대여비용으로 파산할 지도 모르는 상황이;;

그래서 일단 이 모델이 도대체 얼마나 자원을 잡아먹는지를 알아봤다. 기존의 대여중이였던 (BERT모델이 돌아가는 중이던) 서버에서 top명령어로 찾아보니 사용중인 RAM 용량이 거의 8GB에 육박했다.... 젠장...최소 8GB의 RAM을 보유하는 인스턴스 모델은 내 상황에서 너무 비쌌다.

하지만 다행히 AWS에서는 상황에 맞는 인스턴스를 제공하고 있었다. 인스턴스 유형중에 r6g모델은 vCPU의 숫자를 줄이는 대신 동일 vCPU 모델 대비 넉넉한 메모리를, t2.xlarge의 반값에 제공하고 있었던 것! 물론 분석 성능이 떨어지리라 예상했지만 다량의 유저가 접속하는 서비스가 아니었기 때문에 성능적인 부분은 현실적인 금액과 합의를 봤다. 만약에 테스트를 거쳐 인스턴스를 예약제로 사용하면 조금이라도 더 비용을 줄일 수 있었기 때문이다!

동일 메모리 대비 가격은 절반도 안됐다! 심지어 medium을 사용하면 8GB 메모리 인 대신 비용은 더 줄어든다.

 

그. 런. 데.

 

이제 방법을 찾았으니 이대로 r6g모델에 도커 설치하고 올리면 끝이네! 했는데... 아키텍쳐가 달랐다... 흔히 사용했던 t2는 x86_64인데 비해 이놈은 arm64였던 것!!! docker version 명령어로 확인해 보면 아래와 같이 명확하게 알 수 있다. 

 amd64 != arm64

그래서 BERT모델을 arm64 아키텍쳐로 빌드하는 것을 도전하기로 했다! 도커 공식 문서를 보면 설명이 자세하게 나와있다.

 

Leverage multi-CPU architecture support

 

docs.docker.com

 

 

[ Build multi-arch images with Buildx ]

먼저 docker buildx 를 활성화 한 다음, ls 명령어로 어떤 빌더들을 가지고 있는지 확인해 보자!

docker buildx ls

물론 default 빌더가 있고, 이미 다양한 아키텍쳐에 대해 빌드가 가능하지만 이왕 해보는 거 내 빌더를 만들어 보자. 간단하다!

 

1. 내 빌더 생성해준다. 나는 myArm64Builder라고 지었고, --use로 바로 체크아웃 해주었다

docker buildx create --name [builder instance 명] --use

 

2. 생성한 빌더를 테스트 해준다. 다음 명령어를 사용하면 간단하게 검사가 가능하다! (추가로 혹시 BERT와 같은 무거운 모델을 빌드할 때는 도커의 각 컨테이너 별로 할당된 메모리를 넉넉하게 부여해 주는 것이 좋다. 안그러면 강제로 killed..된다..)

docker buildx inspect --bootstrap

 

3. 이제 빌드해서 올려보자! 나도 언젠가는 이런 편리한 툴을 사용하는 수준을 넘어서 만들 수 있었으면 좋겠다!

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t username/demo:latest --push .

 

 

+ 여담...이지만 다른 도커들은 다 이런 방식으로 빌드가 됐는데, KoBERT는 이상하게 에러가 자꾸 발생했다. 밤새 메달려도 안잡아져서 좀 파고들어가 봤는데, 이번 프로젝트에서 사용했던 JPype1는 arm아키텍쳐를 최신 릴리즈에서도 지원하지 않는 것 같다. 따라서 arm으로 도커를 빌드할 수 있도록 다시 추천시스템에 들어가는 감정추출 부분을 손봐야 할 것 같다....

https://github.com/jpype-project/jpype/releases/tag/v1.3.0

 

Release JPype 1.3.0 · jpype-project/jpype

Fixes for memory issues found when upgrading to Python 3.10 beta. Add additional diagnositics for importing of non-public class. Fixed issue with classes with unsatified dependencies leading to...

github.com

 

 

- 끝 -

728x90