File size: 8,074 Bytes
fd43be1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# Pretrain Example

> \[!IMPORTANT\]
> Data must be used in conjunction with the corresponding map_fn.



## Data



`./data.json`



```json

[{

    "toy_text": "I am an artificial intelligence (AI) assistant named InternLM. I was created by the Shanghai AI Laboratory and my purpose is to assist users with various tasks through natural language processing technology."
},
{
    "toy_text": "I am an artificial intelligence programmed to assist with various types of tasks, including answering questions, providing information, and performing automated processes."

}]

```


## Map Function

`./map_fn.py`

```python

def pretrain_map_fn(example):

    return {

        'conversation': [{

            'input': '',

            'output': example['toy_text'].strip()

        }]

    }

```

## Config

Based on [internlm_7b_qlora_json_e3](../../../xtuner/configs/internlm/internlm_7b/internlm_7b_qlora_json_e3.py).

```diff

# Copyright (c) OpenMMLab. All rights reserved.

import torch

from datasets import load_dataset

+ from mmengine.config import read_base

from mmengine.dataset import DefaultSampler

from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook,

                            LoggerHook, ParamSchedulerHook)

from mmengine.optim import AmpOptimWrapper, CosineAnnealingLR

from peft import LoraConfig

from torch.optim import AdamW

from transformers import (AutoModelForCausalLM, AutoTokenizer,

                          BitsAndBytesConfig)



from xtuner.dataset import process_hf_dataset

from xtuner.dataset.collate_fns import default_collate_fn

-from xtuner.dataset.map_fns import template_map_fn_factory

-from xtuner.engine.hooks import DatasetInfoHook, EvaluateChatHook

+from xtuner.engine.hooks import DatasetInfoHook

from xtuner.engine.runner import TrainLoop

from xtuner.model import SupervisedFinetune

-from xtuner.utils import PROMPT_TEMPLATE



+with read_base():

+    from .map_fn import single_turn_map_fn as dataset_map_fn

+

#######################################################################

#                          PART 1  Settings                           #

#######################################################################

# Model

pretrained_model_name_or_path = 'internlm/internlm-7b'



# Data

-data_path = 'path/to/your/json_data'

+data_path = './data.json'

-prompt_template = PROMPT_TEMPLATE.default

max_length = 2048

pack_to_max_length = True



# Scheduler & Optimizer

batch_size = 1  # per_device

accumulative_counts = 16

dataloader_num_workers = 0

max_epochs = 3

optim_type = AdamW

lr = 2e-4

betas = (0.9, 0.999)

weight_decay = 0

max_norm = 1  # grad clip



# Save

save_steps = 500

save_total_limit = 2  # Maximum checkpoints to keep (-1 means unlimited)



# Evaluate the generation performance during the training

evaluation_freq = 500

SYSTEM = ''

evaluation_inputs = [

    '请给我介绍五个上海的景点', 'Please tell me five scenic spots in Shanghai'

]



#######################################################################

#                      PART 2  Model & Tokenizer                      #

#######################################################################

tokenizer = dict(

    type=AutoTokenizer.from_pretrained,

    pretrained_model_name_or_path=pretrained_model_name_or_path,

    trust_remote_code=True,

    padding_side='right')



model = dict(

    type=SupervisedFinetune,

    llm=dict(

        type=AutoModelForCausalLM.from_pretrained,

        pretrained_model_name_or_path=pretrained_model_name_or_path,

        trust_remote_code=True,

        torch_dtype=torch.float16,

        quantization_config=dict(

            type=BitsAndBytesConfig,

            load_in_4bit=True,

            load_in_8bit=False,

            llm_int8_threshold=6.0,

            llm_int8_has_fp16_weight=False,

            bnb_4bit_compute_dtype=torch.float16,

            bnb_4bit_use_double_quant=True,

            bnb_4bit_quant_type='nf4')),

    lora=dict(

        type=LoraConfig,

        r=64,

        lora_alpha=16,

        lora_dropout=0.1,

        bias='none',

        task_type='CAUSAL_LM'))



#######################################################################

#                      PART 3  Dataset & Dataloader                   #

#######################################################################

train_dataset = dict(

    type=process_hf_dataset,

    dataset=dict(

        type=load_dataset, path='json', data_files=dict(train=data_path)),

    tokenizer=tokenizer,

    max_length=max_length,

+   dataset_map_fn=dataset_map_fn,

-    template_map_fn=dict(

-        type=template_map_fn_factory, template=prompt_template),

+    template_map_fn=None,

    remove_unused_columns=True,

    shuffle_before_pack=True,

    pack_to_max_length=pack_to_max_length)



train_dataloader = dict(

    batch_size=batch_size,

    num_workers=dataloader_num_workers,

    dataset=train_dataset,

    sampler=dict(type=DefaultSampler, shuffle=True),

    collate_fn=dict(type=default_collate_fn))



#######################################################################

#                    PART 4  Scheduler & Optimizer                    #

#######################################################################

# optimizer

optim_wrapper = dict(

    type=AmpOptimWrapper,

    optimizer=dict(

        type=optim_type, lr=lr, betas=betas, weight_decay=weight_decay),

    clip_grad=dict(max_norm=max_norm, error_if_nonfinite=False),

    accumulative_counts=accumulative_counts,

    loss_scale='dynamic',

    dtype='float16')



# learning policy

# More information: https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/param_scheduler.md  # noqa: E501

param_scheduler = dict(

    type=CosineAnnealingLR,

    eta_min=0.0,

    by_epoch=True,

    end=max_epochs,

    convert_to_iter_based=True)



# train, val, test setting

train_cfg = dict(type=TrainLoop, max_epochs=max_epochs)



#######################################################################

#                           PART 5  Runtime                           #

#######################################################################

# Log the dialogue periodically during the training process, optional

-custom_hooks = [

-    dict(type=DatasetInfoHook, tokenizer=tokenizer),

-    dict(

-        type=EvaluateChatHook,

-        tokenizer=tokenizer,

-        every_n_iters=evaluation_freq,

-        evaluation_inputs=evaluation_inputs,

-        system=SYSTEM,

-        prompt_template=prompt_template)

-]

+custom_hooks = [dict(type=DatasetInfoHook, tokenizer=tokenizer)]



# configure default hooks

default_hooks = dict(

    # record the time of every iteration.

    timer=dict(type=IterTimerHook),

    # print log every 10 iterations.

    logger=dict(type=LoggerHook, log_metric_by_epoch=False, interval=10),

    # enable the parameter scheduler.

    param_scheduler=dict(type=ParamSchedulerHook),

    # save checkpoint per `save_steps`.

    checkpoint=dict(

        type=CheckpointHook,

        by_epoch=False,

        interval=save_steps,

        max_keep_ckpts=save_total_limit),

    # set sampler seed in distributed evrionment.

    sampler_seed=dict(type=DistSamplerSeedHook),

)



# configure environment

env_cfg = dict(

    # whether to enable cudnn benchmark

    cudnn_benchmark=False,

    # set multi process parameters

    mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),

    # set distributed parameters

    dist_cfg=dict(backend='nccl'),

)



# set visualizer

visualizer = None



# set log level

log_level = 'INFO'



# load from which checkpoint

load_from = None



# whether to resume training from the loaded checkpoint

resume = False



# Defaults to use random seed and disable `deterministic`

randomness = dict(seed=None, deterministic=False)



# set log processor

log_processor = dict(by_epoch=False)

```

## Quick Start

```bash

cd ./examples/demo_data/pretrain

xtuner train config.py

```