평소 Linux기반의 서버만 사용해왔는데 Windows Sever를 구축할 일이 생겼습니다.

ftp를 설정해주려했는데 ssh만 설정해주면 ftp도 자동으로 설정되는 것이어서, windows 답게 예상보다 간단하게 설정할 수 있었습니다.

 


Windows PowerShell에서 진행합니다.

MS사이트에 자세하게 나와있어서 아래 링크대로만 수행하셔도 큰 문제는 없을 겁니다.

(https://learn.microsoft.com/ko-kr/windows-server/administration/openssh/openssh_install_firstuse?tabs=powershell)

 

 

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
                                                                                                                 새로운 기능 및 개선 사항에 대 한 최신 PowerShell을 설치 하세요! https://aka.ms/PSWindows                                                                                                                                          PS C:\Users\Administrator> Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent



PS C:\Users\Administrator> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0


Path          :
Online        : True
RestartNeeded : False



PS C:\Users\Administrator> Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'


Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : Installed



PS C:\Users\Administrator> Start-Service sshd
PS C:\Users\Administrator> Set-Service -Name sshd -StartupType 'Automatic'
PS C:\Users\Administrator> if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
>>     Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
>>     New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
>> } else {
>>     Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
>> }
Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists.

 

 

감사합니다.

MacOS에서 Windows Server OS를 탑재한 서버의 폴더에 접근해보겠습니다.

먼저 윈도우 서버에 SSH, FTP가 설정되어 있을 때 입니다.

그리고 당연히 접근할 서버에 접근이 가능한 네트워크 상태여야합니다.


Finder  실행

Finder 실행

단축키 ⌘ + K 를 누른 후 'smb://{호스트 IP}'를 입력합니다

 

마운트 할 볼륨(폴더 경로 선택) 합니다

그럼 Finder에서 마운트된 볼륨(FTP 폴더경로)에 접근하실 수 있습니다.

간단합니다.


그렇다면 smb란 무엇일까요?

sftp, ftp 프로토콜이 아닌 'smb'로 호스트를 마운트합니다.

아래 나무위키에 쉽게 설명이 되어있어서 발췌를 하였습니다. (https://namu.wiki/w/SMB)

 

결론적으로 같은 네트워크 상에 있는 다른 OS(컴퓨터)간에 파일, 자원등을 공유할 수 있는 프로토콜입니다.

Server Message Block.

SMB는 네트워크 상 존재하는 노드들 간에 자원을 공유할 수 있도록 설계된 프로토콜이다. 주로 네트워크에 연결된 컴퓨터끼리 파일, 프린터, 포트 또는 기타 메시지를 전달하는데 사용된다. SMB 대신 Common Internet File System, CIFS라고도 한다.

SMB는 1990년에 도스, 윈도우, NT, OS/2, 유닉스 등 난잡했던 운영체제 간 자원 공유를 쉽게 해줄 목적으로 만들어졌고, 윈도우로 거의 통일된 지금도 NAS, 네트워크 스캐너 등 리눅스 기기와의 파일공유를 클라이언트 없이 탐색기로 직접 수정가능하다는 장점이 있어 아직도 널리 쓰이고 있다. 리눅스에서는 SAMBA라는 소프트웨어를 설치하면 누구나 쉽게 SMB를 이용한 공유가 가능하다.

이 프로토콜은 윈도우에 종속되어 있어 호환성때문에 수십년간 낡은 코드를 유지하면서 자리를 지켜왔으나, 엄청나게 많은 보안 취약점과 도저히 수정할 수 없는 코드로 인해 마이크로소프트의 골칫거리가 되어왔다. 특히 2017년 5월 발생한 WannaCry라는 랜섬웨어가 바로 SMB의 취약점을 노린 것으로 드러났다.

애플 진영에서는 이것 대신 AFP라는 유사한 프로토콜을 주로 사용했으나 MacOS Big Sur부터 SMB로 대체되었고 iOS도 13부터 네이티브로 SMB를 지원하기 시작했다.


 

감사합니다/

https://arxiv.org/abs/2312.07935

 

Comparing YOLOv8 and Mask RCNN for object segmentation in complex orchard environments

Instance segmentation, an important image processing operation for automation in agriculture, is used to precisely delineate individual objects of interest within images, which provides foundational information for various automated or robotic tasks such a

arxiv.org

 

Object Detection 모델을 생성해야해서 어떤 모델을 사용해야할까 고민하던 와중에 좋은 논문이 있어서 소개드립니다.

Mask R-CNN과 Yolo 모델, 둘 다 Image data 기반의 학습(Object detection)에서 좋은 성능을 보여줍니다만, 요즘의 트렌드를 파악하기 위해 자료를 찾던 중 훌륭한 논문이 있었습니다.

 

결론적으로...


이 연구는 농업 자동화를 위한 YOLOv8과 Mask R-CNN의 객체 분할 성능을 비교합니다. Y

OLOv8은 정밀도와 재현율에서 Mask R-CNN보다 우수하며, 특히 단일 클래스 미성숙 녹색 과일 분할(정밀도 0.92, 재현율 0.97)과 다중 클래스 나무 줄기 및 가지 감지에서 높은 성능을 보였습니다. 또한 YOLOv8은 더 빠른 추론 속도(단일 클래스 128.21 FPS, 다중 클래스 91.74 FPS)를 제공해 실시간 농업 작업에 적합합니다. Mask R-CNN은 속도 면에서 다소 뒤쳐집니다.

 

2024년 상반기 시점에서 YOLOv8이 전반적으로 우수하다는 걸 알 수 있었습니다.

 

tensorflow 패키지를 활용할 작업이 있어서 m1 실리콘 맥에 설치한 과정입니다.

불과 m1 맥이 출시했던 2~3년 전만 하더라도, m1 프로세서의 맥으로 작업하는 동료들 중 tensorflow 설치로 애먹은 동료들이 떠올랐습니다.

하지만 지금은 매우 쉽게 설치가 되네요.

 

python 3.8버전의 anaconda가 설치된 환경에서 진행하였으며 아래 pip 명령어만 입력해주면 어렵지 않게 설치가 가능합니다.

python3 -m pip install tensorflow
python3 -m pip install tensorflow-metal

 

설치 후 터미널 상에서 테스트한 결과입니다.

% python3
Python 3.8.19 (default, Mar 20 2024, 15:27:52) 
[Clang 14.0.6 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf

>>> 
>>> tf.__version__
'2.13.0'
>>> tf.config.list_physical_devices('GPU')
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
>>>

 

앞으로 더 많은 작업을 쉽게 할 수 있겠네요 .

 

DONE!

Ubuntu 환경에서 pytorch 프로젝트 실행을 위해 설정하던 중 발생한 에러입니다.

 

'ModuleNotFoundError: No module named 'torch_geometric'

단순히 아래처럼 실행하면 되지 않을까 했는데, 여전히 같은 에러가 계속 발생했습니다.

pip install torch-geometric

설치전에..

우선 점검해볼것은 Nvidia 드라이버와 CuDA 설치 유무입니다.

아래 명령어로 각각의 요소들이 설치되었는지 확인을 하고, 설치가 안되었다면 반드시 설치를 해주어야합니다.

nvidia-smi
nvcc --version

Anaconda 환경에서 설치

저는 Anaconda 환경에서 진행하였습니다.

conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch
pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.9.0+cu111.html
pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.9.0+cu111.html
pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.9.0+cu111.html
pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.9.0+cu111.html
pip install torch-geometric

 

위 명령어들을 순차적으로 진행하면 정상적으로 설치가 되면서 에러가 해결됩니다.

(tf) admin@gpu-server:/usr/local/cuda$ python
Python 3.9.16 (main, Mar  8 2023, 14:00:05) 
[GCC 11.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch_geometric

 

GOOD!

오랜만에 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