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_tokenizer30class 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 NotImplementedError98 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)) * 32padded_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 results207class 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)