File size: 7,287 Bytes
26d5b81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#!/bin/bash
# ═══════════════════════════════════════════════════════════════
# NeuroFlow — 阿里天池 DSW CUDA 一键部署/训练脚本
# 适用: DSW GPU 实例, A10 / V100 / 其他 sm_80+ 显卡
# 用法: bash deploy_dsw.sh
# ═══════════════════════════════════════════════════════════════

set -euo pipefail

REPO_DIR="neuroflow-C++"
BUILD_DIR="build_cuda"
GIT_REPO="https://github.com/chenzhiwenhphp12-afk/neuroflow-model.git"

echo "╔══════════════════════════════════════════════════╗"
echo "║   NeuroFlow DSW 部署 + 蒸馏训练脚本              ║"
echo "╚══════════════════════════════════════════════════╝"

# ── 0. 检查 GPU ──
echo ""
echo "🔍 [0/7] 检查 GPU / CUDA..."
if ! command -v nvidia-smi &>/dev/null; then
    echo "❌ nvidia-smi 未找到,请确认已开启 GPU 实例"
    exit 1
fi
nvidia-smi
echo ""

if ! command -v nvcc &>/dev/null; then
    echo "⚠️  nvcc 未找到。DSW 镜像里 CUDA 通常装在 /usr/local/cuda"
    export CUDA_HOME=/usr/local/cuda
    export PATH="$CUDA_HOME/bin:$PATH"
    if ! command -v nvcc &>/dev/null; then
        echo "❌ 仍未找到 nvcc,请确认 CUDA Toolkit 已安装"
        exit 1
    fi
fi
nvcc --version | grep "release"
echo "✅ CUDA 就绪"
echo ""

# ── 1. 安装系统依赖 ──
echo "📦 [1/7] 安装编译依赖..."
apt-get update -qq
apt-get install -y -qq cmake build-essential python3 python3-pip git 2>/dev/null || true
echo "✅ 依赖安装完成"
echo ""

# ── 2. 获取代码 ──
echo "📥 [2/7] 获取 NeuroFlow 源码..."
if [ -d "$REPO_DIR" ]; then
    echo "   检测到已有目录,执行 git pull..."
    cd "$REPO_DIR"
    git pull || true
    cd ..
else
    echo "   正在克隆: $GIT_REPO"
    git clone "$GIT_REPO" "$REPO_DIR"
fi
cd "$REPO_DIR"
echo "✅ 代码就绪: $(pwd)"
echo ""

# ── 3. 数据格式转换 ──
echo "📝 [3/7] 准备训练数据..."
DEEPSEEK_JSONL="${DEEPSEEK_JSONL:-}"
DATA_TXT="data/distill_train.txt"

if [ ! -f "$DATA_TXT" ]; then
    mkdir -p data

    if [ -n "$DEEPSEEK_JSONL" ] && [ -f "$DEEPSEEK_JSONL" ]; then
        echo "   使用 DeepSeek 蒸馏数据: $DEEPSEEK_JSONL"
        python3 scripts/preprocess_distill.py "$DEEPSEEK_JSONL" "$DATA_TXT" 240000
    else
        echo "   ⚠️  未找到蒸馏数据,生成 5000 条测试样本..."
        python3 -c "
samples = []
for i in range(5000):
    samples.append(f'这是第{i}条训练数据,用于NeuroFlow模型测试。')
with open('$DATA_TXT', 'w', encoding='utf-8') as f:
    f.write('\n'.join(samples))
print(f'已生成 {len(samples)} 条样本 -> $DATA_TXT')
"
    fi
else
    echo "   训练数据已存在: $DATA_TXT"
fi
ls -lh "$DATA_TXT"
echo ""

# ── 4. 修复 CMake CUDA 编译 ──
echo "🔧 [4/7] 修复 CMake CUDA 编译配置..."
# 本项目要求所有 src/*.cpp 都以 CUDA 语言编译,否则训练回退 CPU
# 将非 CUDA 源文件强制设为 CUDA 语言
CMAKE_FILE="CMakeLists.txt"
if [ -f "$CMAKE_FILE" ]; then
    # 在 set_source_files_properties(src/cuda_context.cpp ...) 后插入全量 CUDA 映射
    if ! grep -q "set_source_files_properties(src/tensor_ops.cpp" "$CMAKE_FILE"; then
        echo "   为所有 src/*.cpp 添加 CUDA 编译属性..."
        python3 -c "
import re
p = '$CMAKE_FILE'
with open(p, 'r', encoding='utf-8') as f:
    c = f.read()
anchor = 'set_source_files_properties(src/cuda_context.cpp PROPERTIES LANGUAGE CUDA)'
if anchor in c and 'NEUROFLOW_ALL_CUDA_SOURCES' not in c:
    srcs = '''src/train_v2.cpp src/infer_v2.cpp src/tensor.cpp src/model.cpp src/weight_io.cpp
src/tokenizer.cpp src/sampling.cpp src/causal_lm.cpp src/tensor_ops.cpp src/generative_model.cpp
src/rope.cpp src/swiglu.cpp src/rms_norm.cpp src/adamw.cpp src/scheduler.cpp src/train_lm.cpp
src/grad_scaler.cpp src/cuda_context.cpp'''.split()
    block = '\n'.join([f'set_source_files_properties({s} PROPERTIES LANGUAGE CUDA)' for s in srcs])
    c = c.replace(anchor, anchor + '\n' + block + '\n', 1)
    with open(p, 'w', encoding='utf-8') as f:
        f.write(c)
    print('   CMake 已更新')
else:
    print('   跳过 (已配置或缺少锚点)')
"
    fi
else
    echo "❌ 未找到 $CMAKE_FILE"
    exit 1
fi
echo ""

# ── 5. 编译 CUDA 版本 ──
echo "🔨 [5/7] 编译 NeuroFlow (CUDA 模式)..."
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"
cd "$BUILD_DIR"

cmake .. \
    -DNEUROFLOW_USE_CUDA=ON \
    -DNEUROFLOW_USE_BLAS=OFF \
    -DNEUROFLOW_USE_AVX2=OFF \
    -DCMAKE_BUILD_TYPE=Release

cmake --build . -j"$(nproc)"
echo "✅ 编译完成"
echo ""

# ── 6. 小规模验证 ──
echo "🧪 [6/7] 小规模验证 (5 epochs)..."
cd "$REPO_DIR"
./"$BUILD_DIR"/neuroflow_train_v2 \
    --config configs/config_distill.json \
    --data "$DATA_TXT" \
    --output output_dsw_verify \
    --epochs 5 \
    --batch-size 16 \
    --lr 0.001 \
    --use-cuda \
    --adam \
    --log-interval 10 \
    --save-interval 100 || {
        echo "⚠️  验证失败,查看上方错误"
        exit 1
    }
echo "✅ 验证完成"
echo ""

# ── 7. 正式训练 (蒸馏) ──
echo "🚀 [7/7] 开始正式蒸馏训练..."
echo "════════════════════════════════════════════════════"
echo "  配置: configs/config.json (128K vocab)"
echo "  数据: $DATA_TXT"
echo "  输出: output_dsw_distill"
echo "════════════════════════════════════════════════════"

./"$BUILD_DIR"/neuroflow_train_v2 \
    --config configs/config.json \
    --data "$DATA_TXT" \
    --output output_dsw_distill \
    --epochs 10 \
    --batch-size 64 \
    --lr 0.0003 \
    --grad-accum 4 \
    --use-cuda \
    --adam \
    --log-interval 10 \
    --save-interval 2000 \
    --replay-buffer 10000 \
    --replay-ratio 0.25

echo ""
echo "╔══════════════════════════════════════════════════╗"
echo "║           训练完成!                              ║"
echo "╚══════════════════════════════════════════════════╝"
echo ""
echo "📁 模型目录: output_dsw_distill/"
ls -lh output_dsw_distill/ 2>/dev/null || true
echo ""
echo "🔜 续训命令:"
echo "   ./$BUILD_DIR/neuroflow_train_v2 \\"
echo "     --config configs/config.json \\"
echo "     --data $DATA_TXT \\"
echo "     --output output_dsw_distill \\"
echo "     --resume output_dsw_distill/model_final.nfv1 \\"
echo "     --epochs 20 \\"
echo "     --batch-size 64 \\"
echo "     --lr 0.0003 \\"
echo "     --grad-accum 4 \\"
echo "     --use-cuda --adam"