반응형
인공지능 모델을 만들었다면, 모델을 저장하고 활용할 수 있어야 한다.
이를 위해 Docker를 통해 이미지 빌드하고 Container를 실행하는 과정까지 
포스팅 하려고 한다.

이번 글에서는 이미 저장한 모델을 가지고 Docker 중점에서 작성된 글이다.

 


 

Docker 설치

다음 사이트를 통해 Docker를 다운 받아준다.

 

Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com

 

 

 

 

설치가 완료되었다면 컴퓨터를 다시 시작 해준다.

 

모델 로드 확인 ( app.py )

다음과 같은 코드를 통해 모델 로드를 확인한다.

모델을 저장할 때 환경과 동일하게 구성해야 함으로 그 때 사용했던 가상환경을 불러와 실행해 준다.

모델을 파일로 저장했다면 - 파일경로
model = tf.keras.models.load_model("model/모델 파일 경로")​

 

모델을 h5 파일로 저장했다면 - 파일
model = tf.keras.models.load_model("model/모델 파일 명.h5")​

 

from flask import Flask, request, jsonify
import tensorflow as tf
import numpy as np
import cv2
import os

# app = Flask(__name__)

model = tf.keras.models.load_model("./모델 경로")
print(model.summary())

 

 

flask HTTP 통신 테스트 ( app.py )

이미지 분류모델을 불러오고, 이미지를 보편적 크기인 ( 224, 224, 3 )로 resize 해준다.

이미지를 분류모델에 맞게 예측한 후 결과를 출력해 준다.

이 때 통신할 접속 경로는 (로컬호스트:5002/predict) 이다.

from flask import Flask, request, jsonify
import tensorflow as tf
import numpy as np
import cv2
from io import BytesIO
from PIL import Image

app = Flask(__name__)
model = tf.keras.models.load_model("./모델 경로")

def preprocess_image(image):
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    image = cv2.resize(image, (224, 224))
    image = image.astype(np.float32) / 255.0
    image = np.expand_dims(image, axis = 0)

    return image

def predict(file):
    image = Image.open(BytesIO(file.read()))
    image = np.array(image)

    processed_image = preprocess_image(image)

    predictions = model.predict(processed_image)
    return predictions

@app.route('/predict',methods=['POST'])
def predict_image():
    if 'image' not in request.files:
        return jsonify({"error" : "Not found image file"}), 400
    
    file = request.files['image']

    if file.filename == '':
        return jsonify({"error" : "Not selected image file"}), 400
    
    
    result = predict(file)

    return jsonify({"result": int(np.argmax(result, axis=1)[0])})

if __name__ == '__main__':
    app.run(debug=False, port=5002)

 

통신 확인

먼저 두 개의 명령 프롬프트를 실행한다.

1. conda

해당 가상환경을 실행 시키고 파일 위치로 이동 후 다음을 입력한다.

( 그렇다면 서버가 열릴 것이다. )

python app.py

2. cmd

이후 cmd에서 이미지파일과 함께 curl 명령어로 POST 요청을 한다.

이 때 상대경로가 아닌 절대경로로 C:부터 시작하여 전부 입력해준다.

  • -X POST : HTTP POST 요청
  • -F : multipart/form-data 형식 데이터 첨부
    • image필드 파일 이름=이미지파일경
curl -X POST -F "image=@이미지 절대 경로.jpg" http://127.0.0.1:5002/predict

 

이후 json 형태의 파일로 결과값이 돌아온다.

{"result":모델 예측 값}

 

Dockerfile 생성

가상환경 버전 확인

실행할 때와 같이 같은 버전으로 만들어줘야 한다. 때문에 가상환경의 라이브러리들의 버전을 먼저 확인하자

다음 명령어를 통해 버전을 확인 할 수 있다.

conda list

 

Docker build 시 사용할 라이브러리 버전 ( requirement.txt )

다음과 같이 버전을 적어준다.

gunicorn은 flask로 배포시에 개발 서버 모드로 실행된다.

WSGI (Web Server GateWay Interface) 서버를 사용하라는 경고

flask의 내장 서버는 개발용으로만 설계되었다.

numpy=1.23.0
python=3.9.18
opencv-python=4.11.0.86
tensorflow=2.10.0
flask=3.1.0
pillow= 11.1.0 #PIL
gunicorn==20.1.0 #flask warning

 

 

Dockerfile 생성

docker build할 파일을 생성한다. 

이는 txt파일로 생성한 후 확장자를 제거해준다.

# 파이썬 버전
FROM python:3.9

WORKDIR /app

# opencv에 필요한 라이브러리
RUN apt-get update && apt-get install -y \ libglib2.0-0 libsm6 libxext6 libxrender-dev libgl1-mesa-glx

# 라이브러리 버전 파일
COPY requirements.txt .

# 라이브러리 다운로드
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# 5002 포트 개방
EXPOSE 5002

CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5002", "app:app"]

 

Docker DeskTop 확인 후 실행

1. 다음 명령어를 통해 docker-desktop 가상환경이 존재하는지 확인

wsl -l -v

 

 

2. docker image build

-t : tag(이름) 설정 ex) 아래 명령어는 app이라는 이름을 가진 image 생성

. : 현재 디렉토리에서 Dockerfile를 찾아 build

docker build -t app .

 

3. docker container run

docker 이미지 기반으로 컨테이너를 실행

-p 5002:5002 -> 첫 번째는 호스트 머신, 두 번째는 컨테이너 내에서 사용할 포트

( localhost:5002 통해 접근하여 docker 5002 port에 전달 )

docker run -p 5002:5002 app

 

4. curl를 통해 post request

위와 같은 과정을 거쳤다면 cmd창에서 curl명령어를 통해 POST요청을 할 수 있다.

curl -X POST -F "image=@이미지 절대 경로.jpg" http://localhost:5002/predict
반응형
반응형
인공지능 개발시 Tensorflow를 사용할 때 겪는 어려움이 상당하다.
환경 변수로 인해 머리가 너무 아프고 막상 설치한다고 해도
대부분 Jupyter NoteBook을 통해 개발하는데 에러 메시지가 정확하게 나오지 않는다.
때문에 그 모든 과정을 포스팅하려고 한다.

해당 컴퓨터 사양은 Window11 RTX 3070 환경이나 다른 환경도 할 수 있게끔 설명하도록 하겠습니다.
많은 분들이 힘드실 Cuda 버전에서는 Tensorflow가 윈도우 지원은 2.10.0 까지 하기 때문에
Cuda 12버전은 되지 않는다는 점 미리 말씀드립니다. ( 성공하신 분 있으면 댓글 달아주세요 )

가상환경을 쓰는 이유는 앞 서 말한 이유로 인해 이전 버전을 사용하기 때문에 기존의 Python과 라이브러리 충돌이 일어나지 않게끔 독립적으로 유지하기 위함이다. 때문에 귀찮더라도 모두 설치하기 바랍니다.


1.  GPU 드라이버 설치 ( Tensorflow호환성 체크 )

1 - 1. 전체 적인 호환성 체크

먼저 Cuda Toolkit 과 cuDNN 라이브러리, Tensorflow의 호환성을 체크해야 한다.

( 이는 3070기준이며 각자의 맞게 사용하기 바란다. ) 

 

먼저 내 그래픽 카드가 어떤 Cuda에 맞게 사용되는지 알아야 한다. 다음 사이트에서 두 가지 표를 보고 확인 가능하다.

 

CUDA - Wikipedia

From Wikipedia, the free encyclopedia Parallel computing platform and programming model In computing, CUDA (Compute Unified Device Architecture) is a proprietary[2] parallel computing platform and application programming interface (API) that allows softwar

en.wikipedia.org

 

내 그래픽 카드를 검색하고 맨 앞에 숫자를 체크한다.

 

그리고 다음 표를 보며 내 그래픽 카드가 사용 가능한 Cuda 를 체크한다.

8.6이 포함된 모든 Cuda 11.1 ~ 12.8 최신버전까지 모두 사용 가능하다.

 

Tensorflow가 버전에 따라 지원하는 Cuda 버전들을 확인한다.

 

Windows의 소스에서 빌드,Windows의 소스에서 빌드  |  TensorFlow

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Windows의 소스에서 빌드,Windows의 소스에서 빌드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 소스에

www.tensorflow.org

 

다음은 Tensorflow에 대한 설치 가이드로 설치해야하는 버전이 나와 있다. 

다음과 같이 Window에서의 GPU 지원은 2.10 이하의 버전에서만 사용 가능하다.

 

cuDNN과 쿠다(Cuda)라고 적힌 부분에 11.2라고 적혀있지만

사실상 11.x버전을 지원하는 경우이며 11.0이나 10은 11.x, 10.x를 지원하지 않는 듯 하다.

때문에 지원하는 가장 최신 버전 선택했다.

 

1 - 2. 그래픽 카드 드라이버 환경 설치

참고할 점

여기서 드라이버를 먼저 설치 했더라면 아마 CUDA가 버전에 맞게 설치 되어있는 경우들이 있다.

최신 버전으로 업데이트 했더라면 12.8로 나올 것이다. 환경 변수를 바꾸는 방법도 있지만, 삭제하고 설치하는 것이 맘이 편하다.

제어판에 있는 다음 항목들을 모두 삭제하고 진행한다면 편할 것이다. 

Cuda Toolkit다운시에 모두 다운로드 된다.

 

Cuda Toolkit  설치

다음 사이트에서 Cuda 11.x 버전을 다운 받아 준다. ( 각자 맞게 다운로드 하길 바란다. ) 

 

CUDA Toolkit Archive

Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production

developer.nvidia.com

Cuda 라이브러리 다운

그리고 아까 확인했던 RTX 3070 기준 v8.6.0을 Cuda 11.x 버전에 맞게 다운로드 받고 압축을 풀어 준다.

 

라이브러리 복사

그러면 다음과 같은 경로에 Toolkit이 버전에 맞게 설치 되어있다.

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8

 

다운받았던 라이브러리 파일을 복사해서 넣어준다.

 

1 - 3. 환경 변수 설정

다음과 같이 환경 변수 설정에서 CUDA_PATH는 버전에 맞게 설치되어 있다. 

이제 시스템 변수의 path에서 새로 만들기를 통해 다음 세 줄을 하나씩 추가한다.

( 찾아보면 bin은 있을 것이다. )

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\lib

1 - 4. 설치 확인

다음 명령어를 통해 Cuda Version이 맞게 설치된 것을 알 수 있다.

> nvidia-smi

 

환경 변수에 인식된 Cuda 버전도 확인할 수 있다.

> nvcc --version

처음 말했던 삭제하고 설치하라는 이유가 간 혹 nvidia-smi 명령어에서는 12.8로 확인되고, nvcc --version에서는 11.8로 확인되는 경우가 있다. 드라이버가 함께 설치되어 인식하는 버전은 Cuda 12.8이고 환경 변수로 컴퓨터에서 인식하는 버전은 11.8인 경우이다.  



2. 아나콘다 설치

 

Anaconda | Built to Advance Open Source AI

Anaconda simplifies, safeguards, and accelerates open-source AI with a trusted platform, enabling secure scaling, real-time insights, and community collaboration.

www.anaconda.com

 

 

2 - 1. 다음과 같이 Free Download를 통해 사이트를 접속하고 이메일을 Submit하면 이메일로 다운로드 링크를 보내준다.

 

이후에 설치 창에서 Recommnad 추천하는 경우를 선택하고 설치해주는 것이 좋다.

 

2 - 2. Anaconda Prompt 실행 후 가상환경 생성

 

가상환경을 생성하기 위해서는 아까 봤던 tensorflow 표를 통해 python version을 설정하여 생성하면 된다.

 

 

일단 가상 환경에 설정할 Python은 3.7에서 3.10으로 나와 있지만,

3.8 ~ 3.9가 안정적이다라고 많은 평가가 있으며,

3.10 버전은 이후 세팅을 위한 과정에서 어려움을 겪을 수 있으니 3.8 ~ 3.9를 추천한다.

 

가상환경 생성

먼저 가상환경을 생성해 준다.

> conda create --name (사용할 가상환경 이름) python=3.9

 

생성된 가상환경을 활성화 준다. 다음과 같이 앞이 설정한 이름으로 바뀌는 것을 알 수 있다.

> conda activate ( 사용했던 가상환경 이름 )

 

라이브러리 설치 ( tensorflow )

최신 버전의 conda는 더이상 tensorflow-gpu=2.10.0의 설치 지원을 하지 않기 때문에 pip 설치로 대체한다. 

둘다 설치한다. 이후 버전은 통합하였지만 따로따로 사용해야 한다.

> pip install tensorflow-gpu==2.10.0
> pip install tensorflow==2.10.0

라이브러리 설치 ( numpy )

이렇게 설치 한다면 tensorflow에 필요한 라이브러리들이 자동적으로 설치된다.

이때 numpy가 최신버전으로 설치 되기 때문에 다운그레이드를 해야한다. 이 경우도 conda가 지원하지 않아 pip로 진행

1.23 버전이 다른 라이브러리 버전과 호환된다.

> pip install numpy==1.23

 

GPU 인식 확인

꼭 다음 명령어를 conda가상환경이 활성화 된 상태에서 하기 바란다.

jupyter Notebook or Visual Code에서는 인식하는 과정이 느리고 오류가 제대로 나오지 않기 때문에 확인이 어렵다

다음과 같은 코드를 입력했을 때 되지않는다 하더라도 에러 내용이 제대로 나오기 때문에 대처가 가능하다.

> python -c "import tensorflow as tf; print('TensorFlow Version:', tf.__version__); print('GPU 사용 가능 여부:', tf.config.list_physical_devices('GPU'))"

 

위와 같이 GPU 인식이 가능하다.

 

 

추가 에러 상황 - zlibwapi.dll error

다음 오류는 Visual code에서 Jupyter Notebook으로 사용했을 때 생기는 오류이다. ( 그 외에도 생길 수 있다. )

 

Could not load library cudnn_cnn_infer64_8.dll. Error code 193

the zlibwapi files are there, the paths are there. Still getting the same error. However the links you provided for downloading the 64 bit versions are NOT secure. It has been more than 2 months with this and it takes you 2 weeks to provide vage answers th

forums.developer.nvidia.com

다음 사이트를 통해 사양에 맞는 비트를 선택하고 설치한 파일 내에 zlibwapi.dll만 복사해서 다음 경로에 붙여넣기 하면된다.

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin

 

계속 CPU 기기만 인식해서 많은 블로그와 공식 가이드 문서들을 찾아보았지만 호환성에 대해서 정확한 내용이 거의 없었다. 때문에 Cuda버전들을 삭제하고 다시 설치 하는 수 많은 과정을 통해 이 글을 작성하게 되었다.
다른 분들께서는 이 글을 통해 인식이 되지 않는 문제 없이 한 번에 이루어지는 쾌거를 느끼시길 바란다.

추가적인 오류가 있다면 댓글로 남겨주시면 감사하겠습니다.
반응형

+ Recent posts