Skip to content

Commit 9c81a4a

Browse files
LiuChiachiZeyuChen
andauthored
Update ofa example Multi cards startup method (#515)
* add device argument and gpu launch method * update reamde * fix readme, and remove args.n_gpu * fix ofa depth multi gpus bug * add choice to device arg Co-authored-by: Zeyu Chen <[email protected]>
1 parent 062e41e commit 9c81a4a

File tree

3 files changed

+48
-32
lines changed

3 files changed

+48
-32
lines changed

examples/model_compression/ofa/README.md

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -218,15 +218,16 @@ python -u ./run_glue.py \
218218
--logging_steps 1 \
219219
--save_steps 500 \
220220
--output_dir ./tmp/$TASK_NAME/ \
221-
--n_gpu 1 \
221+
--device gpu \
222222
```
223223
参数详细含义参考[README.md](../../benchmark/glue/README.md)
224224
Fine-tuning 在dev上的结果如压缩结果表1-1中Result那一列所示。
225225

226226

227227
### 压缩训练
228228

229-
```python
229+
单卡训练
230+
```shell
230231
python -u ./run_glue_ofa.py --model_type bert \
231232
--model_name_or_path ${task_pretrained_model_dir} \
232233
--task_name $TASK_NAME --max_seq_length 128 \
@@ -236,10 +237,29 @@ python -u ./run_glue_ofa.py --model_type bert \
236237
--logging_steps 10 \
237238
--save_steps 100 \
238239
--output_dir ./tmp/$TASK_NAME \
239-
--n_gpu 1 \
240+
--device gpu \
241+
--width_mult_list 1.0 0.8333333333333334 0.6666666666666666 0.5
242+
```
243+
244+
多卡训练
245+
246+
```shell
247+
unset CUDA_VISIBLE_DEVICES
248+
python -m paddle.distributed.launch --gpus "0,1" run_glue_ofa.py \
249+
--model_type bert \
250+
--model_name_or_path ${task_pretrained_model_dir} \
251+
--task_name $TASK_NAME --max_seq_length 128 \
252+
--batch_size 32 \
253+
--learning_rate 2e-5 \
254+
--num_train_epochs 6 \
255+
--logging_steps 10 \
256+
--save_steps 100 \
257+
--output_dir ./tmp/$TASK_NAME \
258+
--device gpu \
240259
--width_mult_list 1.0 0.8333333333333334 0.6666666666666666 0.5
241260
```
242261

262+
243263
其中参数释义如下:
244264
- `model_type` 指示了模型类型,当前仅支持BERT模型。
245265
- `model_name_or_path` 指示了某种特定配置的模型,对应有其预训练模型和预训练时使用的 tokenizer。若模型相关内容保存在本地,这里也可以提供相应目录地址。
@@ -251,7 +271,7 @@ python -u ./run_glue_ofa.py --model_type bert \
251271
- `logging_steps` 表示日志打印间隔。
252272
- `save_steps` 表示模型保存及评估间隔。
253273
- `output_dir` 表示模型保存路径。
254-
- `n_gpu` 表示使用的 GPU 卡数。若希望使用多卡训练,将其设置为指定数目即可;若为0,则使用CPU
274+
- `device` 表示训练使用的设备, 'gpu'表示使用GPU, 'xpu'表示使用百度昆仑卡, 'cpu'表示使用CPU
255275
- `width_mult_list` 表示压缩训练过程中,对每层Transformer Block的宽度选择的范围。
256276

257277
压缩训练之后在dev上的结果如压缩结果表格中Result with PaddleSlim那一列所示,延时情况如表1-2所示。
@@ -268,7 +288,7 @@ python -u ./export_model.py --model_type bert \
268288
--max_seq_length 128 \
269289
--sub_model_output_dir ./tmp/$TASK_NAME/dynamic_model \
270290
--static_sub_model ./tmp/$TASK_NAME/static_model \
271-
--n_gpu 1 \
291+
--device gpu \
272292
--width_mult 0.6666666666666666
273293
```
274294

@@ -278,7 +298,7 @@ python -u ./export_model.py --model_type bert \
278298
- `max_seq_length` 表示最大句子长度,超过该长度将被截断。默认:128.
279299
- `sub_model_output_dir` 指示了导出子模型动态图参数的目录。
280300
- `static_sub_model` 指示了导出子模型静态图模型及参数的目录,设置为None,则表示不导出静态图模型。默认:None。
281-
- `n_gpu` 表示使用的 GPU 卡数。若希望使用多卡训练,将其设置为指定数目即可;若为0,则使用CPU。默认:1.
301+
- `device` 表示训练使用的设备, 'gpu'表示使用GPU, 'xpu'表示使用百度昆仑卡, 'cpu'表示使用CPU。
282302
- `width_mult` 表示导出子模型的宽度。默认:1.0.
283303

284304

examples/model_compression/ofa/run_glue_ofa.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,11 @@ def parse_args():
148148
parser.add_argument(
149149
"--seed", type=int, default=42, help="random seed for initialization")
150150
parser.add_argument(
151-
"--n_gpu",
152-
type=int,
153-
default=1,
154-
help="number of gpus to use, 0 for cpu.")
151+
"--device",
152+
default="gpu",
153+
type=str,
154+
choices=["gpu", "cpu", "xpu"],
155+
help="The device to select to train the model, is must be cpu/gpu/xpu.")
155156
parser.add_argument(
156157
'--width_mult_list',
157158
nargs='+',
@@ -317,7 +318,7 @@ def convert_example(example,
317318

318319

319320
def do_train(args):
320-
paddle.set_device("gpu" if args.n_gpu else "cpu")
321+
paddle.set_device(args.device)
321322
if paddle.distributed.get_world_size() > 1:
322323
paddle.distributed.init_parallel_env()
323324

@@ -497,7 +498,7 @@ def do_train(args):
497498
optimizer.clear_grad()
498499

499500
if global_step % args.logging_steps == 0:
500-
if (not args.n_gpu > 1) or paddle.distributed.get_rank() == 0:
501+
if paddle.distributed.get_rank() == 0:
501502
logger.info(
502503
"global step %d, epoch: %d, batch: %d, loss: %f, speed: %.2f step/s"
503504
% (global_step, epoch, step, loss,
@@ -544,8 +545,7 @@ def do_train(args):
544545
print("eval done total : %s s" %
545546
(time.time() - tic_eval))
546547

547-
if (not args.n_gpu > 1
548-
) or paddle.distributed.get_rank() == 0:
548+
if paddle.distributed.get_rank() == 0:
549549
output_dir = os.path.join(args.output_dir,
550550
"model_%d" % global_step)
551551
if not os.path.exists(output_dir):
@@ -570,7 +570,4 @@ def print_arguments(args):
570570
if __name__ == "__main__":
571571
args = parse_args()
572572
print_arguments(args)
573-
if args.n_gpu > 1:
574-
paddle.distributed.spawn(do_train, args=(args, ), nprocs=args.n_gpu)
575-
else:
576-
do_train(args)
573+
do_train(args)

examples/model_compression/ofa/run_glue_ofa_depth.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,11 @@ def parse_args():
153153
parser.add_argument(
154154
"--seed", type=int, default=42, help="random seed for initialization")
155155
parser.add_argument(
156-
"--n_gpu",
157-
type=int,
158-
default=1,
159-
help="number of gpus to use, 0 for cpu.")
156+
"--device",
157+
default="gpu",
158+
type=str,
159+
choices=["gpu", "cpu", "xpu"],
160+
help="The device to select to train the model, is must be cpu/gpu/xpu.")
160161
parser.add_argument(
161162
'--width_mult_list',
162163
nargs='+',
@@ -312,7 +313,7 @@ def convert_example(example,
312313

313314

314315
def do_train(args):
315-
paddle.set_device("gpu" if args.n_gpu else "cpu")
316+
paddle.set_device(args.device)
316317
if paddle.distributed.get_world_size() > 1:
317318
paddle.distributed.init_parallel_env()
318319

@@ -384,8 +385,6 @@ def do_train(args):
384385
model = model_class.from_pretrained(
385386
args.model_name_or_path, num_classes=num_labels)
386387
origin_weights = model.state_dict()
387-
if paddle.distributed.get_world_size() > 1:
388-
model = paddle.DataParallel(model)
389388

390389
# Step2: Convert origin model to supernet.
391390
sp_config = supernet(expand_ratio=args.width_mult_list)
@@ -430,6 +429,10 @@ def do_train(args):
430429
if args.task_name == "mnli":
431430
dev_data_loader = (dev_data_loader_matched, dev_data_loader_mismatched)
432431

432+
if paddle.distributed.get_world_size() > 1:
433+
ofa_model.model = paddle.DataParallel(
434+
ofa_model.model, find_unused_parameters=True)
435+
433436
if args.max_steps > 0:
434437
num_training_steps = args.max_steps
435438
num_train_epochs = math.ceil(num_training_steps /
@@ -487,7 +490,7 @@ def do_train(args):
487490
ofa_model.model.clear_gradients()
488491

489492
if global_step % args.logging_steps == 0:
490-
if (not args.n_gpu > 1) or paddle.distributed.get_rank() == 0:
493+
if paddle.distributed.get_rank() == 0:
491494
logger.info(
492495
"global step %d, epoch: %d, batch: %d, loss: %f, speed: %.2f step/s"
493496
% (global_step, epoch, step, loss,
@@ -537,8 +540,7 @@ def do_train(args):
537540
print("eval done total : %s s" %
538541
(time.time() - tic_eval))
539542

540-
if (not args.n_gpu > 1
541-
) or paddle.distributed.get_rank() == 0:
543+
if paddle.distributed.get_rank() == 0:
542544
output_dir = os.path.join(args.output_dir,
543545
"model_%d" % global_step)
544546
if not os.path.exists(output_dir):
@@ -563,7 +565,4 @@ def print_arguments(args):
563565
if __name__ == "__main__":
564566
args = parse_args()
565567
print_arguments(args)
566-
if args.n_gpu > 1:
567-
paddle.distributed.spawn(do_train, args=(args, ), nprocs=args.n_gpu)
568-
else:
569-
do_train(args)
568+
do_train(args)

0 commit comments

Comments
 (0)