Files
frankenstallm/source/scripts/check_korean_data.sh

179 lines
5.9 KiB
Bash
Raw Normal View History

#!/bin/bash
# 한국어 학습 데이터 현황 확인 스크립트
# 용도: 한국어 데이터셋 상태, 토크나이저, 원본 데이터 파일 확인
set -e
# 프로젝트 루트 (이 스크립트 실행 위치 기준)
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "${PROJECT_ROOT}"
echo "=== 한국어 학습 데이터 현황 ==="
echo ""
# ============================================================================
# 1. 학습용 바이너리 데이터 확인
# ============================================================================
echo "[ 학습 바이너리 데이터 ]"
check_binary_data() {
local file=$1
local name=$2
if [ -f "$file" ]; then
local size=$(du -h "$file" | cut -f1)
# Python + numpy memmap으로 토큰 수 계산
# 바이너리는 uint32 형태로 저장되어 있음 (4 bytes per token)
local token_count=$(python3 -c "
import numpy as np
try:
data = np.memmap('$file', dtype=np.uint32, mode='r')
print(len(data))
except Exception as e:
print('error')
" 2>/dev/null || echo "error")
if [ "$token_count" != "error" ] && [ ! -z "$token_count" ]; then
# 토큰 수를 포맷팅 (천 단위 쉼표)
local formatted_tokens=$(printf "%'d" "$token_count")
# 1B 모델 학습 스텝 계산
# tokens_per_step = batch_size * grad_accum * seq_len * num_gpus
# = 8 * 4 * 4096 * 8 = 1,048,576 tokens/step
local tokens_per_step=1048576
local estimated_steps=$((token_count / tokens_per_step))
printf " %-20s : 존재 (%s, %'d 토큰, ~%'d steps)\n" \
"$name" "$size" "$token_count" "$estimated_steps"
else
printf " %-20s : 존재 (%s, 토큰 계산 실패)\n" "$name" "$size"
fi
else
printf " %-20s : 없음\n" "$name"
fi
}
check_binary_data "data/korean_train.bin" "korean_train.bin"
check_binary_data "data/korean_val.bin" "korean_val.bin"
check_binary_data "data/train.bin" "train.bin"
check_binary_data "data/val.bin" "val.bin"
echo ""
# ============================================================================
# 2. 토크나이저 확인
# ============================================================================
echo "[ 토크나이저 ]"
check_tokenizer() {
local dir=$1
local name=$2
if [ -d "$dir" ]; then
local files=$(find "$dir" -type f | wc -l)
printf " %-20s : 존재 (%d개 파일)\n" "$name" "$files"
else
printf " %-20s : 없음\n" "$name"
fi
}
check_tokenizer "tokenizer/korean_sp" "korean_sp"
check_tokenizer "tokenizer" "default tokenizer"
echo ""
# ============================================================================
# 3. 원본 데이터 디렉토리 확인
# ============================================================================
echo "[ 원본 데이터 ]"
check_raw_data() {
local dir=$1
local name=$2
if [ -d "$dir" ]; then
local file_count=$(find "$dir" -maxdepth 1 -type f | wc -l)
local total_size=$(du -sh "$dir" 2>/dev/null | cut -f1)
if [ $file_count -eq 0 ]; then
printf " %-20s : 없음 (디렉토리만 존재, 0 파일)\n" "$name"
else
printf " %-20s : %'d 파일 (%s)\n" "$name" "$file_count" "$total_size"
fi
else
printf " %-20s : 없음\n" "$name"
fi
}
check_raw_data "data/raw/cc100_ko" "cc100_ko/"
check_raw_data "data/raw/c4_ko" "c4_ko/"
check_raw_data "data/raw/namuwiki_ko" "namuwiki_ko/"
# 위키 데이터는 raw/ 직접 하위
echo ""
echo "[ 위키피디아 데이터 ]"
ko_wiki_count=$(find "data/raw" -maxdepth 1 -name "ko_wiki_*.txt" | wc -l)
en_wiki_count=$(find "data/raw" -maxdepth 1 -name "en_wiki_*.txt" | wc -l)
ko_wiki_size=$(du -sh "data/raw" 2>/dev/null | cut -f1)
if [ $ko_wiki_count -gt 0 ]; then
printf " %-20s : %'d 파일\n" "ko_wiki" "$ko_wiki_count"
fi
if [ $en_wiki_count -gt 0 ]; then
printf " %-20s : %'d 파일\n" "en_wiki" "$en_wiki_count"
fi
echo ""
# ============================================================================
# 4. 종합 상태 요약
# ============================================================================
echo "[ 종합 상태 ]"
# 학습용 바이너리 데이터 확인
binary_ready=false
if [ -f "data/korean_train.bin" ] && [ -f "data/korean_val.bin" ]; then
binary_ready=true
elif [ -f "data/train.bin" ] && [ -f "data/val.bin" ]; then
binary_ready=true
fi
# 토크나이저 확인
tokenizer_ready=false
if [ -d "tokenizer/korean_sp" ] && [ -f "tokenizer/korean_sp/tokenizer.model" ]; then
tokenizer_ready=true
fi
# 원본 데이터 확인
raw_ready=false
if [ -d "data/raw/c4_ko" ] || [ -d "data/raw/namuwiki_ko" ] || [ -d "data/raw/cc100_ko" ]; then
count=$(find "data/raw/c4_ko" -maxdepth 1 -type f 2>/dev/null | wc -l)
count=$((count + $(find "data/raw/namuwiki_ko" -maxdepth 1 -type f 2>/dev/null | wc -l)))
count=$((count + $(find "data/raw/cc100_ko" -maxdepth 1 -type f 2>/dev/null | wc -l)))
if [ $count -gt 0 ]; then
raw_ready=true
fi
fi
printf " 학습용 바이너리 : %s\n" "$([ "$binary_ready" = true ] && echo "✓ 준비됨" || echo "✗ 미준비")"
printf " 토크나이저 : %s\n" "$([ "$tokenizer_ready" = true ] && echo "✓ 준비됨" || echo "✗ 미준비")"
printf " 원본 데이터 : %s\n" "$([ "$raw_ready" = true ] && echo "✓ 준비됨" || echo "✗ 미준비")"
echo ""
# ============================================================================
# 5. 학습 설정 파라미터 정보
# ============================================================================
echo "[ 학습 설정 (1B 모델 기준) ]"
echo " 배치 사이즈 : 8"
echo " 시퀀스 길이 : 4096"
echo " GPU 수 : 8"
echo " 그래디언트 누적 : 4"
echo " 토큰/스텝 : 8 × 4 × 4096 × 8 = 1,048,576"
echo ""
echo "=== 검사 완료 ==="