Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

可以配合tornado使用么? #81

Open
tengmao opened this issue Aug 14, 2020 · 3 comments
Open

可以配合tornado使用么? #81

tengmao opened this issue Aug 14, 2020 · 3 comments

Comments

@tengmao
Copy link

tengmao commented Aug 14, 2020

作者您好, 我试了一下讲flask替换为tornado, batchsize一直是1, log如下:
INFO:service_streamer.service_streamer:[gpu worker 271141] run_once batch_size: 1 start_at: 1597397389.1931512 spend: 2.809465646743774

是不能配合tornado使用么?

@tengmao
Copy link
Author

tengmao commented Aug 14, 2020

代码如下:


import tornado.web
import tornado.ioloop
import tornado.httpserver
from tornado.escape import json_decode
import json
from tornado.options import define, options

import torch
import json
from transformers import BertTokenizer,BertForSequenceClassification
import torch.nn as nn

from service_streamer import ThreadedStreamer

class BertgModel(object):
    def __init__(self,model_path):
        self.tokenizer = BertTokenizer.from_pretrained(model_path)
        self.model = BertForSequenceClassification.from_pretrained(model_path)
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        self.model.to(self.device)
        self.model.eval()
    def predict(self, batch_input):
    
        pt_batch = self.tokenizer(batch_input,
                                  padding="max_length",
                                  truncation="only_first",
                                  return_tensors="pt",
                                  max_length =128
                                )

        pt_batch = pt_batch.to(self.device)
       
        with torch.no_grad():
            outputs = self.model(**pt_batch)
            prob = torch.softmax(outputs[0], dim=1)
            predict = torch.max(prob.data, 1)[1].cpu().numpy()
            
        return predict
    
print("load model......")
model = BertgModel("../model/")
print("load sucess...")

streamer = ThreadedStreamer(model.predict, batch_size=64, max_latency=2)

class IndexHandler(tornado.web.RequestHandler):
    def post(self, *args, **kwargs):
        print("post......")
        params = json_decode(self.request.body)
        inputs = [params["query"]]
        print(inputs)
        outputs = streamer.predict(inputs)
        print(outputs)
        result = {}
        result["result"] = "result"
        result = json.dumps(result)
        self.write(result)

if __name__ == '__main__':
    print("start....")
    app = tornado.web.Application([
        (r"/", IndexHandler)
    ])
    
    define("port", default=1818, help="run on the given port", type=int)

    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)   
    tornado.ioloop.IOLoop.current().start()

@yangtianyu92
Copy link

好像不支持异步,你有解决方案吗

@Meteorix
Copy link
Contributor

可能不能直接支持,tornado有自己的事件循环,跟这里面的thread会有冲突。你可能需要自己将tornado接收的请求放到一个任务队列,再用streamer进行batching

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants