Zero3 මතක ප්රශස්තකරණය සමඟ ජීපීටී-නියෝක්ස් ෆිනෙටුන්

මෙමස්ක්රිප්ට් එක ZERO-DP මතක ප්රශස්තිකරණය සමඟ බහු උපාංගවල ජීපීටී-නියෝක්ස් ආකෘතියේ නැඹුරුව පරාමිතීන් පුහුණු කරයි.

14import datetime
15
16import torch
17import torch.distributed
18
19from labml import experiment, monit, tracker
20from labml.configs import option
21from labml.logger import inspect
22from labml_nn.neox.samples.finetune import PipelineParallelTrainerConf

නල මාර්ග සමාන්තර පුහුණුකරු වින්යාසයන් භාවිතා කර Zero3 මතක ප්රශස්තකරණය සඳහා එය අනුවර්තනය කරන්න.

27class Configs(PipelineParallelTrainerConf):
28    rank: int
29    world_size: int

ආකෘතියසඳහා ප්රශස්තකරණය සකසන්න

අපිතියුණු පරාමිතීන් සමත් වන බව සලකන්න get_trainable_chunk .

32@option(Configs.optimizer, 'Zero3Adam')
33def _optimizer(c: Configs):
39    from labml_nn.optimizers.adam_fp16 import AdamFP16
40    return AdamFP16(c.model.get_trainable_chunk(), lr=c.learning_rate)

Zero3මතක ප්රශස්තකරණය සමඟ ආකෘතිය සාදන්න

43@option(Configs.model, 'Zero3')
44def _model(c: Configs):
48    from labml_nn.scaling.zero3 import Zero3Layer, Zero3Sequential

සිහින්සුසරකය පුහුණු කළ හැකි පරාමිතීන් සකස් කරන බවට වග බලා ගැනීම

51    _ = c.fine_tuner

ස්ථරසමඟ ආවරණය කරන්න Zero3Layer

54    modules = []
55    for m in monit.iterate('Zero3', c.layers):
56        modules.append(Zero3Layer(m.to(c.device),
57                                  c.rank, c.world_size, c.device, c.dtype))

අනුක්රමිකආකෘතියක් සාදන්න

60    model = Zero3Sequential(modules)

63    return model

තරාතිරමසමඟ නෝඩ් මත පුහුණුව ක්රියාත්මක කරන්න rank .

66def main(rank: int, world_size: int, init_method: str = 'tcp://localhost:23456'):

PyTorchබෙදා හරින ලද ක්රියාවලි සමූහය ආරම්භ කරන්න

71    with monit.section('Distributed'):
72        torch.distributed.init_process_group('nccl',
73                                             timeout=datetime.timedelta(seconds=30),
74                                             init_method=init_method,
75                                             rank=rank,
76                                             world_size=world_size)

වත්මන්උපාංගය සකසන්න

79    device = torch.device(f'cuda:{rank}')
80    torch.cuda.set_device(device)

අත්හදාබැලීම සාදන්න

83    experiment.create(name='zero3_neox', writers={'screen', 'labml'})
84    experiment.distributed(rank, world_size)

වින්යාසයන්සාදන්න

87    conf = Configs()

වින්යාසයන්පූරණය කරන්න

90    experiment.configs(conf, {
91        'model': 'Zero3',
92        'optimizer': 'Zero3Adam',
93
94        'device': device,
95        'rank': rank,
96        'world_size': world_size,
97
98        'learning_rate': 3e-4,
99        'max_seq_len': 128,
100        'batch_size': 16,
101    })

අත්හදාබැලීම ආරම්භ කරන්න

104    with experiment.start():

ආකෘතියආරම්භ කරන්න. පිරිසිදු ලොග් සඳහා ලූපයට පෙර මෙය කරන්න.

106        _ = conf.model

ආකෘතියපුහුණු කරන්න

109        for epoch in monit.loop(conf.epochs):
110            conf.train_epoch()
111            tracker.new_line()

115if __name__ == '__main__':

යන්ත්රවින්යාසයන් ලොග් කරන්න

117    inspect([torch.cuda.get_device_name(i) for i in range(torch.cuda.device_count())])
118    inspect(
119        n_gpus=torch.cuda.device_count(),
120        mpi=torch.distributed.is_mpi_available(),
121        nccl=torch.distributed.is_nccl_available(),
122    )
123
124    n_gpu = torch.cuda.device_count()

එක්එක් GPU සඳහා ක්රියාවලියක් ආරම්භ කරන්න. ඔබ බහු පරිගණක භාවිතා කරන්නේ නම් ඔබට වෙනම දියත් කිරීමක් අවශ්ය වේ.

127    torch.multiprocessing.spawn(main, args=(n_gpu,), nprocs=n_gpu, join=True)