From 88c5f939a8cbf5a2cce6cf0de5927c4e85ff7fa2 Mon Sep 17 00:00:00 2001 From: wxywb Date: Thu, 3 Nov 2022 11:32:50 +0800 Subject: [PATCH] update the operator. Signed-off-by: wxywb --- albef.py | 69 +++++++++++++----- configs/Grounding.yaml | 33 +++++++++ configs/NLVR.yaml | 25 +++++++ configs/NLVR_pretrain.yaml | 25 +++++++ configs/Pretrain.yaml | 29 ++++++++ configs/Retrieval_coco.yaml | 31 ++++++++ configs/Retrieval_flickr.yaml | 31 ++++++++ configs/VE.yaml | 25 +++++++ configs/VQA.yaml | 32 ++++++++ configs/config_bert.json | 21 ++++++ models/__pycache__/__init__.cpython-38.pyc | Bin 140 -> 0 bytes .../model_retrieval.cpython-38.pyc | Bin 6302 -> 0 bytes .../tokenization_bert.cpython-38.pyc | Bin 19556 -> 0 bytes models/__pycache__/vit.cpython-38.pyc | Bin 8249 -> 0 bytes models/__pycache__/xbert.cpython-38.pyc | Bin 55151 -> 0 bytes 15 files changed, 304 insertions(+), 17 deletions(-) create mode 100644 configs/Grounding.yaml create mode 100644 configs/NLVR.yaml create mode 100644 configs/NLVR_pretrain.yaml create mode 100644 configs/Pretrain.yaml create mode 100644 configs/Retrieval_coco.yaml create mode 100644 configs/Retrieval_flickr.yaml create mode 100644 configs/VE.yaml create mode 100644 configs/VQA.yaml create mode 100644 configs/config_bert.json delete mode 100644 models/__pycache__/__init__.cpython-38.pyc delete mode 100644 models/__pycache__/model_retrieval.cpython-38.pyc delete mode 100644 models/__pycache__/tokenization_bert.cpython-38.pyc delete mode 100644 models/__pycache__/vit.cpython-38.pyc delete mode 100644 models/__pycache__/xbert.cpython-38.pyc diff --git a/albef.py b/albef.py index 7f60539..6b129fa 100644 --- a/albef.py +++ b/albef.py @@ -18,19 +18,25 @@ from PIL import Image import torch import yaml from torchvision import transforms +from urllib.parse import urlparse +from timm.models.hub import download_cached_file from towhee.types.image_utils import to_pil from towhee.operator.base import NNOperator, OperatorFlag from towhee.types.arg import arg, to_image_color from towhee import register +def is_url(url_or_filename): + parsed = urlparse(url_or_filename) + return parsed.scheme in ("http", "https") + @register(output_schema=['vec']) class Albef(NNOperator): """ ALBEF multi-modal embedding operator """ - def prepare_model(checkpoint_path, model): - checkpoint = torch.load(checkpoint_path, map_location='cpu') + def prepare_model(self, checkpoint_path, model, interpolate_pos_embed): + checkpoint = self.load_checkpoint(checkpoint_path) state_dict = checkpoint['model'] pos_embed_reshaped = interpolate_pos_embed(state_dict['visual_encoder.pos_embed'],model.visual_encoder) state_dict['visual_encoder.pos_embed'] = pos_embed_reshaped @@ -42,23 +48,44 @@ class Albef(NNOperator): state_dict[encoder_key] = state_dict[key] del state_dict[key] msg = model.load_state_dict(state_dict,strict=False) - print('load checkpoint from ' + checkpoint_path) return model + + def load_checkpoint(self, url_or_filename): + if is_url(url_or_filename): + cached_file = download_cached_file(url_or_filename, check_hash=False, progress=True) + checkpoint = torch.load(cached_file, map_location='cpu') + elif os.path.isfile(url_or_filename): + checkpoint = torch.load(url_or_filename, map_location='cpu') + else: + raise RuntimeError('checkpoint url or path is invalid') + + return checkpoint def __init__(self, model_name: str, modality: str): self.modality = modality config = self._configs()[model_name] + path = str(Path(__file__).parent) + sys.path.append(path) + + from models.model_retrieval import ALBEF + from models.vit import interpolate_pos_embed + from models.tokenization_bert import BertTokenizer + sys.path.pop() + self.device = "cuda" if torch.cuda.is_available() else "cpu" normalize = transforms.Normalize((0.48145466, 0.4578275, 0.40821073), (0.26862954, 0.26130258, 0.27577711)) - tokenizer = BertTokenizer.from_pretrained(config) - model = ALBEF(config=config, text_encoder=config['text_encoder'], tokenizer=tokenizer) - cfg = yaml.load(open(config['cfg'], 'r'), Loader=yaml.Loader) - checkpoint_path = cfg['ckpt_path'] + tokenizer = BertTokenizer.from_pretrained(config['text_encoder']) + self.tokenizer = tokenizer - self.model = self.prepare_model(checkpoint_path, model) + cfg = yaml.load(open(path + '/' + config['cfg_path'], 'r'), Loader=yaml.Loader) + cfg['bert_config'] = path + '/' + cfg['bert_config'] + model = ALBEF(config=cfg, text_encoder=config['text_encoder'], tokenizer=tokenizer) + checkpoint_path = config['weights'] + self.model = self.prepare_model(checkpoint_path, model, interpolate_pos_embed) + self.test_transform = transforms.Compose([ transforms.Resize((cfg['image_res'],cfg['image_res']),interpolation=Image.BICUBIC), transforms.ToTensor(), @@ -90,16 +117,20 @@ class Albef(NNOperator): return results def _inference_from_text(self, text): - tokens = self.text_tokenizer(text, return_tensors='pt', padding=True)['input_ids'].to(self.device) - text_features = self.text_encoder(tokens).logits - return text_features + text_input = self.tokenizer(text, padding='max_length', truncation=True, max_length=30, return_tensors="pt").to(self.device) + + text_output = self.model.text_encoder(text_input.input_ids, attention_mask = text_input.attention_mask, mode='text') + text_feat = text_output.last_hidden_state + text_embed = self.model.text_proj(text_feat[:,0,:]) + return text_embed @arg(1, to_image_color('RGB')) def _inference_from_image(self, img): image = to_pil(img) - image = self.processor(images=image, return_tensors="pt").to(self.device) - image_features = self.clip_model.get_image_features(**image) - return image_features + image = self.test_transform(image).unsqueeze(0) + image_feat = self.model.visual_encoder(image) + image_embed = self.model.vision_proj(image_feat[:,0,:]) + return image_embed def _configs(self): config = {} @@ -107,7 +138,11 @@ class Albef(NNOperator): config['albef_4m']['tokenizer'] = 'bert-base-uncased' config['albef_4m']['text_encoder'] = 'bert-base-uncased' config['albef_4m']['cfg_path'] = './configs/Retrieval_flickr.yaml' - config['albef_4m']['ckpt_path'] = '' - - + config['albef_4m']['weights'] = 'https://storage.googleapis.com/sfr-pcl-data-research/ALBEF/ALBEF_4M.pth' + config['albef_14m'] = {} + config['albef_14m']['tokenizer'] = 'bert-base-uncased' + config['albef_14m']['text_encoder'] = 'bert-base-uncased' + config['albef_14m']['cfg_path'] = './configs/Retrieval_flickr.yaml' + config['albef_14m']['weights'] = 'https://storage.googleapis.com/sfr-pcl-data-research/ALBEF/ALBEF.pth' + return config diff --git a/configs/Grounding.yaml b/configs/Grounding.yaml new file mode 100644 index 0000000..d90bd5b --- /dev/null +++ b/configs/Grounding.yaml @@ -0,0 +1,33 @@ +train_file: ['data/refcoco+_train.json'] +test_file: ['data/refcoco+_val.json','data/refcoco+_test.json'] + +refcoco_data: 'data' +det_file: 'data/refcoco+/dets.json' +coco_file: 'data/refcoco+/cocos.json' + +image_root: '/export/share/datasets/vision/coco/images/' + +bert_config: 'configs/config_bert.json' + +image_res: 384 +batch_size: 32 + +queue_size: 65536 +momentum: 0.995 +vision_width: 768 +embed_dim: 256 +temp: 0.07 + +alpha: 0.4 +distill: True +warm_up: True + +optimizer: {opt: adamW, lr: 1e-5, weight_decay: 0.02} +schedular: {sched: cosine, lr: 1e-5, epochs: 5, min_lr: 1e-6, decay_rate: 1, warmup_lr: 1e-5, warmup_epochs: 1, cooldown_epochs: 0} + + + + + + + diff --git a/configs/NLVR.yaml b/configs/NLVR.yaml new file mode 100644 index 0000000..9baca1d --- /dev/null +++ b/configs/NLVR.yaml @@ -0,0 +1,25 @@ +train_file: ['data/nlvr_train.json'] +val_file: ['data/nlvr_dev.json'] +test_file: ['data/nlvr_test.json'] + +image_root: '/export/share/datasets/vision/NLVR2/' + +image_res: 384 +batch_size: 16 + +bert_config: 'configs/config_bert.json' + +alpha: 0.4 +distill: True +warm_up: True +eval_ema: False + +optimizer: {opt: adamW, lr: 2e-5, weight_decay: 0.02} +schedular: {sched: cosine, lr: 2e-5, epochs: 10, min_lr: 1e-6, decay_rate: 1, warmup_lr: 1e-5, warmup_epochs: 1, cooldown_epochs: 0} + + + + + + + diff --git a/configs/NLVR_pretrain.yaml b/configs/NLVR_pretrain.yaml new file mode 100644 index 0000000..bc93f40 --- /dev/null +++ b/configs/NLVR_pretrain.yaml @@ -0,0 +1,25 @@ +train_file: ['data/coco.json', + 'data/vg.json', + 'data/cc3m_train.json', + 'data/cc3m_val.json', + 'data/sbu.json' + ] + +# each train_file (json) contains a python list where each item is {'image': img_path, 'caption': text or list_of_text } + +bert_config: 'configs/config_bert.json' + +image_res: 256 +vision_width: 768 +embed_dim: 256 +batch_size: 64 + +optimizer: {opt: adamW, lr: 2e-5, weight_decay: 0.02} +schedular: {sched: cosine, lr: 2e-5, epochs: 1, min_lr: 1e-5, decay_rate: 1, warmup_lr: 1e-5, warmup_epochs: 1, cooldown_epochs: 0} + + + + + + + diff --git a/configs/Pretrain.yaml b/configs/Pretrain.yaml new file mode 100644 index 0000000..0e22d2d --- /dev/null +++ b/configs/Pretrain.yaml @@ -0,0 +1,29 @@ +train_file: ['data/coco.json', + 'data/vg.json', + 'data/cc12m.json', + 'data/cc3m_train.json', + 'data/cc3m_val.json', + 'data/sbu.json' + ] +# each train_file (json) contains a python list where each item is {'image': img_path, 'caption': text or list_of_text } +bert_config: 'configs/config_bert.json' + +image_res: 256 +vision_width: 768 +embed_dim: 256 +batch_size: 64 +temp: 0.07 +mlm_probability: 0.15 +queue_size: 65536 +momentum: 0.995 +alpha: 0.4 + +optimizer: {opt: adamW, lr: 1e-4, weight_decay: 0.02} +schedular: {sched: cosine, lr: 1e-4, epochs: 30, min_lr: 1e-5, decay_rate: 1, warmup_lr: 1e-5, warmup_epochs: 20, cooldown_epochs: 0} + + + + + + + diff --git a/configs/Retrieval_coco.yaml b/configs/Retrieval_coco.yaml new file mode 100644 index 0000000..30e0a6b --- /dev/null +++ b/configs/Retrieval_coco.yaml @@ -0,0 +1,31 @@ +train_file: ['data/coco_train.json'] +val_file: 'data/coco_val.json' +test_file: 'data/coco_test.json' +image_root: '/export/share/datasets/vision/coco/images/' + +bert_config: 'configs/config_bert.json' + +image_res: 384 +batch_size_train: 32 +batch_size_test: 64 + +queue_size: 65536 +momentum: 0.995 +vision_width: 768 +embed_dim: 256 +temp: 0.07 +k_test: 256 + +alpha: 0.4 +distill: True +warm_up: True + +optimizer: {opt: adamW, lr: 1e-5, weight_decay: 0.02} +schedular: {sched: cosine, lr: 1e-5, epochs: 5, min_lr: 1e-6, decay_rate: 1, warmup_lr: 1e-5, warmup_epochs: 1, cooldown_epochs: 0} + + + + + + + diff --git a/configs/Retrieval_flickr.yaml b/configs/Retrieval_flickr.yaml new file mode 100644 index 0000000..4b7d626 --- /dev/null +++ b/configs/Retrieval_flickr.yaml @@ -0,0 +1,31 @@ +train_file: ['data/flickr30k_train.json'] +val_file: 'data/flickr30k_val.json' +test_file: 'data/flickr30k_test.json' +image_root: '/export/share/datasets/vision/flickr30k/' #flickr30k-images/ + +bert_config: 'configs/config_bert.json' + +image_res: 384 +batch_size_train: 32 +batch_size_test: 64 + +queue_size: 65536 +momentum: 0.995 +vision_width: 768 +embed_dim: 256 +temp: 0.07 +k_test: 128 + +alpha: 0.4 +distill: True +warm_up: True + +optimizer: {opt: adamW, lr: 1e-5, weight_decay: 0.02} +schedular: {sched: cosine, lr: 1e-5, epochs: 10, min_lr: 1e-6, decay_rate: 1, warmup_lr: 1e-5, warmup_epochs: 1, cooldown_epochs: 0} + + + + + + + diff --git a/configs/VE.yaml b/configs/VE.yaml new file mode 100644 index 0000000..baf70a6 --- /dev/null +++ b/configs/VE.yaml @@ -0,0 +1,25 @@ +train_file: 'data/ve_train.json' +val_file: 'data/ve_dev.json' +test_file: 'data/ve_test.json' + +image_root: '/export/home/project/SNLI-VE/data/images' + +image_res: 384 +batch_size_train: 32 +batch_size_test: 64 + +alpha: 0.4 +distill: True +warm_up: False + +bert_config: 'configs/config_bert.json' + +optimizer: {opt: adamW, lr: 2e-5, weight_decay: 0.02} +schedular: {sched: cosine, lr: 2e-5, epochs: 5, min_lr: 1e-6, decay_rate: 1, warmup_lr: 1e-5, warmup_epochs: 1, cooldown_epochs: 0} + + + + + + + diff --git a/configs/VQA.yaml b/configs/VQA.yaml new file mode 100644 index 0000000..f379338 --- /dev/null +++ b/configs/VQA.yaml @@ -0,0 +1,32 @@ +train_file: ['data/vqa_train.json', + 'data/vqa_val.json', + 'data/vg_qa.json'] + +test_file: ['data/vqa_test.json'] +answer_list: 'data/answer_list.json' + +vqa_root: '/export/share/datasets/vision/VQA/Images/mscoco/' #train2014/ +vg_root: '/export/share/datasets/vision/visual-genome/' #image/ + +image_res: 384 +batch_size_train: 32 +batch_size_test: 16 +k_test: 128 + +alpha: 0.4 +distill: True +warm_up: True + +eos: '[SEP]' + +bert_config: 'configs/config_bert.json' + +optimizer: {opt: adamW, lr: 2e-5, weight_decay: 0.02} +schedular: {sched: cosine, lr: 2e-5, epochs: 8, min_lr: 1e-6, decay_rate: 1, warmup_lr: 1e-5, warmup_epochs: 4, cooldown_epochs: 0} + + + + + + + diff --git a/configs/config_bert.json b/configs/config_bert.json new file mode 100644 index 0000000..48a8449 --- /dev/null +++ b/configs/config_bert.json @@ -0,0 +1,21 @@ +{ + "architectures": [ + "BertForMaskedLM" + ], + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 768, + "initializer_range": 0.02, + "intermediate_size": 3072, + "layer_norm_eps": 1e-12, + "max_position_embeddings": 512, + "model_type": "bert", + "num_attention_heads": 12, + "num_hidden_layers": 12, + "pad_token_id": 0, + "type_vocab_size": 2, + "vocab_size": 30522, + "fusion_layer": 6, + "encoder_width": 768 +} diff --git a/models/__pycache__/__init__.cpython-38.pyc b/models/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 91c077913c8fd343afe5fdfdb3f3e377ee3ae46e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 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 diff --git a/models/__pycache__/tokenization_bert.cpython-38.pyc b/models/__pycache__/tokenization_bert.cpython-38.pyc deleted file mode 100644 index 40946499a83bed9438f399ac40e4618cac1030ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19556 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 diff --git a/models/__pycache__/vit.cpython-38.pyc b/models/__pycache__/vit.cpython-38.pyc deleted file mode 100644 index 337092ff9dc369d6bd48881dbb8f560d2fb88075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8249 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