🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

2回答

6455閲覧

Flaskでの、ValueError: signal only works in main thread が解決できない

shin_shin

総合スコア96

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2020/12/18 08:39

編集2020/12/18 08:40

掲題の通り、"ValueError: signal only works in main thread"が解決できずにいます。
下記に、「発生しているエラー内容の詳細 & 試したこと」と、「実現したいこと」をそれぞれ記載いたします。

【発生しているエラーの詳細 & 試したこと】
下記の、試したことの参照先で提案されている解決方法を、色々試しましたが、うまくいきませんでした。
エラーの本質は、「Jumanというライブラリをmain threadで実行して」ということなのでしょうか?

試したことの参照先

エラーの原文
エラーの詳細1
エラーの詳細_続き

【実現したいこと】
「クラインアントサーバーから、インプット(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}")

もう、一週間このエラーに悩まされていて、藁にもすがる思いです。
解決方法をご教示していただけると、幸いでございます。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argparse

2020/12/21 02:50

具体的に何を試されて、どのような結果が得られたのでしょうか? Flask の built-in server を threading 無しで動作させたければ、 `app.run()` に `use_reloader=False, threaded=False` を指定する必要が有るように思います。
shin_shin

2020/12/21 13:53

ありがとうございます!! `app.run()` に `use_reloader=False, threaded=False`で解決いたしました!!!!!!!
argparse

2020/12/21 15:51

それで問題がないようであれば、自己解決による質問のクローズを御願い致します。
guest

回答2

0

自己解決

argparseさんのご指摘の方法を試した所、無事解決いたしましたので、下記に共有をさせていただきます。

Flask の built-in server を threading 無しで動作させたければ、 app.run()use_reloader=False, threaded=False を指定する必要が有るように思います。

TakaiYさんも、ご回答ありがとうございました!

投稿2020/12/22 15:52

shin_shin

総合スコア96

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーメッセージと、flaskで検索したら、最初にこの記事がヒットしました。
同様の内容に思えますが、ここに書いてある対処方法で解決しませんか?
ーー
flask-app-valueerror-signal-only-works-in-main-thread

投稿2020/12/18 09:12

TakaiY

総合スコア13748

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shin_shin

2020/12/18 10:32 編集

ありがとうございます、 試してみましたが、解決しませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問