playdata/daily

12주차 : Day 2 (9/24)

soojin1 2024. 9. 30. 09:10

crontab

학원에서도 하루죙일 했는데....집 와서 또 하루죙일 했다....

$ cat pyproject.toml

[project.scripts]
ml-worker = 'mnist.worker:run'
$ cat ml-work-cronjob
* * * * * /usr/local/bin/ml-worker >> /var/log/worker.log 2>&1

 

ml-work-cronjob의 의미는

크론 태스크 설정을 매 분마다 /usr/local/bin/ml-worker 스크립트를 실행하고, 그 결과를 /var/log/worker.log 파일에 기록하도록 설정하는 것 이다.

 

먼저 이해가 안됐던 부분은 /usr/local/bin ,, /var/log,,, >> 갑자기 등장한 낯선 경로들

알아본 바로는 PDM 등 패키징 도구를 사용하여 프로젝트를 설치했을 때 자동 설치되는 경로라는 것 이다. 내가 지정한게 아니라 토믈 파일에서 ml-worker 명령어를 설정해주었고, 이 명령이 설치되는 기본 경로라는 뜻 이다. (이렇게 설명하는 게 맞는지 모르겠음ㅎㅎ;)

그리고 관련 로그가 /var/log/worker.log에 저장된다. 

 

그리고 나는 이 프로그램을 도커를 통해 실행시키고 있다. 그래서 Dockerfile을 확인해보면 cron과 관련한 설치 명령을 넣은 것 이다.

$ cat Dockerfile
FROM python:3.11

WORKDIR /code

RUN apt update
RUN apt install -y cron
COPY ml-work-cronjob /etc/cron.d/ml-work-cronjob
RUN crontab /etc/cron.d/ml-work-cronjob

'
'
'

로그를 확인해보겠다. 먼저 도커 2개(프로그램, DB) 실행시키기.

그리고 도커에 접속해서 로그가 저장된 경로를 cat 을 통해 출력해보았다.

매 분 cron이 실행되는 로그를 확인할 수 있다.

$ docker exec -it m23 bash
root@17708102e7e8:/code# cat /var/log/worker.log
2024-09-24 22:20:01
2024-09-24 22:21:01, num
2024-09-24 22:22:02, num
2024-09-24 22:23:01, num
2024-09-24 22:24:01, num
2024-09-24 22:25:01, num
2024-09-24 22:26:01, num
2024-09-24 22:27:02, num

 

그리고 FastAPI를 통해 이미지를 업로드 했다면 라인 알람이 갈 것이다. 

 

학원에서도 그렇고 집에서도 데이터베이스 서버 주소 관련해서 에러가 많이 발생했었다.

지금은 이해 완료요

 


 

각각의 사용자들이 AWS 서버 DB에 이미지를 업로드하는데, 아래와 같이 file_path가 지정되면 서로 다른 도커 컨테이너에서 접근이 불가능하다. 내 소유 컨테이너에서 다른 컨테이너가 만든 파일 경로에 접근이 가능해야하고, 반대로 다른 컨테이너도 내 컨테이너에서 만든 파일 경로에 접근이 가능해야한다.

+----------------------------------------------------------------------------+
| /home/centa/code/mnist/img/c5e4f008-f7ec-4e48-9fde-a8fdf2f91859.jpeg       |
| /home/centa/code/mnist/img/f733030d-6236-4ed4-bd39-a789f0a16cc5.jpeg       |
| /home/centa/code/mnist/img/1951703b-6666-46c5-b18f-5f36f7ab4040.jpeg       |
| /home/hun/code/mnist/img/b9e49d9e-684b-4e73-82ba-785913ab156e.png          |
| /home/young12/code/mnist/img/5747f8e8-a1cc-4b28-a2b3-c8816dbe972c.jpeg     |
| /home/centa/code/mnist/img/d6e69b15-0a6e-4d07-b408-886b29c1c659.jpeg       |
| /home/centa/code/mnist/img/c38dd045-dcc2-4d92-9c5a-ae75f478b7d8.jpeg       |
| /home/centa/code/mnist/img/0229cd1d-8777-41de-bb4d-f99a7b39e311.jpeg       |

 

어제 배웠던 -v 옵션을 통해 해결할 수 있다.

$ sudo docker run -d --name mnist23 \
-e LINE_NOTI_TOKEN=<!!!> \
-e DB_IP=172.17.0.1 -e DB_PORT=53306 \
-v /home/ubuntu/images:/home/ubuntu/images \
-e UPLOAD_DIR=/home/ubuntu/images/n23 \
-p 8023:8080 sooj1n/mnist:0.4.3

 


 

먼저 주피터 노트북을 설치해서 테스트(?)

import numpy as np
from PIL import Image
from keras.models import load_model
from tensorflow.keras.datasets import mnist
import os

# 모델 로드
model = load_model('mnist240924.keras')  # 학습된 모델 파일 경로

# 사용자 이미지 불러오기 및 전처리
def preprocess_image(image_path):
    img = Image.open(image_path).convert('L')  # 흑백 이미지로 변환
    img = img.resize((28, 28))  # 크기 조정

    # 흑백 반전
    # img = 255 - np.array(img)  # 흑백 반전
    img = np.array(img)
    
    img = img.reshape(1, 28, 28, 1)  # 모델 입력 형태에 맞게 변형
    img = img / 255.0  # 정규화
    return img

# 예측
def predict_digit(image_path):
    img = preprocess_image(image_path)
    prediction = model.predict(img)
    digit = np.argmax(prediction)
    return digit
    

(train_images, train_lables), (test_images, test_lables) = mnist.load_data()

save_dir = 'train_img'
os.makedirs(save_dir, exist_ok=True)

def save_images(images, labels):
    for i, (imga, label) in enumerate(zip(images, labels)):
        img = Image.fromarray(imga)
        name = f'{label}_{i}.png'
        img.save(os.path.join(save_dir,name))

save_images(train_images, train_lables)

 

'playdata > daily' 카테고리의 다른 글

12주차 : Day 4 (9/26)  (0) 2024.09.30
12주차 : Day 3 (9/25)  (1) 2024.09.30
12주차 : Day 1 (9/23)  (2) 2024.09.24
10주차 : Day 4,5 (9/12,13)  (3) 2024.09.23
10주차 : Day 2,3 (9/10,11)  (0) 2024.09.23