오랜만에 AI 작업을 위해 Ubuntu 기반의 GPU 서버를 활용하다 발생한 문제입니다.

(base) root@gpu-server:~$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch
NVML library version: 535.161

 

Nvidia 드라이버를 재설치하여 해결하였습니다.

 

아래 링크 글에서 많은 도움이 되었습니다.

(참고 링크 : https://dfso2222.tistory.com/69)


1. Nvidia 드라이버 완전히 삭제하기

sudo apt-get remove --purge '^nvidia-.*'
sudo apt-get install ubuntu-desktop
sudo rm /etc/X11/xorg.conf
echo 'nouveau' | sudo tee -a /etc/modules

위 명령어를 순서대로 실행하면 정상적으로 드라이버가 제거됩니다.

 

2. Nvidia 드라이버 설치

(base) admin@gpu-server:~$ sudo apt install nvidia-driver-550
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  ca-certificates-java fonts-dejavu-extra g++-8 java-common javascript-common
  libaccinj64-10.1 libatk-wrapper-java libatk-wrapper-java-jni libclang-cpp10
  libcublas10 libcublaslt10 libcudart10.1 libcufft10 libcufftw10
  libcuinj64-10.1 libcupti-dev libcupti-doc libcupti10.1 libcurand10
  libcusolver10 libcusolvermg10 libcusparse10 libjs-jquery libncurses5
  libnppc10 libnppial10 libnppicc10 libnppicom10 libnppidei10 libnppif10
  libnppig10 libnppim10 libnppist10 libnppisu10 libnppitc10 libnpps10
  libnvblas10 libnvgraph10 libnvidia-container-tools libnvidia-container1
  libnvidia-ml-dev libnvjpeg10 libnvrtc10.1 libnvtoolsext1 libnvvm3
  libstdc++-8-dev libthrust-dev libtinfo5 libvdpau-dev libz3-4 libz3-dev
  llvm-10-tools node-html5shiv openjdk-8-jre openjdk-8-jre-headless
  python3-pygments
... (중략) ...

 

3. 설치 확인 

'nvidia-smi' 명령어로 확인할 수 있습니다.

(base) admin@gpu-server:~$ nvidia-smi
Mon Apr 22 12:04:24 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA A40                     Off |   00000000:3B:00.0 Off |                    0 |
|  0%   39C    P8             13W /  300W |      13MiB /  46068MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA A40                     Off |   00000000:AF:00.0 Off |                    0 |
|  0%   33C    P8             13W /  300W |      13MiB /  46068MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A      1755      G   /usr/lib/xorg/Xorg                              4MiB |
|    1   N/A  N/A      1755      G   /usr/lib/xorg/Xorg                              4MiB |
+-----------------------------------------------------------------------------------------+

 

감사합니다.

 

https://velog.io/@jskim/Windows%EC%97%90%EC%84%9C-Linux-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-with-WSL2

 

Windows에서 Linux 사용하기 (with WSL2)

개발자나 엔지니어가 개발을 하고 서버를 구축하는 등의 일련의 활동을 할 때 Windows OS보다는 Linux, Mac OS가 확실히 편하다. 하지만 Windows OS가 깔린 노트북, PC를 가진 개발자나 엔지니어도 많을터!

velog.io

위 참고글이 정말 많은 도움이 되었습니다.

 

1. PowerShell 에서 WSL 설치

 

2. 커널 업데이트 패키지 설치

 

* 만약 위 커널 업데이트 패키지 설치가 안 될 경우 아래 처럼 윈도우 기능을 꼭 체크해야합니다!

 

windows 환경에서 Docker를 실행할 작업이 생겼습니다.

windows local에 있는 어느 폴더와 docker container간 파일을 주고받으며 이 파일을 파이썬으로 처리하는 작업을 수행합니다

 


Dockerfile 작성

container는 ubuntu base로 python이 설치된 환경으로 생성하였습니다.

# Ubuntu 최신 버전을 기반 이미지로 사용
FROM ubuntu:latest

# 패키지 목록 업데이트 및 필요한 패키지 설치
# --no-install-recommends 옵션 추가
RUN apt-get update && apt-get install -y \
    git \
    vim \
    python3 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*  # apt-get clean과 유사

# 작업 디렉토리 설정
WORKDIR /workspace

# 컨테이너 시작 시 실행될 명령어
# 여기서는 bash 쉘을 실행하도록 설정합니다.
CMD ["bash"]

 


Docker Image Build

docker build -t ubuntu_custom .

Docker Container 실행

이 부분이 자칫 헷갈릴 수 있는 부분입니다.

'C:\CPImage'라는 경로와 바인딩하기 위해 wsl에서는 해당 경로를 '/mnt/c/CPImage'로 접근할 수 있습니다.

그리고 ubuntu container의 '/app'경로와 바인딩하는 예시입니다.

docker run -d --name ubuntu_container -v /mnt/c/CPImage:/app ubuntu_custom tail -f /dev/null

 

 

바인딩한 윈도우 로컬 경로 폴더 조회
바인딩한 컨테이너의 '/app'경로 폴더 조회

 

각 경로에서 파일을 서로 생성해보면 조회가 되는 것으로 정확히 바인딩 된 것을 확인할 수 있습니다

docker나 기타 리눅스 서버로 서버를 실행하면 로그를 살펴보거나 기타 모니터링 하기 편리합니다.

하지만 iis에서 flask 서버를 서비스하면 기본적인 debug 로그도 살펴보기가 매우 어렵습니다.

 

anaconda3 환경에서 iis에 flask 서비스를 설정해둔 상태여서 기본적은 에러조차 로그로 파악하기가 어렵습니다

불친절한 IIS 서버

local 상에서 정상작동하는 서버인데 iis에서만 위와같은 500에러만 나오는 상태, 맨 윗줄부터 디버깅을 하다가 작성한 코드입니다.

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def check_packages():
    packages = [
        'flask', 'watchdog', 'pysftp', 'PIL', 'psycopg2', 'requests'
    ]

    package_status = {}
    for package_name in packages:
        try:
            __import__(package_name)
            package_status[package_name] = 'Installed'
        except ImportError:
            package_status[package_name] = 'Not Installed'

    return render_template('packages.html', package_status=package_status)

if __name__ == '__main__':
    app.run(debug=True)

 

templates/packages.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Package Status</title>
</head>
<body>
    <h1>Package Status</h1>
    <table border="1">
        <tr>
            <th>Package Name</th>
            <th>Status</th>
        </tr>
        {% for package_name, status in package_status.items() %}
        <tr>
            <td>{{ package_name }}</td>
            <td>{{ status }}</td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

 

윈도우 PC에서 서비스할 프로젝트가 시작되었습니다.

윈도우에 Docker를 설치해서 하려다 번거로워서, ASP.NET 개발 할 때 IIS를 사용한 경험을 되살려서 IIS에 Flask서버를 가동하였습니다.

 

아래와 같은 환경에서 설정하였습니다.

  • Anaconda3
  • Windows 10
  • python <= 3.8

아래는 도움받은 블로그 글입니다

https://blog.gapmoe.net/entry/IIS%EC%97%90-Flask-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0
https://urame.tistory.com/entry/IIS%EC%99%80-Flask-Python-%EC%97%B0%EB%8F%99

 


 

1. IIS & CGI 설정

윈도우 OS에 설치되어 있는 IIS를 활성화해줘야합니다.

아래 처럼 '인터넷 정보 서비스(IIS)' 내 항목들과 'CGI'를 체크하여 확인을 누른 후 설치과정을 진행합니다

 


2. FLASK 실행을 위한 설정

다른 서버 어플리케이션과 달리 설정할 변수들이 많아 번거로울 수도 있지만 한 번 세팅해두면 의외로 IIS도 서버 관리에 장점이 많은 어플리케이션입니다.

 

1) python 실행 경로

먼저 Python은 Ananconda3에서 실행되는 환경입니다.

저 같은 경우 가상환경 이름은 'flask'로 지정했으며 python이 실행되는 인터프리터 경로는 아래와 같습니다

C:\anaconda3\envs\flask\python.exe

 

2) 필요한 파이썬 패키지

wfastcgi, flask 두 가지 패키지가 필요합니다. 

아래 처럼 anaconda prompt에서 설치를 진행해줍니다.

(flask) C:\WINDOWS\system32> pip install wfastcgi
(flask) C:\WINDOWS\system32> pip install flask

 

3) flask 웹 서버 경로 설정

iis 가 정상적으로 설치되었다면 

"C:\inetpub\" 디렉토리가 생성됩니다. 

참고로 웹 브라우저상에서 'http://localhost' 경로를 호출하면 아래와 같은 페이지를 불러오게 되며, 기본적인 iis 설치가 완료된 상태임을 확인할 수 있습니다.

 

flask 프로젝트 경로는 아래의 경로에서 실행할 예정입니다.

C:\inetpub\flask

 

'wfastcgi.py'파일을 flask 프로젝트 폴더에 복사해줍니다.

저 같은 경우는 flask라는 anaconda3 가상공간에 wfastcgi 패키지를 설치하였으므로 해당 경로에서 파일을 찾을 수 있었습니다.

그리고 위 파일을 복사하여 flask 프로젝트에 복사해주고 'app.py'파일을 생성해줍니다

 

 


3. IIS와 Python Flask Mapping 설정

여기서 부터가 실제로 설정하는 단계입니다.

IIS 어플리케이션을 실행한 후 사이트 -> 웹 사이트 추가를 해줍니다.

'flask_test'라는 웹 사이트를 추가하였으며 포트는 '5000'으로 지정하였습니다

 

flask_test 웹 사이트의 처리기 매핑 설정 -> 처리기 매핑 클릭

 

우측 상단에 '모듈 매핑 추가',

아래 화면과 같이 설정값을 입력해줘야 합니다.

'파이썬 인터프리터 경로|프로젝트 내 wfastcgi.py 경로'

'|'기호로 연결된다는 점을 유의해야합니다.

C:\anaconda3\envs\flask\python.exe|C:\inetpub\flask\wfastcgi.py

 

마지막으로 FastCGI를 설정해줘야합니다.

IIS내 최상단 장치명 -> FastCGI 설정 클릭 -> 환경변수 설정하여 아래 두 개의 환경 변수를 설정합니다

NAME : PYTHONPATH
VALUE : C:\inetpub\flask  (flask 프로젝트 폴더 경로)
---------------------
NAME : WSGI_HANDLER
VALUE : app.app

 

 


4. Flask Test 페이지 코드 입력

flask 프로젝트 폴더 내 'app.py'파일에 아래와 같은 코드를 입력합니다.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, World!"

if __name__ == '__main__':
    app.run()

 

그리고 웹 사이트 생성하면서 설정한 포트(5000)로 접속하여 결과값을 확인합니다.

+ Recent posts