掲題の通り、"ValueError: signal only works in main thread"が解決できずにいます。
下記に、「発生しているエラー内容の詳細 & 試したこと」と、「実現したいこと」をそれぞれ記載いたします。
【発生しているエラーの詳細 & 試したこと】
下記の、試したことの参照先で提案されている解決方法を、色々試しましたが、うまくいきませんでした。
エラーの本質は、「Jumanというライブラリをmain threadで実行して」ということなのでしょうか?
【実現したいこと】
「クラインアントサーバーから、インプット(json型)をもらったら、
そのインプットを、preprocess_exeで処理して、outputを返す。」 というものです。
下記に必要なコードを共有いたします。
flask実行ファイル
python
1from flask import Flask, jsonify 2from kyodai_bert_embedding import BertWithJumanModel 3 4app = Flask(__name__) 5 6# 前処理を実行する関数の定義 7def preprocess_exe(text): 8 # BERTのインスタンス化 9 bert = BertWithJumanModel('./Japanese_L-12_H-768_A-12_E-30_BPE') 10 # Word Embeddingの取得 11 bert_vec = bert.get_sentence_embedding(text) 12 13 return bert_vec.reshape(-1, 1) 14 15@app.route("/test") 16def test(): 17 # クライアントサーバーから、インプットが送られてきたテイ 18 json_ = {"input": "これは、テストです"} 19 20 # インプットを処理して、分散表現(1×768)を返す 21 word_embed = preprocess_exe(json_["input"]) 22 output = jsonify({"output_shape": word_embed.shape}) 23 24 return output 25 26if __name__=="__main__": 27 app.run(debug=True, port=11111)
上記コードを実行する際に、インポートした自前のクラス(参考:https://recruit.cct-inc.co.jp/tecblog/machine-learning/bert/
)
python
1""" 2参考にしたサイト: https://recruit.cct-inc.co.jp/tecblog/machine-learning/bert/ 3""" 4# Kyodai BERTで必要なライブラリ 5from pathlib import Path 6import numpy as np 7import torch 8from pytorch_pretrained_bert import BertTokenizer, BertModel 9from pyknp import Juman 10 11 12### BERT分散表現に変換するためのクラス群 (下記、2つ) ### 13class JumanTokenizer(): 14 def __init__(self): 15 self.juman = Juman() 16 17 def tokenize(self, text): 18 result = self.juman.analysis(text) 19 return [mrph.midasi for mrph in result.mrph_list()] 20 21 22class BertWithJumanModel(): 23 def __init__(self, bert_path, vocab_file_name="vocab.txt", use_cuda=False): 24 self.juman_tokenizer = JumanTokenizer() 25 self.model = BertModel.from_pretrained(bert_path) 26 self.bert_tokenizer = BertTokenizer(Path(bert_path) / vocab_file_name, 27 do_lower_case=False, do_basic_tokenize=False) 28 self.use_cuda = use_cuda 29 30 def _preprocess_text(self, text): 31 return text.replace(" ", "") # for Juman 32 33 def get_sentence_embedding(self, text, pooling_layer=-2, pooling_strategy="REDUCE_MEAN"): 34 preprocessed_text = self._preprocess_text(text) 35 tokens = self.juman_tokenizer.tokenize(preprocessed_text) 36 bert_tokens = self.bert_tokenizer.tokenize(" ".join(tokens)) 37 ids = self.bert_tokenizer.convert_tokens_to_ids(["[CLS]"] + bert_tokens[:126] + ["[SEP]"]) # max_seq_len-2 38 tokens_tensor = torch.tensor(ids).reshape(1, -1) 39 40 if self.use_cuda: 41 tokens_tensor = tokens_tensor.to('cuda') 42 self.model.to('cuda') 43 44 self.model.eval() 45 with torch.no_grad(): 46 all_encoder_layers, _ = self.model(tokens_tensor) 47 48 embedding = all_encoder_layers[pooling_layer].cpu().numpy()[0] 49 if pooling_strategy == "REDUCE_MEAN": 50 return np.mean(embedding, axis=0) 51 elif pooling_strategy == "REDUCE_MAX": 52 return np.max(embedding, axis=0) 53 elif pooling_strategy == "REDUCE_MEAN_MAX": 54 return np.r_[np.max(embedding, axis=0), np.mean(embedding, axis=0)] 55 elif pooling_strategy == "CLS_TOKEN": 56 return embedding[0] 57 else: 58 raise ValueError("specify valid pooling_strategy: {REDUCE_MEAN, REDUCE_MAX, REDUCE_MEAN_MAX, CLS_TOKEN}")
もう、一週間このエラーに悩まされていて、藁にもすがる思いです。
解決方法をご教示していただけると、幸いでございます。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー