docs/si/transformers/retro/database.html
මෙයවේ දත්ත සමුදාය සාදන්න සහ RETRO ආකෘතියසඳහා ළඟම අසල්වැසියන් ලබා ගනී.
කඩදාසිScanN පුස්තකාලය භාවිතා කර ඇති අතර දත්ත සමුදාය සඳහා අපි FaISS පුස්තකාලය භාවිතා කරමු.
16fromtypingimportList,Optional1718importfaiss19importnumpyasnp20importtorch2122fromlabmlimportlab,monit23fromlabml\_helpers.datasets.textimportTextFileDataset24fromlabml\_nn.transformers.retro.bert\_embeddingsimportBERTChunkEmbeddings
chunk_len යනු කුට්ටියක දිග (අක්ෂර ගණන)batch_size ගණනය කිරීමේදී භාවිතා කළ යුතු කණ්ඩායම් ප්රමාණයයි BERT(N)d_embFAISS දර්ශකයේ තෝරා ගැනීම සඳහා BERT(N) කාවැද්දීම් ලැයිස්තු වල විශේෂාංග ගණන වේn_centeroids දර්ශකයේ ලැයිස්තු ගණනcode_size දර්ශකයේ කේතනය කරන ලද දෛශික ප්රමාණයn_probe විමර්ශනය කළ යුතු ලැයිස්තු ගණන27defbuild\_database(chunk\_len:int=16,batch\_size:int=64,d\_emb:int=768,n\_centeroids:int=256,28code\_size:int=64,n\_probe:int=8,n\_train:int=50\_000):
දත්තසමුදාය පෙළ ගොනුව පූරණය කරන්න
43dataset=TextFileDataset(44lab.get\_data\_path()/'tiny\_shakespeare.txt',45list,46url='https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt')
පුහුණුදත්ත ලබා ගන්න (නූලක්)
49text=dataset.train
පෙළකැබලි වලට බෙදන්න chunk_length
52chunks=[text[i:i+chunk\_len]foriinrange(0,len(text),chunk\_len)ifi+chunk\_len\*2\<len(text)]
එක්එක් කුට්ටි වල ඕෆ්සෙට් ලබා ගන්න
54chunk\_offsets=np.array([iforiinrange(0,len(text),chunk\_len)ifi+chunk\_len\*2\<len(text)])
කුට්ටිගණන
56n\_chunks=len(chunks)
ලබාගැනීම සඳහා බර්ට් ආරම්භ කරන්න BERT(N)
59bert=BERTChunkEmbeddings(torch.device('cuda:0'))
එක්එක් පුනරාවර්තනයේ කුට්ටි batch_size ගණන සැකසීම මගින් කුට්ටි කාවැද්දීම් ලබා ගන්න
62chunk\_emb=[]63foriinmonit.iterate('Get embeddings',range(0,n\_chunks,batch\_size)):64chunk\_emb.append(bert(chunks[i:i+batch\_size]).cpu())
ඒවාතනි ආතනයකට ඒකාබද්ධ කරන්න
66chunk\_emb=torch.cat(chunk\_emb,dim=0).numpy()
FAISS දර්ශකය සාදන්න
69quantizer=faiss.IndexFlatL2(d\_emb)70index=faiss.IndexIVFPQ(quantizer,d\_emb,n\_centeroids,code\_size,8)71index.nprobe=n\_probe
කුට්ටම්දර්ශකවල අහඹු නියැදියක් ලබා ගන්න
74random\_sample=np.random.choice(np.arange(n\_chunks),size=[min(n\_train,n\_chunks)],replace=False)
යතුරුගබඩා කිරීම සඳහා දර්ශකය පුහුණු කරන්න
77withmonit.section('Train index'):78index.train(chunk\_emb[random\_sample])
ප්රමාණයෙන්කාණ්ඩවල දර්ශකයට කුට්ටි එකතු කරන්න 1024
81forsinmonit.iterate('Index',range(0,n\_chunks,1024)):82e=min(s+1024,n\_chunks)
දර්ශකයටඑකතු කරන්න
84index.add\_with\_ids(chunk\_emb[s:e],chunk\_offsets[s:e])
දර්ශකයසුරකින්න
87withmonit.section('Save'):88faiss.write\_index(index,str(lab.get\_data\_path()/'retro.index'))
91classRetroIndex:
chunk_len කුටියේ දිග වේn_probe විමර්ශනය කළ යුතු ලැයිස්තු ගණනn_neighbors ලබා ගැනීමට අසල්වැසියන් සංඛ්යාවn_extra අපි විමසුම් කුට්ටියේ සමග අතිච්ඡාදනය අසල්වැසියන් ඉවත් කරනු ඇත සිට ලබා ගැනීමට අමතර අසල්වැසියන් සංඛ්යාව වේexclude_neighbor_span අතිච්ඡාදනය සඳහා පරීක්ෂා කිරීමේදී වළක්වා ගත යුතු අමතර පෙළ දිග වේ96def\_\_init\_\_(self,chunk\_len:int=16,n\_probe:int=8,97n\_neighbors:int=2,n\_extra:int=2,98exclude\_neighbor\_span:int=8):
108self.n\_neighbors=n\_neighbors109self.chunk\_len=chunk\_len110self.exclude\_neighbor\_span=exclude\_neighbor\_span111self.n\_extra=n\_extra
ලබාගැනීම සඳහා බර්ට් ආරම්භ කරන්න BERT(N)
114self.bert=BERTChunkEmbeddings(torch.device('cuda:0'))
දත්තසමුදාය පටවන්න
116withmonit.section('Load index'):117self.index=faiss.read\_index(str(lab.get\_data\_path()/'retro.index'))118self.index.nprobe=n\_probe
අසල්වාසීන්ගේතනතුරු ලබා දී ඇති neighbor_offsets අතර විමසුම් කුට්ටියේ පිහිටීම වේ offset .
120deffilter\_neighbors(self,offset:int,neighbor\_offsets:List[int]):
127return[nforninneighbor\_offsets128ifn\<offset-(self.chunk\_len+self.exclude\_neighbor\_span)129orn\>offset+(self.chunk\_len+self.exclude\_neighbor\_span)]
131def\_\_call\_\_(self,query\_chunks:List[str],offsets:Optional[List[int]]):
විමසුම්කුට්ටි ලබා ගන්න BERT(N)
137emb=self.bert(query\_chunks).cpu()
දත්තගබඩාවෙන් n_neighbors + n_extra ළඟම අසල්වැසියන් ලබා ගන්න
140distance,neighbor\_offsets=self.index.search(emb.numpy(),self.n\_neighbors+self.n\_extra)
විමසුමකුට්ටියේ ඕෆ්සෙට් අතිච්ඡාදනය කුට්ටි සිදු පෙරහන ලබා දී තිබේ නම්
143ifoffsetsisnotNone:144neighbor\_offsets=[self.filter\_neighbors(off,n\_off)145foroff,n\_offinzip(offsets,neighbor\_offsets)]
n_neighbors පෙරීමෙන් පසු ආසන්නතම දේ ලබා ගන්න
148neighbor\_offsets=[n\_off[:self.n\_neighbors]forn\_offinneighbor\_offsets]
151returnneighbor\_offsets
155if\_\_name\_\_=='\_\_main\_\_':156build\_database()