Skip to content

Commit 7178b06

Browse files
Update doc and fix bugs (#84)
1 parent 329cfd1 commit 7178b06

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1951
-258
lines changed

README.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ For more detailed model support list 👉 [Quick Start](docs/source_en/Usage%20
138138

139139
## Sample Code
140140

141+
Below are some of the capabilities demonstrated in the example code. For a complete introduction to training capabilities,
142+
please refer to [Quick Start](docs/source_en/Usage%20Guide/Quick-Start.md) and [cookbook](cookbook).
143+
141144
### Train with Ray
142145

143146
```python
@@ -157,7 +160,7 @@ twinkle.initialize(mode='ray', groups=device_group, global_device_mesh=device_me
157160

158161
def train():
159162
# to load model from Hugging Face, use 'hf://...'
160-
base_model = 'ms://Qwen/Qwen2.5-7B-Instruct'
163+
base_model = 'ms://Qwen/Qwen3-4B'
161164
# 1000 samples
162165
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(1000)))
163166
# Set template to prepare encoding
@@ -214,13 +217,13 @@ from twinkle.preprocessor import SelfCognitionProcessor
214217
from twinkle.server.tinker.common import input_feature_to_datum
215218

216219
base_model = 'ms://Qwen/Qwen3-30B-A3B-Instruct-2507'
217-
base_url='http://www.modelscope.cn/twinkle'
218-
api_key=os.environ.get('MODELSCOPE_TOKEN')
220+
base_url='your-base-url'
221+
api_key='your-api-key'
219222

220223
# Use twinkle dataset to load the data
221224
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(500)))
222225
dataset.set_template('Template', model_id=base_model, max_length=256)
223-
dataset.map(SelfCognitionProcessor('twinkle Model', 'twinkle Team'), load_from_cache_file=False)
226+
dataset.map(SelfCognitionProcessor('twinkle Model', 'ModelScope Team'), load_from_cache_file=False)
224227
dataset.encode(batched=True, load_from_cache_file=False)
225228
dataloader = DataLoader(dataset=dataset, batch_size=8)
226229

README_ZH.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,11 @@ pip install -e .
6767
| twinkle 客户端微调 | megatron | [脚本](cookbook/client/twinkle/megatron) |
6868
| twinkle 客户端微调 | transformer | [脚本](cookbook/client/twinkle/transformer) |
6969

70+
Twinkle✨支持相同的算法接口运行在单GPU、torchrun多机、Ray、Client等各场景下。其算法过程是外露的,非常便于修改和调试。完整的框架介绍请查看[快速开始](docs/source_zh/使用指引/快速开始.md)
71+
7072
## 更新日志
7173

72-
- 🎉2026-02-13 Twinkle✨ 初始版本发布,包括对文本模型的 SFT/PT/RL 支持以及在 [ModelScope](https://modelscope.cn) 上的无服务器训练能力
74+
🎉2026-02-13 Twinkle✨ 初始版本发布,支持文本模型的SFT/PT/RL训练。我们还通过兼容Tinker的API,在魔搭社区上提供了无服务器训练功能
7375

7476
## ModelScope 的训练服务
7577

@@ -88,8 +90,8 @@ pip install -e .
8890

8991
随着新模型的发布,我们将添加对更多模型的支持。下表列出了 Twinkle✨ 框架当前支持的模型。
9092

91-
>[!注意]
92-
> 对于通过 `base_url=https://www.modelscope.cn/twinkle` 访问的无服务器训练服务,目前一次只支持一个训练基座,当前是 [Qwen3-30B-A3B-Instruct-2507](https://modelscope.cn/models/Qwen/Qwen3-30B-A3B-Instruct-2507)
93+
>[!Note]
94+
> 通过 `base_url=https://www.modelscope.cn/twinkle` 访问的无服务器训练服务,目前是通过兼容Tinker的API提供的。我们将陆续推出同时支持Tinker API和完整Twinkle✨原生 API的服务。无服务器端点每次由一个训练基座支持,目前使用的是[Qwen3-30B-A3B-Instruct-2507](https://modelscope.cn/models/Qwen/Qwen3-30B-A3B-Instruct-2507)
9395
9496

9597
| 模型类型 | [ModelScope](https://modelscope.cn) 上的模型 ID | 要求 | Megatron 支持 | HF 模型 ID |
@@ -117,6 +119,8 @@ pip install -e .
117119

118120
## 示例代码
119121

122+
下面列出了示例代码的一部分能力。完整的训练能力介绍请参考[快速开始](docs/source_zh/使用指引/快速开始.md)以及[cookbook](cookbook)
123+
120124
### 使用 Ray 训练
121125

122126
```python
@@ -136,7 +140,7 @@ twinkle.initialize(mode='ray', groups=device_group, global_device_mesh=device_me
136140

137141
def train():
138142
# to load model from Hugging Face, use 'hf://...'
139-
base_model = 'ms://Qwen/Qwen2.5-7B-Instruct'
143+
base_model = 'ms://Qwen/Qwen3-4B'
140144
# 1000 samples
141145
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(1000)))
142146
# Set template to prepare encoding
@@ -180,7 +184,7 @@ if __name__ == '__main__':
180184
train()
181185
```
182186

183-
### 使用类 Tinker API
187+
### 使用类 Tinker API实现无服务器式训练
184188

185189
```python
186190
import os
@@ -193,13 +197,13 @@ from twinkle.preprocessor import SelfCognitionProcessor
193197
from twinkle.server.tinker.common import input_feature_to_datum
194198

195199
base_model = 'ms://Qwen/Qwen3-30B-A3B-Instruct-2507'
196-
base_url='http://www.modelscope.cn/twinkle'
197-
api_key=os.environ.get('MODELSCOPE_TOKEN')
200+
base_url='your-base-url'
201+
api_key='your-api-key'
198202

199203
# Use twinkle dataset to load the data
200204
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(500)))
201205
dataset.set_template('Template', model_id=base_model, max_length=256)
202-
dataset.map(SelfCognitionProcessor('twinkle Model', 'twinkle Team'), load_from_cache_file=False)
206+
dataset.map(SelfCognitionProcessor('twinkle Model', 'ModelScope Team'), load_from_cache_file=False)
203207
dataset.encode(batched=True, load_from_cache_file=False)
204208
dataloader = DataLoader(dataset=dataset, batch_size=8)
205209

assets/framework.jpg

674 KB
Loading

cookbook/megatron/qwen3_5.py

Lines changed: 0 additions & 46 deletions
This file was deleted.

cookbook/megatron/tp.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from twinkle.dataset import Dataset, DatasetMeta
99
from twinkle.model import MegatronModel
1010
from twinkle.preprocessor import SelfCognitionProcessor
11+
from twinkle.server.tinker.common import input_feature_to_datum
12+
from twinkle.server.tinker.common.compat_base import TwinkleCompatModelBase
1113

1214
# Construct a device_mesh, tp=pp=cp=2, dp=1
1315
device_mesh = DeviceMesh.from_sizes(dp_size=1, tp_size=2, pp_size=2, cp_size=2)
@@ -20,7 +22,7 @@
2022
def eval(model):
2123
# 100 Samples
2224
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(100)))
23-
dataset.set_template('Template', model_id='ms://Qwen/Qwen2.5-7B-Instruct')
25+
dataset.set_template('Template', model_id='ms://Qwen/Qwen3-4B')
2426
dataset.map(SelfCognitionProcessor('twinkle大模型', 'ModelScope社区'))
2527
dataset.encode()
2628
dataloader = DataLoader(dataset=dataset, batch_size=16)
@@ -34,15 +36,15 @@ def train():
3436
# 1000 samples
3537
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(1000)))
3638
# Set template to prepare encoding
37-
dataset.set_template('Template', model_id='ms://Qwen/Qwen2.5-7B-Instruct')
39+
dataset.set_template('Template', model_id='ms://Qwen/Qwen3-4B')
3840
# Preprocess the dataset to standard format
3941
dataset.map(SelfCognitionProcessor('twinkle大模型', 'ModelScope社区'))
4042
# Encode dataset
4143
dataset.encode()
4244
# Global batch size = 1, dp_size = 1
4345
dataloader = DataLoader(dataset=dataset, batch_size=16)
4446
# Use a MegatronModel
45-
model = MegatronModel(model_id='ms://Qwen/Qwen2.5-7B-Instruct')
47+
model = MegatronModel(model_id='ms://Qwen/Qwen3-4B')
4648

4749
lora_config = LoraConfig(r=8, lora_alpha=32, target_modules='all-linear')
4850

@@ -63,6 +65,8 @@ def train():
6365
for step, batch in enumerate(dataloader):
6466
# Do forward and backward
6567
model.forward_backward(inputs=batch)
68+
_inputs = [input_feature_to_datum(b) for b in batch]
69+
_temp = TwinkleCompatModelBase._get_forward_output(_inputs, model.optimizer_group['default'].outputs['logits'])
6670
# Step
6771
model.clip_grad_and_step()
6872
if step % 5 == 0:

cookbook/megatron/tp_moe.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
def eval(model):
2121
# 100 Samples
2222
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(100)))
23-
dataset.set_template('Template', model_id='ms://Qwen/Qwen3-30B-A3B-Instruct-2507')
23+
dataset.set_template('Template', model_id='ms://Qwen/Qwen3.5-35B-A3B')
2424
dataset.map(SelfCognitionProcessor('twinkle大模型', 'ModelScope社区'))
2525
dataset.encode()
2626
dataloader = DataLoader(dataset=dataset, batch_size=16)
@@ -34,15 +34,15 @@ def train():
3434
# 1000 samples
3535
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(1000)))
3636
# Set template to prepare encoding
37-
dataset.set_template('Template', model_id='ms://Qwen/Qwen3-30B-A3B-Instruct-2507')
37+
dataset.set_template('Template', model_id='ms://Qwen/Qwen3.5-35B-A3B')
3838
# Preprocess the dataset to standard format
3939
dataset.map(SelfCognitionProcessor('twinkle大模型', 'ModelScope社区'))
4040
# Encode dataset
4141
dataset.encode()
4242
# Global batch size = 1, dp_size = 1
4343
dataloader = DataLoader(dataset=dataset, batch_size=16)
4444
# Use a MegatronModel
45-
model = MegatronModel(model_id='ms://Qwen/Qwen3-30B-A3B-Instruct-2507')
45+
model = MegatronModel(model_id='ms://Qwen/Qwen3.5-35B-A3B')
4646

4747
lora_config = LoraConfig(r=8, lora_alpha=32, target_modules='all-linear')
4848

@@ -75,7 +75,7 @@ def train():
7575
if loss_metric > float(metrics['loss']):
7676
model.save(f'checkpoint-{step}')
7777
loss_metric = float(metrics['loss'])
78-
model.save(f'last-checkpoint')
78+
model.save('last-checkpoint', merge_lora=True)
7979

8080

8181
if __name__ == '__main__':

cookbook/ray/single_controller.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
def eval(model):
2727
# 100 Samples
2828
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(100)))
29-
dataset.set_template('Template', model_id='ms://Qwen/Qwen2.5-7B-Instruct')
29+
dataset.set_template('Template', model_id='ms://Qwen/Qwen3.5-35B-A3B')
3030
dataset.map(SelfCognitionProcessor('twinkle大模型', 'ModelScope社区'))
3131
dataset.encode()
3232
dataloader = DataLoader(dataset=dataset, batch_size=8, min_batch_size=8)
@@ -41,15 +41,15 @@ def train():
4141
# 1000 samples
4242
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(1000)))
4343
# Set template to prepare encoding
44-
dataset.set_template('Template', model_id='ms://Qwen/Qwen2.5-7B-Instruct')
44+
dataset.set_template('Template', model_id='ms://Qwen/Qwen3-4B')
4545
# Preprocess the dataset to standard format
4646
dataset.map(SelfCognitionProcessor('twinkle大模型', 'ModelScope社区'))
4747
# Encode dataset
4848
dataset.encode()
4949
# Global batch size = 8, for GPUs, so 1 sample per GPU
5050
dataloader = DataLoader(dataset=dataset, batch_size=8, min_batch_size=8)
5151
# Use a TransformersModel
52-
model = TransformersModel(model_id='ms://Qwen/Qwen2.5-7B-Instruct', remote_group='default')
52+
model = TransformersModel(model_id='ms://Qwen/Qwen3-4B', remote_group='default')
5353

5454
lora_config = LoraConfig(r=8, lora_alpha=32, target_modules='all-linear')
5555

cookbook/rl/grpo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
logger = get_logger()
2222

23-
MODEL_ID = os.environ.get('MODEL_ID', 'ms://Qwen/Qwen2.5-3B-Instruct')
23+
MODEL_ID = os.environ.get('MODEL_ID', 'ms://Qwen/Qwen3-4B')
2424
USE_MEGATRON = bool(int(os.environ.get('USE_MEGATRON', '1')))
2525

2626
MODEL_GPUS = int(os.environ.get('MODEL_GPUS', 4))

cookbook/transformers/fsdp2.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
def eval(model):
2121
# 100 Samples
2222
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(100)))
23-
dataset.set_template('Template', model_id='ms://Qwen/Qwen2.5-7B-Instruct')
23+
dataset.set_template('Template', model_id='ms://Qwen/Qwen3-4B')
2424
dataset.map(SelfCognitionProcessor('twinkle大模型', 'ModelScope社区'))
2525
dataset.encode()
2626
dataloader = DataLoader(dataset=dataset, batch_size=8)
@@ -35,15 +35,15 @@ def train():
3535
# 1000 samples
3636
dataset = Dataset(dataset_meta=DatasetMeta('ms://swift/self-cognition', data_slice=range(1000)))
3737
# Set template to prepare encoding
38-
dataset.set_template('Template', model_id='ms://Qwen/Qwen2.5-7B-Instruct')
38+
dataset.set_template('Template', model_id='ms://Qwen/Qwen3-4B')
3939
# Preprocess the dataset to standard format
4040
dataset.map(SelfCognitionProcessor('twinkle大模型', 'ModelScope社区'))
4141
# Encode dataset
4242
dataset.encode()
4343
# Global batch size = 8, for GPUs, so 1 sample per GPU
4444
dataloader = DataLoader(dataset=dataset, batch_size=8)
4545
# Use a TransformersModel
46-
model = TransformersModel(model_id='ms://Qwen/Qwen2.5-7B-Instruct')
46+
model = TransformersModel(model_id='ms://Qwen/Qwen3-4B')
4747

4848
lora_config = LoraConfig(r=8, lora_alpha=32, target_modules='all-linear')
4949

cookbook/transformers/sp_fsdp_dense.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from twinkle.preprocessor import SelfCognitionProcessor
1111

1212
logger = get_logger()
13-
MODEL_ID = 'ms://Qwen/Qwen2.5-7B-Instruct'
13+
MODEL_ID = 'ms://Qwen/Qwen3-4B'
1414
DATASETS = 'ms://swift/self-cognition'
1515

1616
device_group = [DeviceGroup(

0 commit comments

Comments
 (0)