# ============================================================================ # LAL / STE — 长上下文中文训练 # # 这个仓库现在只保留一条路: models/ste_train.c + runtime/lal_runtime.c # 历史上的 gpt2 / qwen / demos / meta-learn 等目标依赖的源文件(tools/, # compiler/, tests/, scripts/, docs/)都已从仓库中删除, 因此那些目标全部 # 移除了 —— 留着只会让人 make 一个必然失败的目标, 浪费时间。 # # !! 这个 Makefile 只适用于 Linux/macOS !! # Windows 上 MSYS2/MinGW 一般只有 gcc, 没有 make 也没有 bash, 请改用: # .\build.ps1 编译 # .\ste_train.exe 单进程训练 # .\train_4core.ps1 多进程并行训练 # build.ps1 的编译参数必须与本文件的 CFLAGS 一致。 # # === 唯一正确的路 (Linux/macOS) === # make 编译 ste_train # make train 单进程训练(默认参数已固化在 ste_train.c, 无需传参) # make test 生成测试 # make clean 清理产物 # # 固化参数(必须与 models/ste_train.c 和 train_4core.ps1 三处一致): # data=data/wiki_clean.bin steps=2000 batch=4 max_pos=8192 # lr=0.0003 logic_lr=0.01 phase=1 vocab=32768 # attn_window=1024 attn_sink=64 ternary=ON save_every=20 # resume/save = model_dialogue.ste # 改任何一处都必须同步改另外两处。 # ============================================================================ CC ?= gcc # -fopenmp 必需: ste_train.c 用了 omp_get_max_threads(), 少了会链接失败。 CFLAGS ?= -O3 -march=native -fno-strict-aliasing -fopenmp -funroll-loops -ftree-vectorize -ffast-math -Wall -Wno-unused-function -Wno-unused-variable LDLIBS ?= -lm # [加速] OpenBLAS 检测: 有则定义 HAVE_OPENBLAS + 链接 -lopenblas # Linux: apt install libopenblas-dev; Windows MSYS2: pacman -S mingw-w64-x86_64-openblas OPENBLAS_CFLAGS := $(shell echo 'int main(){return 0;}' | $(CC) -x c - -lopenblas -o /dev/null 2>/dev/null && echo '-DHAVE_OPENBLAS') OPENBLAS_LDLIBS := $(shell echo 'int main(){return 0;}' | $(CC) -x c - -lopenblas -o /dev/null 2>/dev/null && echo '-lopenblas') CFLAGS += $(OPENBLAS_CFLAGS) LDLIBS += $(OPENBLAS_LDLIBS) BIN := ste_train DATA := data/wiki_clean.bin MODEL := model_dialogue.ste DEPS := models/ste_train.c runtime/lal_runtime.c runtime/lal_runtime.h \ runtime/lal_ponder.h \ runtime/lal_data_loader.h runtime/lal_model_growth.h \ runtime/lal_semantic_logic.h runtime/lal_whitebox_probe.h \ runtime/lal_inference_tracer.h runtime/lal_concept_attn.h .PHONY: all train test clean help all: $(BIN) $(BIN): $(DEPS) $(CC) $(CFLAGS) -o $@ models/ste_train.c runtime/lal_runtime.c $(LDLIBS) @echo "[*] built $(BIN) — 直接 ./$(BIN) 即走固化路径, 无需任何参数" # 单进程训练。不传任何参数: 默认值已固化在 ste_train.c main() 里, # 启动时会打印一遍生效配置, 不用去猜。 train: $(BIN) @if [ ! -f $(DATA) ]; then \ echo "[!] 缺少固化数据 $(DATA) — 这是唯一正确的数据, 不要用别的 .bin 替代"; \ exit 1; fi ./$(BIN) # 生成测试。--resume 默认就是 model_dialogue.ste, 这里显式写出便于阅读。 # 注意: 推理的 attn-window/attn-sink 必须与训练时相同(默认值已保证一致), # 不一致会直接输出乱码 —— 这是踩过的坑。 test: $(BIN) @if [ ! -f $(MODEL) ]; then \ echo "[!] 缺少 $(MODEL), 请先 make train"; exit 1; fi ./$(BIN) --diagnose-only --resume $(MODEL) --prompt "什么是火?" --max-gen 40 clean: rm -f $(BIN) $(BIN).exe help: @./$(BIN) --help 2>/dev/null || $(MAKE) -s _helpfallback _helpfallback: @echo "先 make 编译, 再 make help 查看完整参数说明"