Server/Docker

WSL 도커(docker) 환경에서 허깅페이스(HuggingFace)를 활용하기 위한 Ubuntu서버환경(GPU) 구성

juhpark 2024. 4. 19. 23:46
반응형

허깅페이이스(huggingface.io)를 활용하면 다양한 인공지능 모델을 사용하여 텍스트로 이미지를 생성하거나 대화하는 chatgpt같은 모델을 만들 수 있다. 이러한 테스트를 위해 nvidia 그래픽 카드가 필요하고 cuda 환경도 설정해야 한다. 

윈도우 WSL환경에 설치된 Ubuntu 22.04.3 LTS 환경에서 GPU 환경을 구성하는 방법을 설명한다.

 

NVIDIA Driver 설치

아래의 홈페이지에서 비디오 카드 모델에 맞는 윈도우 드라이버를 먼저 설치한다. 

 

Download the latest official NVIDIA drivers

Download the latest official NVIDIA drivers

www.nvidia.com

 

CUDA 툴킷 설치

쿠다 툴킷은 ubuntu로 진입한 이후에 다음의 명령어를 실행한다. 참고로 모든 명령은 root 계정에서 실행했다.

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb
apt-get update
apt-get -y install cuda-toolkit-12-4

설치되는데 상당한 시간이 소요됨(다운로드 시간 등)

 

Docker 설치

# 도커 설치
curl -sSL get.docker.com | sh

# 설치여부 확인
docker -v

 

Nvidia-Docker 설치

설치할 패키기를 위해 먼저 패키지 리포지터리 GPG키를 설정한다.

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container.list | \
         sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
         sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

 

패키지 목록을 업데이터 하고, 패키지를 설치한다.

apt-get update
apt-get install -y nvidia-docker2

 

이후 docker 데몬은 재시작하고, 설치확인을 위해 다음을 실행한다.

# 데몬 재시작
systemctl restart docker

# (option) 설치 확인 (cuda 12.2.2 컨테이너 버전까지 사용이 가능함
docker run --rm --gpus all nvidia/cuda:12.2.2-base-ubuntu20.04 nvidia-smi

 

명령을 실행하면 아래과 같이 GPU에 대한 상세한 정보가 보여진다.

 

다음의 링크에서 컨테이너 이미지중에 사용가능한 버전을 직접 실행하면서 테스트 해볼수 있다. 내가 설치된 쿠다에서는 12.2.2 태그까지 지원이 되었다.

 

doc/supported-tags.md · master · nvidia / container-images / cuda · GitLab

GitLab.com

gitlab.com

 

Dockerfile 을 통해 AI사용 가능한 도커이미지 생성

아래의 내용으로 dockerfile 이름으로 파일을 생성한다. 

FROM nvidia/cuda:12.2.2-base-ubuntu20.04

# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES \
    ${NVIDIA_VISIBLE_DEVICES:-all}

# Remove any third-party apt sources to avoid issues with expiring keys.
RUN rm -f /etc/apt/sources.list.d/*.list      #*/

# -o 옵션은 ssl관련 오류발생시 추가한다
RUN apt-get -o "Acquire::https::Verify-Peer=false" update && \
    apt-get -o "Acquire::https::Verify-Peer=false" install -y --no-install-recommends \
    sudo \
    vim \
    locales language-pack-ko \
    wget curl \
    python3-openssl pip \
    && rm -rf /var/lib/apt/lists/* \          #*/
    && locale-gen ko_KR.utf8 && dpkg-reconfigure locales

# 파이썬 모듈설치
RUN pip install diffusers torch transformers accelerate

# 한글관련 처리
RUN echo 'export LANGUAGE=ko_KR.UTF-8' >> /etc/bash.bashrc
RUN echo 'export LANG=ko_KR.UTF-8' >> /etc/bash.bashrc


# 타임존 설정(서울)
ENV TZ=Asia/Seoul
RUN sudo ln -snf /usr/share/zoneinfo/$TZ /etc/localtime

# 일반계정을 추가하고 sudoers에 추가(build시 id/pass를 입력한다.)
ARG USER_NAME user
ARG USER_PASSWORD 0000
RUN adduser --disabled-password --gecos '' --shell /bin/bash $USER_NAME && \
    echo "$USER_NAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USER_NAME && \
    echo "$USER_NAME:$USER_PASSWORD" | chpasswd
USER $USER_NAME


# 모든 사용자가 접근가능한 홈디렉토리 설정
ENV HOME /home/$USER_NAME
RUN mkdir $HOME/.cache $HOME/.config && \
    chmod -R 777 $HOME

# huggingface 실행히 SSL문제해결을 위한 환경설정
RUN echo "export REQUESTS_CA_BUNDLE=$HOME/workspace/cert/{인증서}.crt" >> $HOME/.bashrc

# 작업디렉토리 생성
RUN mkdir $HOME/workspace
WORKDIR $HOME/workspace

# 인증서와 테스트 파이썬코드 복사
COPY --chown=$USER_NAME:$USER_NAME workspace/cert $HOME/workspace/cert
COPY --chown=$USER_NAME:$USER_NAME workspace/test.py $HOME/workspace/test.py

 

위 파일을 생성한 뒤 다음의 명령어를 통해 도커 이미지를 생성한다.

docker build -t <image name> \
   --build-arg USER_NAME=<user_id>  \
   --build-arg USER_PASSWORD=<password>  \
   --build-arg PYTHON_VERSION=3.12.2 \
   .
# <image name>으로 이미지를 생성한다.   ex) test:1.0

docker images # 생성된 이미지를 확인

 

위 build 스크립트를 실행하면 다음과 같이 이미지를 만드는 작업을 한다.

 

 

컨테이너 생성 및 접속

위 명령의 <image name>으로 이미지 화일이 생성하고 아래와 같이 컨테이너를 생성하면 된다.

컨테이너를 생성할때, --gpus all 옵션을 붙여서 생성한다.

docker run -it --name <컨테이너명> -d --gpus all <이미지:태그>

 

컨테이너에 접속시 다음과 같은 명령어로 접속한다.

docker exec -it <컨테이너명> bash

 

 

HuggingFace(허깅페이스) 모델 사용

아래 허깅페이스 페이지의 모델에서 kyujinpy/KO-anything-v4-5 모델을 검색하여 상세페이지로 들어가면 샘플 코드를 바로 확인 할 수 있다.

 

Hugging Face – The AI community building the future.

The Home of Machine Learning Create, discover and collaborate on ML better. We provide paid Compute and Enterprise solutions. We are building the foundation of ML tooling with the community.

huggingface.co

 

샘플코드를 test.py 파일로 만들고 

from diffusers import StableDiffusionPipeline
import torch

model_id = "kyujinpy/KO-anything-v4.5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe = pipe.to("cuda")

prompt = "1소년, 강아지 귀, 귀여운, 흰색 스카프, 눈, 관찰자"
image = pipe(prompt).images[0]

image.save("./hatsune_miku.png")

 

python3 test.py로 실행한다.

 python3 test.py

 

그러면 아래 그림과 같이 모델 파일들을 다운로드 받고(1회), 다운로드된 모델 파일은 ~/.cache 폴더에 모델별로 저장된다. 상당한 시간이 걸리고, 모델의 용량도 큼 

 

다운로드가 끝나면 바로, 파일이 생성되고 생성된 파일은 윈도우 폴더로 복사하여 확인할 수 있다. 

# WSL 환경에서 실행해야 함
docker cp nvidia:$HOME/workspace/hatsune_miku.png /mnt/c/cloud/

 

생성된 이미지는 아래와 같다. 생각했던거 와는 좀 다르지만 신기하게도 잘 나온다. 내가 가진 GPU는 메모리가 3GB정도여서 이미지가 생성되는데 약 20분 정도 소요되었다. 메모리가 12GB정도되는 GPU에서는 5초이내에 생성되는 걸로 보아 그래픽카드의 성능에 따라 이미지 생성 속도에 차이가 엄청나다.

반응형