(cls, name, args=None, *, home_path=None, url=None, prefix='', build_only=False, use_node_group=True, overwrite_args={}, **kwargs)
| 338 | |
| 339 | @classmethod |
| 340 | def from_pretrained(cls, name, args=None, *, home_path=None, url=None, prefix='', build_only=False, use_node_group=True, overwrite_args={}, **kwargs): |
| 341 | if build_only or 'model_parallel_size' not in overwrite_args: |
| 342 | return cls.from_pretrained_base(name, args=args, home_path=home_path, url=url, prefix=prefix, build_only=build_only, overwrite_args=overwrite_args, **kwargs) |
| 343 | else: |
| 344 | new_model_parallel_size = overwrite_args['model_parallel_size'] |
| 345 | if new_model_parallel_size != 1 or new_model_parallel_size == 1 and args.model_parallel_size == 1: |
| 346 | model, model_args = cls.from_pretrained_base(name, args=args, home_path=home_path, url=url, prefix=prefix, build_only=True, overwrite_args=overwrite_args, **kwargs) |
| 347 | local_rank = get_node_rank() if use_node_group else get_model_parallel_rank() |
| 348 | world_size = torch.distributed.get_world_size() |
| 349 | assert world_size % new_model_parallel_size == 0, "world size should be a multiplier of new model_parallel_size." |
| 350 | destroy_model_parallel() |
| 351 | initialize_model_parallel(1) |
| 352 | if local_rank == 0: |
| 353 | args.skip_init = True |
| 354 | args.use_gpu_initialization = False |
| 355 | args.device = 'cpu' |
| 356 | overwrite_args.pop('model_parallel_size') |
| 357 | model_full, args_ = cls.from_pretrained_base(name, args=args, home_path=home_path, url=url, prefix=prefix, build_only=False, overwrite_args=overwrite_args, **kwargs) |
| 358 | if args_.model_parallel_size != 1: |
| 359 | raise Exception("We do not support overwriting model_parallel_size when original model_parallel_size != 1. Try merging the model using `from_pretrained(xxx,overwrite_args={'model_parallel_size':1})` first if you still want to change model_parallel_size!") |
| 360 | if hasattr(args, 'mode') and args.mode == 'inference': # For multi-node inference, we should prevent rank 0 eagerly printing some info. |
| 361 | torch.distributed.barrier() |
| 362 | destroy_model_parallel() |
| 363 | initialize_model_parallel(new_model_parallel_size) |
| 364 | if local_rank == 0: |
| 365 | mp_split_model_rank0(model, model_full, use_node_group=use_node_group) |
| 366 | del model_full |
| 367 | else: |
| 368 | mp_split_model_receive(model, use_node_group=use_node_group) |
| 369 | reset_random_seed(6) |
| 370 | else: |
| 371 | overwrite_args.pop('model_parallel_size') |
| 372 | model, model_args = cls.from_pretrained_base(name, args=args, home_path=home_path, url=url, prefix=prefix, build_only=False, overwrite_args=overwrite_args, **kwargs) |
| 373 | rank = torch.distributed.get_rank() |
| 374 | world_size = torch.distributed.get_world_size() |
| 375 | assert world_size == model_args.model_parallel_size, "world size should be equal to model_parallel_size." |
| 376 | destroy_model_parallel() |
| 377 | initialize_model_parallel(1) |
| 378 | if rank == 0: |
| 379 | args.use_gpu_initialization = False |
| 380 | args.device = 'cpu' |
| 381 | overwrite_args['model_parallel_size'] = 1 |
| 382 | model_full, args_ = cls.from_pretrained_base(name, args=args, home_path=home_path, url=url, prefix=prefix, build_only=True, overwrite_args=overwrite_args, **kwargs) |
| 383 | torch.distributed.barrier() |
| 384 | destroy_model_parallel() |
| 385 | initialize_model_parallel(model_args.model_parallel_size) |
| 386 | if rank == 0: |
| 387 | mp_merge_model_rank0(model, model_full) |
| 388 | model, model_args = model_full, args_ |
| 389 | else: |
| 390 | mp_merge_model_send(model) |
| 391 | model_args.model_parallel_size = 1 |
| 392 | destroy_model_parallel() |
| 393 | initialize_model_parallel(1) |
| 394 | return model, model_args |
| 395 | |
| 396 | def get_model(args, model_cls, **kwargs): |
| 397 | """Build the model.""" |
nothing calls this directly
no test coverage detected