feat: enhance model training and deployment scripts with time-weighted sampling
- Updated `train_model.py` and `train_mlx_model.py` to include a time weight decay parameter for improved sample weighting during training. - Modified dataset generation to incorporate sample weights based on time decay, enhancing model performance. - Adjusted deployment scripts to support new backend options and improved error handling for model file transfers. - Added new entries to the training log for better tracking of model performance metrics over time. - Included ONNX model export functionality in the MLX filter for compatibility with Linux servers.
This commit is contained in:
@@ -1,65 +1,77 @@
|
||||
#!/usr/bin/env bash
|
||||
# 맥미니에서 학습한 모델을 LXC 컨테이너 볼륨 경로로 전송한다.
|
||||
# 사용법: bash scripts/deploy_model.sh [LXC_HOST] [LXC_MODELS_PATH]
|
||||
# 사용법: bash scripts/deploy_model.sh [lgbm|mlx]
|
||||
#
|
||||
# 예시:
|
||||
# bash scripts/deploy_model.sh 10.1.10.28 /path/to/cointrader/models
|
||||
# bash scripts/deploy_model.sh root@10.1.10.28 /root/cointrader/models
|
||||
# bash scripts/deploy_model.sh # LightGBM (기본값)
|
||||
# bash scripts/deploy_model.sh mlx # MLX 신경망
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
LXC_HOST="${1:-root@10.1.10.24}"
|
||||
LXC_MODELS_PATH="${2:-/root/cointrader/models}"
|
||||
LOCAL_MODEL="models/lgbm_filter.pkl"
|
||||
BACKEND="${1:-lgbm}"
|
||||
LXC_HOST="root@10.1.10.24"
|
||||
LXC_MODELS_PATH="/root/cointrader/models"
|
||||
LOCAL_LOG="models/training_log.json"
|
||||
|
||||
if [[ ! -f "$LOCAL_MODEL" ]]; then
|
||||
echo "[오류] 모델 파일 없음: $LOCAL_MODEL"
|
||||
echo "먼저 python scripts/train_model.py 를 실행하세요."
|
||||
exit 1
|
||||
# ── 백엔드별 파일 목록 설정 ──────────────────────────────────────────────────
|
||||
# mlx: ONNX 파일만 전송 (Linux 서버는 onnxruntime으로 추론)
|
||||
# lgbm: pkl 파일 전송
|
||||
RELOAD_CMD="from src.ml_filter import MLFilter; f=MLFilter(); f.reload_model(); print('리로드 완료')"
|
||||
if [ "$BACKEND" = "mlx" ]; then
|
||||
LOCAL_FILES=("models/mlx_filter.weights.onnx")
|
||||
else
|
||||
LOCAL_FILES=("models/lgbm_filter.pkl")
|
||||
fi
|
||||
|
||||
echo "=== 모델 전송 시작 ==="
|
||||
echo " 대상: ${LXC_HOST}:${LXC_MODELS_PATH}"
|
||||
echo " 파일: $LOCAL_MODEL"
|
||||
|
||||
# 기존 모델을 prev로 백업 (원격)
|
||||
ssh "${LXC_HOST}" "
|
||||
if [ -f '${LXC_MODELS_PATH}/lgbm_filter.pkl' ]; then
|
||||
cp '${LXC_MODELS_PATH}/lgbm_filter.pkl' '${LXC_MODELS_PATH}/lgbm_filter_prev.pkl'
|
||||
echo ' 기존 모델 백업 완료'
|
||||
# ── 파일 존재 확인 ────────────────────────────────────────────────────────────
|
||||
for f in "${LOCAL_FILES[@]}"; do
|
||||
if [[ ! -f "$f" ]]; then
|
||||
echo "[오류] 모델 파일 없음: $f"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "=== 모델 전송 시작 (백엔드: ${BACKEND}) ==="
|
||||
echo " 대상: ${LXC_HOST}:${LXC_MODELS_PATH}"
|
||||
|
||||
# ── 원격 디렉터리 생성 + lgbm 기존 모델 백업 ─────────────────────────────────
|
||||
ssh "${LXC_HOST}" "
|
||||
mkdir -p '${LXC_MODELS_PATH}'
|
||||
if [ '$BACKEND' = 'lgbm' ] && [ -f '${LXC_MODELS_PATH}/lgbm_filter.pkl' ]; then
|
||||
cp '${LXC_MODELS_PATH}/lgbm_filter.pkl' '${LXC_MODELS_PATH}/lgbm_filter_prev.pkl'
|
||||
echo ' 기존 lgbm 모델 백업 완료'
|
||||
fi
|
||||
"
|
||||
|
||||
# 모델 파일 전송 (rsync 우선, 없으면 scp 폴백)
|
||||
if command -v rsync &>/dev/null && ssh "${LXC_HOST}" "command -v rsync" &>/dev/null; then
|
||||
rsync -avz --progress \
|
||||
"$LOCAL_MODEL" \
|
||||
"${LXC_HOST}:${LXC_MODELS_PATH}/lgbm_filter.pkl"
|
||||
else
|
||||
echo " rsync 없음 → scp 사용"
|
||||
scp "$LOCAL_MODEL" "${LXC_HOST}:${LXC_MODELS_PATH}/lgbm_filter.pkl"
|
||||
fi
|
||||
|
||||
# 학습 로그도 함께 전송 (있을 경우)
|
||||
if [[ -f "$LOCAL_LOG" ]]; then
|
||||
# ── 파일 전송 헬퍼 (rsync 우선, scp 폴백) ────────────────────────────────────
|
||||
_send() {
|
||||
local src="$1" dst="$2"
|
||||
echo " 전송: $src → ${LXC_HOST}:$dst"
|
||||
if command -v rsync &>/dev/null && ssh "${LXC_HOST}" "command -v rsync" &>/dev/null; then
|
||||
rsync -avz "$LOCAL_LOG" "${LXC_HOST}:${LXC_MODELS_PATH}/training_log.json"
|
||||
rsync -avz --progress "$src" "${LXC_HOST}:$dst"
|
||||
else
|
||||
scp "$LOCAL_LOG" "${LXC_HOST}:${LXC_MODELS_PATH}/training_log.json"
|
||||
scp "$src" "${LXC_HOST}:$dst"
|
||||
fi
|
||||
}
|
||||
|
||||
# ── 모델 파일 전송 ────────────────────────────────────────────────────────────
|
||||
for f in "${LOCAL_FILES[@]}"; do
|
||||
_send "$f" "${LXC_MODELS_PATH}/$(basename "$f")"
|
||||
done
|
||||
|
||||
# ── 학습 로그 전송 ────────────────────────────────────────────────────────────
|
||||
if [[ -f "$LOCAL_LOG" ]]; then
|
||||
_send "$LOCAL_LOG" "${LXC_MODELS_PATH}/training_log.json"
|
||||
echo " 학습 로그 전송 완료"
|
||||
fi
|
||||
|
||||
echo "=== 전송 완료 ==="
|
||||
echo ""
|
||||
|
||||
# 봇 컨테이너가 실행 중이면 모델 핫리로드, 아니면 건너뜀
|
||||
# ── 핫리로드 ─────────────────────────────────────────────────────────────────
|
||||
echo "=== 핫리로드 시도 ==="
|
||||
if ssh "${LXC_HOST}" "docker inspect -f '{{.State.Running}}' cointrader 2>/dev/null | grep -q true"; then
|
||||
ssh "${LXC_HOST}" "docker exec cointrader python -c \
|
||||
\"from src.ml_filter import MLFilter; f=MLFilter(); f.reload_model(); print('리로드 완료')\""
|
||||
ssh "${LXC_HOST}" "docker exec cointrader python -c \"${RELOAD_CMD}\""
|
||||
echo "=== 핫리로드 완료 ==="
|
||||
else
|
||||
echo " cointrader 컨테이너가 실행 중이 아닙니다. 건너뜁니다."
|
||||
|
||||
Reference in New Issue
Block a user