Flatten src layout: drop omni namespace, modules live directly under src/
Browse files- Move src/omni/{core,datasets,encoders,models,projectors,serve,trainers,utils}
up to src/, remove intermediate omni package
- Rewrite all omni.* imports to absolute top-level (core/models/trainers/dataset/utils/...)
- Rename data package datasets->dataset to avoid collision with HF 'datasets' library;
internal refs use 'dataset.*', HF lib imports keep 'from datasets import ...'
- Update root trainer/{lm,vlm,vam}.py to import from trainers.*
- Rewrite README to reflect flat layout, renamed classes, trainer/ entry points, configs/
This view is limited to 50 files because it contains too many changes. See raw diff
- README.md +65 -70
- scripts/convert_model.py +2 -2
- scripts/eval_llm.py +3 -3
- scripts/eval_toolcall.py +2 -2
- scripts/eval_vam.py +3 -3
- scripts/eval_vlm.py +2 -2
- scripts/omni_web_demo.py +3 -3
- scripts/serve_openai_api.py +2 -2
- src/{omni/core → core}/__init__.py +5 -5
- src/{omni/core → core}/attention.py +2 -2
- src/{omni/core → core}/block.py +3 -3
- src/{omni/core → core}/mlp.py +0 -0
- src/{omni/core → core}/norm.py +0 -0
- src/{omni/core → core}/rope.py +0 -0
- src/{omni/datasets → dataset}/__init__.py +7 -7
- src/{omni/datasets → dataset}/agent_rl.py +0 -0
- src/{omni/datasets → dataset}/common.py +1 -1
- src/{omni/datasets → dataset}/dpo.py +1 -1
- src/{omni/datasets → dataset}/pretrain.py +1 -1
- src/{omni/datasets → dataset}/rlaif.py +1 -1
- src/{omni/datasets → dataset}/sft.py +1 -1
- src/{omni/datasets → dataset}/vam.py +1 -1
- src/{omni/datasets → dataset}/vlm.py +1 -1
- src/{omni/encoders → encoders}/__init__.py +1 -1
- src/{omni/encoders → encoders}/audio/__init__.py +1 -1
- src/{omni/encoders → encoders}/audio/sensevoice.py +0 -0
- src/{omni/encoders → encoders}/vision/__init__.py +1 -1
- src/{omni/encoders → encoders}/vision/siglip.py +0 -0
- src/{omni/models → models}/__init__.py +8 -8
- src/{omni/models → models}/lm/__init__.py +2 -2
- src/{omni/models → models}/lm/config.py +0 -0
- src/{omni/models → models}/lm/lora.py +0 -0
- src/{omni/models → models}/lm/model.py +2 -2
- src/{omni/models → models}/vam/__init__.py +2 -2
- src/{omni/models → models}/vam/config.py +1 -1
- src/{omni/models → models}/vam/model.py +7 -7
- src/models/vlm/__init__.py +4 -0
- src/{omni/models → models}/vlm/config.py +1 -1
- src/{omni/models → models}/vlm/model.py +5 -5
- src/omni/__init__.py +0 -0
- src/omni/models/vlm/__init__.py +0 -4
- src/omni/serve/__init__.py +0 -1
- src/omni/trainers/__init__.py +0 -15
- src/omni/trainers/lm/__init__.py +0 -10
- src/omni/trainers/vam/__init__.py +0 -1
- src/omni/trainers/vlm/__init__.py +0 -2
- src/{omni/projectors → projectors}/__init__.py +2 -2
- src/{omni/projectors → projectors}/audio.py +0 -0
- src/{omni/projectors → projectors}/vision.py +0 -0
- src/serve/__init__.py +1 -0
README.md
CHANGED
|
@@ -5,78 +5,82 @@ Omni 是一个以 **多模态 (omni)** 为目标的 LLM 训练 / 推理框架,
|
|
| 5 |
[miniMind-V](https://github.com/jingyaogong/minimind-v)(视觉多模态)与
|
| 6 |
[miniMind-O](https://github.com/jingyaogong/minimind-o)(语音 / 全模态)三套代码。
|
| 7 |
|
| 8 |
-
项目采用标准 `src/` 布局(`pip install -e .` 即可安装
|
| 9 |
-
|
| 10 |
|
| 11 |
## 设计分层
|
| 12 |
|
| 13 |
- `core/`:可复用模型**纯底层组件**,按层级细分为独立模块——
|
| 14 |
`norm.py`(`RMSNorm`)、`rope.py`(`precompute_freqs_cis` / `apply_rotary_pos_emb` / `repeat_kv`)、
|
| 15 |
`attention.py`(`Attention`)、`mlp.py`(`FeedForward` / `MOEFeedForward`)、
|
| 16 |
-
`block.py`(`
|
| 17 |
- `models/`:把 `core` 组件**拼装**成成品模型,按模态能力分为三个子包(每个含 `config.py` 配置 + `model.py` 建模):
|
| 18 |
-
- `models/lm/`:纯文本——`
|
| 19 |
-
- `models/vlm/`:文本 + 视觉——`VLMConfig` + `
|
| 20 |
-
- `models/vam/`:文本 + 语音/全模态——`
|
| 21 |
- `encoders/`:外部模态编码器,按模态分目录——`vision/`(SigLIP)、`audio/`(SenseVoice)。
|
| 22 |
- `projectors/`:把 encoder 输出**桥接**到 LLM 隐藏维度的拼接层(`MMVisionProjector`、`MMAudioProjector`)。
|
| 23 |
- `serve/`:实时语音会话工程层(`SileroVAD`、`RealtimeSession`)。
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
## 目录结构
|
| 26 |
|
| 27 |
```
|
| 28 |
-
src/
|
| 29 |
├── core/ # 模型底层组件(按层级拆分)
|
| 30 |
│ ├── norm.py # RMSNorm
|
| 31 |
│ ├── rope.py # precompute_freqs_cis / apply_rotary_pos_emb / repeat_kv
|
| 32 |
│ ├── attention.py # Attention
|
| 33 |
│ ├── mlp.py # FeedForward / MOEFeedForward
|
| 34 |
-
│ └── block.py #
|
| 35 |
├── models/ # 模型拼装(按模态能力分子包)
|
| 36 |
│ ├── lm/ # 纯文本
|
| 37 |
-
│ │ ├── config.py #
|
| 38 |
-
│ │ ├── model.py #
|
| 39 |
-
│ │ └── lora.py # LoRA 注入 / 保存 / 合并(作用于
|
| 40 |
│ ├── vlm/ # 文本 + 视觉
|
| 41 |
│ │ ├── config.py # VLMConfig
|
| 42 |
-
│ │ └── model.py #
|
| 43 |
│ └── vam/ # 文本 + 语音/全模态
|
| 44 |
-
│ ├── config.py #
|
| 45 |
-
│ └── model.py #
|
| 46 |
├── encoders/ # 多模态编码器(按模态分目录)
|
| 47 |
│ ├── vision/ # SiglipVisionEncoder
|
| 48 |
│ └── audio/ # SenseVoiceAudioEncoder
|
| 49 |
├── projectors/ # 多模态桥接层
|
| 50 |
│ ├── vision.py # MMVisionProjector
|
| 51 |
│ └── audio.py # MMAudioProjector
|
| 52 |
-
├── trainers/ # 训练脚本(
|
| 53 |
-
│ ├──
|
| 54 |
-
│
|
| 55 |
-
│ ├──
|
| 56 |
-
│
|
| 57 |
-
|
| 58 |
-
│ ├──
|
| 59 |
-
│
|
| 60 |
-
|
| 61 |
-
├──
|
| 62 |
-
│
|
| 63 |
-
├──
|
| 64 |
-
│
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
├──
|
| 72 |
-
|
| 73 |
-
|
|
|
|
|
|
|
|
|
|
| 74 |
├── serve_openai_api.py # OpenAI 兼容 API 服务
|
| 75 |
-
├── omni_web_demo.py
|
| 76 |
-
├── eval_toolcall.py
|
| 77 |
-
└── convert_model.py
|
| 78 |
-
weights/MiniMind2/ # tokenizer 与模型配置(从 MiniMind 迁移)
|
| 79 |
-
configs/ # 训练配置(按需补充)
|
| 80 |
```
|
| 81 |
|
| 82 |
## 安装
|
|
@@ -89,43 +93,34 @@ pip install -e ".[rl,serve,demo]"
|
|
| 89 |
|
| 90 |
## 快速开始
|
| 91 |
|
| 92 |
-
###
|
|
|
|
|
|
|
|
|
|
| 93 |
|
| 94 |
```bash
|
| 95 |
-
|
|
|
|
|
|
|
|
|
|
| 96 |
```
|
| 97 |
|
| 98 |
-
###
|
| 99 |
-
|
| 100 |
-
每个训练脚本都是 `omni.trainers` 下的一个模块,直接运行即可:
|
| 101 |
|
| 102 |
```bash
|
| 103 |
-
|
| 104 |
-
python -m omni.trainers.pretrain --data_path dataset/pretrain.jsonl
|
| 105 |
-
# 全量 SFT
|
| 106 |
-
python -m omni.trainers.full_sft --data_path dataset/sft.jsonl
|
| 107 |
-
# LoRA 微调
|
| 108 |
-
python -m omni.trainers.lora --data_path dataset/lora.jsonl
|
| 109 |
-
# DPO / 蒸馏 / PPO / GRPO / Agent RL
|
| 110 |
-
python -m omni.trainers.dpo --data_path dataset/dpo.jsonl
|
| 111 |
-
python -m omni.trainers.distillation --data_path dataset/sft.jsonl
|
| 112 |
-
python -m omni.trainers.grpo --data_path dataset/rlaif.jsonl
|
| 113 |
-
python -m omni.trainers.agent --data_path dataset/agent_rl.jsonl
|
| 114 |
```
|
| 115 |
|
| 116 |
-
|
| 117 |
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
- 去除所有 `sys.path` 注入 hack,统一使用 `omni.*` 包导入;
|
| 121 |
-
- `trainer_utils.py` 拆分为 `utils/training.py`(训练工具)、`utils/distributed.py`、`utils/checkpoint.py`;
|
| 122 |
-
- 训练脚本从「`if __name__ == '__main__'` 内联」改为可被 `python -m omni.trainers.<name>` 调用的模块;
|
| 123 |
-
- 预留 `encoders/`(vision/audio)、`projectors/`、`core/` 供多模态扩展。
|
| 124 |
|
| 125 |
-
##
|
| 126 |
-
|
| 127 |
-
在 `models/minimind.py` 的 `MiniMindModel` 之上接入:
|
| 128 |
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
[miniMind-V](https://github.com/jingyaogong/minimind-v)(视觉多模态)与
|
| 6 |
[miniMind-O](https://github.com/jingyaogong/minimind-o)(语音 / 全模态)三套代码。
|
| 7 |
|
| 8 |
+
项目采用标准 `src/` 布局(`pip install -e .` 即可安装),按
|
| 9 |
+
**core(组件)/ models(拼装)/ encoders(模态编码器)/ projectors(桥接层)** 分层。
|
| 10 |
|
| 11 |
## 设计分层
|
| 12 |
|
| 13 |
- `core/`:可复用模型**纯底层组件**,按层级细分为独立模块——
|
| 14 |
`norm.py`(`RMSNorm`)、`rope.py`(`precompute_freqs_cis` / `apply_rotary_pos_emb` / `repeat_kv`)、
|
| 15 |
`attention.py`(`Attention`)、`mlp.py`(`FeedForward` / `MOEFeedForward`)、
|
| 16 |
+
`block.py`(`Block`)。
|
| 17 |
- `models/`:把 `core` 组件**拼装**成成品模型,按模态能力分为三个子包(每个含 `config.py` 配置 + `model.py` 建模):
|
| 18 |
+
- `models/lm/`:纯文本——`LMConfig` + `LMForCausalLM`(主干 `LM`)
|
| 19 |
+
- `models/vlm/`:文本 + 视觉——`VLMConfig` + `VLM`
|
| 20 |
+
- `models/vam/`:文本 + 语音/全模态——`VAMConfig` + `VAM`(含 `TalkerModule`)
|
| 21 |
- `encoders/`:外部模态编码器,按模态分目录——`vision/`(SigLIP)、`audio/`(SenseVoice)。
|
| 22 |
- `projectors/`:把 encoder 输出**桥接**到 LLM 隐藏维度的拼接层(`MMVisionProjector`、`MMAudioProjector`)。
|
| 23 |
- `serve/`:实时语音会话工程层(`SileroVAD`、`RealtimeSession`)。
|
| 24 |
+
- `trainers/`:训练脚本,按模态分 `lm/` `vlm/` `vam/` 子包。
|
| 25 |
+
- `dataset/`:数据集(Pretrain / SFT / DPO / RLAIF / Agent / VLM / VAM),每类一个文件。
|
| 26 |
+
- `utils/`:训练与多模态工具。
|
| 27 |
|
| 28 |
## 目录结构
|
| 29 |
|
| 30 |
```
|
| 31 |
+
src/
|
| 32 |
├── core/ # 模型底层组件(按层级拆分)
|
| 33 |
│ ├── norm.py # RMSNorm
|
| 34 |
│ ├── rope.py # precompute_freqs_cis / apply_rotary_pos_emb / repeat_kv
|
| 35 |
│ ├── attention.py # Attention
|
| 36 |
│ ├── mlp.py # FeedForward / MOEFeedForward
|
| 37 |
+
│ └── block.py # Block
|
| 38 |
├── models/ # 模型拼装(按模态能力分子包)
|
| 39 |
│ ├── lm/ # 纯文本
|
| 40 |
+
│ │ ├── config.py # LMConfig
|
| 41 |
+
│ │ ├── model.py # LMForCausalLM + LM 主干
|
| 42 |
+
│ │ └── lora.py # LoRA 注入 / 保存 / 合并(作用于 LM 主干)
|
| 43 |
│ ├── vlm/ # 文本 + 视觉
|
| 44 |
│ │ ├── config.py # VLMConfig
|
| 45 |
+
│ │ └── model.py # VLM
|
| 46 |
│ └── vam/ # 文本 + 语音/全模态
|
| 47 |
+
│ ├── config.py # VAMConfig
|
| 48 |
+
│ └── model.py # VAM + TalkerModule
|
| 49 |
├── encoders/ # 多模态编码器(按模态分目录)
|
| 50 |
│ ├── vision/ # SiglipVisionEncoder
|
| 51 |
│ └── audio/ # SenseVoiceAudioEncoder
|
| 52 |
├── projectors/ # 多模态桥接层
|
| 53 |
│ ├── vision.py # MMVisionProjector
|
| 54 |
│ └── audio.py # MMAudioProjector
|
| 55 |
+
├── trainers/ # 训练脚本(按模态分 lm / vlm / vam)
|
| 56 |
+
│ ├── lm/ # pretrain / full_sft / lora / dpo / distillation / ppo / grpo / agent
|
| 57 |
+
│ │ # + rollout_engine / train_tokenizer
|
| 58 |
+
│ ├── vlm/ # pretrain / full_sft
|
| 59 |
+
│ └── vam/ # full_sft
|
| 60 |
+
├── dataset/ # 数据集(每类一个文件)
|
| 61 |
+
│ ├── pretrain.py / sft.py / dpo.py / rlaif.py / agent_rl.py / vlm.py / vam.py
|
| 62 |
+
│ └── common.py # 共享辅助函数
|
| 63 |
+
├── utils/ # 工具
|
| 64 |
+
│ ├── training.py # get_lr / init_model / lm_checkpoint / SkipBatchSampler / apply_config
|
| 65 |
+
│ ├── multimodal.py # init_vlm_model / vlm_checkpoint / init_omni_model / omni_checkpoint
|
| 66 |
+
│ ├── distributed.py # 分布式初始化
|
| 67 |
+
│ └── checkpoint.py # checkpoint 读写辅助
|
| 68 |
+
├── serve/ # 实时语音会话(SileroVAD / RealtimeSession)
|
| 69 |
+
configs/
|
| 70 |
+
├── model/ # lm / lm_moe / vlm / vlm_moe / vam / vam_moe 训练配置
|
| 71 |
+
└── tokenizer/ # tokenizer.json / tokenizer_config.json
|
| 72 |
+
trainer/ # 根目录可直接运行的训练入口(默认加载对应 configs/model/*.yaml)
|
| 73 |
+
├── lm.py # python trainer/lm.py -> configs/model/lm.yaml
|
| 74 |
+
├── vlm.py # python trainer/vlm.py -> configs/model/vlm.yaml
|
| 75 |
+
└── vam.py # python trainer/vam.py -> configs/model/vam.yaml
|
| 76 |
+
scripts/ # 推理 / 服务 / 转换脚本
|
| 77 |
+
├── eval_llm.py # 命令行推理与对话
|
| 78 |
+
├── eval_vlm.py # 视觉多模态推理
|
| 79 |
+
├── eval_vam.py # 全模态推理
|
| 80 |
├── serve_openai_api.py # OpenAI 兼容 API 服务
|
| 81 |
+
├── omni_web_demo.py # 网页演示(含实时语音)
|
| 82 |
+
├── eval_toolcall.py # 工具调用评测
|
| 83 |
+
└── convert_model.py # torch <-> transformers 权重互转
|
|
|
|
|
|
|
| 84 |
```
|
| 85 |
|
| 86 |
## 安装
|
|
|
|
| 93 |
|
| 94 |
## 快速开始
|
| 95 |
|
| 96 |
+
### 训练(YAML 驱动)
|
| 97 |
+
|
| 98 |
+
根目录 `trainer/` 提供可直接运行的入口,默认加载 `configs/model/` 下对应的 YAML,
|
| 99 |
+
也可通过 `--config` 指定其它配置,任意 CLI 参数都能覆盖 YAML 中的默认值:
|
| 100 |
|
| 101 |
```bash
|
| 102 |
+
cd trainer
|
| 103 |
+
python lm.py # 使用 configs/model/lm.yaml
|
| 104 |
+
python vlm.py --config ../configs/model/vlm_moe.yaml
|
| 105 |
+
python vam.py --epochs 5 # 在 vam.yaml 基础上覆盖单字段
|
| 106 |
```
|
| 107 |
|
| 108 |
+
### 推理 / 对话
|
|
|
|
|
|
|
| 109 |
|
| 110 |
```bash
|
| 111 |
+
python scripts/eval_llm.py --load_from ../model --weight full_sft
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
```
|
| 113 |
|
| 114 |
+
## 配置说明
|
| 115 |
|
| 116 |
+
`configs/model/*.yaml` 分为 `model` / `train` / `paths` 三段,由 `utils.training.apply_config`
|
| 117 |
+
注入为 argparse 默认值;CLI 显式传参优先级更高。训练产出保存在 `checkpoint/` 目录。
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
|
| 119 |
+
## 与原 MiniMind 的差异
|
|
|
|
|
|
|
| 120 |
|
| 121 |
+
- 去除 `omni` 中间包,模块直接置于 `src/` 下(`core` / `models` / `trainers` / `dataset` / `utils` …),统一绝对导入;
|
| 122 |
+
- 类名统一:`MiniMindModel→LM`、`MiniMindVLM→VLM`、`MiniMindOmni→VAM`、`MiniMindConfig→LMConfig`、
|
| 123 |
+
`MiniMindForCausalLM→LMForCausalLM`、`OmniConfig→VAMConfig`;
|
| 124 |
+
- `trainer_utils.py` 拆分为 `utils/training.py`、`utils/distributed.py`、`utils/checkpoint.py`;
|
| 125 |
+
- 训练脚本暴露 `main(default_config=None)`,既可由 `python -m trainers.<mod>` 调用,也可由根 `trainer/*.py` 调用;
|
| 126 |
+
- `dataset/` 按数据集类型拆分为独立文件,供多模态扩展。
|
scripts/convert_model.py
CHANGED
|
@@ -5,8 +5,8 @@ import torch
|
|
| 5 |
import transformers
|
| 6 |
import warnings
|
| 7 |
from transformers import AutoTokenizer, AutoModelForCausalLM, Qwen3Config, Qwen3ForCausalLM, Qwen3MoeConfig, Qwen3MoeForCausalLM
|
| 8 |
-
from
|
| 9 |
-
from
|
| 10 |
|
| 11 |
warnings.filterwarnings('ignore', category=UserWarning)
|
| 12 |
|
|
|
|
| 5 |
import transformers
|
| 6 |
import warnings
|
| 7 |
from transformers import AutoTokenizer, AutoModelForCausalLM, Qwen3Config, Qwen3ForCausalLM, Qwen3MoeConfig, Qwen3MoeForCausalLM
|
| 8 |
+
from models import LMConfig, LMForCausalLM
|
| 9 |
+
from models.lm.lora import apply_lora, merge_lora
|
| 10 |
|
| 11 |
warnings.filterwarnings('ignore', category=UserWarning)
|
| 12 |
|
scripts/eval_llm.py
CHANGED
|
@@ -4,9 +4,9 @@ import random
|
|
| 4 |
import warnings
|
| 5 |
import torch
|
| 6 |
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
|
| 7 |
-
from
|
| 8 |
-
from
|
| 9 |
-
from
|
| 10 |
warnings.filterwarnings('ignore')
|
| 11 |
|
| 12 |
def init_model(args):
|
|
|
|
| 4 |
import warnings
|
| 5 |
import torch
|
| 6 |
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
|
| 7 |
+
from models import LMConfig, LMForCausalLM
|
| 8 |
+
from models.lm.lora import * # noqa: F401,F403
|
| 9 |
+
from utils.training import setup_seed, get_model_params
|
| 10 |
warnings.filterwarnings('ignore')
|
| 11 |
|
| 12 |
def init_model(args):
|
scripts/eval_toolcall.py
CHANGED
|
@@ -9,8 +9,8 @@ import torch
|
|
| 9 |
from datetime import datetime
|
| 10 |
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
|
| 11 |
from openai import OpenAI
|
| 12 |
-
from
|
| 13 |
-
from
|
| 14 |
warnings.filterwarnings('ignore')
|
| 15 |
|
| 16 |
TOOLS = [
|
|
|
|
| 9 |
from datetime import datetime
|
| 10 |
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
|
| 11 |
from openai import OpenAI
|
| 12 |
+
from models import LMConfig, LMForCausalLM
|
| 13 |
+
from utils.training import setup_seed, get_model_params
|
| 14 |
warnings.filterwarnings('ignore')
|
| 15 |
|
| 16 |
TOOLS = [
|
scripts/eval_vam.py
CHANGED
|
@@ -6,9 +6,9 @@ import warnings
|
|
| 6 |
import torch
|
| 7 |
from PIL import Image
|
| 8 |
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 9 |
-
from
|
| 10 |
-
from
|
| 11 |
-
from
|
| 12 |
warnings.filterwarnings('ignore')
|
| 13 |
|
| 14 |
|
|
|
|
| 6 |
import torch
|
| 7 |
from PIL import Image
|
| 8 |
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 9 |
+
from models import VAM, VAMConfig
|
| 10 |
+
from dataset import VAMDataset
|
| 11 |
+
from utils import setup_seed, log_model_params
|
| 12 |
warnings.filterwarnings('ignore')
|
| 13 |
|
| 14 |
|
scripts/eval_vlm.py
CHANGED
|
@@ -6,8 +6,8 @@ import torch
|
|
| 6 |
import random
|
| 7 |
from PIL import Image
|
| 8 |
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
|
| 9 |
-
from
|
| 10 |
-
from
|
| 11 |
warnings.filterwarnings('ignore')
|
| 12 |
|
| 13 |
def init_model(args):
|
|
|
|
| 6 |
import random
|
| 7 |
from PIL import Image
|
| 8 |
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
|
| 9 |
+
from models import VLM, VLMConfig
|
| 10 |
+
from utils import setup_seed, get_vlm_model_params
|
| 11 |
warnings.filterwarnings('ignore')
|
| 12 |
|
| 13 |
def init_model(args):
|
scripts/omni_web_demo.py
CHANGED
|
@@ -2,9 +2,9 @@ import argparse, os, sys, json, time, math, torch, threading, queue, base64, io,
|
|
| 2 |
import numpy as np
|
| 3 |
from PIL import Image
|
| 4 |
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 5 |
-
from
|
| 6 |
-
from
|
| 7 |
-
from
|
| 8 |
logging.getLogger().setLevel(logging.ERROR)
|
| 9 |
|
| 10 |
M = {} # model / tokenizer / device / mimi / asr / cfg
|
|
|
|
| 2 |
import numpy as np
|
| 3 |
from PIL import Image
|
| 4 |
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 5 |
+
from models import VAM
|
| 6 |
+
from serve.realtime import RealtimeSession
|
| 7 |
+
from utils import log_model_params
|
| 8 |
logging.getLogger().setLevel(logging.ERROR)
|
| 9 |
|
| 10 |
M = {} # model / tokenizer / device / mimi / asr / cfg
|
scripts/serve_openai_api.py
CHANGED
|
@@ -14,8 +14,8 @@ from fastapi import FastAPI, HTTPException
|
|
| 14 |
from fastapi.responses import StreamingResponse
|
| 15 |
from pydantic import BaseModel, Field
|
| 16 |
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
|
| 17 |
-
from
|
| 18 |
-
from
|
| 19 |
|
| 20 |
warnings.filterwarnings('ignore')
|
| 21 |
|
|
|
|
| 14 |
from fastapi.responses import StreamingResponse
|
| 15 |
from pydantic import BaseModel, Field
|
| 16 |
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer
|
| 17 |
+
from models import LMConfig, LMForCausalLM
|
| 18 |
+
from models.lm.lora import apply_lora, load_lora
|
| 19 |
|
| 20 |
warnings.filterwarnings('ignore')
|
| 21 |
|
src/{omni/core → core}/__init__.py
RENAMED
|
@@ -1,8 +1,8 @@
|
|
| 1 |
-
from
|
| 2 |
-
from
|
| 3 |
-
from
|
| 4 |
-
from
|
| 5 |
-
from
|
| 6 |
|
| 7 |
__all__ = [
|
| 8 |
"RMSNorm",
|
|
|
|
| 1 |
+
from core.norm import RMSNorm
|
| 2 |
+
from core.rope import precompute_freqs_cis, apply_rotary_pos_emb, repeat_kv
|
| 3 |
+
from core.attention import Attention
|
| 4 |
+
from core.mlp import FeedForward, MOEFeedForward
|
| 5 |
+
from core.block import Block
|
| 6 |
|
| 7 |
__all__ = [
|
| 8 |
"RMSNorm",
|
src/{omni/core → core}/attention.py
RENAMED
|
@@ -3,8 +3,8 @@ import torch
|
|
| 3 |
import torch.nn.functional as F
|
| 4 |
from torch import nn
|
| 5 |
|
| 6 |
-
from
|
| 7 |
-
from
|
| 8 |
|
| 9 |
|
| 10 |
class Attention(nn.Module):
|
|
|
|
| 3 |
import torch.nn.functional as F
|
| 4 |
from torch import nn
|
| 5 |
|
| 6 |
+
from core.norm import RMSNorm
|
| 7 |
+
from core.rope import apply_rotary_pos_emb, repeat_kv
|
| 8 |
|
| 9 |
|
| 10 |
class Attention(nn.Module):
|
src/{omni/core → core}/block.py
RENAMED
|
@@ -1,8 +1,8 @@
|
|
| 1 |
from torch import nn
|
| 2 |
|
| 3 |
-
from
|
| 4 |
-
from
|
| 5 |
-
from
|
| 6 |
|
| 7 |
|
| 8 |
class Block(nn.Module):
|
|
|
|
| 1 |
from torch import nn
|
| 2 |
|
| 3 |
+
from core.norm import RMSNorm
|
| 4 |
+
from core.attention import Attention
|
| 5 |
+
from core.mlp import FeedForward, MOEFeedForward
|
| 6 |
|
| 7 |
|
| 8 |
class Block(nn.Module):
|
src/{omni/core → core}/mlp.py
RENAMED
|
File without changes
|
src/{omni/core → core}/norm.py
RENAMED
|
File without changes
|
src/{omni/core → core}/rope.py
RENAMED
|
File without changes
|
src/{omni/datasets → dataset}/__init__.py
RENAMED
|
@@ -1,10 +1,10 @@
|
|
| 1 |
-
from
|
| 2 |
-
from
|
| 3 |
-
from
|
| 4 |
-
from
|
| 5 |
-
from
|
| 6 |
-
from
|
| 7 |
-
from
|
| 8 |
|
| 9 |
__all__ = [
|
| 10 |
"PretrainDataset",
|
|
|
|
| 1 |
+
from dataset.pretrain import PretrainDataset
|
| 2 |
+
from dataset.sft import SFTDataset
|
| 3 |
+
from dataset.dpo import DPODataset
|
| 4 |
+
from dataset.rlaif import RLAIFDataset
|
| 5 |
+
from dataset.agent_rl import AgentRLDataset
|
| 6 |
+
from dataset.vlm import VLMDataset
|
| 7 |
+
from dataset.vam import VAMDataset
|
| 8 |
|
| 9 |
__all__ = [
|
| 10 |
"PretrainDataset",
|
src/{omni/datasets → dataset}/agent_rl.py
RENAMED
|
File without changes
|
src/{omni/datasets → dataset}/common.py
RENAMED
|
@@ -12,7 +12,7 @@ import pyarrow.parquet as pq
|
|
| 12 |
|
| 13 |
os.environ["TOKENIZERS_PARALLELISM"] = "false"
|
| 14 |
|
| 15 |
-
from
|
| 16 |
|
| 17 |
|
| 18 |
def pre_processing_chat(conversations, add_system_ratio=0.2):
|
|
|
|
| 12 |
|
| 13 |
os.environ["TOKENIZERS_PARALLELISM"] = "false"
|
| 14 |
|
| 15 |
+
from models import VLM
|
| 16 |
|
| 17 |
|
| 18 |
def pre_processing_chat(conversations, add_system_ratio=0.2):
|
src/{omni/datasets → dataset}/dpo.py
RENAMED
|
@@ -2,7 +2,7 @@ import torch
|
|
| 2 |
from torch.utils.data import Dataset
|
| 3 |
from datasets import load_dataset
|
| 4 |
|
| 5 |
-
from
|
| 6 |
|
| 7 |
|
| 8 |
class DPODataset(Dataset):
|
|
|
|
| 2 |
from torch.utils.data import Dataset
|
| 3 |
from datasets import load_dataset
|
| 4 |
|
| 5 |
+
from dataset.common import post_processing_chat
|
| 6 |
|
| 7 |
|
| 8 |
class DPODataset(Dataset):
|
src/{omni/datasets → dataset}/pretrain.py
RENAMED
|
@@ -2,7 +2,7 @@ from torch.utils.data import Dataset
|
|
| 2 |
import torch
|
| 3 |
from datasets import load_dataset
|
| 4 |
|
| 5 |
-
from
|
| 6 |
|
| 7 |
|
| 8 |
class PretrainDataset(Dataset):
|
|
|
|
| 2 |
import torch
|
| 3 |
from datasets import load_dataset
|
| 4 |
|
| 5 |
+
from dataset.common import pre_processing_chat, post_processing_chat
|
| 6 |
|
| 7 |
|
| 8 |
class PretrainDataset(Dataset):
|
src/{omni/datasets → dataset}/rlaif.py
RENAMED
|
@@ -3,7 +3,7 @@ import torch
|
|
| 3 |
from torch.utils.data import Dataset
|
| 4 |
from datasets import load_dataset
|
| 5 |
|
| 6 |
-
from
|
| 7 |
|
| 8 |
|
| 9 |
class RLAIFDataset(Dataset):
|
|
|
|
| 3 |
from torch.utils.data import Dataset
|
| 4 |
from datasets import load_dataset
|
| 5 |
|
| 6 |
+
from dataset.common import pre_processing_chat
|
| 7 |
|
| 8 |
|
| 9 |
class RLAIFDataset(Dataset):
|
src/{omni/datasets → dataset}/sft.py
RENAMED
|
@@ -3,7 +3,7 @@ import torch
|
|
| 3 |
from torch.utils.data import Dataset
|
| 4 |
from datasets import load_dataset, Features, Value
|
| 5 |
|
| 6 |
-
from
|
| 7 |
|
| 8 |
|
| 9 |
class SFTDataset(Dataset):
|
|
|
|
| 3 |
from torch.utils.data import Dataset
|
| 4 |
from datasets import load_dataset, Features, Value
|
| 5 |
|
| 6 |
+
from dataset.common import pre_processing_chat, post_processing_chat
|
| 7 |
|
| 8 |
|
| 9 |
class SFTDataset(Dataset):
|
src/{omni/datasets → dataset}/vam.py
RENAMED
|
@@ -7,7 +7,7 @@ from PIL import Image
|
|
| 7 |
import pyarrow as pa
|
| 8 |
import pyarrow.parquet as pq
|
| 9 |
|
| 10 |
-
from
|
| 11 |
|
| 12 |
|
| 13 |
class VAMDataset(Dataset):
|
|
|
|
| 7 |
import pyarrow as pa
|
| 8 |
import pyarrow.parquet as pq
|
| 9 |
|
| 10 |
+
from dataset.common import pre_processing_chat, post_processing_chat
|
| 11 |
|
| 12 |
|
| 13 |
class VAMDataset(Dataset):
|
src/{omni/datasets → dataset}/vlm.py
RENAMED
|
@@ -5,7 +5,7 @@ from torch.utils.data import Dataset
|
|
| 5 |
from PIL import Image
|
| 6 |
from datasets import Dataset as HFDataset
|
| 7 |
|
| 8 |
-
from
|
| 9 |
|
| 10 |
|
| 11 |
class VLMDataset(Dataset):
|
|
|
|
| 5 |
from PIL import Image
|
| 6 |
from datasets import Dataset as HFDataset
|
| 7 |
|
| 8 |
+
from dataset.common import VLM, pre_processing_chat, post_processing_chat
|
| 9 |
|
| 10 |
|
| 11 |
class VLMDataset(Dataset):
|
src/{omni/encoders → encoders}/__init__.py
RENAMED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
-
from
|
| 2 |
|
| 3 |
__all__ = ["SiglipVisionEncoder"]
|
|
|
|
| 1 |
+
from encoders.vision import SiglipVisionEncoder
|
| 2 |
|
| 3 |
__all__ = ["SiglipVisionEncoder"]
|
src/{omni/encoders → encoders}/audio/__init__.py
RENAMED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
-
from
|
| 2 |
|
| 3 |
__all__ = ["SenseVoiceAudioEncoder", "SenseVoiceAudioProcessor"]
|
|
|
|
| 1 |
+
from encoders.audio.sensevoice import SenseVoiceAudioEncoder, SenseVoiceAudioProcessor
|
| 2 |
|
| 3 |
__all__ = ["SenseVoiceAudioEncoder", "SenseVoiceAudioProcessor"]
|
src/{omni/encoders → encoders}/audio/sensevoice.py
RENAMED
|
File without changes
|
src/{omni/encoders → encoders}/vision/__init__.py
RENAMED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
-
from
|
| 2 |
|
| 3 |
__all__ = ["SiglipVisionEncoder"]
|
|
|
|
| 1 |
+
from encoders.vision.siglip import SiglipVisionEncoder
|
| 2 |
|
| 3 |
__all__ = ["SiglipVisionEncoder"]
|
src/{omni/encoders → encoders}/vision/siglip.py
RENAMED
|
File without changes
|
src/{omni/models → models}/__init__.py
RENAMED
|
@@ -1,17 +1,17 @@
|
|
| 1 |
-
from
|
| 2 |
-
from
|
| 3 |
-
from
|
| 4 |
-
from
|
| 5 |
-
from
|
| 6 |
-
from
|
| 7 |
-
from
|
| 8 |
LoRA,
|
| 9 |
apply_lora,
|
| 10 |
load_lora,
|
| 11 |
save_lora,
|
| 12 |
merge_lora,
|
| 13 |
)
|
| 14 |
-
from
|
| 15 |
RMSNorm,
|
| 16 |
Attention,
|
| 17 |
FeedForward,
|
|
|
|
| 1 |
+
from models.lm.config import LMConfig
|
| 2 |
+
from models.lm.model import LMForCausalLM, LM
|
| 3 |
+
from models.vlm.config import VLMConfig
|
| 4 |
+
from models.vlm.model import VLM
|
| 5 |
+
from models.vam.config import VAMConfig
|
| 6 |
+
from models.vam.model import VAM, TalkerModule
|
| 7 |
+
from models.lm.lora import (
|
| 8 |
LoRA,
|
| 9 |
apply_lora,
|
| 10 |
load_lora,
|
| 11 |
save_lora,
|
| 12 |
merge_lora,
|
| 13 |
)
|
| 14 |
+
from core import (
|
| 15 |
RMSNorm,
|
| 16 |
Attention,
|
| 17 |
FeedForward,
|
src/{omni/models → models}/lm/__init__.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from
|
| 2 |
-
from
|
| 3 |
|
| 4 |
__all__ = ["LMConfig", "LMForCausalLM", "LM"]
|
|
|
|
| 1 |
+
from models.lm.config import LMConfig
|
| 2 |
+
from models.lm.model import LMForCausalLM, LM
|
| 3 |
|
| 4 |
__all__ = ["LMConfig", "LMForCausalLM", "LM"]
|
src/{omni/models → models}/lm/config.py
RENAMED
|
File without changes
|
src/{omni/models → models}/lm/lora.py
RENAMED
|
File without changes
|
src/{omni/models → models}/lm/model.py
RENAMED
|
@@ -4,8 +4,8 @@ from torch import nn
|
|
| 4 |
from transformers import PreTrainedModel, GenerationMixin
|
| 5 |
from transformers.modeling_outputs import MoeCausalLMOutputWithPast
|
| 6 |
|
| 7 |
-
from
|
| 8 |
-
from
|
| 9 |
|
| 10 |
|
| 11 |
class LM(nn.Module):
|
|
|
|
| 4 |
from transformers import PreTrainedModel, GenerationMixin
|
| 5 |
from transformers.modeling_outputs import MoeCausalLMOutputWithPast
|
| 6 |
|
| 7 |
+
from core import RMSNorm, precompute_freqs_cis, Block, MOEFeedForward
|
| 8 |
+
from models.lm.config import LMConfig
|
| 9 |
|
| 10 |
|
| 11 |
class LM(nn.Module):
|
src/{omni/models → models}/vam/__init__.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from
|
| 2 |
-
from
|
| 3 |
|
| 4 |
__all__ = ["VAMConfig", "VAM", "TalkerModule"]
|
|
|
|
| 1 |
+
from models.vam.config import VAMConfig
|
| 2 |
+
from models.vam.model import VAM, TalkerModule
|
| 3 |
|
| 4 |
__all__ = ["VAMConfig", "VAM", "TalkerModule"]
|
src/{omni/models → models}/vam/config.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from
|
| 2 |
|
| 3 |
|
| 4 |
class VAMConfig(LMConfig):
|
|
|
|
| 1 |
+
from models.lm.config import LMConfig
|
| 2 |
|
| 3 |
|
| 4 |
class VAMConfig(LMConfig):
|
src/{omni/models → models}/vam/model.py
RENAMED
|
@@ -10,13 +10,13 @@ from torch.nn import functional as F
|
|
| 10 |
from transformers.modeling_outputs import MoeCausalLMOutputWithPast
|
| 11 |
from transformers import SiglipVisionModel, SiglipImageProcessor, logging as hf_logging
|
| 12 |
|
| 13 |
-
from
|
| 14 |
-
from
|
| 15 |
-
from
|
| 16 |
-
from
|
| 17 |
-
from
|
| 18 |
-
from
|
| 19 |
-
from
|
| 20 |
|
| 21 |
|
| 22 |
class TalkerHead(nn.Module):
|
|
|
|
| 10 |
from transformers.modeling_outputs import MoeCausalLMOutputWithPast
|
| 11 |
from transformers import SiglipVisionModel, SiglipImageProcessor, logging as hf_logging
|
| 12 |
|
| 13 |
+
from core import RMSNorm, precompute_freqs_cis, Block, MOEFeedForward
|
| 14 |
+
from models.lm.config import LMConfig
|
| 15 |
+
from models.lm.model import LMForCausalLM
|
| 16 |
+
from models.vam.config import VAMConfig
|
| 17 |
+
from encoders.audio import SenseVoiceAudioEncoder, SenseVoiceAudioProcessor
|
| 18 |
+
from encoders.vision import SiglipVisionEncoder
|
| 19 |
+
from projectors import MMVisionProjector, MMAudioProjector
|
| 20 |
|
| 21 |
|
| 22 |
class TalkerHead(nn.Module):
|
src/models/vlm/__init__.py
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from models.vlm.config import VLMConfig
|
| 2 |
+
from models.vlm.model import VLM
|
| 3 |
+
|
| 4 |
+
__all__ = ["VLMConfig", "VLM"]
|
src/{omni/models → models}/vlm/config.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from
|
| 2 |
|
| 3 |
|
| 4 |
class VLMConfig(LMConfig):
|
|
|
|
| 1 |
+
from models.lm.config import LMConfig
|
| 2 |
|
| 3 |
|
| 4 |
class VLMConfig(LMConfig):
|
src/{omni/models → models}/vlm/model.py
RENAMED
|
@@ -7,11 +7,11 @@ from torch import nn
|
|
| 7 |
from transformers.modeling_outputs import MoeCausalLMOutputWithPast
|
| 8 |
from transformers import SiglipVisionModel, SiglipImageProcessor, logging as hf_logging
|
| 9 |
|
| 10 |
-
from
|
| 11 |
-
from
|
| 12 |
-
from
|
| 13 |
-
from
|
| 14 |
-
from
|
| 15 |
|
| 16 |
warnings.filterwarnings('ignore')
|
| 17 |
|
|
|
|
| 7 |
from transformers.modeling_outputs import MoeCausalLMOutputWithPast
|
| 8 |
from transformers import SiglipVisionModel, SiglipImageProcessor, logging as hf_logging
|
| 9 |
|
| 10 |
+
from core import precompute_freqs_cis, MOEFeedForward
|
| 11 |
+
from models.lm.model import LMForCausalLM
|
| 12 |
+
from models.vlm.config import VLMConfig
|
| 13 |
+
from encoders.vision import SiglipVisionEncoder
|
| 14 |
+
from projectors import MMVisionProjector
|
| 15 |
|
| 16 |
warnings.filterwarnings('ignore')
|
| 17 |
|
src/omni/__init__.py
DELETED
|
File without changes
|
src/omni/models/vlm/__init__.py
DELETED
|
@@ -1,4 +0,0 @@
|
|
| 1 |
-
from omni.models.vlm.config import VLMConfig
|
| 2 |
-
from omni.models.vlm.model import VLM
|
| 3 |
-
|
| 4 |
-
__all__ = ["VLMConfig", "VLM"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/omni/serve/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import omni.serve
|
|
|
|
|
|
src/omni/trainers/__init__.py
DELETED
|
@@ -1,15 +0,0 @@
|
|
| 1 |
-
from omni.trainers.lm.pretrain import *
|
| 2 |
-
from omni.trainers.lm.full_sft import *
|
| 3 |
-
from omni.trainers.lm.lora import *
|
| 4 |
-
from omni.trainers.lm.dpo import *
|
| 5 |
-
from omni.trainers.lm.distillation import *
|
| 6 |
-
from omni.trainers.lm.ppo import *
|
| 7 |
-
from omni.trainers.lm.grpo import *
|
| 8 |
-
from omni.trainers.lm.agent import *
|
| 9 |
-
from omni.trainers.lm.rollout_engine import *
|
| 10 |
-
from omni.trainers.lm.train_tokenizer import *
|
| 11 |
-
|
| 12 |
-
from omni.trainers.vlm.pretrain import *
|
| 13 |
-
from omni.trainers.vlm.full_sft import *
|
| 14 |
-
|
| 15 |
-
from omni.trainers.vam.full_sft import *
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/omni/trainers/lm/__init__.py
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
from omni.trainers.lm.pretrain import *
|
| 2 |
-
from omni.trainers.lm.full_sft import *
|
| 3 |
-
from omni.trainers.lm.lora import *
|
| 4 |
-
from omni.trainers.lm.dpo import *
|
| 5 |
-
from omni.trainers.lm.distillation import *
|
| 6 |
-
from omni.trainers.lm.ppo import *
|
| 7 |
-
from omni.trainers.lm.grpo import *
|
| 8 |
-
from omni.trainers.lm.agent import *
|
| 9 |
-
from omni.trainers.lm.rollout_engine import *
|
| 10 |
-
from omni.trainers.lm.train_tokenizer import *
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/omni/trainers/vam/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
from omni.trainers.vam.full_sft import *
|
|
|
|
|
|
src/omni/trainers/vlm/__init__.py
DELETED
|
@@ -1,2 +0,0 @@
|
|
| 1 |
-
from omni.trainers.vlm.pretrain import *
|
| 2 |
-
from omni.trainers.vlm.full_sft import *
|
|
|
|
|
|
|
|
|
src/{omni/projectors → projectors}/__init__.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from
|
| 2 |
-
from
|
| 3 |
|
| 4 |
__all__ = ["MMVisionProjector", "MMAudioProjector"]
|
|
|
|
| 1 |
+
from projectors.vision import MMVisionProjector
|
| 2 |
+
from projectors.audio import MMAudioProjector
|
| 3 |
|
| 4 |
__all__ = ["MMVisionProjector", "MMAudioProjector"]
|
src/{omni/projectors → projectors}/audio.py
RENAMED
|
File without changes
|
src/{omni/projectors → projectors}/vision.py
RENAMED
|
File without changes
|
src/serve/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import serve
|