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) 산출물 확인

'데이터 엔지니어( 실습 정리 )' 카테고리의 다른 글
| 데이터 저장 정책에 따른 저장 환경 별 데이터 삭제 스크립트 모음 (0) | 2024.10.16 |
|---|---|
| ansible - 하둡 동적 설치 (3) | 2024.07.23 |
| ansible - postgresql 동적 설치 (2) | 2024.07.22 |
| ansible - 주키퍼 동적 설치 (3) | 2024.07.22 |
| ansible 사용 os_auto_config (0) | 2024.07.18 |