lalmodel-code / src /Makefile
gasschina's picture
feat: PonderNet 循环思考 (逐层停机 + 末块循环 双重混合)
1423b78
Raw
History Blame Contribute Delete
3.71 kB
# ============================================================================
# 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 查看完整参数说明"