본문 바로가기
데이터 엔지니어( 실습 정리 )

파이썬 venv를 사용한 파이썬 프로젝트 버전관리 ( Ubuntu 22.04 실습 )

by 세용용용용 2024. 10. 10.

1. venv 란 ??

Python의 내장 모듈로, 가상 환경을 생성하고 관리하는 데 사용
가상 환경은 프로젝트별로 독립된 패키지와 종속성을 유지할 수 있도록 도와준다!!

(1-1) venv 장단점

장점
1) 프로젝트 독립성 : 프로젝트 별 독립된 패키지 종속성 유지 가능, 프로젝트간 패키지 의존성 충돌 방지
2) 버전 관리 : 프로젝트 별 파이썬 패키지 버전관리가 가능
즉, 다수의 파이썬 프로젝트 환경에서 시스템 안정성 높아짐 ( 서로 영향을 주지 않기에 )

단점
1) 운영을 위한 추가적인 구축 및 관리
2) 디스크 낭비 : 디스크 공간이 추가로 발생 ( 오버헤드 발생 )

 

 

2. venv 환경 구축 및 실습

(2-1) python3-venv 패키지 설치

0) python3-venv 패키지 설치
apt update
apt install python3-venv -y

1) python3-venv 설치 버전 확인( 현재 환경 에서는 3.10.6-1~22.04.1 )
dpkg -l | grep python3-venv

 

(2-2) python3-venv 가상환경 생성

1) 가상환경 생성
ex) python3 -m venv [가상환경 명]
python3 -m venv macro_project

2) 가상환경 활성화
ex) source [가상환경 경로]/bin/activate
source /data/venv_test/macro_project/bin/activate

3) 가상환경 비활성화
deactivate

4) 패키지 설치
pip install -r requirements.txt

( 예시 패키지 나열 : requirements.txt )
psycopg2-binary==2.9.9
pandas==2.2.3
numpy==1.26.4
scikit-learn==1.5.2
tensorflow==2.17.0
memory-profiler==0.61.0

5) 가상환경 삭제
ex) rm -rf [가상환경 경로]
rm -rf /data/venv_test

 

(2-3) python3-venv 가상환경 실행 test

test_project : 매크로 사용자 탐지 모델 ( mk_model.py )

#!/data/venv_test/macro_project/bin/python3
import sys
import time
from memory_profiler import memory_usage

import psycopg2
from psycopg2 import sql

import pandas as pd
import numpy as np
import pickle
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Embedding
from tensorflow.keras.preprocessing.sequence import pad_sequences

# 과적합 방지를 위해 얼리 스탑핑
from tensorflow.keras.callbacks import EarlyStopping

def main(materials_path, batch_date):
    start_time = time.time() # 시작 시간 기록

    # PostgreSQL 연결 정보 설정
    conn_params = {
        'dbname': 'sy0218',
        'user': 'sy0218',
        'password': 'sy0218',
        'host': '192.168.56.10',
        'port': 5432
    }

    conn = psycopg2.connect(**conn_params)
    query = "SELECT * FROM keylog_modeling_data"
    df = pd.read_sql_query(query, conn)

    # 사용자별 키로그 입력 시간 오름차순 정렬
    df = df[['key_log_time', 'key_active', 'user_id','label']].sort_values(by=['user_id', 'key_log_time'], ascending=[True, True])
    df = df.groupby('user_id').agg({
        'key_active': lambda x: list(x),
        'label': 'first'
    }).reset_index()

    # lstm 모델링을 위한 전처리 레고레고
    # 시퀀스 변환, 패딩
    max_length = 50
    tokenizer = {key: i+1 for i, key in enumerate(set(np.concatenate(df['key_active'].values)))}
    X = [[tokenizer[key] for key in seq] for seq in df['key_active']]
    y = df['label'].values
    X = pad_sequences(X, maxlen=max_length, padding='post')

    # 데이터 분할
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # LSTM 모델링
    model = Sequential()
    # len(tokenizer)+1 개의 토근을 8차원 백터로 변환후, 각 시퀀스 길이는 30으로 고정
    model.add(Embedding(input_dim=len(tokenizer)+1, output_dim=8, input_length=max_length))
    model.add(LSTM(32))
    model.add(Dense(1, activation='sigmoid'))

    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

    # 과적합 방지 위한 얼리 스탑핑 ( 검증 손실이 3번 연속 개선안되면 학습을 중지!! )
    early_stopping = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)

    # 모델 학습
    model.fit(X_train, y_train, epochs=30, batch_size=10, validation_data=(X_test, y_test), callbacks=[early_stopping])

    # 모델 평가
    loss, accuracy = model.evaluate(X_test, y_test)
    print(f'Loss: {loss}, Accuracy: {accuracy}')

    # 테스트 데이터 예측
    pred = model.predict(X_test)
    print(pred, y_test)

    # 모델 및 토큰 객체 저장
    model_filename = f"macro_model_{batch_date}.keras"
    tokenizer_filename = f"macro_tokenizer_{batch_date}.pkl"
    model.save(f"{materials_path}/{model_filename}")
    with open(f'{materials_path}/{tokenizer_filename}', 'wb') as f:
        pickle.dump(tokenizer, f)

    # 종료 시간 기록하여 실행 시간 확인
    end_time = time.time()
    print(f"총 실행시간: {end_time - start_time}")

if __name__ == "__main__":
    args = sys.argv[1:]
    # 인자 두개 아니면 종료
    if len(args) != 2:
        print("사용법 : py <객체경로> <배치날짜>")
        sys.exit(1)

    materials_path, batch_date = args
    #main(materials_path, batch_date)

    # 메모리 사용량 확인
    mem_use = memory_usage((main, (materials_path, batch_date)))
    print(f"최대 메모리 사용량: {max(mem_use)} MB")

 

(2-4) 로컬, venv 환경 실행 test

1) 로컬 환경 실행 정보
총 실행시간: 11.154206991195679
최대 메모리 사용량: 605.1953125 MB

2) venv 환경 실행 정보
총 실행시간: 11.249036073684692
최대 메모리 사용량: 606.40234375 MB

>>> 큰 차이는 없는듯...싶..다.???

 

3. 가상환경을 아카이빙

1) gz으로 압축
ex) tar -czvf (압축파일 저장명) (가상환경 디렉토리명)
tar -czvf /data/venv_test.tar.gz /data/venv_test

2) 타 시스템에 배포
tar -xzvf venv_test.tar.gz

3) 타 시스템 가상환경 활성화
source /data/venv_test/macro_project/bin/activate  # 활성화

4) 실행 테스트
/data/venv_test/model_test /data 20241009

 

(3-1) 압축 용량 확인 ( 대략 731MB )

 

(3-2) 산출물 확인