docs/si/transformers/knn/eval_knn.html
11fromtypingimportOptional,List1213importfaiss14importnumpyasnp15importtorch1617fromlabmlimportmonit,lab18fromlabml.loggerimportinspect19fromlabml\_nn.transformers.knn.train\_modelimportConfigs
මෙන්නඅපි විමසුම් f(ct) ලෙස, යතුරු f(ci) ලෙස සහ අගයන් wi ලෙස සඳහන් කරමු.
22defknn(queries:torch.Tensor,index:faiss.IndexFlatL2,keys\_store:np.ndarray,vals\_store:np.ndarray,n\_tokens:int):
ප්රති. ල නැවත හැඩගැස්වීම සඳහා විමසුම් වල හැඩය සුරකින්න
31queries\_shape=queries.shape
විමසුම්වල batch සහ sequence මානයන් සමතලා කරන්න
34queries=queries.view(-1,queries\_shape[-1])
f(ct) ඒ අතර ළඟම අසල්වැසියන් 10 දෙනෙකු සොයා ගන්න f(ci). distance FAISS විසින් ලබා දී ඇති දුර ප්රමාණය i වන අතර idx , එහි දර්ශකය keys_store වේ.
38distance,idx=index.search(queries.numpy(),10)
ලබාගන්න f(ci)
41keys\_found=queries.new\_tensor(keys\_store[idx])
ලබාගන්න wi
43vals\_found=torch.tensor(vals\_store[idx]).squeeze(-1)
සාමාන්යකරණයකරන ලද දෛශික අතර කොසයින් සමානතාවය ගණනය කිරීමට අපි යන්නෙමු
සාමාන්යකරන්න f(ci)
48keys\_found\_n=keys\_found/torch.sqrt((keys\_found\*\*2).sum(-1,keepdims=True)+1e-10)
සාමාන්යකරන්න f(ct)
50queries\_n=queries/torch.sqrt((queries\*\*2).sum(-1,keepdims=True)+1e-10)
තිත්නිෂ්පාදන, හෝ කොසයින් සමානකම ලබා ගන්න
53dot\_prod=(keys\_found\_n\*queries\_n.unsqueeze(1)).sum(-1)
ටෝකන්-නැණවත්පිවිසුම්
56logits\_token=dot\_prod.new\_zeros(queries.shape[0],n\_tokens)
ආසන්නතමඅසල්වැසියන් මත පදනම්ව ටෝකන් ලොග්ස් විසිරීම සහ රැස් කිරීම
58\_=logits\_token.scatter\_(dim=1,index=vals\_found,src=dot\_prod,reduce='add')
පිවිසුම්නැවත සකස් කරන්න
61logits\_token=logits\_token.reshape(queries\_shape[0],queries\_shape[1],-1)6263returnlogits\_token
අපි k-NN අනාවැකිය හා ට්රාන්ස්ෆෝමර් අනාවැකිය මත ඒකාබද්ධ වලංගු අහිමි ගණනය. k-NN ආකෘතියට ලබා දී ඇති බර ලබා දෙනු ලැබේ knn_weight . එය පඩි ලැයිස්තුවක් වන අතර අපි එක් එක් සඳහා වලංගු කිරීමේ අලාභය ගණනය කරමු.
66defvalidation\_loss(knn\_weights:List[float],last\_n:Optional[int],conf:Configs,index:faiss.IndexFlatL2,67keys\_store:np.ndarray,vals\_store:np.ndarray):
එක්එක් සඳහා පාඩු ලැයිස්තුව knn_weights
77losses=[[]for\_inknn\_weights]
එක්එක් කාණ්ඩයේ සාම්පල ගණන
79n\_samples=[]80withtorch.no\_grad():
වලංගුදත්ත හරහා නැවත
82fori,batchinmonit.enum("Validation",conf.validator.data\_loader,is\_children\_silent=True):
දත්තසහ ඉලක්ක ලේබල ලබා ගන්න
84data,target=batch[0].to(conf.device),batch[1].to(conf.device)
ආකෘතියධාවනය කර අනාවැකි ලබා ගන්න p(wt,ct)
86res=conf.model(data)
k-NN අනාවැකි ලබා ගන්න
88res\_knn=knn(conf.model.ff\_input.cpu(),index,keys\_store,vals\_store,conf.n\_tokens)89res\_knn=res\_knn.to(conf.device)
මෙය last_n ටෝකන සඳහා වන අලාභය පමණක් ගණනය කිරීමයි. මෙය වැදගත් වන්නේ ට්රාන්ස්ෆෝමර් ආකෘතියේ පළමු අනාවැකි (අනුක්රමය ඔස්සේ) දෙස බැලීමට අතීත ටෝකන ඉතා අල්පය.
94iflast\_n:95res=res[-last\_n:]96res\_knn=res\_knn[-last\_n:]97target=target[-last\_n:]
සාම්පලගණන
100n\_s=res.shape[0]\*data.shape[1]101n\_samples.append(n\_s)
එක්එක් සඳහා ලකුණු ගණනය කරන්න knn_weights .
104fori,cinenumerate(knn\_weights):
අලාභයගණනය කරන්න
106loss=conf.loss\_func(res\_knn\*c+(1-c)\*res,target)107losses[i].append(loss\*n\_s)108109returnlosses,n\_samples
112defload\_index(conf:Configs,n\_probe:int=8):
මානයන් f(ci)
117d\_model=conf.transformer.d\_model
පුහුණුදත්ත පැටවුම
119data\_loader=conf.trainer.data\_loader
සන්දර්භයන්ගණන; එනම් පුහුණු දත්තවල ටෝකන ගණන us ණ එකක්. (f(ci),wi)
සඳහා i∈[2,T]
122n\_keys=data\_loader.data.shape[0]\*data\_loader.data.shape[1]-1
FAISSදර්ශකය පැටවීම
125withmonit.section('Load index'):126index=faiss.read\_index(str(lab.get\_data\_path()/'faiss.index'))
පරීක්ෂණසඳහා සෛල ගණන සකසන්න
128index.nprobe=n\_probe
මතකයසිතියම් ගත කළ අංකුර අරා පටවන්න
131keys\_store=np.memmap(str(lab.get\_data\_path()/'keys.npy'),dtype=np.float32,mode='r',shape=(n\_keys,d\_model))132vals\_store=np.memmap(str(lab.get\_data\_path()/'vals.npy'),dtype=np.int,mode='r',shape=(n\_keys,1))133134returnindex,keys\_store,vals\_store
137defmain():138fromlabml\_nn.transformers.knn.build\_indeximportload\_experiment
අත්හදාබැලීම පූරණය කරන්න. ආකෘතිය පුහුණුකිරීමෙන් ඔබ uuid ධාවනය සමඟ uuid ධාවනය කරන්න.
141conf=load\_experiment('4984b85c20bf11eb877a69c1a03717cd')
ඇගයීම්ප්රකාරයට ආකෘතිය සකසන්න
143conf.model.eval()
පැටවුම්දර්ශකය
146index,keys\_store,vals\_store=load\_index(conf)
k-NN අනාවැකිය ලබා දී ඇති බර ලැයිස්තුව. එක් එක් බර සඳහා වලංගු කිරීමේ අලාභය අපි ඇගයීමට ලක් කරන්නෙමු
149knn\_weights=[i/20foriinrange(10)]
වලංගුකිරීමේ අලාභය තක්සේරු කරන්න
151losses,n\_samples=validation\_loss(knn\_weights,None,conf,index,keys\_store,vals\_store)
එක්එක් සඳහා පාඩු ප්රතිදානය knn_weights කරන්න.
153inspect({c:np.sum(losses[i])/np.sum(n\_samples)fori,cinenumerate(knn\_weights)})154155156if\_\_name\_\_=='\_\_main\_\_':157main()