Views
No views yet
1
2# 1. Copy "kinya-ag-retrieval" dataset from Hugging face into a local directory, e.g. /home/ubuntu/DATA/kinya-ag-retrieval/
3
4# 2. Copy "kinyabert_base_pretrained.pt" model into a local directory, e.g. /home/ubuntu/DATA/kinyabert_base_pretrained.pt
5
6# 3. Run the following training script from DeepKIN-AgAI package:
7
8python3 DeepKIN-AgAI/deepkin/train/flex_trainer.py \
9 --model_variant="kinya_colbert:base" \
10 --colbert_embedding_dim=512 \
11 --gpus=1 \
12 --batch_size=12 \
13 --accumulation_steps=10 \
14 --dataloader_num_workers=4 \
15 --dataloader_persistent_workers=True \
16 --dataloader_pin_memory=True \
17 --use_ddp=False \
18 --use_mtl_optimizer=False \
19 --warmup_iter=2000 \
20 --peak_lr=1e-5 \
21 --lr_decay_style="cosine" \
22 --num_iters=152630 \
23 --dataset_max_seq_len=512 \
24 --use_iterable_dataset=False \
25 --train_log_steps=1 \
26 --checkpoint_steps=1000 \
27 --pretrained_bert_model_file="/home/ubuntu/DATA/kinyabert_base_pretrained.pt" \
28 --qa_train_query_id="/home/ubuntu/DATA/kinya-ag-retrieval/rw_ag_retrieval_query_id.txt" \
29 --qa_train_query_text="/home/ubuntu/DATA/kinya-ag-retrieval/parsed_rw_ag_retrieval_query_text.txt" \
30 --qa_train_passage_id="/home/ubuntu/DATA/kinya-ag-retrieval/rw_ag_retrieval_passage_id.txt" \
31 --qa_train_passage_text="/home/ubuntu/DATA/kinya-ag-retrieval/parsed_rw_ag_retrieval_passage_text.txt" \
32 --qa_train_qpn_triples="/home/ubuntu/DATA/kinya-ag-retrieval/rw_ag_retrieval_qpntriplets_all.tsv" \
33 --qa_dev_query_id="/home/ubuntu/DATA/kinya-ag-retrieval/rw_ag_retrieval_query_id.txt" \
34 --qa_dev_query_text="/home/ubuntu/DATA/kinya-ag-retrieval/parsed_rw_ag_retrieval_query_text.txt" \
35 --qa_dev_passage_id="/home/ubuntu/DATA/kinya-ag-retrieval/rw_ag_retrieval_passage_id.txt" \
36 --qa_dev_passage_text="/home/ubuntu/DATA/kinya-ag-retrieval/parsed_rw_ag_retrieval_passage_text.txt" \
37 --qa_dev_qpn_triples="/home/ubuntu/DATA/kinya-ag-retrieval/rw_ag_retrieval_qpntriplets_dev.tsv" \
38 --load_saved_model=True \
39 --model_save_path="/home/ubuntu/DATA/kinya_colbert_base_rw_ag_retrieval_new.pt"
40
411
2# Launch a daemon container
3
4docker run -d -v /home/ubuntu/MORPHODATA:/MORPHODATA \
5 --gpus all morphokin:latest morphokin \
6 --morphokin_working_dir /MORPHODATA \
7 --morphokin_config_file /MORPHODATA/data/analysis_config_file.conf \
8 --task RMS \
9 --kinlp_license /MORPHODATA/licenses/KINLP_LICENSE_FILE.dat \
10 --ca_roots_pem_file /MORPHODATA/data/roots.pem \
11 --morpho_socket /MORPHODATA/run/morpho.sock
12
131
2docker container ls
3
4docker logs -f <CONTAINER ID>
5
6# MorphoKIN server is ready once you see a message like this: MorphoKin server listening on UNIX SOCKET: /MORPHODATA/run/morpho.sock
71
2mkdir -p /home/ubuntu/DATA/agai_index
3
4python3 DeepKIN-AgAI/deepkin/production/agai_backend.py
51import progressbar
2import torch
3import torch.nn.functional as F
4
5from deepkin.clib.libkinlp.kinlpy import ParsedFlexSentence
6from deepkin.data.morpho_qa_triple_data import DOCUMENT_TYPE_ID, QUESTION_TYPE_ID
7from deepkin.models.kinyabert import KinyaColBERT
8from deepkin.utils.misc_functions import read_lines
9
10DATA_DIR = '/home/ubuntu/DATA'
11rank = 0
12pretrained_model_file = f'{DATA_DIR}/kinya_colbert_large_rw_ag_retrieval_finetuned_512D.pt'
13keyword = f'kinya_colbert_large'
14
15qa_query_id = f'{DATA_DIR}/kinya-ag-retrieval/rw_ag_retrieval_query_id.txt'
16qa_query_text = f'{DATA_DIR}/kinya-ag-retrieval/parsed_rw_ag_retrieval_query_text.txt'
17qa_passage_id = f'{DATA_DIR}/kinya-ag-retrieval/rw_ag_retrieval_passage_id.txt'
18qa_passage_text = f'{DATA_DIR}/kinya-ag-retrieval/parsed_rw_ag_retrieval_passage_text.txt'
19
20all_queries = {idx: ParsedFlexSentence(txt) for idx, txt in zip(read_lines(qa_query_id), read_lines(qa_query_text))}
21all_passages = {idx: ParsedFlexSentence(txt) for idx, txt in zip(read_lines(qa_passage_id), read_lines(qa_passage_text))}
22
23print(f'Got: {len(all_queries)} queries, {len(all_passages)} passages', flush=True)
24
25device = torch.device('cuda:%d' % rank)
26
27model, args = KinyaColBERT.from_pretrained(device, pretrained_model_file, ret_args=True)
28model.float()
29model.eval()
30
31passage_embeddings = dict()
32DocPool = None
33QueryPool = None
34with torch.no_grad():
35 print(f'{keyword} Embedding passages ...', flush=True)
36 with progressbar.ProgressBar(max_value=len(all_passages), redirect_stdout=True) as bar:
37 for itr, (passage_id, passage) in enumerate(all_passages.items()):
38 if (itr % 100) == 0:
39 bar.update(itr)
40 passage.trim(508)
41 with torch.no_grad():
42 D = model.get_colbert_embeddings([passage], DOCUMENT_TYPE_ID)
43 DocPool = D.view(-1,D.size(-1)) if DocPool is None else torch.cat((DocPool, D.view(-1,D.size(-1))))
44 passage_embeddings[passage_id] = D
45
46 query_embeddings = dict()
47 Doc_Mean = DocPool.mean(dim=0)
48 Doc_Stdev = DocPool.std(dim=0)
49 del DocPool
50 print(f'{keyword} Embedding queries ...', flush=True)
51 with progressbar.ProgressBar(max_value=len(all_queries), redirect_stdout=True) as bar:
52 for itr, (query_id, query) in enumerate(all_queries.items()):
53 if (itr % 1000) == 0:
54 bar.update(itr)
55 query.trim(508)
56 with torch.no_grad():
57 Q = model.get_colbert_embeddings([query], QUESTION_TYPE_ID)
58 QueryPool = Q.view(-1, Q.size(-1)) if QueryPool is None else torch.cat((QueryPool, Q.view(-1, Q.size(-1))))
59 query_embeddings[query_id] = Q
60
61 Query_Mean = QueryPool.mean(dim=0)
62 Query_Stdev = QueryPool.std(dim=0)
63 del QueryPool
64
65 dev_triples = f'{DATA_DIR}/kinya-ag-retrieval/rw_ag_retrieval_qpntriplets_dev.tsv'
66 test_triples = f'{DATA_DIR}/kinya-ag-retrieval/rw_ag_retrieval_qpntriplets_test.tsv'
67
68 EVAL_SETS = [('DEV', dev_triples),
69 ('TEST', test_triples)]
70
71for eval_set_name, eval_qpn_triples in EVAL_SETS:
72 eval_query_to_passage_ids = {(line.split('\t')[0]): (line.split('\t')[1]) for line in read_lines(eval_qpn_triples)}
73 Top = [1, 5, 10, 20, 30]
74 TopAcc = [0.0 for _ in Top]
75 MTop = [5, 10, 20, 30]
76 MRR = [0.0 for _ in MTop]
77 Total = 0.0
78 for itr,(query_id,target_doc_id) in enumerate(eval_query_to_passage_ids.items()):
79 query = all_queries[query_id]
80 with torch.no_grad():
81 Q = model.get_colbert_embeddings([query], QUESTION_TYPE_ID)
82 Q = (Q - Query_Mean) / Query_Stdev
83 Q = F.normalize(Q, p=2, dim=2)
84 results = []
85 for doc_id,D in passage_embeddings.items():
86 D = (D - Doc_Mean) / Doc_Stdev
87 D = F.normalize(D, p=2, dim=2)
88 with torch.no_grad():
89 score = model.pairwise_score(Q,D).squeeze().item()
90 score = score / Q.size(1)
91 results.append((score, doc_id))
92 Total += 1.0
93 results = sorted(results, key=lambda x: x[0], reverse=True)
94 for i, t in enumerate(Top):
95 TopAcc[i] += (1.0 if (target_doc_id in {idx for sc, idx in results[:t]}) else 0.0)
96 for i, t in enumerate(MTop):
97 top_rr = [(1 / (i + 1)) for i, (sc, idx) in enumerate(results[:t]) if idx == target_doc_id]
98 MRR[i] += (top_rr[0] if (len(top_rr) > 0) else 0.0)
99 print(f'-------------------------------------------------------------------------------------------------')
100 for i, t in enumerate(Top):
101 print(f'@{eval_set_name} Final {keyword}-{args.colbert_embedding_dim} kinya-ag-retrieval {eval_set_name} Set Top#{t} Accuracy:',
102 f'{(100.0 * TopAcc[i] / Total): .1f}% ({TopAcc[i]:.0f} / {Total:.0f})')
103 for i, t in enumerate(MTop):
104 print(f'@{eval_set_name} Final {keyword}-{args.colbert_embedding_dim} kinya-ag-retrieval {eval_set_name} Set MRR@{t}:',
105 f'{(100.0 * MRR[i] / Total): .1f}% ({MRR[i]:.0f} / {Total:.0f})')
106 print(f'-------------------------------------------------------------------------------------------------', flush=True)
107
1081from deepkin.utils.misc_functions import read_lines
2from ragatouille import RAGPretrainedModel
3
4keyword = 'agai-colbert-10000'
5print(f'Evaluating {keyword} ...', flush=True)
6qa_query_id = 'kinya-ag-retrieval/rw_ag_retrieval_query_id.txt'
7qa_query_text = 'kinya-ag-retrieval/rw_ag_retrieval_query_text.txt'
8
9all_queries = {idx: txt for idx, txt in zip(read_lines(qa_query_id), read_lines(qa_query_text))}
10
11print(f'Got: {len(all_queries)} queries', flush=True)
12
13RAG = RAGPretrainedModel.from_index(f'ragatouille-kinya-colbert/indexes/agai-colbert-10000/')
14
15dev_triples = 'kinya-ag-retrieval/rw_ag_retrieval_qpntriplets_dev.tsv'
16test_triples = 'kinya-ag-retrieval/rw_ag_retrieval_qpntriplets_test.tsv'
17
18EVAL_SETS = [('DEV', dev_triples),
19 ('TEST', test_triples)]
20
21for eval_set_name, eval_qpn_triples in EVAL_SETS:
22 eval_query_to_passage_ids = {(line.split('\t')[0]): (line.split('\t')[1]) for line in
23 read_lines(eval_qpn_triples)}
24 Top = [1, 5, 10, 20, 30]
25 TopAcc = [0.0 for _ in Top]
26 MTop = [5, 10, 20, 30]
27 MRR = [0.0 for _ in MTop]
28 Total = 0.0
29 for itr, (query_id, target_doc_id) in enumerate(eval_query_to_passage_ids.items()):
30 query = all_queries[query_id]
31 results = RAG.search(query=query, k=max(max(50, max(Top)), max(MTop)))
32 results = [(d['score'],d['document_id']) for d in results]
33 Total += 1.0
34 results = sorted(results, key=lambda x: x[0], reverse=True)
35 for i, t in enumerate(Top):
36 TopAcc[i] += (1.0 if (target_doc_id in {idx for sc, idx in results[:t]}) else 0.0)
37 for i, t in enumerate(MTop):
38 top_rr = [(1 / (i + 1)) for i, (sc, idx) in enumerate(results[:t]) if idx == target_doc_id]
39 MRR[i] += (top_rr[0] if (len(top_rr) > 0) else 0.0)
40 print(f'-------------------------------------------------------------------------------------------------')
41 for i, t in enumerate(Top):
42 print(f'@{eval_set_name} Final {keyword} kinya-ag-retrieval {eval_set_name} Set Top#{t} Accuracy:',
43 f'{(100.0 * TopAcc[i] / Total): .1f}% ({TopAcc[i]:.0f} / {Total:.0f})')
44 for i, t in enumerate(MTop):
45 print(f'@{eval_set_name} Final {keyword} kinya-ag-retrieval {eval_set_name} Set MRR@{t}:',
46 f'{(100.0 * MRR[i] / Total): .1f}% ({MRR[i]:.0f} / {Total:.0f})')
47 print(f'-------------------------------------------------------------------------------------------------',
48 flush=True)
49
50