OpenASH

0 downloads 0 likes on ModelScope updated

Model card

OpenASH

OpenASH 是一个基于 PyTorch 的轻量级语言模型项目,使用自研的 累积最大值注意力机制(Cumulative Max Attention) 替代传统 Softmax 注意力,支持预训练、SFT 微调、流式推理和 WebUI 对话。

模型架构

  • MaxStateSuper: 核心注意力层,使用 torch.cummax 操作替代 softmax,通过可学习的 alpha 参数混合多种交互项,支持有状态推理(stateful inference)
  • DecoderLayer: 解码器层,包含 MaxStateSuper 注意力 + 门控前馈网络(Gated FFN)+ 残差连接 + LayerNorm
  • OpenASH: 完整模型,由 Embedding + 多层 DecoderLayer + 输出投影层组成

默认配置: hidden_size=640, num_layers=8, num_heads=8(约数百万参数)。

项目结构

demo/
├── open_ash.py            # 模型定义(MaxStateSuper, DecoderLayer, OpenASH)
├── open_ash_voc.py         # 分词器(基于 jieba + 代理词表编码)
├── open_ash_infer.py       # 推理引擎(采样、流式生成、交互式聊天)
├── open_ash_webui.py       # Streamlit WebUI(支持工具调用、思考模式)
├── open_ash_dataset.py     # 数据集(Pretrain/SFT/DPO/RLAIF/AgentRL)
├── train_pretrain.py       # 预训练脚本
├── train_full_sft.py       # SFT 全参数微调脚本
├── trainer_utils.py        # 训练工具(分布式、检查点、学习率调度)
├── config.py               # 配置文件
├── open_ash_voc_agent.json # 代理词表映射
└── vocabulary_nnn.json     # 基础词表

特性

  • 自定义注意力机制: 使用累积最大值(cummax)替代 softmax,计算效率更高
  • 有状态推理: 支持跨 chunk 的状态传递,可处理超长序列
  • 代理词表编码: 通过二维/三维索引编码扩展词表,在有限 token 空间内覆盖更多词汇
  • 多种采样策略: 支持 Temperature、Top-K、Top-P、重复惩罚
  • 流式输出: 支持逐 token 流式解码
  • 工具调用: 支持 function calling / tool use
  • 思考模式: 支持 <|think|>...<|end_think|> 链式思考
  • 分布式训练: 支持多卡 DDP、混合精度(BFloat16)、梯度累积、断点续训
  • Streamlit WebUI: 提供可视化对话界面,支持中英文切换

依赖

torch
jieba
streamlit
numpy
tqdm

快速开始

推理

python open_ash_infer.py

WebUI 对话

streamlit run demo/open_ash_webui.py

启动后会自动在浏览器中打开 WebUI 界面(默认 http://localhost:8501),支持以下功能:

  • 模型选择: 支持加载不同配置的模型权重(自动扫描 out/ 目录)
  • 参数调节: 侧边栏可调节历史对话轮次、最大生成长度、温度、Top-K、Top-P、重复惩罚
  • 思考模式: 开启后模型会在 <|think|>...<|end_think|> 中展示推理过程
  • 工具调用: 支持选择并使用工具(数学计算、时间查询、随机数、文本长度、单位转换、天气、汇率、翻译等)
  • 多语言: 支持中英文界面切换
  • 流式输出: 实时显示生成过程
  • 对话历史: 保存当前会话的对话记录

配置说明:

  • WEIGHT_DIR: 模型权重目录(默认 F:\OpenASH\out)
  • HIDDEN_SIZE: 模型隐藏层维度(默认 640)
  • NUM_LAYERS: 模型层数(默认 8)
  • NUM_HEADS: 注意力头数(默认 8)
  • MAX_SEQ_LEN: 最大序列长度(默认 2048)

预训练

python train_pretrain.py \
    --data_path pretrain_t2t.jsonl \
    --epochs 6 \
    --batch_size 40 \
    --learning_rate 1.25e-4 \
    --max_seq_len 512 \
    --save_dir ../out

SFT 微调

python train_full_sft.py \
    --data_path sft_t2t.jsonl \
    --epochs 6 \
    --batch_size 40 \
    --learning_rate 1.25e-5 \
    --from_weight pretrain \
    --max_seq_len 512 \
    --save_dir ../out \
    --save_weight full_sft

多卡训练

torchrun --nproc_per_node=4 train_pretrain.py \
    --data_path pretrain_t2t.jsonl \
    --batch_size 10

训练参数说明

参数 说明 默认值
--data_path 训练数据路径(JSONL 格式) pretrain_t2t.jsonl
--epochs 训练轮数 6
--batch_size 批次大小 40
--learning_rate 学习率 1.25e-4 (pretrain) / 1.25e-5 (sft)
--max_seq_len chunk 最大序列长度 512
--accumulation_steps 梯度累积步数 1
--grad_clip 梯度裁剪阈值 1.0
--from_weight 加载的预训练权重前缀 none (pretrain) / pretrain (sft)
--from_resume 是否从检查点续训 0
--use_compile 是否使用 torch.compile 0
--hidden_size 隐藏层维度 640
--num_layers 层数 8 (pretrain) / 10 (sft)
--num_heads 注意力头数 8

数据格式

预训练数据

每行一个 JSON 对象,包含 text 字段:

{"text": "这是一段训练文本..."}

SFT 数据

每行一个 JSON 对象,包含 conversations 字段:

{"conversations": [{"role": "user", "content": "你好"}, {"role": "assistant", "content": "你好!有什么可以帮你的?"}]}

支持 system、user、assistant、tool 角色,以及 reasoning_content(思考内容)、tool_calls(工具调用)、tools(工具定义)等字段。

License

MIT