| | import torch |
| | from typing import Dict, Any, List |
| | from transformers import AutoTokenizer, AutoModelForMaskedLM |
| |
|
| | class EndpointHandler(): |
| | def __init__(self, path=""): |
| | self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
| |
|
| | |
| | self.leadership_model_name = "roberta-large-mnli" |
| | self.leadership_model_path = path + "/pet-leadership-model-roberta-large-mnli_bs4_gas4_lr1e-05_ep5" + "/checkpoint-1855" |
| | self.leadership_pattern = "Sentence: {} Question: Does this show leadership? Answer: <mask>" |
| |
|
| | |
| | self.collab_model_name = "roberta-large-mnli" |
| | self.collab_model_path = path + "/pet-collaboration-model-roberta-large-mnli_bs4_gas4_lr1e-05_ep5" + "/checkpoint-1560" |
| | self.collab_pattern = "Sentence: {} Question: Does this show teamwork? Answer: <mask>" |
| |
|
| | |
| | self.leadership_tokenizer = AutoTokenizer.from_pretrained(self.leadership_model_name) |
| | self.collab_tokenizer = AutoTokenizer.from_pretrained(self.collab_model_name) |
| | self.model_lead = AutoModelForMaskedLM.from_pretrained(self.leadership_model_path) |
| | self.model_collab = AutoModelForMaskedLM.from_pretrained(self.collab_model_path) |
| |
|
| | def __call__(self, data: Dict[str, Any]) -> List[Dict[str, Any]]: |
| | """ |
| | data args: |
| | inputs (:obj: `str` | `PIL.Image` | `np.array`) |
| | kwargs |
| | Return: |
| | A :obj:`list` | `dict`: will be serialized and returned |
| | """ |
| | sentence = data["inputs"] |
| | pl, pt, pc, pct = self.extract_skill_quality(sentence) |
| | return {"leadership": pl, "leadership_token": pt, "collaboration": pc, "collaboration_token": pct} |
| | |
| |
|
| | def predict_trait(self, model, sentence, pattern, task_name): |
| | prompt = pattern.format(sentence) |
| | |
| | tokenizer = self.leadership_tokenizer if task_name == "leadership" else self.collab_tokenizer |
| | |
| | enc = tokenizer(prompt, return_tensors="pt") |
| |
|
| | if torch.cuda.is_available(): |
| | model = model.cuda() |
| | enc = {k: v.cuda() for k, v in enc.items()} |
| |
|
| | outputs = model(**enc) |
| | logits = outputs.logits |
| |
|
| | |
| | mask_index = (enc["input_ids"] == tokenizer.mask_token_id).nonzero(as_tuple=True)[1] |
| | mask_logits = logits[0, mask_index, :] |
| |
|
| | |
| | pred_token_id = mask_logits.argmax(dim=-1).item() |
| | pred_token = tokenizer.decode([pred_token_id]).strip() |
| |
|
| | |
| | pred_label = 1 if pred_token.lower().startswith("yes") else 0 |
| | return pred_label, pred_token |
| |
|
| | def extract_skill_quality(self, sentence): |
| | |
| | pl, pt = self.predict_trait(self.model_lead, sentence, self.leadership_pattern, "leadership") |
| | |
| | pc, pct = self.predict_trait(self.model_collab, sentence, self.collab_pattern, "collaboration") |
| | return pl, pt, pc, pct |
| | |
| |
|
| | if __name__ == "__main__": |
| | |
| | from handler import EndpointHandler |
| | handler = EndpointHandler(path=".") |
| |
|
| | |
| | test_sentences = [ |
| | "I am leading a team of engineers.", |
| | "I am not leading my team.", |
| | "Exemplified the second-to-none customer service delivery in all interactions with customers and potential clients", |
| | "Collaborated with cross-functional teams to deliver the product on time.", |
| | "Finished my work on time.", |
| | "Mentored interns and coordinated weekly sync-ups." |
| | ] |
| |
|
| | |
| | for sentence in test_sentences: |
| | print(f"Sentence: \"{sentence}\"") |
| | result = handler({"inputs": sentence}) |
| | |
| | |
| | lead_token = result["leadership_token"] |
| | lead_pred = "Yes" if result["leadership"] == 1 else "No" |
| | print(f" Leadership Prediction: {lead_pred} (Predicted token: '{lead_token}')") |
| | |
| | |
| | collab_token = result["collaboration_token"] |
| | collab_pred = "Yes" if result["collaboration"] == 1 else "No" |
| | print(f" Collaboration Prediction: {collab_pred} (Predicted token: '{collab_token}')") |
| | print() |
| |
|