docker 오프라인 설치 & Multi-Arch 빌드하기 ~ cpu ARCH가 다른 경우 (amd64, ppc64le 등)

고객의 정보가 중요한 모든 회사는 당연하게도 망이 분리되어있다.

모델 개발을 해야 하는데, 환경설정을 매번 승인받아서 올리는 중, 힘들다....

나와 같은 환경에 있을 대기업 AI개발자 친구들을 위해, gpu 사용자를 위해 글을 써 올립니다.

-----------------------------------------------------------------------------

기본적인 docker command 정보 및 구성요소. 출처




아래와 같이 진행됩니다.

0. 설치하려는 곳 docker 버전을 docker -v로 확인합니다.

당연히 gpu 사용이 필요하실테고, 이를 위한 과정입니다.
19.03 이전 버전에는 nvidia-docker2와 --runtime=nvidia 플래그가 필요합니다. 19.03 이상 버전에는 nvidia-container-toolkit 패키지와 --gpus all 플래그를 사용합니다.

1. uname -m을 통해 시스템 하드웨어 타입(아키텍쳐)를 확인합니다

amd64, ppc64le 등.


2. 설치하고자 하는 docker image의 아키텍쳐를 확인합니다.

huggingface/transformers-pytorch-gpu 를 받고자 하는데, arch가 amd64네요. 기존 시스템과 상이하기 때문에 Multi-Arch 이미지를 빌드해야 합니다.

동일한 경우에는 패스하셔도 됩니다.



위의 이러한 확인 과정 및 Multi-Arch 빌드를 거치지 않고 docker run으로 이미지를 컨테이너화하면
standard_init_linux.go:203: exec user process caused "exec format error"
라는 오류가 출력되며 진행이 되지 않습니다.

3. 오프라인 환경에서 활용가능하도록 저장하고 로드합니다.

다른 블로그에서 볼 수 있는 내용과 같습니다.
제가 새로 추가한 것 외 출처는 여기 입니다.

1) 먼저 인터넷환경에서 받고싶은 image를 docker hub에서 땡겨받는다.

docker pull huggingface/transformers-pytorch-gpu:3.0.2

2) (선택) 내 도커 이미지를 커스터마이징한다 - commit | build 사용

컨테이너 실행을 하고
nvidia-docker run --name trans302 -it -d huggingface/transformers-pytorch-gpu:3.0.2
nvidia-docker exec -it trans302 /bin/bash
* docker option은 여기 참조

원하는 파일 설치~~
pip install gpustat
pip install -i http://ftp.daumkakao.com/pypi/simple --trusted-host ftp.daumkakao.com pytorch_lightning

3) (선택) 내 커스텀 컨테이너를 도커 이미지화 한다

docker commit myimage


* 2, 3번의 경우 multi-Arch 빌드를 위해서는 컨테이너를 이미지화 하기 위해 commit 방법을 사용하지 않고, 아래 방식으로 build합니다. 출처:여기


4.(선택) Multi-Arch 빌드 (아키가 다른 경우)

1) docker experimental features (시험모드)를 사용해야 buildx를 사용할 수 있습니다. 시범모드 전환 (출처)
sudo nano /etc/docker/daemon.json
{
"experimental": true
}
위 파일을 작성하고 docker를 재시작한다.
docker version
실행시, experimental이 true가 된다.


2) 내 docker가 Muli-Arch 빌드 환경을 알 수 있도록, multi-Arch 환경의 이미지를 한개 시범적으로 받습니다.

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes


3) buildx를 사용하여 multi-arch 형태로 이미지를 만들고

docker buildx create --name multi-arch-builder --driver 

docker-container --use docker buildx inspect --bootstrap

platforms에 아래 사항이 뜨는 것을 확인한다.

Platforms: linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6


4) 이제 Buildx로 Image Build & Push한다.
image build를 위한 Dockerfile을 만듭니다.
vim Dockerfile
FROM sayhellotoai/trans_r
sayhellotoai는 제 repository에요
내용으로는 FROM하고 이미지파일과, RUN하고 pip install gpustat 등을 입력하여 커스터마이징합니다.
그렇게 만든 파일 위치에서 아래 명령어를 실행하여 docker image를 build하고, push합니다.
(push 전에 docker 로그인하세요!)

docker buildx build --platform=linux/ppc64le,linux/amd64 -t sayhellotoai/trans_r --push .

그럼 짜잔! multiARCH형태의 이미지를 보실 수 있습니다.

이제 저 이미지를 저장하세요

주의할점은, multi-arch일 때, 기본적으로 현재 cpu의 arch로 이미지가 저장됩니다.
https://docs.docker.com/desktop/multi-arch/
SHA tag를 사용해서 원하는 빌드의 arch를 받아야합니다! 한 이미지가 두 아키를 지원하는 형태가 아니라, 아키를 지원하는 이미지가 새 저장소로 생기는 거로, 지정해서 받아야 합니다.


Multi-Arch 빌드 출처와 자세한 사항은 아래 첨부파일에 표시합니다. (NHN forward 2020) (NHN)


5. 이미지를 파일로 저장합니다

docker save 명령어로 이미지를 tar파일로 빼기

docker save 이미지이름 > 저장할파일_이름.tar



6. 오프라인 서버에 올린 후


0) (선택) sudo 사양이 어려운 서버인 경우 

sudo usermod -aG docker $USER
를 사용하여 운영망 서버의 권한을 미리 받아둡니다.

1) tar파일을 offline server로 전송시키고 다음 명령어로 docker image에 등록한다

docker load < huggingface/transformers-pytorch-gpu.tar

2) docker images로 등록 확인


3) 등록한 이미지 실행

docker run --gpus all --name trans302 -it huggingface/transformers-pytorch-gpu:3.0.2
docker exec -it trans302 /bin/bash



4) docker ps 로 실행 확인, 

죽은거는 docker ps -a 로 확인




--------------------------------------------------------------------------------

위에 방식대로 진행해도 package가 ppc64le가 아니라 x86_64면 아무 소용 없습니다.
huggingface/transformer 환경을 위한 docker와 package는 아래와 같습니다.
#docker 파일
docker pull ibmcom/powerai:1.6.2-pytorch-ubuntu18.04-py36-ppc64le

#package 설치 명령어
파일로 받아서 설치할 것. 오프라인설치는 아래 명령어 사용
conda install --offline ./[package_name]
pip install [package_name] --no-index -f ./




출처: https://github.com/open-ce/transformers-feedstock/issues/13
https://hub.docker.com/layers/ibmcom/powerai/1.6.2-pytorch-ubuntu18.04-py36-ppc64le/images/sha256-caf8eded1066aff71a15397b0c91ea8003b28a70aa88d14df49a8680039f5c8b?context=explore
ppc64le package 주소 : https://anaconda.org/search?q=platform%3Alinux-ppc64le+Pillow







----------------------------------------------------------------------------------
갑자기 딴소리지만 wsl2 정말 편합니다!! 츄라이츄라이
보통 클라우드 환경에서 작업하시겠지만, gpu컴은 게임용밖에 없는 저는 혼자 공부하기에 정말 편합니다 ㅋㅋ colab에서 안되는것들도 있어서요 ...









댓글

가장 많이 본 글