@ -1,13 +1,12 @@
#!/usr/bin/env bash
#!/usr/bin/env bash
# kr_lp_pgnet 전용 컨테이너 안에서 실행되는 환경 셋업 스크립트.
# kr_lp_pgnet 전용 컨테이너 안에서 실행되는 환경 셋업 스크립트.
#
#
# 가정 (컨테이너 외부):
# 컨테이너 가정:
# - Ubuntu 24.04 베이스 컨테이너 `kr_lp_pgnet` (--gpus all, --restart unless-stopped)
# - Ubuntu 24.04 + Python 3.10 + paddlepaddle-gpu sm_120 wheel 설치됨
# - 호스트 /home/cuuva/workspace ↔ 컨테이너 /workspace (bind mount)
# - 호스트 /home/cuuva/workspace ↔ 컨테이너 /workspace bind mount
# - 이 repo는 호스트 ~/workspace/kr_lp_pgnet/ 에 clone (= 컨테이너 /workspace/kr_lp_pgnet/)
# - 이 repo는 /workspace/kr_lp_pgnet/, paddle wheel은 /workspace/wheels/
# - paddle sm_120 wheel은 ~/workspace/wheels/ 안에 둠
#
#
# 실행 (호스트 에서 ):
# 실행 (호스트 ):
# docker exec kr_lp_pgnet bash /workspace/kr_lp_pgnet/scripts/setup_server.sh
# docker exec kr_lp_pgnet bash /workspace/kr_lp_pgnet/scripts/setup_server.sh
set -euo pipefail
set -euo pipefail
@ -20,43 +19,48 @@ PRETRAIN_DIR="$PADDLEOCR_DIR/pretrain_models"
WHEEL_DIR = " $WORKSPACE /wheels "
WHEEL_DIR = " $WORKSPACE /wheels "
PY = python3.10
PY = python3.10
PIP = " $PY -m pip "
PIP_OPTS = "--quiet --root-user-action=ignore"
echo "[1/6] python / paddle 확인"
echo "[1/ 7 ] python / paddle 확인"
$PY --version
$PY --version
if ! $PY -c 'import paddle; assert paddle.is_compiled_with_cuda()' 2>/dev/null; then
if ! $PY -c 'import paddle; assert paddle.is_compiled_with_cuda()' 2>/dev/null; then
echo " paddle 미설치 또는 CUDA 비호환. sm_120 wheel 재 설치..."
echo " paddle 미설치 또는 CUDA 비호환. sm_120 wheel 설치..."
WHL = $( ls " $WHEEL_DIR " /paddlepaddle_gpu-*-cp310-*linux_x86_64.whl 2>/dev/null | head -1)
WHL = $( ls " $WHEEL_DIR " /paddlepaddle_gpu-*-cp310-*linux_x86_64.whl 2>/dev/null | head -1)
if [ -z " $WHL " ] ; then
if [ -z " $WHL " ] ; then
echo " wheel 파일을 $WHEEL_DIR / 에 두고 다시 실행하세요. " >& 2
echo " ERROR: $WHEEL_DIR /paddlepaddle_gpu-*-cp310-*.whl 없음 " >& 2
exit 1
exit 1
fi
fi
$P Y -m pip install --quiet " $WHL "
$P IP install $PIP_OPTS " $WHL "
fi
fi
$PY -c 'import paddle; print(" paddle:", paddle.__version__, "cuda:", paddle.is_compiled_with_cuda())'
$PY -c 'import paddle; print(" paddle:", paddle.__version__, "cuda:", paddle.is_compiled_with_cuda())'
echo "[2/6] PaddleOCR clone (release/2.7)"
echo "[2/7] OpenCV 시스템 의존성 (libgl 등)"
export DEBIAN_FRONTEND = noninteractive
apt-get install -y -q libgl1 libglib2.0-0 libsm6 libxext6 libxrender1 wget git
echo "[3/7] PaddleOCR clone (release/2.7)"
if [ ! -d " $PADDLEOCR_DIR " ] ; then
if [ ! -d " $PADDLEOCR_DIR " ] ; then
git clone --depth 1 -b release/2.7 https://github.com/PaddlePaddle/PaddleOCR.git " $PADDLEOCR_DIR "
git clone --depth 1 -b release/2.7 https://github.com/PaddlePaddle/PaddleOCR.git " $PADDLEOCR_DIR "
fi
fi
cd " $PADDLEOCR_DIR "
cd " $PADDLEOCR_DIR "
echo " PaddleOCR @ $( git rev-parse --short HEAD) "
echo " PaddleOCR @ $( git rev-parse --short HEAD) "
echo "[3/6] PaddleOCR requirements 설치 (paddlepaddle 라인은 제외)"
echo "[4/7] PaddleOCR Python 의존성 (한 줄씩, 충돌 패키지는 skip)"
if [ -f requirements.txt ] ; then
# paddle은 이미 wheel로, blinker는 system pkg, opencv는 numpy2 비호환 → 제외 후 별도 설치
grep -viE '^(paddlepaddle|paddleocr)' requirements.txt > /tmp/kr_lp_req.txt || true
grep -viE '^(paddlepaddle|paddleocr|blinker|opencv-)' requirements.txt > /tmp/kr_lp_req.txt || true
$PY -m pip install --quiet -r /tmp/kr_lp_req.txt || true
while IFS = read -r line; do
fi
[ [ -z " $line " || " $line " = ~ ^# ] ] && continue
$PIP install $PIP_OPTS --ignore-installed " $line " 2>/dev/null || echo " skip: $line "
done < /tmp/kr_lp_req.txt
echo "[4/6] PaddleOCR import smoke test"
echo "[5/7] OpenCV (numpy2 호환) + numpy<2 (PaddleOCR release/2.7 호환성)"
cd " $PADDLEOCR_DIR "
$PIP install $PIP_OPTS 'opencv-python>=4.10' 'opencv-contrib-python>=4.10'
$PY -c "
# imgaug 등이 numpy 1.x API(np.sctypes)에 의존하므로 numpy 1.x로 핀.
import sys; sys.path.insert( 0, '.' )
# paddle 3.3.0.dev는 numpy 1.x도 호환.
import ppocr
$PIP install $PIP_OPTS 'numpy<2' --force-reinstall
from ppocr.modeling.architectures import build_model
print( ' ppocr import OK' )
" || { echo " PaddleOCR import 실패 ( paddle 3.3 호환성 이슈일 수 있음) " ; exit 1; }
echo "[ 5/ 6] PGNet step1 pretrain weight 다운로드"
echo "[6/7] PGNet step1 pretrain weight 다운로드 + import smoke test"
mkdir -p " $PRETRAIN_DIR "
mkdir -p " $PRETRAIN_DIR "
cd " $PRETRAIN_DIR "
cd " $PRETRAIN_DIR "
if [ ! -d train_step1 ] ; then
if [ ! -d train_step1 ] ; then
@ -64,8 +68,18 @@ if [ ! -d train_step1 ]; then
tar xf train_step1.tar && rm train_step1.tar
tar xf train_step1.tar && rm train_step1.tar
fi
fi
ls train_step1/
ls train_step1/
cd " $PADDLEOCR_DIR "
$PY -c "
import sys; sys.path.insert( 0, '.' )
from ppocr.modeling.architectures import build_model
from ppocr.postprocess.pg_postprocess import PGPostProcess
from ppocr.losses.e2e_pg_loss import PGLoss
from ppocr.modeling.heads.e2e_pg_head import PGHead
from ppocr.data.imaug.pg_process import PGProcessTrain
print( ' PGNet modules import OK' )
"
echo "[6/6] dict / config symlink → PaddleOCR 트리"
echo "[ 7/7 ] dict / config symlink → PaddleOCR 트리"
ln -sf " $KR_LP_DIR /dict/kr_lp_dict.txt " " $PADDLEOCR_DIR /ppocr/utils/kr_lp_dict.txt "
ln -sf " $KR_LP_DIR /dict/kr_lp_dict.txt " " $PADDLEOCR_DIR /ppocr/utils/kr_lp_dict.txt "
mkdir -p " $PADDLEOCR_DIR /configs/e2e "
mkdir -p " $PADDLEOCR_DIR /configs/e2e "
ln -sf " $KR_LP_DIR /configs/kr_lp_pgnet.yml " " $PADDLEOCR_DIR /configs/e2e/kr_lp_pgnet.yml "
ln -sf " $KR_LP_DIR /configs/kr_lp_pgnet.yml " " $PADDLEOCR_DIR /configs/e2e/kr_lp_pgnet.yml "
@ -74,6 +88,6 @@ ls -l "$PADDLEOCR_DIR/ppocr/utils/kr_lp_dict.txt" "$PADDLEOCR_DIR/configs/e2e/kr
echo
echo
echo "==========================="
echo "==========================="
echo "셋업 완료. 다음 단계:"
echo "셋업 완료. 다음 단계:"
echo " bash $KR_LP_DIR /data_gen/setup_assets.sh # 합성 자산 다운로드"
echo " bash $KR_LP_DIR /data_gen/setup_assets.sh # 합성 자산 다운로드"
echo " python data_gen/generate_synthetic.py ... # 합성 데이터 생성 (다음 단계) "
echo " python3.10 $KR_LP_DIR /data_gen/generate_synthetic.py ... # 합성 데이터 생성 "
echo "==========================="
echo "==========================="