ZaoKing commited on
Commit
c5862cd
·
verified ·
1 Parent(s): d398608

Upload onstart_v2.sh with huggingface_hub

Browse files
Files changed (1) hide show
  1. onstart_v2.sh +52 -33
onstart_v2.sh CHANGED
@@ -1,12 +1,12 @@
1
  #!/bin/bash
2
- # Khudi AI v2 — On-start script (FIXED VERSION)
3
- # All issues from v1 addressed
4
 
5
- set -e
6
- exec > >(tee -a /workspace/train.log) 2>&1
7
 
8
  echo "============================================"
9
- echo "🇵🇰 Khudi AI v2 — SAFE TRAINING (v2.1)"
10
  echo "============================================"
11
  echo "Start: $(date)"
12
 
@@ -18,11 +18,11 @@ IDLE_COUNT=0
18
  # ============================================================
19
  # SAFETY: 14-hour auto-shutdown
20
  # ============================================================
21
- ( sleep 50400 && echo "⏰ 14 HOUR TIMEOUT" && pkill -9 -f python ) &
22
  TIMEOUT_PID=$!
23
 
24
  # ============================================================
25
- # SAFETY: Health check (only starts AFTER training begins)
26
  # ============================================================
27
  start_health_check() {
28
  while true; do
@@ -33,12 +33,12 @@ start_health_check() {
33
  IDLE_COUNT=$((IDLE_COUNT + 1))
34
  if [ "$IDLE_COUNT" -gt 12 ]; then
35
  echo "[HEALTH] GPU idle 60+ min - EMERGENCY EXIT"
36
- pkill -f "python.*train" 2>/dev/null
37
  # Save what we have
38
  if [ -d /workspace/khudi-v2-output/checkpoints ]; then
39
- LATEST=$(ls /workspace/khudi-v2-output/checkpoints/ | grep checkpoint- | sort -V | tail -1)
40
  if [ -n "$LATEST" ]; then
41
- python -c "
 
42
  from huggingface_hub import HfApi
43
  import os
44
  api = HfApi()
@@ -52,6 +52,7 @@ print('Saved $LATEST to HF')
52
  " 2>&1
53
  fi
54
  fi
 
55
  kill -9 $TIMEOUT_PID 2>/dev/null
56
  exit 2
57
  fi
@@ -73,7 +74,7 @@ pip install -q --no-cache-dir \
73
  "accelerate==0.34.0" \
74
  "bitsandbytes==0.43.3" \
75
  "huggingface_hub==0.25.0" \
76
- "sentencepiece" "protobuf" 2>&1 | tail -3
77
 
78
  # ============================================================
79
  # Step 2: Setup directories
@@ -84,31 +85,42 @@ cd /workspace
84
  mkdir -p khudi-v2-output/checkpoints khudi-v2-output/hf_cache
85
 
86
  # ============================================================
87
- # Step 3: Download train script from HF (FIX: was missing)
88
  # ============================================================
89
  echo "[3/8] Downloading training scripts from HF..."
90
  HF_TOKEN_VALUE="HF_TOKEN_PLACEHOLDER"
91
 
92
- wget -q --header="Authorization: Bearer $HF_TOKEN_VALUE" \
93
- -O train_v2.py \
94
- "https://huggingface.co/ZaoKing/khudi-ai-v2/resolve/main/train_v2.py"
 
 
 
95
 
96
- if [ ! -s train_v2.py ]; then
 
 
 
 
 
 
 
 
 
 
 
97
  echo "❌ FATAL: Could not download train_v2.py"
98
  exit 1
99
  fi
100
  echo " ✅ train_v2.py downloaded: $(wc -l < train_v2.py) lines"
101
 
102
  # ============================================================
103
- # Step 4: Download v2 dataset (FIX: was 1 URL, need 4 chunks)
104
  # ============================================================
105
  echo "[4/8] Downloading v2 dataset (4 chunks)..."
106
  for i in 0 1 2 3; do
107
  echo " Downloading chunk $i..."
108
- wget -q --header="Authorization: Bearer $HF_TOKEN_VALUE" \
109
- -O "v2_chunk_$i.jsonl" \
110
- "https://huggingface.co/ZaoKing/khudi-ai-v2/resolve/main/data/v2_chunk_$i.jsonl"
111
- if [ ! -s "v2_chunk_$i.jsonl" ]; then
112
  echo " ❌ FATAL: Could not download chunk $i"
113
  exit 1
114
  fi
@@ -116,13 +128,15 @@ done
116
 
117
  # Combine chunks
118
  cat v2_chunk_0.jsonl v2_chunk_1.jsonl v2_chunk_2.jsonl v2_chunk_3.jsonl > v2_data.jsonl
119
- echo " ✅ Combined: $(wc -l < v2_data.jsonl) samples ($(ls -lh v2_data.jsonl | awk '{print $5}'))"
 
 
120
 
121
  # ============================================================
122
  # Step 5: Quick data validation
123
  # ============================================================
124
  echo "[5/8] Validating data..."
125
- python -c "
126
  import json
127
  count = 0
128
  errors = 0
@@ -137,7 +151,10 @@ with open('/workspace/v2_data.jsonl') as f:
137
  except:
138
  errors += 1
139
  print(f'Valid: {count}, Errors: {errors}')
140
- " 2>&1
 
 
 
141
 
142
  # ============================================================
143
  # Step 6: Check for resume checkpoint
@@ -153,29 +170,31 @@ else
153
  fi
154
 
155
  # ============================================================
156
- # Step 7: Start training (health check only NOW)
157
  # ============================================================
158
  echo "[7/8] Starting health check + training..."
159
  start_health_check &
160
  HEALTH_PID=$!
161
  echo " Health check PID: $HEALTH_PID"
162
 
163
- # Export token for the training script
164
  export HF_TOKEN="$HF_TOKEN_VALUE"
165
  export HUGGINGFACE_HUB_TOKEN="$HF_TOKEN_VALUE"
166
  export DATA_PATH="/workspace/v2_data.jsonl"
167
  export OUTPUT_DIR="/workspace/khudi-v2-output"
168
  export MODEL_NAME="Qwen/Qwen3.5-9B"
169
 
170
- python train_v2.py $RESUME_FLAG 2>&1
 
 
171
 
172
  TRAIN_EXIT=$?
173
  echo "Training exit: $TRAIN_EXIT"
174
  echo "End: $(date)"
175
 
176
  # Stop health check
177
- kill $HEALTH_PID 2>/dev/null
178
- kill $TIMEOUT_PID 2>/dev/null
179
 
180
  # ============================================================
181
  # Step 8: Final status
@@ -188,7 +207,7 @@ else
188
  fi
189
 
190
  # Upload final log
191
- python -c "
192
  from huggingface_hub import HfApi
193
  api = HfApi()
194
  api.upload_file(
@@ -199,11 +218,11 @@ api.upload_file(
199
  commit_message='Training log v2'
200
  )
201
  print('Log uploaded')
202
- " 2>&1
203
 
204
  # Stop instance
205
  echo "Stopping instance..."
206
- pkill -9 -f python 2>/dev/null
207
  sleep 2
208
- sudo shutdown -h now 2>/dev/null || shutdown -h now 2>/dev/null
209
  echo "Script complete"
 
1
  #!/bin/bash
2
+ # Khudi AI v2 — On-start script (v3 - ALL FIXES APPLIED)
3
+ # All issues from v1 + v2.1 addressed
4
 
5
+ # Don't use 'set -e' - we want to handle errors gracefully
6
+ # instead of exiting on first failure
7
 
8
  echo "============================================"
9
+ echo "🇵🇰 Khudi AI v2 — SAFE TRAINING (v3)"
10
  echo "============================================"
11
  echo "Start: $(date)"
12
 
 
18
  # ============================================================
19
  # SAFETY: 14-hour auto-shutdown
20
  # ============================================================
21
+ ( sleep 50400 && echo "⏰ 14 HOUR TIMEOUT" && pkill -9 -f "python train_v2" ) &
22
  TIMEOUT_PID=$!
23
 
24
  # ============================================================
25
+ # SAFETY: Health check (only after training starts)
26
  # ============================================================
27
  start_health_check() {
28
  while true; do
 
33
  IDLE_COUNT=$((IDLE_COUNT + 1))
34
  if [ "$IDLE_COUNT" -gt 12 ]; then
35
  echo "[HEALTH] GPU idle 60+ min - EMERGENCY EXIT"
 
36
  # Save what we have
37
  if [ -d /workspace/khudi-v2-output/checkpoints ]; then
38
+ LATEST=$(ls /workspace/khudi-v2-output/checkpoints/ 2>/dev/null | grep checkpoint- | sort -V | tail -1)
39
  if [ -n "$LATEST" ]; then
40
+ echo "Saving $LATEST to HF..."
41
+ HF_TOKEN="$HF_TOKEN_VALUE" python -c "
42
  from huggingface_hub import HfApi
43
  import os
44
  api = HfApi()
 
52
  " 2>&1
53
  fi
54
  fi
55
+ pkill -9 -f "python train_v2" 2>/dev/null
56
  kill -9 $TIMEOUT_PID 2>/dev/null
57
  exit 2
58
  fi
 
74
  "accelerate==0.34.0" \
75
  "bitsandbytes==0.43.3" \
76
  "huggingface_hub==0.25.0" \
77
+ "sentencepiece" "protobuf" 2>&1 | tail -3 || echo " ⚠️ Some packages may have failed"
78
 
79
  # ============================================================
80
  # Step 2: Setup directories
 
85
  mkdir -p khudi-v2-output/checkpoints khudi-v2-output/hf_cache
86
 
87
  # ============================================================
88
+ # Step 3: Download train script from HF
89
  # ============================================================
90
  echo "[3/8] Downloading training scripts from HF..."
91
  HF_TOKEN_VALUE="HF_TOKEN_PLACEHOLDER"
92
 
93
+ # FIX: Add retry logic
94
+ download_with_retry() {
95
+ local url="$1"
96
+ local output="$2"
97
+ local max_retries=3
98
+ local retry=0
99
 
100
+ while [ $retry -lt $max_retries ]; do
101
+ if wget -q --header="Authorization: Bearer $HF_TOKEN_VALUE" -O "$output" "$url" && [ -s "$output" ]; then
102
+ return 0
103
+ fi
104
+ retry=$((retry + 1))
105
+ echo " Retry $retry/$max_retries for $output..."
106
+ sleep 5
107
+ done
108
+ return 1
109
+ }
110
+
111
+ if ! download_with_retry "https://huggingface.co/ZaoKing/khudi-ai-v2/resolve/main/train_v2.py" "train_v2.py"; then
112
  echo "❌ FATAL: Could not download train_v2.py"
113
  exit 1
114
  fi
115
  echo " ✅ train_v2.py downloaded: $(wc -l < train_v2.py) lines"
116
 
117
  # ============================================================
118
+ # Step 4: Download v2 dataset (4 chunks)
119
  # ============================================================
120
  echo "[4/8] Downloading v2 dataset (4 chunks)..."
121
  for i in 0 1 2 3; do
122
  echo " Downloading chunk $i..."
123
+ if ! download_with_retry "https://huggingface.co/ZaoKing/khudi-ai-v2/resolve/main/data/v2_chunk_$i.jsonl" "v2_chunk_$i.jsonl"; then
 
 
 
124
  echo " ❌ FATAL: Could not download chunk $i"
125
  exit 1
126
  fi
 
128
 
129
  # Combine chunks
130
  cat v2_chunk_0.jsonl v2_chunk_1.jsonl v2_chunk_2.jsonl v2_chunk_3.jsonl > v2_data.jsonl
131
+ TOTAL=$(wc -l < v2_data.jsonl)
132
+ SIZE=$(ls -lh v2_data.jsonl | awk '{print $5}')
133
+ echo " ✅ Combined: $TOTAL samples ($SIZE)"
134
 
135
  # ============================================================
136
  # Step 5: Quick data validation
137
  # ============================================================
138
  echo "[5/8] Validating data..."
139
+ HF_TOKEN="$HF_TOKEN_VALUE" python -c "
140
  import json
141
  count = 0
142
  errors = 0
 
151
  except:
152
  errors += 1
153
  print(f'Valid: {count}, Errors: {errors}')
154
+ if count < 1000:
155
+ print('FATAL: Not enough valid samples!')
156
+ exit(1)
157
+ " || { echo "❌ Data validation failed"; exit 1; }
158
 
159
  # ============================================================
160
  # Step 6: Check for resume checkpoint
 
170
  fi
171
 
172
  # ============================================================
173
+ # Step 7: Start training
174
  # ============================================================
175
  echo "[7/8] Starting health check + training..."
176
  start_health_check &
177
  HEALTH_PID=$!
178
  echo " Health check PID: $HEALTH_PID"
179
 
180
+ # Export ALL required env vars
181
  export HF_TOKEN="$HF_TOKEN_VALUE"
182
  export HUGGINGFACE_HUB_TOKEN="$HF_TOKEN_VALUE"
183
  export DATA_PATH="/workspace/v2_data.jsonl"
184
  export OUTPUT_DIR="/workspace/khudi-v2-output"
185
  export MODEL_NAME="Qwen/Qwen3.5-9B"
186
 
187
+ # FIX: Pass --epochs 1 explicitly
188
+ cd /workspace
189
+ python train_v2.py $RESUME_FLAG --epochs 1 2>&1
190
 
191
  TRAIN_EXIT=$?
192
  echo "Training exit: $TRAIN_EXIT"
193
  echo "End: $(date)"
194
 
195
  # Stop health check
196
+ kill $HEALTH_PID 2>/dev/null || true
197
+ kill $TIMEOUT_PID 2>/dev/null || true
198
 
199
  # ============================================================
200
  # Step 8: Final status
 
207
  fi
208
 
209
  # Upload final log
210
+ HF_TOKEN="$HF_TOKEN_VALUE" python -c "
211
  from huggingface_hub import HfApi
212
  api = HfApi()
213
  api.upload_file(
 
218
  commit_message='Training log v2'
219
  )
220
  print('Log uploaded')
221
+ " 2>&1 || echo " Log upload failed"
222
 
223
  # Stop instance
224
  echo "Stopping instance..."
225
+ pkill -9 -f "python train_v2" 2>/dev/null || true
226
  sleep 2
227
+ sudo shutdown -h now 2>/dev/null || shutdown -h now 2>/dev/null || true
228
  echo "Script complete"