ඇගයීම

Eleutherai/LM-ඇගයීම්-පටිපිළිබඳ ආකෘතිය පරීක්ෂා කිරීමේ කේතය මෙයයි.

15import math
16from typing import List
17
18import torch
19import torch.nn.functional as F
20from lm_eval import tasks, evaluator, utils
21from lm_eval.base import BaseLM
22from tokenizers import Tokenizer
23from torch import nn
24from tqdm import tqdm
25
26from labml import monit
27from labml_nn.neox.tokenizer import get_tokenizer

ඇගයීම්පටි ඇඩප්ටර

මෙය Eleutherai/GPT-neox වෙතින් ඇඩප්ටරයමත පදනම් වේ

30class EvalHarnessAdapter(BaseLM):
  • tokenizer යනු හගිංෆේස් ටෝකනයිසර්
  • vocab_size යනු වචන මාලාවේ ප්රමාණයයි (මෙය ටෝකනයිසර් වොකාබ් ප්රමාණයට වඩා වෙනස් වන්නේ නියෝක්ස් කාවැද්දීමේ ස්ථර ආකෘතිය සමාන්තරව සිදු කිරීම සඳහා අමතර අමතර ප්රමාණයක් එකතු කරන බැවිනි.)
  • batch_size කණ්ඩායම ප්රමාණය වේ
37    def __init__(self, tokenizer: Tokenizer, vocab_size: int, batch_size: int):
45        super().__init__()
46        self.tokenizer = tokenizer
47        self._eot_token_id = self.tokenizer.token_to_id("<|endoftext|>")
48        self._vocab_size = vocab_size
49
50        self._batch_size = batch_size

වචනමාලාවේ ප්රමාණය

52    @property
53    def device(self):
54        raise RuntimeError()
55
56    @property
57    def vocab_size(self):
59        return self._vocab_size

පෙළඅවසන් ටෝකනය

61    @property
62    def eot_token_id(self):
64        return self._eot_token_id

උපරිමඅනුක්රමය දිග

66    @property
67    def max_length(self):
69        return 2048

උත්පාදනයකිරීමට උපරිම ටෝකන ගණන

71    @property
72    def max_gen_toks(self):
74        return 128

කණ්ඩායම්ප්රමාණය

76    @property
77    def batch_size(self):
81        return self._batch_size

දීඇති පෙළක් කේතනය කරන්න

83    def tok_encode(self, string: str):
87        return self.tokenizer.encode(string).ids

ටෝකන්හැඳුනුම්පත් වලින් පෙළ විකේතනය කරන්න

89    def tok_decode(self, tokens: List[int]):
93        return self.tokenizer.decode(tokens)
95    def _model_call(self, inps: torch.Tensor):
96        raise NotImplementedError
98    def _model_generate(self, context, max_length, eos_token_id):
99        raise RuntimeError()
101    def greedy_until(self, requests):
102        raise RuntimeError()

ඊළඟටෝකන වල ලොග් වීමේ සමානකම් ලබා ගන්න

  • requests සන්දර්භය සහ අපේක්ෂිත අඛණ්ඩ පැවැත්ම අඩංගු ඉල්ලීම් ලැයිස්තුව.
  • disable_tqdm සත්ය නම්, tqdm ප්රගති තීරුව අක්රීය කරන්න.
104    @torch.no_grad()
105    def _loglikelihood_tokens(self, requests, disable_tqdm=False):

ප්රතිඵලසඳහා

114        res = []

දිගපහළ අනුපිළිවෙලෙහි ඉල්ලීම් නැවත සකස් කරන්න, එවිට සමාන දිග සහිත අනුක්රමයන් සමීප වේ

118        def _collate(x):
119            toks = x[1] + x[2]
120            return -len(toks), tuple(toks)
121
122        reord = utils.Reorderer(requests, _collate)

වරකටඉල්ලීම් batch_size ගණනාවක් සහිත ඉල්ලීම් හරහා යැවීමක්

125        for chunk in utils.chunks(tqdm(reord.get_reordered(), disable=disable_tqdm), self.batch_size):

කණ්ඩායමසඳහා යෙදවුම් ගබඩා කිරීම

127            inps = []

කණ්ඩායමසඳහා අඛණ්ඩව

129            continuations = []

ආදානඅනුක්රමවල දිග

131            inplens = []

කණ්ඩායමසඳහා පෑඩ් දිග

133            padded_length = None

කුට්ටියේඇති එක් එක් ඉල්ලීම හරහා ලූප් කර ඒවා පෑඩින් සමඟ පයිටෝච් ටෙන්සර්වලට එකතු කරන්න

135            for _, context_enc, continuation_enc in chunk:

සන්දර්භයසහ අඛණ්ඩ පැවැත්ම සංයුක්ත කරන්න

137                inp = context_enc + continuation_enc

ප්රමාණයඉක්මවා ගියහොත් වමේ සිට කපා ගන්න max_length

139                inp = inp[-(self.max_length + 1):]

අවසානටෝකනය ඉවත් කරන්න

141                inp = inp[:-1]

ආතතියක්සාදන්න

143                inp = torch.tensor(inp, dtype=torch.long)

ආදානදිග

145                inplen = inp.shape[0]

පෑඩ්දිග තීරණය කරන්න. කෙටි අනුපිළිවෙලවල් පෑඩ් ලැබෙනු ඇත.

149                if padded_length is None:
150                    padded_length = int(math.ceil(inplen / 32)) * 32

padded_length= padded_length නම් padded_length වෙන කිසිවක් නැත

පෑඩින්

154                padding = torch.zeros(padded_length - inplen, dtype=torch.long)

පෑඩින්එකතු කරන්න

157                inp = torch.cat([inp, padding], dim=0)
158
159                inps.append(inp)
160                continuations.append(continuation_enc)
161                inplens.append(inplen)

ආදර්ශපිවිසුම් ලබා ගන්න

164            logits = self._model_call(torch.stack(inps))

ලොග්සොෆ්ට්මැක්ස් ලබා ගන්න

167            multi_logits = F.log_softmax(logits, dim=-1)

කණ්ඩායමේආදාන/ප්රතිදාන යුගල හරහා ලූප

170            for logits, inplen, cont_toks in zip(multi_logits, inplens, continuations):

පුරෝකථනයකළ ටෝකන ගණන ලබා ගන්න

172                contlen = len(cont_toks)

අයගේපිවිසුම් ලබා ගන්න

174                logits = logits[inplen - contlen: inplen]

ඉහළමසම්භාවිතාවන් සහිත ටෝකන ලබා ගන්න

176                greedy_tokens = logits.argmax(dim=-1)

ඉලක්කගතටෝකන ලබා ගන්න

178                cont_toks = torch.tensor(cont_toks, dtype=torch.long).to(logits.device)

නිශ්චිතගැලපීමක් තිබේද යන්න

180                max_equal = (greedy_tokens == cont_toks).all()

ඉලක්කගතටෝකන වල ලොග් වීමේ හැකියාව

182                logits = torch.gather(logits, 1, cont_toks[:, None])

මුළුලොග්-Likehoods එකතු කරන්න සහ ප්රතිඵල සඳහා තරගය තිබුණේ ද යන්න

184                res.append((float(logits.sum()), bool(max_equal)))

නැවතඇණවුම් කර නැවත ප්රති. ල

187        return reord.get_original(res)

ලබාදී ඇති ඇගයීම් ක්රියාත්මක කරන්න

189    @torch.no_grad()
190    def run_eval(self, name: str, eval_tasks: List[str]):

Eleutherai/LM ඇගයීම-පටි ඇගයුම්කරු ධාවනය කරන්න

196        results = evaluator.evaluate(lm=self, task_dict=tasks.get_task_dict(eval_tasks))

වින්යාසඑකතු කරන්න

199        results["config"] = {
200            "name": name,
201        }

204        return results

ඇගයීම්පටි ඇඩප්ටර

මෙය Eleutherai/GPT-neox වෙතින් ඇඩප්ටරයමත පදනම් වේ

207class NoeXEvalHarnessAdapter(EvalHarnessAdapter):
  • model ආකෘතිය වේ
  • tokenizer යනු හගිංෆේස් ටෝකනයිසර්
  • vocab_size යනු වචන මාලාවේ ප්රමාණයයි (මෙය ටෝකනයිසර් වොකාබ් ප්රමාණයට වඩා වෙනස් වන්නේ නියෝක්ස් කාවැද්දීමේ ස්ථර ආකෘතිය සමාන්තරව සිදු කිරීම සඳහා අමතර අමතර ප්රමාණයක් එකතු කරන බැවිනි.)
  • batch_size කණ්ඩායම ප්රමාණය වේ
  • device ආකෘතියේ උපාංගය වේ
  • 214    def __init__(self, model: nn.Module, tokenizer: Tokenizer, vocab_size: int, batch_size: int, device: torch.device):
    224        super().__init__(tokenizer, vocab_size, batch_size)
    225        self.model = model
    226        self._device = device

    ආකෘතියඅමතන්න

    228    def _model_call(self, inps: torch.Tensor):
    232        return self.model(inps.to(self._device))

    දීඇති ආකෘතියක් සමඟ ඇගයීම් පටි ධාවනය කරන්න

    235def run_eval_harness(model: nn.Module, name: str, eval_tasks: List[str], device: torch.device, batch_size: int = 8):

    ටෝකනයිසර්පටවන්න

    241    with monit.section('Load tokenizer'):
    242        tokenizer = get_tokenizer()

    කිසිවක්නියම කර නොමැති නම් සියලු කාර්යයන්

    245    if not eval_tasks:
    246        eval_tasks = [
    247            "anli_r1",
    248            "anli_r2",
    249            "anli_r3",
    250            "hellaswag",
    251            "lambada",
    252            "piqa",
    253            "winogrande",
    254            "wsc",
    255            "mathqa",
    256        ]

    ඇඩැප්ටරයසාදන්න

    259    adapter = NoeXEvalHarnessAdapter(model, tokenizer, 50_432, batch_size, device)

    දුවන්න

    262    return adapter.run_eval(name, eval_tasks)